Browse Source

Start cleanup/rework of plugin/ui bridges

tags/1.9.4
falkTX 13 years ago
parent
commit
ec86fac5d7
14 changed files with 284 additions and 305 deletions
  1. +2
    -2
      source/backend/engine/CarlaEngine.cpp
  2. +47
    -47
      source/backend/engine/CarlaEngineOsc.cpp
  3. +1
    -1
      source/backend/engine/CarlaEngineOsc.hpp
  4. +4
    -1
      source/backend/plugin/FluidSynthPlugin.cpp
  5. +10
    -10
      source/bridges/CarlaBridgeClient.hpp
  6. +147
    -153
      source/bridges/CarlaBridgeOsc.cpp
  7. +14
    -14
      source/bridges/CarlaBridgeOsc.hpp
  8. +3
    -3
      source/bridges/CarlaBridgeToolkit.hpp
  9. +0
    -0
      source/bridges/CarlaBridgeToolkitGtk.cpp
  10. +0
    -0
      source/bridges/CarlaBridgeToolkitPlugin.cpp
  11. +0
    -0
      source/bridges/CarlaBridgeToolkitQt.cpp
  12. +50
    -50
      source/bridges/qtcreator/carla-bridge-plugin.pro
  13. +4
    -22
      source/libs/Makefile
  14. +2
    -2
      source/utils/CarlaOscUtils.hpp

+ 2
- 2
source/backend/engine/CarlaEngine.cpp View File

@@ -107,10 +107,12 @@ void CarlaEngineEventPort::initBuffer(CarlaEngine* const engine)
if (engine == nullptr)
return;

#ifndef BUILD_BRIDGE
if (kProcessMode == PROCESS_MODE_CONTINUOUS_RACK)
fBuffer = engine->getRackEventBuffer(kIsInput);
else if (kProcessMode == PROCESS_MODE_PATCHBAY && ! kIsInput)
carla_zeroMem(fBuffer, sizeof(EngineEvent)*PATCHBAY_EVENT_COUNT);
#endif
}

uint32_t CarlaEngineEventPort::getEventCount()
@@ -700,11 +702,9 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons
case PLUGIN_NONE:
break;

#ifndef BUILD_BRIDGE
case PLUGIN_INTERNAL:
plugin = CarlaPlugin::newNative(init);
break;
#endif

case PLUGIN_LADSPA:
plugin = CarlaPlugin::newLADSPA(init, (const LADSPA_RDF_Descriptor*)extra);


+ 47
- 47
source/backend/engine/CarlaEngineOsc.cpp View File

@@ -23,11 +23,13 @@

CARLA_BACKEND_START_NAMESPACE

#ifndef BUILD_BRIDGE
// -------------------------------------------------------------------
// Bridge Helper, defined in plugin/CarlaBlugin.cpp

extern int CarlaPluginSetOscBridgeInfo(CarlaPlugin* const plugin, const PluginBridgeInfoType type,
const int argc, const lo_arg* const* const argv, const char* const types);
#endif

// -----------------------------------------------------------------------

@@ -161,9 +163,7 @@ bool isDigit(const char c)

int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg)
{
#if DEBUG
carla_debug("CarlaEngineOsc::handleMessage(%s, %s, %i, %p, %s, %p)", bool2str(isTCP), path, argc, argv, types, msg);
#endif
carla_debug("CarlaEngineOsc::handleMessage(%s, \"%s\", %i, %p, \"%s\", %p)", bool2str(isTCP), path, argc, argv, types, msg);
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPathTCP.isNotEmpty());
CARLA_ASSERT(fServerPathUDP.isNotEmpty());
@@ -185,12 +185,12 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons

#ifndef BUILD_BRIDGE
// Initial path check
if (strcmp(path, "/register") == 0)
if (std::strcmp(path, "/register") == 0)
{
const lo_address source = lo_message_get_source(msg);
return handleMsgRegister(isTCP, argc, argv, types, source);
}
if (strcmp(path, "/unregister") == 0)
if (std::strcmp(path, "/unregister") == 0)
{
return handleMsgUnregister();
}
@@ -270,104 +270,104 @@ int CarlaEngineOsc::handleMessage(const bool isTCP, const char* const path, cons
}

// Common OSC methods (DSSI and bridge UIs)
if (strcmp(method, "update") == 0)
if (std::strcmp(method, "update") == 0)
{
const lo_address source = lo_message_get_source(msg);
return handleMsgUpdate(plugin, argc, argv, types, source);
}
if (strcmp(method, "configure") == 0)
if (std::strcmp(method, "configure") == 0)
return handleMsgConfigure(plugin, argc, argv, types);
if (strcmp(method, "control") == 0)
if (std::strcmp(method, "control") == 0)
return handleMsgControl(plugin, argc, argv, types);
if (strcmp(method, "program") == 0)
if (std::strcmp(method, "program") == 0)
return handleMsgProgram(plugin, argc, argv, types);
if (strcmp(method, "midi") == 0)
if (std::strcmp(method, "midi") == 0)
return handleMsgMidi(plugin, argc, argv, types);
if (strcmp(method, "exiting") == 0)
if (std::strcmp(method, "exiting") == 0)
return handleMsgExiting(plugin);

