Browse Source

Continue ui-bridge work

tags/1.9.4
falkTX 12 years ago
parent
commit
abf90cd020
17 changed files with 534 additions and 553 deletions
  1. +1
    -1
      source/backend/engine/CarlaEngineOsc.hpp
  2. +135
    -181
      source/backend/plugin/Lv2Plugin.cpp
  3. +0
    -2
      source/bridges/CarlaBridge.hpp
  4. +46
    -69
      source/bridges/CarlaBridgeClient.cpp
  5. +32
    -9
      source/bridges/CarlaBridgeClient.hpp
  6. +16
    -16
      source/bridges/CarlaBridgeOsc.cpp
  7. +20
    -20
      source/bridges/CarlaBridgeOsc.hpp
  8. +1
    -1
      source/bridges/CarlaBridgeToolkit.cpp
  9. +4
    -1
      source/bridges/CarlaBridgeToolkit.hpp
  10. +19
    -0
      source/bridges/CarlaBridgeToolkitQt.cpp
  11. +181
    -187
      source/bridges/CarlaBridgeUI-LV2.cpp
  12. +3
    -4
      source/bridges/Makefile
  13. +45
    -29
      source/bridges/qtcreator/carla-bridge-lv2-qt4.pro
  14. +14
    -14
      source/bridges/qtcreator/carla-bridge-plugin.pro
  15. +3
    -3
      source/utils/CarlaLv2Utils.hpp
  16. +12
    -15
      source/utils/CarlaOscUtils.hpp
  17. +2
    -1
      source/utils/CarlaUtils.hpp

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

@@ -140,7 +140,7 @@ private:


#ifdef WANT_LV2 #ifdef WANT_LV2
int handleMsgLv2AtomTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2); int handleMsgLv2AtomTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2);
int handleMsgLv2EventTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2);
int handleMsgLv2UridMap(CARLA_ENGINE_OSC_HANDLE_ARGS2);
#endif #endif


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


+ 135
- 181
source/backend/plugin/Lv2Plugin.cpp View File

@@ -43,109 +43,101 @@ CARLA_BACKEND_START_NAMESPACE
} }
#endif #endif


/*!
* @defgroup PluginHints Plugin Hints
* @{
*/
const unsigned int PLUGIN_HAS_EXTENSION_OPTIONS = 0x100; //!< LV2 Plugin has Options extension
const unsigned int PLUGIN_HAS_EXTENSION_PROGRAMS = 0x200; //!< LV2 Plugin has Programs extension
const unsigned int PLUGIN_HAS_EXTENSION_STATE = 0x400; //!< LV2 Plugin has State extension
const unsigned int PLUGIN_HAS_EXTENSION_WORKER = 0x800; //!< LV2 Plugin has Worker extension
/**@}*/

/*!
* @defgroup ParameterHints Parameter Hints
* @{
*/
const unsigned int PARAMETER_IS_STRICT_BOUNDS = 0x1000; //!< LV2 Parameter needs strict bounds
const unsigned int PARAMETER_IS_TRIGGER = 0x2000; //!< LV2 Parameter is trigger (current value should be changed to its default after run())
/**@}*/
const unsigned int MAX_EVENT_BUFFER = 8192; // 0x2000


/*!
* @defgroup Lv2EventTypes LV2 Event Data/Types
*
* Data and buffer types for LV2 EventData ports.
* @{
*/
// Extra Plugin Hints
const unsigned int PLUGIN_HAS_EXTENSION_OPTIONS = 0x1000;
const unsigned int PLUGIN_HAS_EXTENSION_PROGRAMS = 0x2000;
const unsigned int PLUGIN_HAS_EXTENSION_STATE = 0x4000;
const unsigned int PLUGIN_HAS_EXTENSION_WORKER = 0x8000;

// Extra Parameter Hints
const unsigned int PARAMETER_IS_STRICT_BOUNDS = 0x1000;
const unsigned int PARAMETER_IS_TRIGGER = 0x2000;

// LV2 Event Data/Types
const unsigned int CARLA_EVENT_DATA_ATOM = 0x01; const unsigned int CARLA_EVENT_DATA_ATOM = 0x01;
const unsigned int CARLA_EVENT_DATA_EVENT = 0x02; const unsigned int CARLA_EVENT_DATA_EVENT = 0x02;
const unsigned int CARLA_EVENT_DATA_MIDI_LL = 0x04; const unsigned int CARLA_EVENT_DATA_MIDI_LL = 0x04;
const unsigned int CARLA_EVENT_TYPE_MESSAGE = 0x10;
const unsigned int CARLA_EVENT_TYPE_MESSAGE = 0x10; // unused
const unsigned int CARLA_EVENT_TYPE_MIDI = 0x20; const unsigned int CARLA_EVENT_TYPE_MIDI = 0x20;
const unsigned int CARLA_EVENT_TYPE_TIME = 0x40; const unsigned int CARLA_EVENT_TYPE_TIME = 0x40;
/**@}*/


/*!
* @defgroup Lv2UriMapIds LV2 URI Map Ids
*
* Static index list of the internal LV2 URI Map Ids.
* @{
*/
// LV2 URI Map Ids
const uint32_t CARLA_URI_MAP_ID_NULL = 0; const uint32_t CARLA_URI_MAP_ID_NULL = 0;
const uint32_t CARLA_URI_MAP_ID_ATOM_BLANK = 1; const uint32_t CARLA_URI_MAP_ID_ATOM_BLANK = 1;
const uint32_t CARLA_URI_MAP_ID_ATOM_CHUNK = 2;
const uint32_t CARLA_URI_MAP_ID_ATOM_DOUBLE = 3;
const uint32_t CARLA_URI_MAP_ID_ATOM_FLOAT = 4;
const uint32_t CARLA_URI_MAP_ID_ATOM_INT = 5;
const uint32_t CARLA_URI_MAP_ID_ATOM_PATH = 6;
const uint32_t CARLA_URI_MAP_ID_ATOM_SEQUENCE = 7;
const uint32_t CARLA_URI_MAP_ID_ATOM_STRING = 8;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 9;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 10;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 11;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 12;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 13;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 14;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 15;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 16;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 17;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 18; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 19; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 20;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 21;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 22;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 23;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 24;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 25;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 26;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 27;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 28;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 29;
const uint32_t CARLA_URI_MAP_ID_COUNT = 30;
/**@}*/

/*!
* @defgroup Lv2FeatureIds LV2 Feature Ids
*
* Static index list of the internal LV2 Feature Ids.
* @{
*/
const uint32_t CARLA_URI_MAP_ID_ATOM_BOOL = 2;
const uint32_t CARLA_URI_MAP_ID_ATOM_CHUNK = 3;
const uint32_t CARLA_URI_MAP_ID_ATOM_DOUBLE = 4;
const uint32_t CARLA_URI_MAP_ID_ATOM_FLOAT = 5;
const uint32_t CARLA_URI_MAP_ID_ATOM_INT = 6;
const uint32_t CARLA_URI_MAP_ID_ATOM_LITERAL = 7;
const uint32_t CARLA_URI_MAP_ID_ATOM_LONG = 8;
const uint32_t CARLA_URI_MAP_ID_ATOM_PATH = 9;
const uint32_t CARLA_URI_MAP_ID_ATOM_PROPERTY = 10;
const uint32_t CARLA_URI_MAP_ID_ATOM_RESOURCE = 11;
const uint32_t CARLA_URI_MAP_ID_ATOM_SEQUENCE = 12;
const uint32_t CARLA_URI_MAP_ID_ATOM_STRING = 13;
const uint32_t CARLA_URI_MAP_ID_ATOM_TUPLE = 14;
const uint32_t CARLA_URI_MAP_ID_ATOM_URI = 15;
const uint32_t CARLA_URI_MAP_ID_ATOM_URID = 16;
const uint32_t CARLA_URI_MAP_ID_ATOM_VECTOR = 17;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 18;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 19;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 20;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 21;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 22;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 23;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 24;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 25;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 26;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 27; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 28; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 29;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 30;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 31;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 32;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 33;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 36;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 37;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 38;
const uint32_t CARLA_URI_MAP_ID_COUNT = 39;

// LV2 Feature Ids
const uint32_t kFeatureIdBufSizeBounded = 0; const uint32_t kFeatureIdBufSizeBounded = 0;
const uint32_t kFeatureIdBufSizeFixed = 1; const uint32_t kFeatureIdBufSizeFixed = 1;
const uint32_t kFeatureIdBufSizePowerOf2 = 2; const uint32_t kFeatureIdBufSizePowerOf2 = 2;
const uint32_t kFeatureIdEvent = 3; const uint32_t kFeatureIdEvent = 3;
const uint32_t kFeatureIdLogs = 4;
const uint32_t kFeatureIdOptions = 5;
const uint32_t kFeatureIdPrograms = 6;
const uint32_t kFeatureIdRtMemPool = 7;
const uint32_t kFeatureIdStateMakePath = 8;
const uint32_t kFeatureIdStateMapPath = 9;
const uint32_t kFeatureIdStrictBounds = 10;
const uint32_t kFeatureIdUriMap = 11;
const uint32_t kFeatureIdUridMap = 12;
const uint32_t kFeatureIdUridUnmap = 13;
const uint32_t kFeatureIdWorker = 14;
const uint32_t kFeatureIdUiDataAccess = 15;
const uint32_t kFeatureIdUiInstanceAccess = 16;
const uint32_t kFeatureIdUiParent = 17;
const uint32_t kFeatureIdUiPortMap = 18;
const uint32_t kFeatureIdUiResize = 19;
const uint32_t kFeatureIdExternalUi = 20;
const uint32_t kFeatureIdExternalUiOld = 21;
const uint32_t kFeatureCount = 22;
/**@}*/

const unsigned int MAX_EVENT_BUFFER = 8192; // 0x2000
const uint32_t kFeatureIdHardRtCapable = 4;
const uint32_t kFeatureIdInPlaceBroken = 5;
const uint32_t kFeatureIdIsLive = 6;
const uint32_t kFeatureIdLogs = 7;
const uint32_t kFeatureIdOptions = 8;
const uint32_t kFeatureIdPrograms = 9;
const uint32_t kFeatureIdRtMemPool = 10;
const uint32_t kFeatureIdStateMakePath = 11;
const uint32_t kFeatureIdStateMapPath = 12;
const uint32_t kFeatureIdStrictBounds = 13;
const uint32_t kFeatureIdUriMap = 14;
const uint32_t kFeatureIdUridMap = 15;
const uint32_t kFeatureIdUridUnmap = 16;
const uint32_t kFeatureIdWorker = 17;
const uint32_t kFeatureIdUiDataAccess = 18;
const uint32_t kFeatureIdUiInstanceAccess = 19;
const uint32_t kFeatureIdUiIdle = 20;
const uint32_t kFeatureIdUiFixedSize = 21;
const uint32_t kFeatureIdUiMakeResident = 22;
const uint32_t kFeatureIdUiNoUserResize = 23;
const uint32_t kFeatureIdUiParent = 24;
const uint32_t kFeatureIdUiPortMap = 25;
const uint32_t kFeatureIdUiPortSubscribe = 26;
const uint32_t kFeatureIdUiResize = 27;
const uint32_t kFeatureIdUiTouch = 28;
const uint32_t kFeatureIdExternalUi = 29;
const uint32_t kFeatureIdExternalUiOld = 30;
const uint32_t kFeatureCount = 31;


