@@ -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 | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -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; | ||||
} | } | ||||
@@ -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 | ||||
@@ -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 | ||||
@@ -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 | ||||
@@ -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; | ||||
@@ -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 | ||||
@@ -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() | ||||
@@ -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) | |||||
}; | }; | ||||
/**@}*/ | /**@}*/ | ||||
@@ -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(); | ||||
@@ -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); | ||||
@@ -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 | ||||
@@ -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 |
@@ -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 |
@@ -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) | ||||
@@ -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 | ||||
@@ -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'; | ||||