#ifndef BUILD_BRIDGE
// Internal methods
if (strcmp(method, "set_active") == 0)
if (std::strcmp(method, "set_active") == 0)
return handleMsgSetActive(plugin, argc, argv, types);
if (strcmp(method, "set_drywet") == 0)
if (std::strcmp(method, "set_drywet") == 0)
return handleMsgSetDryWet(plugin, argc, argv, types);
if (strcmp(method, "set_volume") == 0)
if (std::strcmp(method, "set_volume") == 0)
return handleMsgSetVolume(plugin, argc, argv, types);
if (strcmp(method, "set_balance_left") == 0)
if (std::strcmp(method, "set_balance_left") == 0)
return handleMsgSetBalanceLeft(plugin, argc, argv, types);
if (strcmp(method, "set_balance_right") == 0)
if (std::strcmp(method, "set_balance_right") == 0)
return handleMsgSetBalanceRight(plugin, argc, argv, types);
if (strcmp(method, "set_panning") == 0)
if (std::strcmp(method, "set_panning") == 0)
return handleMsgSetPanning(plugin, argc, argv, types);
if (strcmp(method, "set_parameter_value") == 0)
if (std::strcmp(method, "set_parameter_value") == 0)
return handleMsgSetParameterValue(plugin, argc, argv, types);
if (strcmp(method, "set_parameter_midi_cc") == 0)
if (std::strcmp(method, "set_parameter_midi_cc") == 0)
return handleMsgSetParameterMidiCC(plugin, argc, argv, types);
if (strcmp(method, "set_parameter_midi_channel") == 0)
if (std::strcmp(method, "set_parameter_midi_channel") == 0)
return handleMsgSetParameterMidiChannel(plugin, argc, argv, types);
if (strcmp(method, "set_program") == 0)
if (std::strcmp(method, "set_program") == 0)
return handleMsgSetProgram(plugin, argc, argv, types);
if (strcmp(method, "set_midi_program") == 0)
if (std::strcmp(method, "set_midi_program") == 0)
return handleMsgSetMidiProgram(plugin, argc, argv, types);
if (strcmp(method, "note_on") == 0)
if (std::strcmp(method, "note_on") == 0)
return handleMsgNoteOn(plugin, argc, argv, types);
if (strcmp(method, "note_off") == 0)
if (std::strcmp(method, "note_off") == 0)
return handleMsgNoteOff(plugin, argc, argv, types);