enum Lv2PluginGuiType { enum Lv2PluginGuiType {
PLUGIN_UI_NULL, PLUGIN_UI_NULL,
@@ -228,7 +220,7 @@ struct Lv2EventData {
struct Lv2PluginEventData { struct Lv2PluginEventData {
uint32_t count; uint32_t count;
Lv2EventData* data; Lv2EventData* data;
Lv2EventData* ctrl; // default port, either \a data[x] or PluginEventData.portIn/Out
Lv2EventData* ctrl; // default port, either this->data[x] or kData->portIn/Out
uint32_t ctrlIndex; uint32_t ctrlIndex;


Lv2PluginEventData() Lv2PluginEventData()
@@ -293,30 +285,23 @@ struct Lv2PluginEventData {
}; };


struct Lv2PluginOptions { struct Lv2PluginOptions {
int minBufferSize;
int maxBufferSize; int maxBufferSize;
int minBufferSize;
int sequenceSize; int sequenceSize;
double sampleRate; double sampleRate;
LV2_Options_Option optMinBlockLenth;
LV2_Options_Option optMaxBlockLenth; LV2_Options_Option optMaxBlockLenth;
LV2_Options_Option optMinBlockLenth;
LV2_Options_Option optSequenceSize; LV2_Options_Option optSequenceSize;
LV2_Options_Option optSampleRate; LV2_Options_Option optSampleRate;
LV2_Options_Option optNull; LV2_Options_Option optNull;
LV2_Options_Option* opts[5]; LV2_Options_Option* opts[5];


Lv2PluginOptions() Lv2PluginOptions()
: minBufferSize(0),
maxBufferSize(0),
: maxBufferSize(0),
minBufferSize(0),
sequenceSize(MAX_EVENT_BUFFER), sequenceSize(MAX_EVENT_BUFFER),
sampleRate(0.0) sampleRate(0.0)
{ {
optMinBlockLenth.context = LV2_OPTIONS_INSTANCE;
optMinBlockLenth.subject = 0;
optMinBlockLenth.key = CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
optMinBlockLenth.size = sizeof(int);
optMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMinBlockLenth.value = &minBufferSize;

optMaxBlockLenth.context = LV2_OPTIONS_INSTANCE; optMaxBlockLenth.context = LV2_OPTIONS_INSTANCE;
optMaxBlockLenth.subject = 0; optMaxBlockLenth.subject = 0;
optMaxBlockLenth.key = CARLA_URI_MAP_ID_BUF_MAX_LENGTH; optMaxBlockLenth.key = CARLA_URI_MAP_ID_BUF_MAX_LENGTH;
@@ -324,6 +309,13 @@ struct Lv2PluginOptions {
optMaxBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT; optMaxBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMaxBlockLenth.value = &maxBufferSize; optMaxBlockLenth.value = &maxBufferSize;


optMinBlockLenth.context = LV2_OPTIONS_INSTANCE;
optMinBlockLenth.subject = 0;
optMinBlockLenth.key = CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
optMinBlockLenth.size = sizeof(int);
optMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMinBlockLenth.value = &minBufferSize;

optSequenceSize.context = LV2_OPTIONS_INSTANCE; optSequenceSize.context = LV2_OPTIONS_INSTANCE;
optSequenceSize.subject = 0; optSequenceSize.subject = 0;
optSequenceSize.key = CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE; optSequenceSize.key = CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE;
@@ -355,11 +347,6 @@ struct Lv2PluginOptions {
CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(Lv2PluginOptions) CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(Lv2PluginOptions)
}; };


LV2_Atom_Event* getLv2AtomEvent(LV2_Atom_Sequence* const atom, const uint32_t offset)
{
return (LV2_Atom_Event*)((char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, atom) + offset);
}

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


class Lv2Plugin : public CarlaPlugin, class Lv2Plugin : public CarlaPlugin,
@@ -386,22 +373,22 @@ public:
fCustomURIDs.append(nullptr); fCustomURIDs.append(nullptr);


fAtomForge.Blank = CARLA_URI_MAP_ID_ATOM_BLANK; fAtomForge.Blank = CARLA_URI_MAP_ID_ATOM_BLANK;
fAtomForge.Bool = carla_lv2_urid_map(this, LV2_ATOM__Bool);
fAtomForge.Bool = CARLA_URI_MAP_ID_ATOM_BOOL;
fAtomForge.Chunk = CARLA_URI_MAP_ID_ATOM_CHUNK; fAtomForge.Chunk = CARLA_URI_MAP_ID_ATOM_CHUNK;
fAtomForge.Double = CARLA_URI_MAP_ID_ATOM_DOUBLE; fAtomForge.Double = CARLA_URI_MAP_ID_ATOM_DOUBLE;
fAtomForge.Float = CARLA_URI_MAP_ID_ATOM_FLOAT; fAtomForge.Float = CARLA_URI_MAP_ID_ATOM_FLOAT;
fAtomForge.Int = CARLA_URI_MAP_ID_ATOM_INT; fAtomForge.Int = CARLA_URI_MAP_ID_ATOM_INT;
fAtomForge.Long = carla_lv2_urid_map(this, LV2_ATOM__Long);
fAtomForge.Literal = carla_lv2_urid_map(this, LV2_ATOM__Literal);
fAtomForge.Path = carla_lv2_urid_map(this, LV2_ATOM__Path);
fAtomForge.Property = carla_lv2_urid_map(this, LV2_ATOM__Property);
fAtomForge.Resource = carla_lv2_urid_map(this, LV2_ATOM__Resource);
fAtomForge.Literal = CARLA_URI_MAP_ID_ATOM_LITERAL;
fAtomForge.Long = CARLA_URI_MAP_ID_ATOM_LONG;
fAtomForge.Path = CARLA_URI_MAP_ID_ATOM_PATH;
fAtomForge.Property = CARLA_URI_MAP_ID_ATOM_PROPERTY;
fAtomForge.Resource = CARLA_URI_MAP_ID_ATOM_RESOURCE;
fAtomForge.Sequence = CARLA_URI_MAP_ID_ATOM_SEQUENCE; fAtomForge.Sequence = CARLA_URI_MAP_ID_ATOM_SEQUENCE;
fAtomForge.String = CARLA_URI_MAP_ID_ATOM_STRING; fAtomForge.String = CARLA_URI_MAP_ID_ATOM_STRING;
fAtomForge.Tuple = carla_lv2_urid_map(this, LV2_ATOM__Tuple);
fAtomForge.URI = carla_lv2_urid_map(this, LV2_ATOM__URI);
fAtomForge.URID = carla_lv2_urid_map(this, LV2_ATOM__URID);
fAtomForge.Vector = carla_lv2_urid_map(this, LV2_ATOM__Vector);
fAtomForge.Tuple = CARLA_URI_MAP_ID_ATOM_TUPLE;
fAtomForge.URI = CARLA_URI_MAP_ID_ATOM_URI;
fAtomForge.URID = CARLA_URI_MAP_ID_ATOM_URID;
fAtomForge.Vector = CARLA_URI_MAP_ID_ATOM_VECTOR;
} }


~Lv2Plugin() override ~Lv2Plugin() override
@@ -1254,19 +1241,7 @@ public:
if (kData->osc.data.target != nullptr) if (kData->osc.data.target != nullptr)
{ {
QByteArray chunk((const char*)atom, lv2_atom_total_size(atom)); QByteArray chunk((const char*)atom, lv2_atom_total_size(atom));

const char* typeStr = carla_lv2_urid_unmap(this, atom->type);
const char* bodyStr = "";

if (atom->type == CARLA_URI_MAP_ID_ATOM_BLANK)
{
const LV2_Atom_Object* const obj((const LV2_Atom_Object*)atom);

if (obj->body.otype != CARLA_URI_MAP_ID_NULL)
bodyStr = carla_lv2_urid_unmap(this, obj->body.otype);
}

osc_send_lv2_transfer_event(&kData->osc.data, portIndex, typeStr, bodyStr, chunk.toBase64().constData());
osc_send_lv2_atom_transfer(&kData->osc.data, portIndex, chunk.toBase64().constData());
} }
} }
else if (fUi.type != PLUGIN_UI_NULL) else if (fUi.type != PLUGIN_UI_NULL)
@@ -3510,7 +3485,12 @@ protected:


fCustomURIDs.append(carla_strdup(uri)); fCustomURIDs.append(carla_strdup(uri));


return fCustomURIDs.count()-1;
const LV2_URID urid(fCustomURIDs.count()-1);

if (fUi.type == PLUGIN_UI_OSC && kData->osc.data.target != nullptr)
osc_send_lv2_urid_map(&kData->osc.data, urid, uri);

return urid;
} }


const char* getCustomURIString(const LV2_URID urid) const char* getCustomURIString(const LV2_URID urid)
@@ -3805,7 +3785,7 @@ protected:
} }
} }
} }
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM)
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM || format == CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT)
{ {
CARLA_ASSERT(buffer != nullptr); CARLA_ASSERT(buffer != nullptr);


@@ -3814,18 +3794,6 @@ protected:


fAtomQueueIn.put(rindex, (const LV2_Atom*)buffer); fAtomQueueIn.put(rindex, (const LV2_Atom*)buffer);
} }
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT)
{
CARLA_ASSERT(buffer != nullptr);

if (buffer == nullptr)
return;

fAtomQueueIn.put(rindex, (const LV2_Atom*)buffer);

const LV2_Atom* atom((const LV2_Atom*)buffer);
carla_stdout("UI WRITE DATA: %i | size:%i, realSize:%i, type:\"%s\"", rindex, atom->size, lv2_atom_total_size(atom), carla_lv2_urid_unmap(this, atom->type));
}
else else
{ {
carla_stdout("Lv2Plugin::handleUiWrite(%i, %i, %i:\"%s\", %p) - unknown format", rindex, bufferSize, format, carla_lv2_urid_unmap(this, format), buffer); carla_stdout("Lv2Plugin::handleUiWrite(%i, %i, %i:\"%s\", %p) - unknown format", rindex, bufferSize, format, carla_lv2_urid_unmap(this, format), buffer);
@@ -4665,39 +4633,26 @@ public:


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


void handleTransferAtom(const int32_t portIndex, const char* const typeStr, LV2_Atom* const atom)
void handleTransferAtom(const uint32_t portIndex, const LV2_Atom* const atom)
{ {
CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(atom != nullptr); CARLA_ASSERT(atom != nullptr);
CARLA_ASSERT(typeStr != nullptr);
carla_debug("Lv2Plugin::handleTransferAtom(%i, \"%s\", %p)", portIndex, typeStr, atom);

atom->type = carla_lv2_urid_map(this, typeStr);
carla_debug("Lv2Plugin::handleTransferAtom(%i, %p)", portIndex, atom);


fAtomQueueIn.put(portIndex, atom); fAtomQueueIn.put(portIndex, atom);
} }


void handleTransferEvent(const int32_t portIndex, const char* const typeStr, const char* const bodyStr, LV2_Atom* const atom)
void handleUridMap(const LV2_URID urid, const char* const uri)
{ {
CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(typeStr != nullptr);
CARLA_ASSERT(bodyStr != nullptr);
CARLA_ASSERT(atom != nullptr);
carla_debug("Lv2Plugin::handleTransferEvent(%i, \"%s\", \"%s\", %p)", portIndex, typeStr, bodyStr, atom);

atom->type = carla_lv2_urid_map(this, typeStr);

if (atom->type == CARLA_URI_MAP_ID_ATOM_BLANK)
{
LV2_Atom_Object* const obj((LV2_Atom_Object*)atom);
CARLA_ASSERT(urid != CARLA_URI_MAP_ID_NULL);
CARLA_ASSERT(uri != nullptr);
carla_debug("Lv2Plugin::handleUridMap(%i, \"%s\")", urid, uri);


if (obj->body.otype != CARLA_URI_MAP_ID_NULL)
obj->body.otype = carla_lv2_urid_map(this, bodyStr);
}
CARLA_SAFE_ASSERT_INT2(urid == fCustomURIDs.count(), urid, fCustomURIDs.count());


carla_stdout("FROM OSC UI WRITE DATA: %i | size:%i, realSize:%i, type:\"%s\"", portIndex, atom->size, lv2_atom_total_size(atom), carla_lv2_urid_unmap(this, atom->type));
if (urid != fCustomURIDs.count())
return;


fAtomQueueIn.put(portIndex, atom);
fCustomURIDs.append(carla_strdup(uri));
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -5229,36 +5184,35 @@ private:


int CarlaEngineOsc::handleMsgLv2AtomTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2) int CarlaEngineOsc::handleMsgLv2AtomTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2)
{ {
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "is");
carla_debug("CarlaOsc::handleMsgLv2AtomTransfer()"); carla_debug("CarlaOsc::handleMsgLv2AtomTransfer()");
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(3, "iss");


const int32_t portIndex = argv[0]->i; const int32_t portIndex = argv[0]->i;
const char* const typeStr = (const char*)&argv[1]->s;
const char* const atomBuf = (const char*)&argv[2]->s;
const char* const atomBuf = (const char*)&argv[1]->s;

if (portIndex < 0)
return 0;


QByteArray chunk; QByteArray chunk;
chunk = QByteArray::fromBase64(atomBuf); chunk = QByteArray::fromBase64(atomBuf);


LV2_Atom* const atom = (LV2_Atom*)chunk.data(); LV2_Atom* const atom = (LV2_Atom*)chunk.data();
lv2PluginPtr->handleTransferAtom(portIndex, typeStr, atom);
lv2PluginPtr->handleTransferAtom(portIndex, atom);
return 0; return 0;
} }


int CarlaEngineOsc::handleMsgLv2EventTransfer(CARLA_ENGINE_OSC_HANDLE_ARGS2)
int CarlaEngineOsc::handleMsgLv2UridMap(CARLA_ENGINE_OSC_HANDLE_ARGS2)
{ {
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(2, "is");
carla_debug("CarlaOsc::handleMsgLv2EventTransfer()"); carla_debug("CarlaOsc::handleMsgLv2EventTransfer()");
CARLA_ENGINE_OSC_CHECK_OSC_TYPES(4, "isss");


const int32_t portIndex = argv[0]->i;
const char* const typeStr = (const char*)&argv[1]->s;
const char* const bodyStr = (const char*)&argv[2]->s;
const char* const atomBuf = (const char*)&argv[3]->s;
const int32_t urid = argv[0]->i;
const char* const uri = (const char*)&argv[1]->s;


QByteArray chunk;
chunk = QByteArray::fromBase64(atomBuf);
if (urid <= 0)
return 0;


LV2_Atom* const atom = (LV2_Atom*)chunk.data();
lv2PluginPtr->handleTransferEvent(portIndex, typeStr, bodyStr, atom);
lv2PluginPtr->handleUridMap(urid, uri);
return 0; return 0;
} }




+ 0
- 2
source/bridges/CarlaBridge.hpp View File

@@ -28,9 +28,7 @@ CARLA_BRIDGE_START_NAMESPACE


// forward declarations of commonly used Carla-Bridge classes // forward declarations of commonly used Carla-Bridge classes
class CarlaBridgeClient; class CarlaBridgeClient;
#ifdef BUILD_BRIDGE_UI
class CarlaBridgeToolkit; class CarlaBridgeToolkit;
#endif


CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE




+ 46
- 69
source/bridges/CarlaBridgeClient.cpp View File

@@ -29,26 +29,17 @@ CARLA_BRIDGE_START_NAMESPACE
CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle) CarlaBridgeClient::CarlaBridgeClient(const char* const uiTitle)
: kOsc(this), : kOsc(this),
#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
kUiToolkit(CarlaBridgeToolkit::createNew(this, uiTitle)),
fUiFilename(nullptr),
fUiLib(nullptr),
fUiQuit(false),
fUI(CarlaBridgeToolkit::createNew(this, uiTitle)),
#endif #endif
fOscData(nullptr) fOscData(nullptr)
{ {
CARLA_ASSERT(uiTitle != nullptr);
carla_debug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle); carla_debug("CarlaBridgeClient::CarlaBridgeClient(\"%s\")", uiTitle);
} }


CarlaBridgeClient::~CarlaBridgeClient() CarlaBridgeClient::~CarlaBridgeClient()
{ {
carla_debug("CarlaBridgeClient::~CarlaBridgeClient()"); carla_debug("CarlaBridgeClient::~CarlaBridgeClient()");

#ifdef BUILD_BRIDGE_UI
if (fUiFilename != nullptr)
delete[] fUiFilename;

delete kUiToolkit;
#endif
} }


#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
@@ -66,8 +57,7 @@ bool CarlaBridgeClient::uiInit(const char* const, const char* const)
initiated = true; initiated = true;
} }


fUiQuit = false;
kUiToolkit->init();
fUI.init();


return false; return false;
} }
@@ -76,15 +66,10 @@ void CarlaBridgeClient::uiClose()
{ {
carla_debug("CarlaBridgeClient::uiClose()"); carla_debug("CarlaBridgeClient::uiClose()");


if (! fUiQuit)
{
fUiQuit = true;
if (isOscControlRegistered() && ! fUI.quit)
sendOscExiting();


if (isOscControlRegistered())
sendOscExiting();
}

kUiToolkit->quit();
fUI.close();
} }
#endif #endif


@@ -104,7 +89,7 @@ bool CarlaBridgeClient::oscIdle()
kOsc.idle(); kOsc.idle();


#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
return ! fUiQuit;
return ! fUI.quit;
#else #else
return true; return true;
#endif #endif
@@ -112,11 +97,11 @@ bool CarlaBridgeClient::oscIdle()


void CarlaBridgeClient::oscClose() void CarlaBridgeClient::oscClose()
{ {
carla_debug("CarlaBridgeClient::oscClose()");
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::oscClose()");


kOsc.close();
fOscData = nullptr; fOscData = nullptr;
kOsc.close();
} }


bool CarlaBridgeClient::isOscControlRegistered() const bool CarlaBridgeClient::isOscControlRegistered() const
@@ -126,8 +111,8 @@ bool CarlaBridgeClient::isOscControlRegistered() const