// Plugin Bridges
if ((plugin->hints() & PLUGIN_IS_BRIDGE) > 0 && strlen(method) > 11 && strncmp(method, "bridge_", 7) == 0)
{
if (strcmp(method+7, "set_peaks") == 0)
if (std::strcmp(method+7, "set_peaks") == 0)
return handleMsgBridgeSetPeaks(plugin, argc, argv, types);
if (strcmp(method+7, "audio_count") == 0)
if (std::strcmp(method+7, "audio_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeAudioCount, argc, argv, types);
if (strcmp(method+7, "midi_count") == 0)
if (std::strcmp(method+7, "midi_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiCount, argc, argv, types);
if (strcmp(method+7, "parameter_count") == 0)
if (std::strcmp(method+7, "parameter_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterCount, argc, argv, types);
if (strcmp(method+7, "program_count") == 0)
if (std::strcmp(method+7, "program_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeProgramCount, argc, argv, types);
if (strcmp(method+7, "midi_program_count") == 0)
if (std::strcmp(method+7, "midi_program_count") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiProgramCount, argc, argv, types);
if (strcmp(method+7, "plugin_info") == 0)
if (std::strcmp(method+7, "plugin_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgePluginInfo, argc, argv, types);
if (strcmp(method+7, "parameter_info") == 0)
if (std::strcmp(method+7, "parameter_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterInfo, argc, argv, types);
if (strcmp(method+7, "parameter_data") == 0)
if (std::strcmp(method+7, "parameter_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterData, argc, argv, types);
if (strcmp(method+7, "parameter_ranges") == 0)
if (std::strcmp(method+7, "parameter_ranges") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeParameterRanges, argc, argv, types);
if (strcmp(method+7, "program_info") == 0)
if (std::strcmp(method+7, "program_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeProgramInfo, argc, argv, types);
if (strcmp(method+7, "midi_program_info") == 0)
if (std::strcmp(method+7, "midi_program_info") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeMidiProgramInfo, argc, argv, types);
if (strcmp(method+7, "configure") == 0)
if (std::strcmp(method+7, "configure") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeConfigure, argc, argv, types);
if (strcmp(method+7, "set_parameter_value") == 0)
if (std::strcmp(method+7, "set_parameter_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetParameterValue, argc, argv, types);
if (strcmp(method+7, "set_default_value") == 0)
if (std::strcmp(method+7, "set_default_value") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetDefaultValue, argc, argv, types);
if (strcmp(method+7, "set_program") == 0)
if (std::strcmp(method+7, "set_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetProgram, argc, argv, types);
if (strcmp(method+7, "set_midi_program") == 0)
if (std::strcmp(method+7, "set_midi_program") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetMidiProgram, argc, argv, types);
if (strcmp(method+7, "set_custom_data") == 0)
if (std::strcmp(method+7, "set_custom_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetCustomData, argc, argv, types);
if (strcmp(method+7, "set_chunk_data") == 0)
if (std::strcmp(method+7, "set_chunk_data") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeSetChunkData, argc, argv, types);
if (strcmp(method+7, "update") == 0)
if (std::strcmp(method+7, "update") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeUpdateNow, argc, argv, types);
if (strcmp(method+7, "error") == 0)
if (std::strcmp(method+7, "error") == 0)
return CarlaPluginSetOscBridgeInfo(plugin, kPluginBridgeError, argc, argv, types);
}
#endif

// Plugin-specific methods, FIXME
#if 0 //def WANT_LV2
if (strcmp(method, "lv2_atom_transfer") == 0)
if (std::strcmp(method, "lv2_atom_transfer") == 0)
return handleMsgLv2AtomTransfer(plugin, argc, argv, types);
if (strcmp(method, "lv2_event_transfer") == 0)
if (std::strcmp(method, "lv2_event_transfer") == 0)
return handleMsgLv2EventTransfer(plugin, argc, argv, types);
#endif



+ 1
- 1
source/backend/engine/CarlaEngineOsc.hpp View File

@@ -19,8 +19,8 @@
#define __CARLA_ENGINE_OSC_HPP__

#include "CarlaBackend.hpp"
#include "CarlaString.hpp"
#include "CarlaOscUtils.hpp"
#include "CarlaString.hpp"

#define CARLA_ENGINE_OSC_HANDLE_ARGS1 CarlaPlugin* const plugin
#define CARLA_ENGINE_OSC_HANDLE_ARGS2 CarlaPlugin* const plugin, const int argc, const lo_arg* const* const argv, const char* const types


+ 4
- 1
source/backend/plugin/FluidSynthPlugin.cpp View File

@@ -1406,7 +1406,7 @@ CARLA_BACKEND_START_NAMESPACE

CarlaPlugin* CarlaPlugin::newSF2(const Initializer& init, const bool use16Outs)
{
carla_debug("CarlaPlugin::newSF2({%p, \"%s\", \"%s\", \"%s\"})", init.engine, init.filename, init.name, init.label);
carla_debug("CarlaPlugin::newSF2({%p, \"%s\", \"%s\", \"%s\"}, %s)", init.engine, init.filename, init.name, init.label, bool2str(use16Outs));

#ifdef WANT_FLUIDSYNTH
if (! fluid_is_soundfont(init.filename))
@@ -1436,6 +1436,9 @@ CarlaPlugin* CarlaPlugin::newSF2(const Initializer& init, const bool use16Outs)
#else
init.engine->setLastError("fluidsynth support not available");
return nullptr;

// unused
(void)use16Outs;
#endif
}



+ 10
- 10
source/bridges/CarlaBridgeClient.hpp View File

@@ -15,10 +15,10 @@
* For a full copy of the GNU General Public License see the GPL.txt file
*/

#ifndef CARLA_BRIDGE_CLIENT_HPP
#define CARLA_BRIDGE_CLIENT_HPP
#ifndef __CARLA_BRIDGE_CLIENT_HPP__
#define __CARLA_BRIDGE_CLIENT_HPP__

#include "carla_bridge_osc.hpp"
#include "CarlaBridgeOsc.hpp"

CARLA_BRIDGE_START_NAMESPACE

@@ -132,15 +132,15 @@ protected:
// ---------------------------------------------------------------------

private:
CarlaBridgeOsc m_osc;
CarlaBridgeToolkit* const m_toolkit;
CarlaBridgeOsc const kOsc;
CarlaBridgeToolkit* const kToolkit;

const CarlaOscData* m_oscData;
const CarlaOscData* fOscData;

#ifdef BUILD_BRIDGE_UI
char* m_uiFilename;
void* m_uiLib;
bool m_uiQuit;
char* fFilename;
void* fLib;
bool fQuit;
#else
friend class CarlaPluginClient;
#endif
@@ -150,4 +150,4 @@ private:

CARLA_BRIDGE_END_NAMESPACE

#endif // CARLA_BRIDGE_CLIENT_HPP
#endif // __CARLA_BRIDGE_CLIENT_HPP__

+ 147
- 153
source/bridges/CarlaBridgeOsc.cpp View File

@@ -15,159 +15,107 @@
* For a full copy of the GNU General Public License see the GPL.txt file
*/

#include "carla_bridge_osc.hpp"
#include "carla_bridge_client.hpp"
#include "CarlaBridgeOsc.hpp"

#include "CarlaBridgeClient.hpp"
#include "CarlaMIDI.h"
#include "CarlaUtils.hpp"

#include <QtCore/QString>
#include <QtCore/QStringList>
int main() { return 0; }

CARLA_BRIDGE_START_NAMESPACE

// -----------------------------------------------------------------------

CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client_)
: client(client_)
CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client)
: kClient(client),
fServer(nullptr)
{
carla_debug("CarlaBridgeOsc::CarlaBridgeOsc(%p)", client);
CARLA_ASSERT(client);

m_name = nullptr;
m_nameSize = 0;

m_server = nullptr;
m_serverPath = nullptr;
CARLA_ASSERT(client != nullptr);
}

CarlaBridgeOsc::~CarlaBridgeOsc()
{
carla_debug("CarlaBridgeOsc::~CarlaBridgeOsc()");
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_server);
CARLA_ASSERT(! m_serverPath);
CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPath.isEmpty());
CARLA_ASSERT(fServer == nullptr);
}

bool CarlaBridgeOsc::init(const char* const url)
void CarlaBridgeOsc::init(const char* const url)
{
carla_debug("CarlaBridgeOsc::init(\"%s\")", url);
CARLA_ASSERT(! m_name);
CARLA_ASSERT(! m_server);
CARLA_ASSERT(! m_serverPath);
CARLA_ASSERT(m_nameSize == 0);
CARLA_ASSERT(url);

if (! url)
{
carla_stderr("CarlaBridgeOsc::init(\"%s\") - invalid url", url);
return false;
}
CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPath.isEmpty());
CARLA_ASSERT(fServer == nullptr);
CARLA_ASSERT(url != nullptr);

#ifdef BUILD_BRIDGE_PLUGIN
m_name = strdup("carla-bridge-plugin");
fName = "carla-bridge-plugin";
#else
m_name = strdup("carla-bridge-ui");
fName = "carla-bridge-ui";
#endif
m_nameSize = strlen(m_name);

char* const host = lo_url_get_hostname(url);
char* const path = lo_url_get_path(url);
char* const port = lo_url_get_port(url);

if (! host)
{
carla_stderr("CarlaBridgeOsc::init(\"%s\") - failed to get url hostname", url);
return false;
}

if (! path)
{
std::free(host);
carla_stderr("CarlaBridgeOsc::init(\"%s\") - failed to get url path", url);
return false;
}
char* const host = lo_url_get_hostname(url);
char* const port = lo_url_get_port(url);
fControlData.path = carla_strdup_free(lo_url_get_path(url));
fControlData.target = lo_address_new_with_proto(LO_TCP, host, port);

if (! port)
{
std::free(host);
std::free(path);
carla_stderr("CarlaBridgeOsc::init(\"%s\") - failed to get url port", url);
return false;
std::free(port);
}

m_controlData.path = carla_strdup(path);
m_controlData.target = lo_address_new_with_proto(LO_TCP, host, port);
fServer = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler);

std::free(path);
std::free(host);
std::free(port);

if (! m_controlData.target)
if (fServer != nullptr)
{
carla_stderr("CarlaBridgeOsc::init(\"%s\") - failed to get new url address for host '%s' and port '%s'", url, host, port);
return false;
if (char* const tmpServerPath = lo_server_get_url(fServer))
{
fServerPath = tmpServerPath;
fServerPath += fName;
std::free(tmpServerPath);
}

lo_server_add_method(fServer, nullptr, nullptr, osc_message_handler, this);
}

m_server = lo_server_new_with_proto(nullptr, LO_TCP, osc_error_handler);

if (! m_server)
{
carla_stderr("CarlaBridgeOsc::init(\"%s\") - failed to create new OSC server", url);
return false;
}

if (char* const serverUrl = lo_server_get_url(m_server))
{
m_serverPath = strdup(QString("%1%2").arg(serverUrl).arg(m_name).toUtf8().constData());
std::free(serverUrl);
}
else
m_serverPath = strdup(QString("%1carla-bridge").arg(serverUrl).toUtf8().constData());

lo_server_add_method(m_server, nullptr, nullptr, osc_message_handler, this);

return true;
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPath.isNotEmpty());
CARLA_ASSERT(fServer != nullptr);
}

void CarlaBridgeOsc::idle()
{
CARLA_ASSERT(m_server);

if (m_server)
if (fServer != nullptr)
{
while (lo_server_recv_noblock(m_server, 0) != 0) {}
while (lo_server_recv_noblock(fServer, 0) != 0) {}
}
}

void CarlaBridgeOsc::close()
{
carla_debug("CarlaBridgeOsc::close()");
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_server);
CARLA_ASSERT(m_serverPath);
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPath.isNotEmpty());
CARLA_ASSERT(fServer != nullptr);

m_nameSize = 0;
fName.clear();

if (m_name)
if (fServer != nullptr)
{
free(m_name);
m_name = nullptr;
lo_server_del_method(fServer, nullptr, nullptr);
lo_server_free(fServer);
fServer = nullptr;
}

if (m_server)
{
lo_server_del_method(m_server, nullptr, nullptr);
lo_server_free(m_server);
m_server = nullptr;
}
fServerPath.clear();
fControlData.free();

if (m_serverPath)
{
free(m_serverPath);
m_serverPath = nullptr;
}

m_controlData.free();
CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPath.isEmpty());
CARLA_ASSERT(fServer == nullptr);
}

// -----------------------------------------------------------------------
@@ -175,31 +123,35 @@ void CarlaBridgeOsc::close()
int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg)
{
carla_debug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg);
CARLA_ASSERT(m_name);
CARLA_ASSERT(m_server);
CARLA_ASSERT(m_serverPath);
CARLA_ASSERT(path);
CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPath.isNotEmpty());
CARLA_ASSERT(fServer != nullptr);
CARLA_ASSERT(path != nullptr);

if (! path)
if (path == nullptr)
{
carla_stderr("CarlaBridgeOsc::handleMessage() - got invalid path");
return 1;
}

if (! (m_name && m_server && m_serverPath))
if (fName.isEmpty())
{
carla_stderr("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received message but client is offline", path);
return 1;
}

if (strlen(path) <= m_nameSize || strncmp(path+1, m_name, m_nameSize) != 0)
const size_t nameSize = fName.length();

// Check if message is for this client
if (std::strlen(path) <= nameSize || std::strncmp(path+1, (const char*)fName, nameSize) != 0)
{
carla_stderr("CarlaBridgeOsc::handleMessage() - message not for this client: '%s' != '/%s/'", path, m_name);
carla_stderr("CarlaBridgeOsc::handleMessage() - message not for this client -> '%s' != '/%s/'", path, (const char*)fName);
return 1;
}

// Get method from path
char method[32] = { 0 };
strncpy(method, path + (m_nameSize + 2), 31);
std::strncpy(method, path + (nameSize + 2), 31);

if (method[0] == '\0')
{
@@ -208,49 +160,48 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const
}

// Common OSC methods
if (strcmp(method, "configure") == 0)
if (std::strcmp(method, "configure") == 0)
return handleMsgConfigure(argc, argv, types);
if (strcmp(method, "control") == 0)
if (std::strcmp(method, "control") == 0)
return handleMsgControl(argc, argv, types);
if (strcmp(method, "program") == 0)
if (std::strcmp(method, "program") == 0)
return handleMsgProgram(argc, argv, types);
if (strcmp(method, "midi_program") == 0)
if (std::strcmp(method, "midi-program") == 0)
return handleMsgMidiProgram(argc, argv, types);
if (strcmp(method, "midi") == 0)
if (std::strcmp(method, "midi") == 0)
return handleMsgMidi(argc, argv, types);
if (strcmp(method, "sample-rate") == 0)
if (std::strcmp(method, "sample-rate") == 0)
return 0; // unused
if (strcmp(method, "show") == 0)
if (std::strcmp(method, "show") == 0)
return handleMsgShow();
if (strcmp(method, "hide") == 0)
if (std::strcmp(method, "hide") == 0)
return handleMsgHide();
if (strcmp(method, "quit") == 0)
if (std::strcmp(method, "quit") == 0)
return handleMsgQuit();

#ifdef BRIDGE_LV2
// LV2 UI methods
if (strcmp(method, "lv2_atom_transfer") == 0)
if (std::strcmp(method, "lv2_atom_transfer") == 0)
return handleMsgLv2TransferAtom(argc, argv, types);
if (strcmp(method, "lv2_event_transfer") == 0)
if (std::strcmp(method, "lv2_event_transfer") == 0)
return handleMsgLv2TransferEvent(argc, argv, types);
#endif

#ifdef BUILD_BRIDGE_PLUGIN
// Plugin methods
if (strcmp(method, "plugin_save_now") == 0)
if (std::strcmp(method, "plugin_save_now") == 0)
return handleMsgPluginSaveNow();
if (strcmp(method, "plugin_set_chunk") == 0)
if (std::strcmp(method, "plugin_set_chunk") == 0)
return handleMsgPluginSetChunk(argc, argv, types);
if (strcmp(method, "plugin_set_custom_data") == 0)
if (std::strcmp(method, "plugin_set_custom_data") == 0)
return handleMsgPluginSetCustomData(argc, argv, types);
#endif

#if 0
// TODO
else if (strcmp(method, "set_parameter_midi_channel") == 0)
if (std::strcmp(method, "set_parameter_midi_channel") == 0)
return osc_set_parameter_midi_channel_handler(argv);
else if (strcmp(method, "set_parameter_midi_cc") == 0)
if (std::strcmp(method, "set_parameter_midi_cc") == 0)
return osc_set_parameter_midi_channel_handler(argv);
#endif
#endif

carla_stderr("CarlaBridgeOsc::handleMessage(\"%s\", ...) - received unsupported OSC method '%s'", path, method);
@@ -260,30 +211,37 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const
int CarlaBridgeOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgConfigure()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ss");

if (! client)
if (kClient == nullptr)
return 1;

// nothing here for now

return 0;

Q_UNUSED(argv);
// unused
(void)argv;
}

int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgControl()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "if");

if (! client)
if (kClient == nullptr)
return 1;

const int32_t index = argv[0]->i;
const float value = argv[1]->f;

client->setParameter(index, value);
CARLA_SAFE_ASSERT_INT(index != -1, index);

if (index == -1)
return 1;

kClient->setParameter(index, value);

return 0;
}
@@ -291,14 +249,20 @@ int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgProgram()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i");

if (! client)
if (kClient == nullptr)
return 1;

const int32_t index = argv[0]->i;

client->setProgram(index);
CARLA_SAFE_ASSERT_INT(index >= 0, index);

if (index < 0)
return 1;

kClient->setProgram(static_cast<uint32_t>(index));

return 0;
}
@@ -307,14 +271,20 @@ int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgMidiProgram()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i");

if (! client)
if (kClient == nullptr)
return 1;

const int32_t index = argv[0]->i;

client->setMidiProgram(index);
CARLA_SAFE_ASSERT_INT(index >= 0, index);

if (index < 0)
return 1;

kClient->setMidiProgram(static_cast<uint32_t>(index));

return 0;
}
@@ -322,15 +292,24 @@ int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgMidiProgram()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii");

if (! client)
if (kClient == nullptr)
return 1;

const int32_t bank = argv[0]->i;
const int32_t program = argv[1]->i;

client->setMidiProgram(bank, program);
CARLA_SAFE_ASSERT_INT(bank >= 0, bank);
CARLA_SAFE_ASSERT_INT(program >= 0, program);

if (bank < 0)
return 1;
if (program < 0)
return 1;

kClient->setMidiProgram(static_cast<uint32_t>(bank), static_cast<uint32_t>(program));

return 0;
}
@@ -339,14 +318,13 @@ int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
carla_debug("CarlaBridgeOsc::handleMsgMidi()");
CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m");

if (! client)
if (kClient == nullptr)
return 1;

const uint8_t* const mdata = argv[0]->m;
const uint8_t data[4] = { mdata[0], mdata[1], mdata[2], mdata[3] };

const uint8_t* const data = argv[0]->m;
uint8_t status = data[1];
uint8_t channel = status & 0x0F;

@@ -358,14 +336,27 @@ int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{
const uint8_t note = data[2];

client->noteOff(channel, note);
CARLA_SAFE_ASSERT_INT(note < MAX_MIDI_NOTE, note);

if (note >= MAX_MIDI_NOTE)
return 1;

kClient->noteOff(channel, note);
}
else if (MIDI_IS_STATUS_NOTE_ON(status))
{
const uint8_t note = data[2];
const uint8_t velo = data[3];

client->noteOn(channel, note, velo);
CARLA_SAFE_ASSERT_INT(note < MAX_MIDI_NOTE, note);
CARLA_SAFE_ASSERT_INT(velo < MAX_MIDI_VALUE, velo);

if (note >= MAX_MIDI_NOTE)
return 1;
if (velo >= MAX_MIDI_VALUE)
return 1;

kClient->noteOn(channel, note, velo);
}

return 0;
@@ -374,11 +365,12 @@ int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgShow()
{
carla_debug("CarlaBridgeOsc::handleMsgShow()");
CARLA_ASSERT(kClient != nullptr);

if (! client)
if (kClient == nullptr)
return 1;

client->toolkitShow();
kClient->toolkitShow();

return 0;
}
@@ -386,11 +378,12 @@ int CarlaBridgeOsc::handleMsgShow()
int CarlaBridgeOsc::handleMsgHide()
{
carla_debug("CarlaBridgeOsc::handleMsgHide()");
CARLA_ASSERT(kClient != nullptr);

if (! client)
if (kClient == nullptr)
return 1;

client->toolkitHide();
kClient->toolkitHide();

return 0;
}
@@ -398,11 +391,12 @@ int CarlaBridgeOsc::handleMsgHide()
int CarlaBridgeOsc::handleMsgQuit()
{
carla_debug("CarlaBridgeOsc::handleMsgQuit()");
CARLA_ASSERT(kClient != nullptr);

if (! client)
if (kClient == nullptr)
return 1;

client->toolkitQuit();
kClient->toolkitQuit();

return 0;
}


+ 14
- 14
source/bridges/CarlaBridgeOsc.hpp View File

@@ -18,8 +18,9 @@
#ifndef __CARLA_BRIDGE_OSC_HPP__
#define __CARLA_BRIDGE_OSC_HPP__

#include "carla_bridge.hpp"
#include "CarlaBridge.hpp"
#include "CarlaOscUtils.hpp"
#include "CarlaString.hpp"

#define CARLA_BRIDGE_OSC_HANDLE_ARGS const int argc, const lo_arg* const* const argv, const char* const types

@@ -58,7 +59,7 @@ public:
CarlaBridgeOsc(CarlaBridgeClient* const client);
~CarlaBridgeOsc();

bool init(const char* const url);
void init(const char* const url);
void idle();
void close();

@@ -66,31 +67,30 @@ public:

bool isControlRegistered() const
{
return bool(m_controlData.target);
return (fControlData.target != nullptr);
}

const CarlaOscData* getControlData() const
{
return &m_controlData;
return &fControlData;
}

const char* getServerPath() const
{
return m_serverPath;
return (const char*)fServerPath;
}

// -------------------------------------------------------------------

private:
CarlaBridgeClient* const client;
CarlaBridgeClient* const kClient;

char* m_name;
size_t m_nameSize;
CarlaString fName;

lo_server m_server;
char* m_serverPath;
CarlaString fServerPath;
lo_server fServer;

CarlaOscData m_controlData;
CarlaOscData fControlData;

// -------------------------------------------------------------------

@@ -118,14 +118,14 @@ private:

// -------------------------------------------------------------------

static void osc_error_handler(const int num, const char* const msg, const char* const path)
static void osc_error_handler(int num, const char* msg, const char* path)
{
carla_stderr("CarlaBridgeOsc::osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path);
}

static int osc_message_handler(const char* const path, const char* const types, lo_arg** const argv, const int argc, const lo_message msg, void* const user_data)
static int osc_message_handler(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* userData)
{
return ((CarlaBridgeOsc*)user_data)->handleMessage(path, argc, argv, types, msg);
return ((CarlaBridgeOsc*)userData)->handleMessage(path, argc, argv, types, msg);
}
};



+ 3
- 3
source/bridges/CarlaBridgeToolkit.hpp View File

@@ -18,7 +18,7 @@
#ifndef __CARLA_BRIDGE_TOOLKIT_HPP__
#define __CARLA_BRIDGE_TOOLKIT_HPP__

#include "carla_bridge.hpp"
#include "CarlaBridge.hpp"

CARLA_BRIDGE_START_NAMESPACE

@@ -52,8 +52,8 @@ public:
static CarlaBridgeToolkit* createNew(CarlaBridgeClient* const client, const char* const uiTitle);

protected:
CarlaBridgeClient* const client;
char* uiTitle;
CarlaBridgeClient* const kClient;
char* fUiTitle;
};

/**@}*/


source/bridges/CarlaBridgeToolkit-gtk.cpp → source/bridges/CarlaBridgeToolkitGtk.cpp View File


source/bridges/CarlaBridgeToolkit-plugin.cpp → source/bridges/CarlaBridgeToolkitPlugin.cpp View File


source/bridges/CarlaBridgeToolkit-qt.cpp → source/bridges/CarlaBridgeToolkitQt.cpp View File


+ 50
- 50
source/bridges/qtcreator/carla-bridge-plugin.pro View File

@@ -12,87 +12,87 @@ VERSION = 0.5.0
# -----------------------------------------------------------

SOURCES = \
../carla_bridge_client.cpp \
../carla_bridge_osc.cpp \
../carla_bridge_toolkit.cpp \
../carla_bridge_plugin.cpp
# ../CarlaBridgeClient.cpp \
../CarlaBridgeOsc.cpp
# ../CarlaBridgeToolkit.cpp \
# ../CarlaBridgePlugin.cpp

HEADERS = \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp
../CarlaBridge.hpp \
../CarlaBridgeClient.hpp \
../CarlaBridgeOsc.hpp \
../CarlaBridgeToolkit.hpp

# -----------------------------------------------------------

# carla-engine
SOURCES += \
../../backend/engine/carla_engine.cpp \
../../backend/engine/carla_engine_osc.cpp \
../../backend/engine/carla_engine_thread.cpp \
../../backend/engine/jack.cpp \
../../backend/engine/plugin.cpp \
../../backend/engine/rtaudio.cpp
../../backend/engine/CarlaEngine.cpp \
../../backend/engine/CarlaEngineOsc.cpp \
../../backend/engine/CarlaEngineThread.cpp \
../../backend/engine/CarlaEngineJack.cpp \
../../backend/engine/CarlaEnginePlugin.cpp \
../../backend/engine/CarlaEngineRtAudio.cpp

# carla-plugin
SOURCES += \
../../backend/plugin/carla_plugin.cpp \
../../backend/plugin/carla_plugin_thread.cpp \
../../backend/plugin/native.cpp \
../../backend/plugin/ladspa.cpp \
../../backend/plugin/dssi.cpp \
../../backend/plugin/lv2.cpp \
../../backend/plugin/vst.cpp \
../../backend/plugin/fluidsynth.cpp \
../../backend/plugin/linuxsampler.cpp
../../backend/plugin/CarlaPlugin.cpp \
../../backend/plugin/CarlaPluginThread.cpp \
../../backend/plugin/NativePlugin.cpp \
../../backend/plugin/LadspaPlugin.cpp \
../../backend/plugin/DssiPlugin.cpp \
../../backend/plugin/Lv2Plugin.cpp \
../../backend/plugin/VstPlugin.cpp \
../../backend/plugin/FluidSynthPlugin.cpp \
../../backend/plugin/LinuxSamplerPlugin.cpp

# carla-standalone
SOURCES += \
../../backend/standalone/carla_standalone.cpp
../../backend/standalone/CarlaStandalone.cpp

# -----------------------------------------------------------

# common
HEADERS += \
../../backend/carla_backend.hpp \
../../backend/carla_engine.hpp \
../../backend/carla_native.h \
../../backend/carla_native.hpp \
../../backend/carla_plugin.hpp \
../../backend/carla_standalone.hpp
../../CarlaBackend.hpp \
../../CarlaEngine.hpp \
../../CarlaNative.h \
../../CarlaNative.hpp \
../../CarlaPlugin.hpp \
../../CarlaStandalone.hpp

# engine
HEADERS += \
../../backend/engine/carla_engine_internal.hpp \
../../backend/engine/carla_engine_osc.hpp \
../../backend/engine/carla_engine_thread.hpp \
../../backend/engine/plugin/DistrhoPluginInfo.h
../../backend/engine/CarlaEngineInternal.hpp \
../../backend/engine/CarlaEngineOsc.hpp \
../../backend/engine/CarlaEngineThread.hpp \
../../backend/engine/distrho/DistrhoPluginInfo.h

# plugin
HEADERS += \
../../backend/plugin/carla_plugin_internal.hpp \
../../backend/plugin/carla_plugin_thread.hpp
../../backend/plugin/CarlaPluginInternal.hpp \
../../backend/plugin/CarlaPluginThread.hpp

# includes
HEADERS += \
../../includes/carla_defines.hpp \
../../includes/carla_midi.h \
../../includes/CarlaDefines.hpp \
../../includes/CarlaMIDI.h \
../../includes/ladspa_rdf.hpp \
../../includes/lv2_rdf.hpp

# utils
HEADERS += \
../../utils/carla_backend_utils.hpp \
../../utils/carla_juce_utils.hpp \
../../utils/carla_ladspa_utils.hpp \
../../utils/carla_lib_utils.hpp \
../../utils/carla_lv2_utils.hpp \
../../utils/carla_osc_utils.hpp \
../../utils/carla_state_utils.hpp \
../../utils/carla_vst_utils.hpp \
../../utils/carla_utils.hpp \
../../utils/CarlaBackendUtils.hpp \
../../utils/CarlaJuceUtils.hpp \
../../utils/CarlaLadspaUtils.hpp \
../../utils/CarlaLibUtils.hpp \
../../utils/CarlaLv2Utils.hpp \
../../utils/CarlaOscUtils.hpp \
../../utils/CarlaStateUtils.hpp \
../../utils/CarlaVstUtils.hpp \
../../utils/CarlaUtils.hpp \
../../utils/lv2_atom_queue.hpp \
../../utils/rt_list.hpp
../../utils/RtList.hpp

INCLUDEPATH = .. \
../../backend \
@@ -111,8 +111,8 @@ DEFINES += DEBUG
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_PLUGIN BRIDGE_PLUGIN

DEFINES += WANT_JACK
DEFINES += WANT_LADSPA
# WANT_DSSI WANT_LV2 WANT_VST
DEFINES += WANT_LADSPA WANT_DSSI
# WANT_LV2 WANT_VST

LIBS = -ldl \
../../libs/lilv.a \


+ 4
- 22
source/libs/Makefile View File

@@ -25,34 +25,16 @@ jackbridge-win64.dll.so:
lilv.a:
$(MAKE) -C lilv

lilv_posix32.a:
$(MAKE) -C lilv posix32

lilv_posix64.a:
$(MAKE) -C lilv posix64

lilv_win32.a:
$(MAKE) -C lilv win32

lilv_win64.a:
$(MAKE) -C lilv win64
lilv_%.a:
$(MAKE) -C lilv $*

# --------------------------------------------------------------

rtmempool.a:
$(MAKE) -C rtmempool

rtmempool_posix32.a:
$(MAKE) -C rtmempool posix32

rtmempool_posix64.a:
$(MAKE) -C rtmempool posix64

rtmempool_win32.a:
$(MAKE) -C rtmempool win32

rtmempool_win64.a:
$(MAKE) -C rtmempool win64
rtmempool_%.a:
$(MAKE) -C rtmempool $*

# --------------------------------------------------------------



+ 2
- 2
source/utils/CarlaOscUtils.hpp View File

@@ -141,7 +141,7 @@ void osc_send_midi_program(const CarlaOscData* const oscData, const int32_t inde
{
char targetPath[strlen(oscData->path)+14];
strcpy(targetPath, oscData->path);
strcat(targetPath, "/midi_program");
strcat(targetPath, "/midi-program");
lo_send(oscData->target, targetPath, "i", index);
}
}
@@ -158,7 +158,7 @@ void osc_send_midi_program(const CarlaOscData* const oscData, const int32_t bank
{
char targetPath[strlen(oscData->path)+14];
strcpy(targetPath, oscData->path);
strcat(targetPath, "/midi_program");
strcat(targetPath, "/midi-program");
lo_send(oscData->target, targetPath, "ii", bank, program);
}
}


Loading…
Cancel
Save