void CarlaBridgeClient::sendOscUpdate() void CarlaBridgeClient::sendOscUpdate()
{ {
carla_debug("CarlaBridgeClient::sendOscUpdate()");
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscUpdate()");


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_update(fOscData, kOsc.getServerPath()); osc_send_update(fOscData, kOsc.getServerPath());
@@ -136,9 +121,9 @@ void CarlaBridgeClient::sendOscUpdate()
#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN
void CarlaBridgeClient::sendOscBridgeUpdate() void CarlaBridgeClient::sendOscBridgeUpdate()
{ {
carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()");
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
CARLA_ASSERT(fOscData->target != nullptr && fOscData->path != nullptr); CARLA_ASSERT(fOscData->target != nullptr && fOscData->path != nullptr);
carla_debug("CarlaBridgeClient::sendOscBridgeUpdate()");


if (fOscData != nullptr && fOscData->target != nullptr && fOscData->path != nullptr) if (fOscData != nullptr && fOscData->target != nullptr && fOscData->path != nullptr)
osc_send_bridge_update(fOscData, fOscData->path); osc_send_bridge_update(fOscData, fOscData->path);
@@ -146,9 +131,9 @@ void CarlaBridgeClient::sendOscBridgeUpdate()


void CarlaBridgeClient::sendOscBridgeError(const char* const error) void CarlaBridgeClient::sendOscBridgeError(const char* const error)
{ {
carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
CARLA_ASSERT(error != nullptr); CARLA_ASSERT(error != nullptr);
carla_debug("CarlaBridgeClient::sendOscBridgeError(\"%s\")", error);


if (fOscData != nullptr && fOscData->target != nullptr && error != nullptr) if (fOscData != nullptr && fOscData->target != nullptr && error != nullptr)
osc_send_bridge_error(fOscData, error); osc_send_bridge_error(fOscData, error);
@@ -163,36 +148,35 @@ void CarlaBridgeClient::toolkitShow()
{ {
carla_debug("CarlaBridgeClient::toolkitShow()"); carla_debug("CarlaBridgeClient::toolkitShow()");


kUiToolkit->show();
fUI.toolkit->show();
} }


void CarlaBridgeClient::toolkitHide() void CarlaBridgeClient::toolkitHide()
{ {
carla_debug("CarlaBridgeClient::toolkitHide()"); carla_debug("CarlaBridgeClient::toolkitHide()");


kUiToolkit->hide();
fUI.toolkit->hide();
} }


void CarlaBridgeClient::toolkitResize(const int width, const int height) void CarlaBridgeClient::toolkitResize(const int width, const int height)
{ {
carla_debug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height); carla_debug("CarlaBridgeClient::toolkitResize(%i, %i)", width, height);


kUiToolkit->resize(width, height);
fUI.toolkit->resize(width, height);
} }


void CarlaBridgeClient::toolkitExec(const bool showGui) void CarlaBridgeClient::toolkitExec(const bool showGui)
{ {
carla_debug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui)); carla_debug("CarlaBridgeClient::toolkitExec(%s)", bool2str(showGui));


kUiToolkit->exec(showGui);
fUI.toolkit->exec(showGui);
} }


void CarlaBridgeClient::toolkitQuit() void CarlaBridgeClient::toolkitQuit()
{ {
carla_debug("CarlaBridgeClient::toolkitQuit()"); carla_debug("CarlaBridgeClient::toolkitQuit()");


fUiQuit = true;
kUiToolkit->quit();
fUI.close();
} }
#endif #endif


@@ -200,8 +184,8 @@ void CarlaBridgeClient::toolkitQuit()


void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value) void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* const value)
{ {
carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscConfigure(\"%s\", \"%s\")", key, value);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_configure(fOscData, key, value); osc_send_configure(fOscData, key, value);
@@ -209,8 +193,8 @@ void CarlaBridgeClient::sendOscConfigure(const char* const key, const char* cons


void CarlaBridgeClient::sendOscControl(const int32_t index, const float value) void CarlaBridgeClient::sendOscControl(const int32_t index, const float value)
{ {
carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscControl(%i, %f)", index, value);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_control(fOscData, index, value); osc_send_control(fOscData, index, value);
@@ -218,28 +202,26 @@ void CarlaBridgeClient::sendOscControl(const int32_t index, const float value)


void CarlaBridgeClient::sendOscProgram(const int32_t index) void CarlaBridgeClient::sendOscProgram(const int32_t index)
{ {
carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscProgram(%i)", index);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_program(fOscData, index); osc_send_program(fOscData, index);
} }


#ifdef BUILD_BRIDGE_PLUGIN
void CarlaBridgeClient::sendOscMidiProgram(const int32_t index) void CarlaBridgeClient::sendOscMidiProgram(const int32_t index)
{ {
carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscMidiProgram(%i)", index);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_midi_program(fOscData, index); osc_send_midi_program(fOscData, index);
} }
#endif


void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4]) void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4])
{ {
carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscMidi(%p)", midiBuf);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_midi(fOscData, midiBuf); osc_send_midi(fOscData, midiBuf);
@@ -247,30 +229,30 @@ void CarlaBridgeClient::sendOscMidi(const uint8_t midiBuf[4])


void CarlaBridgeClient::sendOscExiting() void CarlaBridgeClient::sendOscExiting()
{ {
carla_debug("CarlaBridgeClient::sendOscExiting()");
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscExiting()");


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_exiting(fOscData); osc_send_exiting(fOscData);
} }


#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
void CarlaBridgeClient::sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
void CarlaBridgeClient::sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf)
{ {
carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\", \"%s\")", portIndex, typeStr, atomBuf);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscLv2TransferAtom(%i, \"%s\")", portIndex, atomBuf);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_lv2_transfer_atom(fOscData, portIndex, typeStr, atomBuf);
osc_send_lv2_atom_transfer(fOscData, portIndex, atomBuf);
} }


void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const bodyStr, const char* const atomBuf)
void CarlaBridgeClient::sendOscLv2UridMap(const uint32_t urid, const char* const uri)
{ {
carla_debug("CarlaBridgeClient::sendOscLv2TransferEvent(%i, \"%s\", \"%s\", \"%s\")", portIndex, typeStr, bodyStr, atomBuf);
CARLA_ASSERT(fOscData != nullptr); CARLA_ASSERT(fOscData != nullptr);
carla_debug("CarlaBridgeClient::sendOscLv2UridMap(%i, \"%s\")", urid, uri);


if (fOscData != nullptr && fOscData->target != nullptr) if (fOscData != nullptr && fOscData->target != nullptr)
osc_send_lv2_transfer_event(fOscData, portIndex, typeStr, bodyStr, atomBuf);
osc_send_lv2_urid_map(fOscData, urid, uri);
} }
#endif #endif


@@ -279,50 +261,45 @@ void CarlaBridgeClient::sendOscLv2TransferEvent(const int32_t portIndex, const c
#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
void* CarlaBridgeClient::getContainerId() void* CarlaBridgeClient::getContainerId()
{ {
return kUiToolkit->getContainerId();
return fUI.toolkit->getContainerId();
} }


bool CarlaBridgeClient::uiLibOpen(const char* const filename) bool CarlaBridgeClient::uiLibOpen(const char* const filename)
{ {
CARLA_ASSERT(fUiLib == nullptr);
CARLA_ASSERT(fUiFilename == nullptr);
CARLA_ASSERT(fUI.lib == nullptr);
CARLA_ASSERT(filename != nullptr);


if (fUiFilename != nullptr)
delete[] fUiFilename;
fUI.lib = lib_open(filename);
fUI.filename = filename;


fUiLib = lib_open(filename);
fUiFilename = carla_strdup(filename ? filename : "");

return (fUiLib != nullptr);
return (fUI.lib != nullptr);
} }


bool CarlaBridgeClient::uiLibClose() bool CarlaBridgeClient::uiLibClose()
{ {
CARLA_ASSERT(fUiLib != nullptr);
CARLA_ASSERT(fUI.lib != nullptr);


if (fUiLib != nullptr)
{
const bool closed = lib_close(fUiLib);
fUiLib = nullptr;
return closed;
}
if (fUI.lib == nullptr)
return false;


return false;
const bool closed = lib_close(fUI.lib);
fUI.lib = nullptr;
return closed;
} }


void* CarlaBridgeClient::uiLibSymbol(const char* const symbol) void* CarlaBridgeClient::uiLibSymbol(const char* const symbol)
{ {
CARLA_ASSERT(fUiLib != nullptr);
CARLA_ASSERT(fUI.lib != nullptr);


if (fUiLib != nullptr)
return lib_symbol(fUiLib, symbol);
if (fUI.lib == nullptr)
return nullptr;


return nullptr;
return lib_symbol(fUI.lib, symbol);
} }


const char* CarlaBridgeClient::uiLibError() const char* CarlaBridgeClient::uiLibError()
{ {
return lib_error(fUiFilename);
return lib_error(fUI.filename);
} }
#endif #endif




+ 32
- 9
source/bridges/CarlaBridgeClient.hpp View File

@@ -19,6 +19,7 @@
#define __CARLA_BRIDGE_CLIENT_HPP__ #define __CARLA_BRIDGE_CLIENT_HPP__


#include "CarlaBridgeOsc.hpp" #include "CarlaBridgeOsc.hpp"
#include "CarlaBridgeToolkit.hpp"


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


@@ -107,15 +108,13 @@ protected:
void sendOscConfigure(const char* const key, const char* const value); void sendOscConfigure(const char* const key, const char* const value);
void sendOscControl(const int32_t index, const float value); void sendOscControl(const int32_t index, const float value);
void sendOscProgram(const int32_t index); void sendOscProgram(const int32_t index);
#ifdef BUILD_BRIDGE_PLUGIN
void sendOscMidiProgram(const int32_t index); void sendOscMidiProgram(const int32_t index);
#endif
void sendOscMidi(const uint8_t midiBuf[4]); void sendOscMidi(const uint8_t midiBuf[4]);
void sendOscExiting(); void sendOscExiting();


#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
void sendOscLv2TransferAtom(const int32_t portIndex, const char* const typeStr, const char* const atomBuf);
void sendOscLv2TransferEvent(const int32_t portIndex, const char* const typeStr, const char* const bodyStr, const char* const atomBuf);
void sendOscLv2AtomTransfer(const int32_t portIndex, const char* const atomBuf);
void sendOscLv2UridMap(const uint32_t urid, const char* const uri);
#endif #endif


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -134,11 +133,35 @@ private:
CarlaBridgeOsc kOsc; CarlaBridgeOsc kOsc;


#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
CarlaBridgeToolkit* const kUiToolkit;

const char* fUiFilename;
void* fUiLib;
bool fUiQuit;
struct UI {
CarlaBridgeToolkit* const toolkit;
CarlaString filename;
void* lib;
bool quit;

UI(CarlaBridgeToolkit* const toolkit_)
: toolkit(toolkit_),
lib(nullptr),
quit(false) {}

~UI()
{
delete toolkit;
}

void init()
{
toolkit->init();
quit = false;
}

void close()
{
quit = true;
toolkit->quit();
}

} fUI;
#else #else
friend class CarlaPluginClient; friend class CarlaPluginClient;
#endif #endif


+ 16
- 16
source/bridges/CarlaBridgeOsc.cpp View File

@@ -29,25 +29,25 @@ CarlaBridgeOsc::CarlaBridgeOsc(CarlaBridgeClient* const client)
: kClient(client), : kClient(client),
fServer(nullptr) fServer(nullptr)
{ {
carla_debug("CarlaBridgeOsc::CarlaBridgeOsc(%p)", client);
CARLA_ASSERT(client != nullptr); CARLA_ASSERT(client != nullptr);
carla_debug("CarlaBridgeOsc::CarlaBridgeOsc(%p)", client);
} }


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


void CarlaBridgeOsc::init(const char* const url) void CarlaBridgeOsc::init(const char* const url)
{ {
carla_debug("CarlaBridgeOsc::init(\"%s\")", url);
CARLA_ASSERT(fName.isEmpty()); CARLA_ASSERT(fName.isEmpty());
CARLA_ASSERT(fServerPath.isEmpty()); CARLA_ASSERT(fServerPath.isEmpty());
CARLA_ASSERT(fServer == nullptr); CARLA_ASSERT(fServer == nullptr);
CARLA_ASSERT(url != nullptr); CARLA_ASSERT(url != nullptr);
carla_debug("CarlaBridgeOsc::init(\"%s\")", url);


#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN
fName = "carla-bridge-plugin"; fName = "carla-bridge-plugin";
@@ -94,10 +94,10 @@ void CarlaBridgeOsc::idle()


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


fName.clear(); fName.clear();


@@ -120,11 +120,11 @@ 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) 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(fName.isNotEmpty()); CARLA_ASSERT(fName.isNotEmpty());
CARLA_ASSERT(fServerPath.isNotEmpty()); CARLA_ASSERT(fServerPath.isNotEmpty());
CARLA_ASSERT(fServer != nullptr); CARLA_ASSERT(fServer != nullptr);
CARLA_ASSERT(path != nullptr); CARLA_ASSERT(path != nullptr);
carla_debug("CarlaBridgeOsc::handleMessage(\"%s\", %i, %p, \"%s\", %p)", path, argc, argv, types, msg);


if (path == nullptr) if (path == nullptr)
{ {
@@ -182,9 +182,9 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const
#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
// LV2 UI methods // LV2 UI methods
if (std::strcmp(method, "lv2_atom_transfer") == 0) if (std::strcmp(method, "lv2_atom_transfer") == 0)
return handleMsgLv2TransferAtom(argc, argv, types);
if (std::strcmp(method, "lv2_event_transfer") == 0)
return handleMsgLv2TransferEvent(argc, argv, types);
return handleMsgLv2AtomTransfer(argc, argv, types);
if (std::strcmp(method, "lv2_urid_map") == 0)
return handleMsgLv2UridMap(argc, argv, types);
#endif #endif


#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN
@@ -210,9 +210,9 @@ int CarlaBridgeOsc::handleMessage(const char* const path, const int argc, const


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


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -226,9 +226,9 @@ int CarlaBridgeOsc::handleMsgConfigure(CARLA_BRIDGE_OSC_HANDLE_ARGS)


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


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -249,9 +249,9 @@ int CarlaBridgeOsc::handleMsgControl(CARLA_BRIDGE_OSC_HANDLE_ARGS)
#ifndef BUILD_BRIDGE_PLUGIN #ifndef BUILD_BRIDGE_PLUGIN
int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{ {
carla_debug("CarlaBridgeOsc::handleMsgProgram()");
CARLA_ASSERT(kClient != nullptr); CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i");
carla_debug("CarlaBridgeOsc::handleMsgProgram()");


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -270,9 +270,9 @@ int CarlaBridgeOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)


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_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii");
carla_debug("CarlaBridgeOsc::handleMsgMidiProgram()");


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -295,9 +295,9 @@ int CarlaBridgeOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS)


int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS) int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{ {
carla_debug("CarlaBridgeOsc::handleMsgMidi()");
CARLA_ASSERT(kClient != nullptr); CARLA_ASSERT(kClient != nullptr);
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m"); CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "m");
carla_debug("CarlaBridgeOsc::handleMsgMidi()");


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -344,8 +344,8 @@ int CarlaBridgeOsc::handleMsgMidi(CARLA_BRIDGE_OSC_HANDLE_ARGS)
#ifdef BUILD_BRIDGE_UI #ifdef BUILD_BRIDGE_UI
int CarlaBridgeOsc::handleMsgShow() int CarlaBridgeOsc::handleMsgShow()
{ {
carla_debug("CarlaBridgeOsc::handleMsgShow()");
CARLA_ASSERT(kClient != nullptr); CARLA_ASSERT(kClient != nullptr);
carla_debug("CarlaBridgeOsc::handleMsgShow()");


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -357,8 +357,8 @@ int CarlaBridgeOsc::handleMsgShow()


int CarlaBridgeOsc::handleMsgHide() int CarlaBridgeOsc::handleMsgHide()
{ {
carla_debug("CarlaBridgeOsc::handleMsgHide()");
CARLA_ASSERT(kClient != nullptr); CARLA_ASSERT(kClient != nullptr);
carla_debug("CarlaBridgeOsc::handleMsgHide()");


if (kClient == nullptr) if (kClient == nullptr)
return 1; return 1;
@@ -370,8 +370,8 @@ int CarlaBridgeOsc::handleMsgHide()


int CarlaBridgeOsc::handleMsgQuit() int CarlaBridgeOsc::handleMsgQuit()
{ {
carla_debug("CarlaBridgeOsc::handleMsgQuit()");
CARLA_ASSERT(kClient != nullptr); CARLA_ASSERT(kClient != nullptr);
carla_debug("CarlaBridgeOsc::handleMsgQuit()");


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


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

@@ -25,27 +25,27 @@


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


#define CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \
/* check argument count */ \
if (argc != argcToCompare) \
{ \
#define CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \
/* check argument count */ \
if (argc != argcToCompare) \
{ \
carla_stderr("CarlaBridgeOsc::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \ carla_stderr("CarlaBridgeOsc::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \
return 1; \
} \
if (argc > 0) \
{ \
/* check for nullness */ \
if (! (types && typesToCompare)) \
{ \
return 1; \
} \
if (argc > 0) \
{ \
/* check for nullness */ \
if (types == nullptr || typesToCompare == nullptr) \
{ \
carla_stderr("CarlaBridgeOsc::%s() - argument types are null", __FUNCTION__); \ carla_stderr("CarlaBridgeOsc::%s() - argument types are null", __FUNCTION__); \
return 1; \
} \
/* check argument types */ \
if (std::strcmp(types, typesToCompare) != 0) \
{ \
return 1; \
} \
/* check argument types */ \
if (std::strcmp(types, typesToCompare) != 0) \
{ \
carla_stderr("CarlaBridgeOsc::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \ carla_stderr("CarlaBridgeOsc::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \
return 1; \
} \
return 1; \
} \
} }


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE
@@ -109,8 +109,8 @@ private:
int handleMsgQuit(); int handleMsgQuit();


#ifdef BRIDGE_LV2 #ifdef BRIDGE_LV2
int handleMsgLv2TransferAtom(CARLA_BRIDGE_OSC_HANDLE_ARGS);
int handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS);
int handleMsgLv2AtomTransfer(CARLA_BRIDGE_OSC_HANDLE_ARGS);
int handleMsgLv2UridMap(CARLA_BRIDGE_OSC_HANDLE_ARGS);
#endif #endif


#ifdef BUILD_BRIDGE_PLUGIN #ifdef BUILD_BRIDGE_PLUGIN


+ 1
- 1
source/bridges/CarlaBridgeToolkit.cpp View File

@@ -24,9 +24,9 @@ CarlaBridgeToolkit::CarlaBridgeToolkit(CarlaBridgeClient* const client, const ch
: kClient(client), : kClient(client),
kUiTitle(carla_strdup((uiTitle != nullptr) ? uiTitle : "(null)")) kUiTitle(carla_strdup((uiTitle != nullptr) ? uiTitle : "(null)"))
{ {
carla_debug("CarlaBridgeToolkit::CarlaBridgeToolkit(%p, \"%s\")", client, uiTitle);
CARLA_ASSERT(client != nullptr); CARLA_ASSERT(client != nullptr);
CARLA_ASSERT(uiTitle != nullptr); CARLA_ASSERT(uiTitle != nullptr);
carla_debug("CarlaBridgeToolkit::CarlaBridgeToolkit(%p, \"%s\")", client, uiTitle);
} }


CarlaBridgeToolkit::~CarlaBridgeToolkit() CarlaBridgeToolkit::~CarlaBridgeToolkit()


+ 4
- 1
source/bridges/CarlaBridgeToolkit.hpp View File

@@ -19,6 +19,7 @@
#define __CARLA_BRIDGE_TOOLKIT_HPP__ #define __CARLA_BRIDGE_TOOLKIT_HPP__


#include "CarlaBridge.hpp" #include "CarlaBridge.hpp"
#include "CarlaJuceUtils.hpp"


CARLA_BRIDGE_START_NAMESPACE CARLA_BRIDGE_START_NAMESPACE


@@ -53,7 +54,9 @@ public:


protected: protected:
CarlaBridgeClient* const kClient; CarlaBridgeClient* const kClient;
const char* kUiTitle;
const char* const kUiTitle;

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaBridgeToolkit)
}; };


/**@}*/ /**@}*/


+ 19
- 0
source/bridges/CarlaBridgeToolkitQt.cpp View File

@@ -17,6 +17,7 @@


#include "CarlaBridgeClient.hpp" #include "CarlaBridgeClient.hpp"
#include "CarlaBridgeToolkit.hpp" #include "CarlaBridgeToolkit.hpp"
#include "CarlaStyle.hpp"


#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtCore/QThread> #include <QtCore/QThread>
@@ -110,6 +111,24 @@ public:


app = new QApplication(qargc, qargv); app = new QApplication(qargc, qargv);


{
QSettings settings("falkTX", "Carla");

if (settings.value("Main/UseProTheme", true).toBool())
{
CarlaStyle* const style(new CarlaStyle());
app->setStyle(style);
style->ready(app);

QString color(settings.value("Main/ProThemeColor", "Black").toString());

if (color == "System")
pass(); //style->setColorScheme(CarlaStyle::COLOR_SYSTEM);
else
style->setColorScheme(CarlaStyle::COLOR_BLACK);
}
}

window = new QMainWindow(nullptr); window = new QMainWindow(nullptr);
window->resize(30, 30); window->resize(30, 30);
window->hide(); window->hide();


+ 181
- 187
source/bridges/CarlaBridgeUI-LV2.cpp View File

@@ -18,13 +18,16 @@
#include "CarlaBridgeClient.hpp" #include "CarlaBridgeClient.hpp"
#include "CarlaLv2Utils.hpp" #include "CarlaLv2Utils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"
#include "RtList.hpp"

#include <QtCore/QDir>


extern "C" { extern "C" {
#include "rtmempool/rtmempool-lv2.h" #include "rtmempool/rtmempool-lv2.h"
} }


#include <vector>
#include <QtCore/QDir>
// -----------------------------------------------------
// Our LV2 World class object


Lv2WorldClass gLv2World; Lv2WorldClass gLv2World;


@@ -33,74 +36,154 @@ CARLA_BRIDGE_START_NAMESPACE
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------


// fake values // fake values
uint32_t bufferSize = 512;
double sampleRate = 44100.0;
static uint32_t gBufferSize = 1024;
static double gSampleRate = 44100.0;


// static max values // static max values
const unsigned int MAX_EVENT_BUFFER = 8192; // 0x2000 const unsigned int MAX_EVENT_BUFFER = 8192; // 0x2000


// feature ids
const uint32_t lv2_feature_id_bufsize_bounded = 0;
const uint32_t lv2_feature_id_bufsize_fixed = 1;
const uint32_t lv2_feature_id_bufsize_powerof2 = 2;
const uint32_t lv2_feature_id_event = 3;
const uint32_t lv2_feature_id_logs = 4;
const uint32_t lv2_feature_id_options = 5;
const uint32_t lv2_feature_id_programs = 6;
const uint32_t lv2_feature_id_rtmempool = 7;
const uint32_t lv2_feature_id_state_make_path = 8;
const uint32_t lv2_feature_id_state_map_path = 9;
const uint32_t lv2_feature_id_strict_bounds = 10;
const uint32_t lv2_feature_id_uri_map = 11;
const uint32_t lv2_feature_id_urid_map = 12;
const uint32_t lv2_feature_id_urid_unmap = 13;
const uint32_t lv2_feature_id_ui_parent = 14;
const uint32_t lv2_feature_id_ui_port_map = 15;
const uint32_t lv2_feature_id_ui_resize = 16;
const uint32_t lv2_feature_count = 17;

// pre-set uri[d] map ids
const uint32_t CARLA_URI_MAP_ID_NULL = 0;
const uint32_t CARLA_URI_MAP_ID_ATOM_BLANK = 1;
const uint32_t CARLA_URI_MAP_ID_ATOM_CHUNK = 2;
const uint32_t CARLA_URI_MAP_ID_ATOM_DOUBLE = 3;
const uint32_t CARLA_URI_MAP_ID_ATOM_INT = 4;
const uint32_t CARLA_URI_MAP_ID_ATOM_PATH = 5;
const uint32_t CARLA_URI_MAP_ID_ATOM_SEQUENCE = 6;
const uint32_t CARLA_URI_MAP_ID_ATOM_STRING = 7;
const uint32_t CARLA_URI_MAP_ID_ATOM_WORKER = 8;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 9;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 10;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 11;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 12;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 13;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 14;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 15;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 16;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 17;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 18;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 19;
const uint32_t CARLA_URI_MAP_ID_COUNT = 20;
// LV2 URI Map Ids
const uint32_t CARLA_URI_MAP_ID_NULL = 0;
const uint32_t CARLA_URI_MAP_ID_ATOM_BLANK = 1;
const uint32_t CARLA_URI_MAP_ID_ATOM_BOOL = 2;
const uint32_t CARLA_URI_MAP_ID_ATOM_CHUNK = 3;
const uint32_t CARLA_URI_MAP_ID_ATOM_DOUBLE = 4;
const uint32_t CARLA_URI_MAP_ID_ATOM_FLOAT = 5;
const uint32_t CARLA_URI_MAP_ID_ATOM_INT = 6;
const uint32_t CARLA_URI_MAP_ID_ATOM_LITERAL = 7;
const uint32_t CARLA_URI_MAP_ID_ATOM_LONG = 8;
const uint32_t CARLA_URI_MAP_ID_ATOM_PATH = 9;
const uint32_t CARLA_URI_MAP_ID_ATOM_PROPERTY = 10;
const uint32_t CARLA_URI_MAP_ID_ATOM_RESOURCE = 11;
const uint32_t CARLA_URI_MAP_ID_ATOM_SEQUENCE = 12;
const uint32_t CARLA_URI_MAP_ID_ATOM_STRING = 13;
const uint32_t CARLA_URI_MAP_ID_ATOM_TUPLE = 14;
const uint32_t CARLA_URI_MAP_ID_ATOM_URI = 15;
const uint32_t CARLA_URI_MAP_ID_ATOM_URID = 16;
const uint32_t CARLA_URI_MAP_ID_ATOM_VECTOR = 17;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM = 18;
const uint32_t CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT = 19;
const uint32_t CARLA_URI_MAP_ID_BUF_MAX_LENGTH = 20;
const uint32_t CARLA_URI_MAP_ID_BUF_MIN_LENGTH = 21;
const uint32_t CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE = 22;
const uint32_t CARLA_URI_MAP_ID_LOG_ERROR = 23;
const uint32_t CARLA_URI_MAP_ID_LOG_NOTE = 24;
const uint32_t CARLA_URI_MAP_ID_LOG_TRACE = 25;
const uint32_t CARLA_URI_MAP_ID_LOG_WARNING = 26;
const uint32_t CARLA_URI_MAP_ID_TIME_POSITION = 27; // base type
const uint32_t CARLA_URI_MAP_ID_TIME_BAR = 28; // values
const uint32_t CARLA_URI_MAP_ID_TIME_BAR_BEAT = 29;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT = 30;
const uint32_t CARLA_URI_MAP_ID_TIME_BEAT_UNIT = 31;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_BAR = 32;
const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 33;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 34;
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 35;
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 36;
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 37;
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 38;
const uint32_t CARLA_URI_MAP_ID_COUNT = 39;

// LV2 Feature Ids
const uint32_t kFeatureIdBufSizeBounded = 0;
const uint32_t kFeatureIdBufSizeFixed = 1;
const uint32_t kFeatureIdBufSizePowerOf2 = 2;
const uint32_t kFeatureIdEvent = 3;
const uint32_t kFeatureIdHardRtCapable = 4;
const uint32_t kFeatureIdInPlaceBroken = 5;
const uint32_t kFeatureIdIsLive = 6;
const uint32_t kFeatureIdLogs = 7;
const uint32_t kFeatureIdOptions = 8;
const uint32_t kFeatureIdPrograms = 9;
const uint32_t kFeatureIdRtMemPool = 10;
const uint32_t kFeatureIdStateMakePath = 11;
const uint32_t kFeatureIdStateMapPath = 12;
const uint32_t kFeatureIdStrictBounds = 13;
const uint32_t kFeatureIdUriMap = 14;
const uint32_t kFeatureIdUridMap = 15;
const uint32_t kFeatureIdUridUnmap = 16;
const uint32_t kFeatureIdWorker = 17;
const uint32_t kFeatureIdUiDataAccess = 18;
const uint32_t kFeatureIdUiInstanceAccess = 19;
const uint32_t kFeatureIdUiIdle = 20;
const uint32_t kFeatureIdUiFixedSize = 21;
const uint32_t kFeatureIdUiMakeResident = 22;
const uint32_t kFeatureIdUiNoUserResize = 23;
const uint32_t kFeatureIdUiParent = 24;
const uint32_t kFeatureIdUiPortMap = 25;
const uint32_t kFeatureIdUiPortSubscribe = 26;
const uint32_t kFeatureIdUiResize = 27;
const uint32_t kFeatureIdUiTouch = 28;
const uint32_t kFeatureIdExternalUi = 29;
const uint32_t kFeatureIdExternalUiOld = 30;
const uint32_t kFeatureCount = 31;


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


struct Lv2PluginOptions { struct Lv2PluginOptions {
uint32_t eventSize;
uint32_t bufferSize;
double sampleRate;
LV2_Options_Option oNull;
LV2_Options_Option oMaxBlockLenth;
LV2_Options_Option oMinBlockLenth;
LV2_Options_Option oSequenceSize;
LV2_Options_Option oSampleRate;
int maxBufferSize;
int minBufferSize;
int sequenceSize;
double sampleRate;
LV2_Options_Option optMaxBlockLenth;
LV2_Options_Option optMinBlockLenth;
LV2_Options_Option optSequenceSize;
LV2_Options_Option optSampleRate;
LV2_Options_Option optNull;
LV2_Options_Option* opts[5];


Lv2PluginOptions() Lv2PluginOptions()
: eventSize(MAX_EVENT_BUFFER),
bufferSize(0),
sampleRate(0.0) {}
: maxBufferSize(0),
minBufferSize(0),
sequenceSize(MAX_EVENT_BUFFER),
sampleRate(0.0)
{
optMaxBlockLenth.context = LV2_OPTIONS_INSTANCE;
optMaxBlockLenth.subject = 0;
optMaxBlockLenth.key = CARLA_URI_MAP_ID_BUF_MAX_LENGTH;
optMaxBlockLenth.size = sizeof(int);
optMaxBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMaxBlockLenth.value = &maxBufferSize;

optMinBlockLenth.context = LV2_OPTIONS_INSTANCE;
optMinBlockLenth.subject = 0;
optMinBlockLenth.key = CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
optMinBlockLenth.size = sizeof(int);
optMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
optMinBlockLenth.value = &minBufferSize;

optSequenceSize.context = LV2_OPTIONS_INSTANCE;
optSequenceSize.subject = 0;
optSequenceSize.key = CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE;
optSequenceSize.size = sizeof(int);
optSequenceSize.type = CARLA_URI_MAP_ID_ATOM_INT;
optSequenceSize.value = &sequenceSize;

optSampleRate.context = LV2_OPTIONS_INSTANCE;
optSampleRate.subject = 0;
optSampleRate.key = CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE;
optSampleRate.size = sizeof(double);
optSampleRate.type = CARLA_URI_MAP_ID_ATOM_DOUBLE;
optSampleRate.value = &sampleRate;

optNull.context = LV2_OPTIONS_INSTANCE;
optNull.subject = 0;
optNull.key = CARLA_URI_MAP_ID_NULL;
optNull.size = 0;
optNull.type = CARLA_URI_MAP_ID_NULL;
optNull.value = nullptr;

opts[0] = &optMinBlockLenth;
opts[1] = &optMaxBlockLenth;
opts[2] = &optSequenceSize;
opts[3] = &optSampleRate;
opts[4] = &optNull;
}

CARLA_DECLARE_NON_COPY_STRUCT_WITH_LEAK_DETECTOR(Lv2PluginOptions)
}; };


Lv2PluginOptions lv2Options;
// -------------------------------------------------------------------------


class CarlaLv2Client : public CarlaBridgeClient class CarlaLv2Client : public CarlaBridgeClient
{ {
@@ -126,40 +209,9 @@ public:
for (uint32_t i=0; i < CARLA_URI_MAP_ID_COUNT; ++i) for (uint32_t i=0; i < CARLA_URI_MAP_ID_COUNT; ++i)
customURIDs.push_back(nullptr); customURIDs.push_back(nullptr);


for (uint32_t i=0; i < lv2_feature_count+1; ++i)
for (uint32_t i=0; i < kFeatureCount+1; ++i)
features[i] = nullptr; features[i] = nullptr;


// -----------------------------------------------------------------
// initialize options

lv2Options.bufferSize = bufferSize;
lv2Options.sampleRate = sampleRate;

lv2Options.oNull.key = CARLA_URI_MAP_ID_NULL;
lv2Options.oNull.size = 0;
lv2Options.oNull.type = CARLA_URI_MAP_ID_NULL;
lv2Options.oNull.value = nullptr;

lv2Options.oMaxBlockLenth.key = CARLA_URI_MAP_ID_BUF_MAX_LENGTH;
lv2Options.oMaxBlockLenth.size = sizeof(uint32_t);
lv2Options.oMaxBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
lv2Options.oMaxBlockLenth.value = &lv2Options.bufferSize;

lv2Options.oMinBlockLenth.key = CARLA_URI_MAP_ID_BUF_MIN_LENGTH;
lv2Options.oMinBlockLenth.size = sizeof(uint32_t);
lv2Options.oMinBlockLenth.type = CARLA_URI_MAP_ID_ATOM_INT;
lv2Options.oMinBlockLenth.value = &lv2Options.bufferSize;

lv2Options.oSequenceSize.key = CARLA_URI_MAP_ID_BUF_SEQUENCE_SIZE;
lv2Options.oSequenceSize.size = sizeof(uint32_t);
lv2Options.oSequenceSize.type = CARLA_URI_MAP_ID_ATOM_INT;
lv2Options.oSequenceSize.value = &lv2Options.eventSize;

lv2Options.oSampleRate.key = CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE;
lv2Options.oSampleRate.size = sizeof(double);
lv2Options.oSampleRate.type = CARLA_URI_MAP_ID_ATOM_DOUBLE;
lv2Options.oSampleRate.value = &lv2Options.sampleRate;

// ----------------------------------------------------------------- // -----------------------------------------------------------------
// initialize features // initialize features


@@ -209,13 +261,7 @@ public:
uiResizeFt->handle = this; uiResizeFt->handle = this;
uiResizeFt->ui_resize = carla_lv2_ui_resize; uiResizeFt->ui_resize = carla_lv2_ui_resize;


LV2_Options_Option* const optionsFt = new LV2_Options_Option [5];
optionsFt[0] = lv2Options.oMaxBlockLenth;
optionsFt[1] = lv2Options.oMinBlockLenth;
optionsFt[2] = lv2Options.oSequenceSize;
optionsFt[3] = lv2Options.oSampleRate;
optionsFt[4] = lv2Options.oNull;

#if 0
features[lv2_feature_id_bufsize_bounded] = new LV2_Feature; features[lv2_feature_id_bufsize_bounded] = new LV2_Feature;
features[lv2_feature_id_bufsize_bounded]->URI = LV2_BUF_SIZE__boundedBlockLength; features[lv2_feature_id_bufsize_bounded]->URI = LV2_BUF_SIZE__boundedBlockLength;
features[lv2_feature_id_bufsize_bounded]->data = nullptr; features[lv2_feature_id_bufsize_bounded]->data = nullptr;
@@ -283,6 +329,7 @@ public:
features[lv2_feature_id_ui_resize] = new LV2_Feature; features[lv2_feature_id_ui_resize] = new LV2_Feature;
features[lv2_feature_id_ui_resize]->URI = LV2_UI__resize; features[lv2_feature_id_ui_resize]->URI = LV2_UI__resize;
features[lv2_feature_id_ui_resize]->data = uiResizeFt; features[lv2_feature_id_ui_resize]->data = uiResizeFt;
#endif
} }


~CarlaLv2Client() ~CarlaLv2Client()
@@ -290,6 +337,7 @@ public:
if (rdf_descriptor) if (rdf_descriptor)
delete rdf_descriptor; delete rdf_descriptor;


#if 0
const LV2_Options_Option* const options = (const LV2_Options_Option*)features[lv2_feature_id_options]->data; const LV2_Options_Option* const options = (const LV2_Options_Option*)features[lv2_feature_id_options]->data;
delete[] options; delete[] options;


@@ -304,10 +352,11 @@ public:
delete (LV2_URID_Unmap*)features[lv2_feature_id_urid_unmap]->data; delete (LV2_URID_Unmap*)features[lv2_feature_id_urid_unmap]->data;
delete (LV2UI_Port_Map*)features[lv2_feature_id_ui_port_map]->data; delete (LV2UI_Port_Map*)features[lv2_feature_id_ui_port_map]->data;
delete (LV2UI_Resize*)features[lv2_feature_id_ui_resize]->data; delete (LV2UI_Resize*)features[lv2_feature_id_ui_resize]->data;
#endif


for (uint32_t i=0; i < lv2_feature_count; ++i)
for (uint32_t i=0; i < kFeatureCount; ++i)
{ {
if (features[i])
if (features[i] != nullptr)
delete features[i]; delete features[i];
} }


@@ -557,24 +606,22 @@ public:


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


void handleTransferAtom(const int32_t portIndex, const LV2_Atom* const atom)
void handleAtomTransfer(const uint32_t portIndex, const LV2_Atom* const atom)
{ {
carla_debug("CarlaLv2Client::handleTransferEvent(%i, %p)", portIndex, atom);
CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(atom != nullptr); CARLA_ASSERT(atom != nullptr);
carla_debug("CarlaLv2Client::handleTransferEvent(%i, %p)", portIndex, atom);


if (atom != nullptr && handle != nullptr && descriptor != nullptr && descriptor->port_event != nullptr) if (atom != nullptr && handle != nullptr && descriptor != nullptr && descriptor->port_event != nullptr)
descriptor->port_event(handle, portIndex, lv2_atom_total_size(atom), CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, atom); descriptor->port_event(handle, portIndex, lv2_atom_total_size(atom), CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM, atom);
} }


void handleTransferEvent(const int32_t portIndex, const LV2_Atom* const atom)
void handleUridMap(const LV2_URID urid, const char* const uri)
{ {
carla_debug("CarlaLv2Client::handleTransferEvent(%i, %p)", portIndex, atom);
CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(atom != nullptr);
CARLA_ASSERT(urid != CARLA_URI_MAP_ID_NULL);
CARLA_ASSERT(uri != nullptr);
carla_debug("CarlaLv2Client::handleUridMap(%i, \"%s\")", urid, uri);


if (atom != nullptr && handle != nullptr && descriptor != nullptr && descriptor->port_event != nullptr)
descriptor->port_event(handle, portIndex, lv2_atom_total_size(atom), CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT, atom);
// TODO
} }


// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@@ -617,14 +664,6 @@ public:


void handleUiWrite(uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) void handleUiWrite(uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer)
{ {
#ifdef DEBUG
if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT)
{
const LV2_Atom* const atom((const LV2_Atom*)buffer);
carla_stdout("OSC UI WRITE DATA: %i | size:%i, realSize:%i, bufferSize:%i, type:\"%s\"", portIndex, atom->size, lv2_atom_total_size(atom), bufferSize, carla_lv2_urid_unmap(this, atom->type));
}
#endif

if (buffer == nullptr || ! isOscControlRegistered()) if (buffer == nullptr || ! isOscControlRegistered())
return; return;


@@ -639,47 +678,15 @@ public:


sendOscControl(portIndex, value); sendOscControl(portIndex, value);
} }
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM)
{
CARLA_ASSERT(bufferSize != 0);

if (bufferSize == 0)
return;

const LV2_Atom* const atom((const LV2_Atom*)buffer);
const char* const typeStr(carla_lv2_urid_unmap(this, atom->type));

QByteArray chunk((const char*)buffer, bufferSize);
sendOscLv2TransferAtom(portIndex, typeStr, chunk.toBase64().constData());
}
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT)
else if (format == CARLA_URI_MAP_ID_ATOM_TRANSFER_ATOM || CARLA_URI_MAP_ID_ATOM_TRANSFER_EVENT)
{ {
CARLA_ASSERT(bufferSize != 0); CARLA_ASSERT(bufferSize != 0);


if (bufferSize == 0) if (bufferSize == 0)
return; return;


const LV2_Atom* const atom((const LV2_Atom*)buffer);

const char* typeStr = carla_lv2_urid_unmap(this, atom->type);
const char* bodyStr = "";

if (atom->type == CARLA_URI_MAP_ID_ATOM_BLANK)
{
const LV2_Atom_Object* const obj((const LV2_Atom_Object*)atom);
carla_stdout("OSC UI WRITE DATA: IS BLANK! %i", obj->body.otype);

carla_stdout("OSC UI WRITE DATA: TEST %i", carla_lv2_urid_map(this, "http://gareus.org/oss/lv2/balance#meteron"));

if (obj->body.otype != CARLA_URI_MAP_ID_NULL)
{
bodyStr = carla_lv2_urid_unmap(this, obj->body.otype);
carla_stdout("OSC UI WRITE DATA: IS BLANK! AND BODY STR:\"%s\"", bodyStr);
}
}

QByteArray chunk((const char*)buffer, bufferSize); QByteArray chunk((const char*)buffer, bufferSize);
sendOscLv2TransferEvent(portIndex, typeStr, bodyStr, chunk.toBase64().constData());
sendOscLv2AtomTransfer(portIndex, chunk.toBase64().constData());
} }
} }


@@ -997,7 +1004,7 @@ private:
LV2UI_Handle handle; LV2UI_Handle handle;
LV2UI_Widget widget; LV2UI_Widget widget;
const LV2UI_Descriptor* descriptor; const LV2UI_Descriptor* descriptor;
LV2_Feature* features[lv2_feature_count+1];
LV2_Feature* features[kFeatureCount+1];


const LV2_RDF_Descriptor* rdf_descriptor; const LV2_RDF_Descriptor* rdf_descriptor;
const LV2_RDF_UI* rdf_ui_descriptor; const LV2_RDF_UI* rdf_ui_descriptor;
@@ -1008,64 +1015,51 @@ private:
std::vector<const char*> customURIDs; std::vector<const char*> customURIDs;
}; };


int CarlaBridgeOsc::handleMsgLv2TransferAtom(CARLA_BRIDGE_OSC_HANDLE_ARGS)
#define lv2ClientPtr ((CarlaLv2Client*)kClient)

int CarlaBridgeOsc::handleMsgLv2AtomTransfer(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{ {
carla_debug("CarlaBridgeOsc::handleMsgLv2TransferAtom()");
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(3, "iss");
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "is");
carla_debug("CarlaBridgeOsc::handleMsgLv2AtomTransfer()");


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


const int32_t portIndex = argv[0]->i; const int32_t portIndex = argv[0]->i;
const char* const typeStr = (const char*)&argv[1]->s;
const char* const atomBuf = (const char*)&argv[2]->s;
const char* const atomBuf = (const char*)&argv[1]->s;

if (portIndex < 0)
return 0;


QByteArray chunk; QByteArray chunk;
chunk = QByteArray::fromBase64(atomBuf); chunk = QByteArray::fromBase64(atomBuf);


LV2_Atom* const atom = (LV2_Atom*)chunk.constData(); LV2_Atom* const atom = (LV2_Atom*)chunk.constData();
CarlaLv2Client* const lv2Client = (CarlaLv2Client*)kClient;

atom->type = CarlaLv2Client::carla_lv2_urid_map(lv2Client, typeStr);
lv2Client->handleTransferAtom(portIndex, atom);


lv2ClientPtr->handleAtomTransfer(portIndex, atom);
return 0; return 0;
} }


int CarlaBridgeOsc::handleMsgLv2TransferEvent(CARLA_BRIDGE_OSC_HANDLE_ARGS)
int CarlaBridgeOsc::handleMsgLv2UridMap(CARLA_BRIDGE_OSC_HANDLE_ARGS)
{ {
carla_debug("CarlaBridgeOsc::handleMsgLv2TransferEvent()");
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(4, "isss");
CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "is");
carla_debug("CarlaBridgeOsc::handleMsgLv2UridMap()");


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


const int32_t portIndex = argv[0]->i;
const char* const typeStr = (const char*)&argv[1]->s;
const char* const bodyStr = (const char*)&argv[2]->s;
const char* const atomBuf = (const char*)&argv[3]->s;

QByteArray chunk;
chunk = QByteArray::fromBase64(atomBuf);

LV2_Atom* const atom = (LV2_Atom*)chunk.constData();
CarlaLv2Client* const lv2Client = (CarlaLv2Client*)kClient;
const int32_t urid = argv[0]->i;
const char* const uri = (const char*)&argv[1]->s;


atom->type = CarlaLv2Client::carla_lv2_urid_map(lv2Client, typeStr);

if (atom->type == CARLA_URI_MAP_ID_ATOM_BLANK)
{
LV2_Atom_Object* const obj((LV2_Atom_Object*)atom);

if (obj->body.otype != CARLA_URI_MAP_ID_NULL)
obj->body.otype = CarlaLv2Client::carla_lv2_urid_map(this, bodyStr);
}

lv2Client->handleTransferEvent(portIndex, atom);
if (urid <= 0)
return 0;


lv2ClientPtr->handleUridMap(urid, uri);
return 0; return 0;
} }


#undef lv2ClientPtr

CARLA_BRIDGE_END_NAMESPACE CARLA_BRIDGE_END_NAMESPACE


int main(int argc, char* argv[]) int main(int argc, char* argv[])
@@ -1087,7 +1081,7 @@ int main(int argc, char* argv[])


// try to get sampleRate value // try to get sampleRate value
if (const char* const sampleRateStr = getenv("CARLA_SAMPLE_RATE")) if (const char* const sampleRateStr = getenv("CARLA_SAMPLE_RATE"))
sampleRate = atof(sampleRateStr);
gSampleRate = atof(sampleRateStr);


// Init LV2 client // Init LV2 client
CarlaLv2Client client(uiTitle); CarlaLv2Client client(uiTitle);


+ 3
- 4
source/bridges/Makefile View File

@@ -37,8 +37,7 @@ endif
# -------------------------------------------------------------- # --------------------------------------------------------------
# Plugin bridges # Plugin bridges


BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS)
BUILD_PLUGIN_FLAGS += -DBUILD_BRIDGE_PLUGIN -DBRIDGE_PLUGIN
BUILD_PLUGIN_FLAGS = $(BUILD_CXX_FLAGS) -DBUILD_BRIDGE_PLUGIN
BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin -I../libs -I../theme BUILD_PLUGIN_FLAGS += -I../backend/engine -I../backend/plugin -I../libs -I../theme
LINK_PLUGIN_FLAGS = $(LINK_FLAGS) -lpthread LINK_PLUGIN_FLAGS = $(LINK_FLAGS) -lpthread


@@ -248,7 +247,7 @@ OBJS_UI_LV2_QT4 = CarlaBridgeUI-LV2__lv2-qt4.o \
CarlaBridgeClient__lv2.o CarlaBridgeOsc__lv2.o \ CarlaBridgeClient__lv2.o CarlaBridgeOsc__lv2.o \
CarlaBridgeToolkit__lv2.o CarlaBridgeToolkitQt__lv2-qt4.o CarlaBridgeToolkit__lv2.o CarlaBridgeToolkitQt__lv2-qt4.o


carla-bridge-lv2-qt4: $(OBJS_UI_LV2_QT4) $(OBJS_UI_LV2_LIBS)
carla-bridge-lv2-qt4: $(OBJS_UI_LV2_QT4) $(OBJS_UI_LV2_LIBS) ../libs/theme.a
$(CXX) $^ $(LINK_UI_LV2_QT4_FLAGS) -o $@ && $(STRIP) $@ $(CXX) $^ $(LINK_UI_LV2_QT4_FLAGS) -o $@ && $(STRIP) $@


%__lv2-qt4.o: %.cpp %__lv2-qt4.o: %.cpp
@@ -261,7 +260,7 @@ OBJS_UI_LV2_QT5 = CarlaBridgeUI-LV2__lv2-qt5.o \
CarlaBridgeClient__lv2.o CarlaBridgeOsc__lv2.o \ CarlaBridgeClient__lv2.o CarlaBridgeOsc__lv2.o \
CarlaBridgeToolkit__lv2.o CarlaBridgeToolkitQt__lv2-qt5.o CarlaBridgeToolkit__lv2.o CarlaBridgeToolkitQt__lv2-qt5.o


carla-bridge-lv2-qt5: $(OBJS_UI_LV2_QT5) $(OBJS_UI_LV2_LIBS)
carla-bridge-lv2-qt5: $(OBJS_UI_LV2_QT5) $(OBJS_UI_LV2_LIBS) ../libs/theme.a
$(CXX) $^ $(LINK_UI_LV2_QT5_FLAGS) -o $@ && $(STRIP) $@ $(CXX) $^ $(LINK_UI_LV2_QT5_FLAGS) -o $@ && $(STRIP) $@


%__lv2-qt5.o: %.cpp %__lv2-qt5.o: %.cpp


+ 45
- 29
source/bridges/qtcreator/carla-bridge-lv2-qt4.pro View File

@@ -2,42 +2,58 @@


QT = core gui QT = core gui


CONFIG = debug link_pkgconfig qt warn_on
PKGCONFIG = liblo

TARGET = carla-bridge-lv2-qt4 TARGET = carla-bridge-lv2-qt4
TEMPLATE = app TEMPLATE = app
VERSION = 0.5.0

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

CONFIG = debug
CONFIG += link_pkgconfig qt warn_on

DEFINES = DEBUG
DEFINES += HAVE_CPP11_SUPPORT
DEFINES += QTCREATOR_TEST

DEFINES += BUILD_BRIDGE
DEFINES += BUILD_BRIDGE_UI
DEFINES += BRIDGE_LV2
DEFINES += BRIDGE_QT4
DEFINES += BRIDGE_LV2_QT4

PKGCONFIG = liblo


SOURCES = \ SOURCES = \
../carla_bridge_client.cpp \
../carla_bridge_osc.cpp \
../carla_bridge_toolkit.cpp \
../carla_bridge_toolkit-qt.cpp \
../carla_bridge_ui-lv2.cpp
../CarlaBridgeClient.cpp \
../CarlaBridgeOsc.cpp \
../CarlaBridgeToolkit.cpp \
../CarlaBridgeToolkitQt.cpp \
../CarlaBridgeUI-LV2.cpp


HEADERS = \ HEADERS = \
../carla_bridge.hpp \
../carla_bridge_client.hpp \
../carla_bridge_osc.hpp \
../carla_bridge_toolkit.hpp \
../../carla-includes/carla_defines.hpp \
../../carla-includes/carla_midi.h \
../../carla-includes/lv2_rdf.hpp \
../../carla-utils/carla_lib_utils.hpp \
../../carla-utils/carla_osc_utils.hpp \
../../carla-utils/carla_lv2_utils.hpp
../CarlaBridge.hpp \
../CarlaBridgeClient.hpp \
../CarlaBridgeOsc.hpp \
../CarlaBridgeToolkit.hpp \
../../includes/CarlaDefines.hpp \
../../includes/CarlaMIDI.h \
../../includes/lv2_rdf.hpp \
../../utils/CarlaJuceUtils.hpp \
../../utils/CarlaLibUtils.hpp \
../../utils/CarlaLv2Utils.hpp \
../../utils/CarlaOscUtils.hpp \
../../utils/CarlaUtils.hpp \
../../utils/CarlaString.hpp \
../../utils/RtList.hpp


INCLUDEPATH = .. \ INCLUDEPATH = .. \
../../carla-includes \
../../carla-utils

LIBS = \
../../carla-lilv/carla_lilv.a \
../../carla-rtmempool/carla_rtmempool.a

DEFINES = QTCREATOR_TEST
DEFINES += DEBUG
DEFINES += BUILD_BRIDGE BUILD_BRIDGE_UI BRIDGE_LV2 BRIDGE_QT4 BRIDGE_LV2_QT4
../../includes \
../../libs \
../../theme \
../../utils

LIBS = -ldl
LIBS += ../../libs/lilv.a
LIBS += ../../libs/rtmempool.a
LIBS += ../../libs/theme.a


QMAKE_CXXFLAGS *= -std=c++0x QMAKE_CXXFLAGS *= -std=c++0x

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

@@ -1,21 +1,21 @@
# QtCreator project file # QtCreator project file


QT = core gui xml

TARGET = carla-bridge-qtcreator TARGET = carla-bridge-qtcreator
TEMPLATE = app TEMPLATE = app
VERSION = 1.0


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


QT = core gui xml

CONFIG = debug CONFIG = debug
CONFIG += link_pkgconfig qt shared warn_on
CONFIG += link_pkgconfig qt warn_on


DEFINES = DEBUG DEFINES = DEBUG
DEFINES += HAVE_CPP11_SUPPORT DEFINES += HAVE_CPP11_SUPPORT
DEFINES += QTCREATOR_TEST DEFINES += QTCREATOR_TEST


DEFINES += BUILD_BRIDGE BUILD_BRIDGE_PLUGIN BRIDGE_PLUGIN
DEFINES += BUILD_BRIDGE
DEFINES += BUILD_BRIDGE_PLUGIN


# Shared # Shared
DEFINES += WANT_NATIVE DEFINES += WANT_NATIVE
@@ -34,7 +34,7 @@ DEFINES += WANT_ZYNADDSUBFX
DEFINES += WANT_ZYNADDSUBFX_UI DEFINES += WANT_ZYNADDSUBFX_UI


# Engine # Engine
PKGCONFIG += liblo
PKGCONFIG = liblo


# RtAudio # RtAudio
DEFINES += HAVE_GETTIMEOFDAY DEFINES += HAVE_GETTIMEOFDAY
@@ -52,7 +52,7 @@ DEFINES += __LINUX_PULSE__
PKGCONFIG += libpulse-simple PKGCONFIG += libpulse-simple


# DISTRHO Plugin # DISTRHO Plugin
DEFINES += DISTRHO_PLUGIN_TARGET_VST
DEFINES += DISTRHO_PLUGIN_TARGET_DSSI


# FluidSynth # FluidSynth
PKGCONFIG += fluidsynth PKGCONFIG += fluidsynth
@@ -161,7 +161,6 @@ HEADERS += \
../../utils/CarlaUtils.hpp \ ../../utils/CarlaUtils.hpp \
../../utils/CarlaMutex.hpp \ ../../utils/CarlaMutex.hpp \
../../utils/CarlaString.hpp \ ../../utils/CarlaString.hpp \
../../utils/CarlaThread.hpp \
../../utils/Lv2AtomQueue.hpp \ ../../utils/Lv2AtomQueue.hpp \
../../utils/RtList.hpp ../../utils/RtList.hpp


@@ -176,11 +175,12 @@ INCLUDEPATH = .. \


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


LIBS = -ldl \
../../backend/libcarla_native.a \
../../libs/dgl.a \
../../libs/lilv.a \
../../libs/rtmempool.a \
../../libs/widgets.a
LIBS = -ldl
LIBS += ../../backend/libcarla_native.a
LIBS += ../../libs/dgl.a
LIBS += ../../libs/lilv.a
LIBS += ../../libs/rtmempool.a
LIBS += ../../libs/theme.a
LIBS += ../../libs/widgets.a


QMAKE_CXXFLAGS *= -std=gnu++0x QMAKE_CXXFLAGS *= -std=gnu++0x

+ 3
- 3
source/utils/CarlaLv2Utils.hpp View File

@@ -1249,7 +1249,7 @@ bool is_lv2_feature_supported(const LV2_URI uri)
if (std::strcmp(uri, LV2_URID__unmap) == 0) if (std::strcmp(uri, LV2_URID__unmap) == 0)
return true; return true;
if (std::strcmp(uri, LV2_WORKER__schedule) == 0) if (std::strcmp(uri, LV2_WORKER__schedule) == 0)
return false; // TODO
return true;
return false; return false;
} }


@@ -1282,11 +1282,11 @@ bool is_lv2_ui_feature_supported(const LV2_URI uri)
if (std::strcmp(uri, LV2_UI__portMap) == 0) if (std::strcmp(uri, LV2_UI__portMap) == 0)
return true; return true;
if (std::strcmp(uri, LV2_UI__portSubscribe) == 0) if (std::strcmp(uri, LV2_UI__portSubscribe) == 0)
return false; // TODO
return true;
if (std::strcmp(uri, LV2_UI__resize) == 0) if (std::strcmp(uri, LV2_UI__resize) == 0)
return true; return true;
if (std::strcmp(uri, LV2_UI__touch) == 0) if (std::strcmp(uri, LV2_UI__touch) == 0)
return false; // TODO
return true;
if (std::strcmp(uri, LV2_EXTERNAL_UI__Widget) == 0) if (std::strcmp(uri, LV2_EXTERNAL_UI__Widget) == 0)
return true; return true;
if (std::strcmp(uri, LV2_EXTERNAL_UI_DEPRECATED_URI) == 0) if (std::strcmp(uri, LV2_EXTERNAL_UI_DEPRECATED_URI) == 0)


+ 12
- 15
source/utils/CarlaOscUtils.hpp View File

@@ -314,39 +314,36 @@ void osc_send_bridge_error(const CarlaOscData* const oscData, const char* const


#if defined(BRIDGE_LV2) || defined(WANT_LV2) #if defined(BRIDGE_LV2) || defined(WANT_LV2)
static inline static inline
void osc_send_lv2_transfer_atom(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const atomBuf)
void osc_send_lv2_atom_transfer(const CarlaOscData* const oscData, const int32_t portIndex, const char* const atomBuf)
{ {
CARLA_ASSERT(oscData != nullptr && oscData->path != nullptr); CARLA_ASSERT(oscData != nullptr && oscData->path != nullptr);
CARLA_ASSERT(portIndex >= 0); CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(typeStr != nullptr);
CARLA_ASSERT(atomBuf != nullptr); CARLA_ASSERT(atomBuf != nullptr);
carla_debug("osc_send_lv2_transfer_atom(path:\"%s\", %i, \"%s\", <atomBuf:%p>)", oscData->path, portIndex, typeStr, atomBuf);
carla_debug("osc_send_lv2_atom_transfer(path:\"%s\", %i, <atomBuf:%p>)", oscData->path, portIndex, atomBuf);


if (oscData != nullptr && oscData->path != nullptr && oscData->target != nullptr && portIndex >= 0 && typeStr != nullptr && atomBuf != nullptr)
if (oscData != nullptr && oscData->path != nullptr && oscData->target != nullptr && portIndex >= 0 && atomBuf != nullptr)
{ {
char targetPath[std::strlen(oscData->path)+19]; char targetPath[std::strlen(oscData->path)+19];
std::strcpy(targetPath, oscData->path); std::strcpy(targetPath, oscData->path);
std::strcat(targetPath, "/lv2_atom_transfer"); std::strcat(targetPath, "/lv2_atom_transfer");
lo_send(oscData->target, targetPath, "iss", portIndex, typeStr, atomBuf);
lo_send(oscData->target, targetPath, "is", portIndex, atomBuf);
} }
} }


static inline static inline
void osc_send_lv2_transfer_event(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const bodyStr, const char* const atomBuf)
void osc_send_lv2_urid_map(const CarlaOscData* const oscData, const uint32_t urid, const char* const uri)
{ {
CARLA_ASSERT(oscData != nullptr && oscData->path != nullptr); CARLA_ASSERT(oscData != nullptr && oscData->path != nullptr);
CARLA_ASSERT(portIndex >= 0);
CARLA_ASSERT(typeStr != nullptr);
CARLA_ASSERT(bodyStr != nullptr);
CARLA_ASSERT(atomBuf != nullptr);
carla_debug("osc_send_lv2_transfer_event(path:\"%s\", %i, \"%s\", \"%s\", <atomBuf:%p>)", oscData->path, portIndex, typeStr, bodyStr, atomBuf);
CARLA_ASSERT(urid > 0);
CARLA_ASSERT(uri != nullptr);
carla_debug("osc_send_lv2_urid_map(path:\"%s\", %i, \"%s\")", oscData->path, urid, uri);


if (oscData != nullptr && oscData->path != nullptr && oscData->target != nullptr && portIndex >= 0 && typeStr != nullptr && bodyStr != nullptr && atomBuf != nullptr)
if (oscData != nullptr && oscData->path != nullptr && oscData->target != nullptr && urid > 0 && uri != nullptr)
{ {
char targetPath[std::strlen(oscData->path)+20];
char targetPath[std::strlen(oscData->path)+14];
std::strcpy(targetPath, oscData->path); std::strcpy(targetPath, oscData->path);
std::strcat(targetPath, "/lv2_event_transfer");
lo_send(oscData->target, targetPath, "isss", portIndex, typeStr, bodyStr, atomBuf);
std::strcat(targetPath, "/lv2_urid_map");
lo_send(oscData->target, targetPath, "is", urid, uri);
} }
} }
#endif #endif


+ 2
- 1
source/utils/CarlaUtils.hpp View File

@@ -211,7 +211,8 @@ const char* carla_strdup(const char* const strBuf)
const size_t bufferLen = (strBuf != nullptr) ? std::strlen(strBuf) : 0; const size_t bufferLen = (strBuf != nullptr) ? std::strlen(strBuf) : 0;
char* const buffer = new char[bufferLen+1]; char* const buffer = new char[bufferLen+1];


std::strcpy(buffer, strBuf);
if (strBuf != nullptr && bufferLen > 0)
std::strcpy(buffer, strBuf);


buffer[bufferLen] = '\0'; buffer[bufferLen] = '\0';




Loading…
Cancel
Save