diff --git a/.gitignore b/.gitignore index 3fbc70c..1914f99 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,8 @@ moc_*.cpp ui_*.h carla-bridge-qtcreator +carla-bridge-posix32 +carla-bridge-posix64 carla-bridge-lv2-gtk2 carla-bridge-lv2-gtk3 carla-bridge-lv2-qt4 diff --git a/c++/carla-backend/carla_backend.h b/c++/carla-backend/carla_backend.h index 42f304b..f38c5e0 100644 --- a/c++/carla-backend/carla_backend.h +++ b/c++/carla-backend/carla_backend.h @@ -511,8 +511,8 @@ struct ParameterRanges { ParameterRanges() : def(0.0), - //min(0.0), - //max(1.0), + min(0.0), + max(1.0), step(0.01), stepSmall(0.0001), stepLarge(0.1) {} diff --git a/c++/carla-backend/carla_backend_standalone.cpp b/c++/carla-backend/carla_backend_standalone.cpp index 0db901f..ffec79c 100644 --- a/c++/carla-backend/carla_backend_standalone.cpp +++ b/c++/carla-backend/carla_backend_standalone.cpp @@ -846,7 +846,7 @@ double get_current_parameter_value(unsigned short plugin_id, uint32_t parameter_ double get_input_peak_value(unsigned short plugin_id, unsigned short port_id) { - if (plugin_id < CarlaBackend::MAX_PLUGINS && (port_id == 1 || port_id == 2)) + if (plugin_id < CarlaBackend::CarlaEngine::maxPluginNumber() && (port_id == 1 || port_id == 2)) return carlaEngine->getInputPeak(plugin_id, port_id-1); qCritical("CarlaBackendStandalone::get_input_peak_value(%i, %i) - invalid plugin or port value", plugin_id, port_id); @@ -855,7 +855,7 @@ double get_input_peak_value(unsigned short plugin_id, unsigned short port_id) double get_output_peak_value(unsigned short plugin_id, unsigned short port_id) { - if (plugin_id < CarlaBackend::MAX_PLUGINS && (port_id == 1 || port_id == 2)) + if (plugin_id < CarlaBackend::CarlaEngine::maxPluginNumber() && (port_id == 1 || port_id == 2)) return carlaEngine->getOutputPeak(plugin_id, port_id-1); qCritical("CarlaBackendStandalone::get_output_peak_value(%i, %i) - invalid plugin or port value", plugin_id, port_id); diff --git a/c++/carla-backend/carla_bridge.cpp b/c++/carla-backend/carla_bridge.cpp index 93984f8..8aa1828 100644 --- a/c++/carla-backend/carla_bridge.cpp +++ b/c++/carla-backend/carla_bridge.cpp @@ -20,35 +20,59 @@ #include #include -CARLA_BACKEND_START_NAMESPACE +#define CARLA_BRIDGE_CHECK_OSC_TYPES(/* argc, types, */ argcToCompare, typesToCompare) \ + /* check argument count */ \ + if (argc != argcToCompare) \ + { \ + qCritical("BridgePlugin::%s() - argument count mismatch: %i != %i", __FUNCTION__, argc, argcToCompare); \ + return 1; \ + } \ + if (argc > 0) \ + { \ + /* check for nullness */ \ + if (! (types && typesToCompare)) \ + { \ + qCritical("BridgePlugin::%s() - argument types are null", __FUNCTION__); \ + return 1; \ + } \ + /* check argument types */ \ + if (strcmp(types, typesToCompare) != 0) \ + { \ + qCritical("BridgePlugin::%s() - argument types mismatch: '%s' != '%s'", __FUNCTION__, types, typesToCompare); \ + return 1; \ + } \ + } -#if 0 -} /* adjust editor indent */ -#endif +CARLA_BACKEND_START_NAMESPACE struct BridgeParamInfo { double value; QString name; QString unit; + + BridgeParamInfo() + : value(0.0) {} }; class BridgePlugin : public CarlaPlugin { public: - BridgePlugin(CarlaEngine* const engine, unsigned short id, BinaryType btype, PluginType ptype) : CarlaPlugin(engine, id), - m_binary(btype) + BridgePlugin(CarlaEngine* const engine, const unsigned short id, const BinaryType btype, const PluginType ptype) + : CarlaPlugin(engine, id), + m_binary(btype) { qDebug("BridgePlugin::BridgePlugin()"); + m_type = ptype; m_hints = PLUGIN_IS_BRIDGE; m_initiated = false; m_saved = false; - info.ains = 0; - info.aouts = 0; - info.mins = 0; - info.mouts = 0; + info.aIns = 0; + info.aOuts = 0; + info.mIns = 0; + info.mOuts = 0; info.category = PLUGIN_CATEGORY_NONE; info.uniqueId = 0; @@ -119,22 +143,22 @@ public: uint32_t audioInCount() { - return info.ains; + return info.aIns; } uint32_t audioOutCount() { - return info.aouts; + return info.aOuts; } uint32_t midiInCount() { - return info.mins; + return info.mIns; } uint32_t midiOutCount() { - return info.mouts; + return info.mOuts; } // ------------------------------------------------------------------- @@ -195,21 +219,21 @@ public: CarlaPlugin::getRealName(strBuf); } - void getParameterName(uint32_t parameterId, char* const strBuf) + void getParameterName(const uint32_t parameterId, char* const strBuf) { Q_ASSERT(parameterId < param.count); strncpy(strBuf, params[parameterId].name.toUtf8().constData(), STR_MAX); } - void getParameterUnit(uint32_t parameterId, char* const strBuf) + void getParameterUnit(const uint32_t parameterId, char* const strBuf) { Q_ASSERT(parameterId < param.count); strncpy(strBuf, params[parameterId].unit.toUtf8().constData(), STR_MAX); } - void getGuiInfo(GuiType* type, bool* resizable) + void getGuiInfo(GuiType* const type, bool* const resizable) { if (m_hints & PLUGIN_HAS_GUI) *type = GUI_EXTERNAL_OSC; @@ -221,166 +245,159 @@ public: // ------------------------------------------------------------------- // Set data (internal stuff) - int setOscBridgeInfo(const PluginBridgeInfoType type, const lo_arg* const* const argv) + int setOscBridgeInfo(const PluginBridgeInfoType type, const int argc, const lo_arg* const* const argv, const char* const types) { - qDebug("setOscBridgeInfo(%i, %p)", type, argv); + qDebug("setOscBridgeInfo(%i, %i, %p, \"%s\")", type, argc, argv, types); switch (type) { -// case PluginBridgeAudioCount: -// { -// int aIns = argv[0]->i; -// int aOuts = argv[1]->i; -// int aTotal = argv[2]->i; - -// info.ains = aIns; -// info.aouts = aOuts; - -// break; -// Q_UNUSED(aTotal); -// } - -// case PluginBridgeMidiCount: -// { -// int mIns = argv[0]->i; -// int mOuts = argv[1]->i; -// int mTotal = argv[2]->i; - -// info.mins = mIns; -// info.mouts = mOuts; - -// break; -// Q_UNUSED(mTotal); -// } - -// case PluginBridgeParameterCount: -// { -// int pIns = argv[0]->i; -// int pOuts = argv[1]->i; -// int pTotal = argv[2]->i; - -// // delete old data -// if (param.count > 0) -// { -// delete[] param.data; -// delete[] param.ranges; -// delete[] params; -// } + case PluginBridgeAudioCount: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(3, "iii"); -// // create new if needed -// param.count = (pTotal < (int)carlaOptions.maxParameters) ? pTotal : 0; + const int32_t aIns = argv[0]->i; + const int32_t aOuts = argv[1]->i; + const int32_t aTotal = argv[2]->i; -// if (param.count > 0) -// { -// param.data = new ParameterData[param.count]; -// param.ranges = new ParameterRanges[param.count]; -// params = new BridgeParamInfo[param.count]; -// } -// else -// { -// param.data = nullptr; -// param.ranges = nullptr; -// params = nullptr; -// } + info.aIns = aIns; + info.aOuts = aOuts; -// // initialize -// for (uint32_t i=0; i < param.count; i++) -// { -// param.data[i].type = PARAMETER_UNKNOWN; -// param.data[i].index = -1; -// param.data[i].rindex = -1; -// param.data[i].hints = 0; -// param.data[i].midiChannel = 0; -// param.data[i].midiCC = -1; - -// param.ranges[i].def = 0.0; -// param.ranges[i].min = 0.0; -// param.ranges[i].max = 1.0; -// param.ranges[i].step = 0.01; -// param.ranges[i].stepSmall = 0.0001; -// param.ranges[i].stepLarge = 0.1; - -// params[i].value = 0.0; -// params[i].name = QString(); -// params[i].unit = QString(); -// } + break; + Q_UNUSED(aTotal); + } -// break; -// Q_UNUSED(pIns); -// Q_UNUSED(pOuts); -// } + case PluginBridgeMidiCount: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(3, "iii"); -// case PluginBridgeProgramCount: -// { -// int count = argv[0]->i; + const int32_t mIns = argv[0]->i; + const int32_t mOuts = argv[1]->i; + const int32_t mTotal = argv[2]->i; -// // Delete old programs -// if (prog.count > 0) -// { -// for (uint32_t i=0; i < prog.count; i++) -// free((void*)prog.names[i]); + info.mIns = mIns; + info.mOuts = mOuts; -// delete[] prog.names; -// } + break; + Q_UNUSED(mTotal); + } -// prog.count = 0; -// prog.names = nullptr; + case PluginBridgeParameterCount: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(3, "iii"); -// // Query new programs -// prog.count = count; + const int32_t pIns = argv[0]->i; + const int32_t pOuts = argv[1]->i; + const int32_t pTotal = argv[2]->i; -// if (prog.count > 0) -// prog.names = new const char* [prog.count]; + // delete old data + if (param.count > 0) + { + delete[] param.data; + delete[] param.ranges; + delete[] params; + } -// // Update names (NULL) -// for (uint32_t i=0; i < prog.count; i++) -// prog.names[i] = nullptr; + // create new if needed + param.count = (pTotal < (int32_t)carlaOptions.maxParameters) ? pTotal : 0; -// break; -// } + if (param.count > 0) + { + param.data = new ParameterData[param.count]; + param.ranges = new ParameterRanges[param.count]; + params = new BridgeParamInfo[param.count]; + } + else + { + param.data = nullptr; + param.ranges = nullptr; + params = nullptr; + } -// case PluginBridgeMidiProgramCount: -// { -// int count = argv[0]->i; + break; + Q_UNUSED(pIns); + Q_UNUSED(pOuts); + } -// // Delete old programs -// if (midiprog.count > 0) -// { -// for (uint32_t i=0; i < midiprog.count; i++) -// free((void*)midiprog.data[i].name); + case PluginBridgeProgramCount: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(1, "i"); -// delete[] midiprog.data; -// } + const int32_t count = argv[0]->i; -// midiprog.count = 0; -// midiprog.data = nullptr; + // Delete old programs + if (prog.count > 0) + { + for (uint32_t i=0; i < prog.count; i++) + { + if (prog.names[i]) + free((void*)prog.names[i]); + } -// // Query new programs -// midiprog.count = count; + delete[] prog.names; + } -// if (midiprog.count > 0) -// midiprog.data = new midi_program_t [midiprog.count]; + prog.count = 0; + prog.names = nullptr; -// // Update data (NULL) -// for (uint32_t i=0; i < midiprog.count; i++) -// { -// midiprog.data[i].bank = 0; -// midiprog.data[i].program = 0; -// midiprog.data[i].name = nullptr; -// } + // Query new programs + prog.count = count; + + if (prog.count > 0) + prog.names = new const char* [prog.count]; + + // Update names (NULL) + for (uint32_t i=0; i < prog.count; i++) + prog.names[i] = nullptr; + + break; + } + + case PluginBridgeMidiProgramCount: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(1, "i"); + + const int32_t count = argv[0]->i; -// break; -// } + // Delete old programs + if (midiprog.count > 0) + { + for (uint32_t i=0; i < midiprog.count; i++) + { + if (midiprog.data[i].name) + free((void*)midiprog.data[i].name); + } + + delete[] midiprog.data; + } + + midiprog.count = 0; + midiprog.data = nullptr; + + // Query new programs + midiprog.count = count; + + if (midiprog.count > 0) + midiprog.data = new midi_program_t [midiprog.count]; + + break; + } case PluginBridgePluginInfo: { - int category = argv[0]->i; - int hints = argv[1]->i; - const char* name = (const char*)&argv[2]->s; - const char* label = (const char*)&argv[3]->s; - const char* maker = (const char*)&argv[4]->s; - const char* copyright = (const char*)&argv[5]->s; - long uniqueId = argv[6]->i; + CARLA_BRIDGE_CHECK_OSC_TYPES(7, "iissssh"); + + const int32_t category = argv[0]->i; + const int32_t hints = argv[1]->i; + const char* const name = (const char*)&argv[2]->s; + const char* const label = (const char*)&argv[3]->s; + const char* const maker = (const char*)&argv[4]->s; + const char* const copyright = (const char*)&argv[5]->s; + const int64_t uniqueId = argv[6]->i; + + Q_ASSERT(name); + Q_ASSERT(label); + Q_ASSERT(maker); + Q_ASSERT(copyright); m_hints = hints | PLUGIN_IS_BRIDGE; info.category = (PluginCategory)category; @@ -397,108 +414,188 @@ public: break; } -// case PluginBridgeParameterInfo: -// { -// int index = argv[0]->i; -// const char* name = (const char*)&argv[1]->s; -// const char* unit = (const char*)&argv[2]->s; + case PluginBridgeParameterInfo: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(3, "iss"); -// if (index >= 0 && index < (int32_t)param.count) -// { -// params[index].name = QString(name); -// params[index].unit = QString(unit); -// } + const int32_t index = argv[0]->i; + const char* const name = (const char*)&argv[1]->s; + const char* const unit = (const char*)&argv[2]->s; -// break; -// } + Q_ASSERT(index >= 0 && index < (int32_t)param.count); + Q_ASSERT(name); + Q_ASSERT(unit); -// case PluginBridgeParameterDataInfo: -// { -// int index = argv[0]->i; -// int type = argv[1]->i; -// int rindex = argv[2]->i; -// int hints = argv[3]->i; -// int channel = argv[4]->i; -// int cc = argv[5]->i; + if (index >= 0 && index < (int32_t)param.count) + { + params[index].name = QString(name); + params[index].unit = QString(unit); + } + break; + } -// if (index >= 0 && index < (int32_t)param.count) -// { -// param.data[index].type = (ParameterType)type; -// param.data[index].index = index; -// param.data[index].rindex = rindex; -// param.data[index].hints = hints; -// param.data[index].midiChannel = channel; -// param.data[index].midiCC = cc; -// } + case PluginBridgeParameterData: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(6, "iiiiii"); -// break; -// } + const int32_t index = argv[0]->i; + const int32_t type = argv[1]->i; + const int32_t rindex = argv[2]->i; + const int32_t hints = argv[3]->i; + const int32_t channel = argv[4]->i; + const int32_t cc = argv[5]->i; -// case PluginBridgeParameterRangesInfo: -// { -// int index = argv[0]->i; -// float def = argv[1]->f; -// float min = argv[2]->f; -// float max = argv[3]->f; -// float step = argv[4]->f; -// float stepSmall = argv[5]->f; -// float stepLarge = argv[6]->f; + Q_ASSERT(index >= 0 && index < (int32_t)param.count); -// if (index >= 0 && index < (int32_t)param.count) -// { -// param.ranges[index].def = def; -// param.ranges[index].min = min; -// param.ranges[index].max = max; -// param.ranges[index].step = step; -// param.ranges[index].stepSmall = stepSmall; -// param.ranges[index].stepLarge = stepLarge; -// } + if (index >= 0 && index < (int32_t)param.count) + { + param.data[index].type = (ParameterType)type; + param.data[index].index = index; + param.data[index].rindex = rindex; + param.data[index].hints = hints; + param.data[index].midiChannel = channel; + param.data[index].midiCC = cc; + } -// break; -// } + break; + } -// case PluginBridgeProgramInfo: -// { -// int index = argv[0]->i; -// const char* name = (const char*)&argv[1]->s; + case PluginBridgeParameterRanges: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(7, "idddddd"); -// if (index >= 0 && index < (int32_t)prog.count) -// prog.names[index] = strdup(name); + const int32_t index = argv[0]->i; + const double def = argv[1]->d; + const double min = argv[2]->d; + const double max = argv[3]->d; + const double step = argv[4]->d; + const double stepSmall = argv[5]->d; + const double stepLarge = argv[6]->d; -// break; -// } + Q_ASSERT(index >= 0 && index < (int32_t)param.count); -// case PluginBridgeMidiProgramInfo: -// { -// int index = argv[0]->i; -// int bank = argv[1]->i; -// int program = argv[2]->i; -// const char* name = (const char*)&argv[3]->s; + if (index >= 0 && index < (int32_t)param.count) + { + param.ranges[index].def = def; + param.ranges[index].min = min; + param.ranges[index].max = max; + param.ranges[index].step = step; + param.ranges[index].stepSmall = stepSmall; + param.ranges[index].stepLarge = stepLarge; + params[index].value = def; + } -// if (index >= 0 && index < (int32_t)midiprog.count) -// { -// midiprog.data[index].bank = bank; -// midiprog.data[index].program = program; -// midiprog.data[index].name = strdup(name); -// } + break; + } + + case PluginBridgeProgramInfo: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(2, "is"); + + const int32_t index = argv[0]->i; + const char* const name = (const char*)&argv[1]->s; + + Q_ASSERT(name); + + if (index >= 0 && index < (int32_t)prog.count) + { + if (prog.names[index]) + free((void*)prog.names[index]); + + prog.names[index] = strdup(name); + } + + break; + } -// break; -// } + case PluginBridgeMidiProgramInfo: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(4, "iiis"); + + const int32_t index = argv[0]->i; + const int32_t bank = argv[1]->i; + const int32_t program = argv[2]->i; + const char* const name = (const char*)&argv[3]->s; + + Q_ASSERT(name); + + if (index >= 0 && index < (int32_t)midiprog.count) + { + if (midiprog.data[index].name) + free((void*)midiprog.data[index].name); + + midiprog.data[index].bank = bank; + midiprog.data[index].program = program; + midiprog.data[index].name = strdup(name); + } + + break; + } + + case PluginBridgeSetParameterValue: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(2, "id"); + + const int32_t index = argv[0]->i; + const double value = argv[1]->d; + + setParameterValueByRIndex(index, value, false, true, true); -// case PluginBridgeCustomData: -// { + break; + } + + case PluginBridgeSetDefaultValue: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(2, "id"); + + const int32_t index = argv[0]->i; + const double value = argv[1]->d; + + + Q_ASSERT(index >= 0 && index < (int32_t)param.count); + + if (index >= 0 && index < (int32_t)param.count) + param.ranges[index].def = value; + + break; + } + + case PluginBridgeSetProgram: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(1, "i"); + + const int32_t index = argv[0]->i; + + setProgram(index, false, true, true, true); + + break; + } + + case PluginBridgeSetMidiProgram: + { + CARLA_BRIDGE_CHECK_OSC_TYPES(1, "i"); + + const int32_t index = argv[0]->i; + + setMidiProgram(index, false, true, true, true); + + break; + } + + case PluginBridgeSetCustomData: + { // const char* stype = (const char*)&argv[0]->s; // const char* key = (const char*)&argv[1]->s; // const char* value = (const char*)&argv[2]->s; // setCustomData(getCustomDataStringType(stype), key, value, false); -// break; -// } + break; + } -// case PluginBridgeChunkData: -// { + case PluginBridgeSetChunkData: + { // const char* const filePath = (const char*)&argv[0]->s; // QFile file(filePath); @@ -508,8 +605,8 @@ public: // file.remove(); // } -// break; -// } + break; + } case PluginBridgeUpdateNow: m_initiated = true; @@ -526,7 +623,7 @@ public: // ------------------------------------------------------------------- // Set data (plugin-specific stuff) - void setParameterValue(uint32_t parameterId, double value, bool sendGui, bool sendOsc, bool sendCallback) + void setParameterValue(const uint32_t parameterId, double value, const bool sendGui, const bool sendOsc, const bool sendCallback) { Q_ASSERT(parameterId < param.count); @@ -535,7 +632,7 @@ public: CarlaPlugin::setParameterValue(parameterId, value, sendGui, sendOsc, sendCallback); } - void setCustomData(CustomDataType type, const char* const key, const char* const value, bool sendGui) + void setCustomData(const CustomDataType type, const char* const key, const char* const value, const bool sendGui) { Q_ASSERT(key); Q_ASSERT(value); @@ -560,7 +657,7 @@ public: Q_ASSERT(stringData); QString filePath; - filePath += "/tmp/.CarlaChunk_"; + filePath += "/tmp/.CarlaChunk_"; // FIXME - cross-platform filePath += m_name; QFile file(filePath); @@ -593,11 +690,11 @@ public: m_saved = false; osc_send_configure(&osc.data, CARLA_BRIDGE_MSG_SAVE_NOW, ""); - for (int i=0; i < 100; i++) + for (int i=0; i < 200; i++) { if (m_saved) break; - carla_msleep(100); + carla_msleep(50); } if (! m_saved) @@ -613,6 +710,11 @@ public: { Q_ASSERT(index < param.count); + if (index >= param.count) + return; + if (! osc.data.target) + return; + osc_send_control(&osc.data, param.data[index].rindex, value); } @@ -620,6 +722,11 @@ public: { Q_ASSERT(index < prog.count); + if (index >= prog.count) + return; + if (! osc.data.target) + return; + osc_send_program(&osc.data, index); } @@ -627,6 +734,11 @@ public: { Q_ASSERT(index < midiprog.count); + if (index >= midiprog.count) + return; + if (! osc.data.target) + return; + osc_send_midi_program(&osc.data, index); } @@ -636,10 +748,14 @@ public: Q_ASSERT(note < 128); Q_ASSERT(velo > 0 && velo < 128); - // TODO - Q_UNUSED(channel); - Q_UNUSED(note); - Q_UNUSED(velo); + if (! osc.data.target) + return; + + uint8_t midiData[4] = { 0 }; + midiData[1] = MIDI_STATUS_NOTE_ON + channel; + midiData[2] = note; + midiData[3] = velo; + osc_send_midi(&osc.data, midiData); } void uiNoteOff(const uint8_t channel, const uint8_t note) @@ -647,9 +763,13 @@ public: Q_ASSERT(channel < 16); Q_ASSERT(note < 128); - // TODO - Q_UNUSED(channel); - Q_UNUSED(note); + if (! osc.data.target) + return; + + uint8_t midiData[4] = { 0 }; + midiData[1] = MIDI_STATUS_NOTE_OFF + channel; + midiData[2] = note; + osc_send_midi(&osc.data, midiData); } // ------------------------------------------------------------------- @@ -717,8 +837,8 @@ private: bool m_saved; struct { - uint32_t ains, aouts; - uint32_t mins, mouts; + uint32_t aIns, aOuts; + uint32_t mIns, mOuts; PluginCategory category; long uniqueId; const char* name; @@ -737,7 +857,7 @@ CarlaPlugin* CarlaPlugin::newBridge(const initializer& init, BinaryType btype, P short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/carla_engine.cpp b/c++/carla-backend/carla_engine.cpp index e6d281b..48f6e72 100644 --- a/c++/carla-backend/carla_engine.cpp +++ b/c++/carla-backend/carla_engine.cpp @@ -22,6 +22,8 @@ CARLA_BACKEND_START_NAMESPACE // ----------------------------------------------------------------------- +unsigned short CarlaEngine::m_maxPluginNumber = 0; + CarlaEngine::CarlaEngine() : m_checkThread(this), #ifndef BUILD_BRIDGE @@ -45,7 +47,7 @@ CarlaEngine::CarlaEngine() name = nullptr; bufferSize = 0; sampleRate = 0.0; - maxPluginNumber = 0; + m_maxPluginNumber = 0; #ifndef Q_COMPILER_INITIALIZER_LISTS for (unsigned short i=0; i < MAX_PLUGINS; i++) @@ -95,6 +97,11 @@ int CarlaEngine::maxPortNameSize() return STR_MAX; } +unsigned short CarlaEngine::maxPluginNumber() +{ + return m_maxPluginNumber; +} + bool CarlaEngine::init(const char* const clientName) { qDebug("CarlaEngine::init(\"%s\")", clientName); @@ -118,7 +125,7 @@ bool CarlaEngine::close() m_osc.close(); #endif - maxPluginNumber = 0; + m_maxPluginNumber = 0; return true; } @@ -130,7 +137,7 @@ short CarlaEngine::getNewPluginId() const { qDebug("CarlaEngine::getNewPluginId()"); - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0; i < m_maxPluginNumber; i++) { if (! m_carlaPlugins[i]) return i; @@ -141,11 +148,11 @@ short CarlaEngine::getNewPluginId() const CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const { - qDebug("CarlaEngine::getPlugin(%i/%i)", id, maxPluginNumber); - Q_ASSERT(maxPluginNumber != 0); - Q_ASSERT(id < maxPluginNumber); + qDebug("CarlaEngine::getPlugin(%i/%i)", id, m_maxPluginNumber); + Q_ASSERT(m_maxPluginNumber != 0); + Q_ASSERT(id < m_maxPluginNumber); - if (id < maxPluginNumber) + if (id < m_maxPluginNumber) return m_carlaPlugins[id]; return nullptr; @@ -153,8 +160,8 @@ CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned short id) const { - Q_ASSERT(maxPluginNumber != 0); - Q_ASSERT(id < maxPluginNumber); + Q_ASSERT(m_maxPluginNumber != 0); + Q_ASSERT(id < m_maxPluginNumber); return m_carlaPlugins[id]; } @@ -171,7 +178,7 @@ const char* CarlaEngine::getUniqueName(const char* const name) qname.truncate(maxClientNameSize()-5-1); // 5 = strlen(" (10)") qname.replace(":", "."); // ":" is used in JACK1 to split client/port names - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0; i < m_maxPluginNumber; i++) { // Check if unique name already exists if (m_uniqueNames[i] && qname == m_uniqueNames[i]) @@ -234,11 +241,11 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con Q_ASSERT(filename); Q_ASSERT(label); - if (maxPluginNumber == 0) + if (m_maxPluginNumber == 0) #ifdef BUILD_BRIDGE - maxPluginNumber = MAX_PLUGINS; + m_maxPluginNumber = MAX_PLUGINS; #else - maxPluginNumber = (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS; + m_maxPluginNumber = (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS; #endif CarlaPlugin::initializer init = { @@ -251,7 +258,7 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con CarlaPlugin* plugin = nullptr; #ifndef BUILD_BRIDGE - if (btype != BINARY_NATIVE) + if (btype != BINARY_NATIVE /*|| true*/) { # ifdef CARLA_ENGINE_JACK if (carlaOptions.processMode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS) @@ -316,7 +323,7 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con m_uniqueNames[id] = plugin->name(); if (! m_checkThread.isRunning()) - m_checkThread.startNow(maxPluginNumber); + m_checkThread.startNow(); return id; } @@ -324,8 +331,8 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con bool CarlaEngine::removePlugin(const unsigned short id) { qDebug("CarlaEngine::removePlugin(%i)", id); - Q_ASSERT(maxPluginNumber != 0); - Q_ASSERT(id < maxPluginNumber); + Q_ASSERT(m_maxPluginNumber != 0); + Q_ASSERT(id < m_maxPluginNumber); CarlaPlugin* const plugin = m_carlaPlugins[id]; @@ -346,7 +353,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) #ifndef BUILD_BRIDGE if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { - for (unsigned short i=id; i < maxPluginNumber-1; i++) + for (unsigned short i=id; i < m_maxPluginNumber-1; i++) { m_carlaPlugins[i] = m_carlaPlugins[i+1]; m_uniqueNames[i] = m_uniqueNames[i+1]; @@ -358,7 +365,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) #endif if (isRunning()) - m_checkThread.startNow(maxPluginNumber); + m_checkThread.startNow(); return true; } @@ -374,7 +381,7 @@ void CarlaEngine::removeAllPlugins() m_checkThread.stopNow(); - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0; i < m_maxPluginNumber; i++) { CarlaPlugin* const plugin = m_carlaPlugins[i]; @@ -390,14 +397,14 @@ void CarlaEngine::removeAllPlugins() } } - maxPluginNumber = 0; + m_maxPluginNumber = 0; } void CarlaEngine::idlePluginGuis() { - Q_ASSERT(maxPluginNumber != 0); + Q_ASSERT(m_maxPluginNumber != 0); - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0; i < m_maxPluginNumber; i++) { CarlaPlugin* const plugin = m_carlaPlugins[i]; @@ -440,7 +447,7 @@ const CarlaTimeInfo* CarlaEngine::getTimeInfo() const double CarlaEngine::getInputPeak(const unsigned short pluginId, const unsigned short id) const { - Q_ASSERT(pluginId < maxPluginNumber); + Q_ASSERT(pluginId < m_maxPluginNumber); Q_ASSERT(id < MAX_PEAKS); return m_insPeak[pluginId*MAX_PEAKS + id]; @@ -448,7 +455,7 @@ double CarlaEngine::getInputPeak(const unsigned short pluginId, const unsigned s double CarlaEngine::getOutputPeak(const unsigned short pluginId, const unsigned short id) const { - Q_ASSERT(pluginId < maxPluginNumber); + Q_ASSERT(pluginId < m_maxPluginNumber); Q_ASSERT(id < MAX_PEAKS); return m_outsPeak[pluginId*MAX_PEAKS + id]; @@ -456,7 +463,7 @@ double CarlaEngine::getOutputPeak(const unsigned short pluginId, const unsigned void CarlaEngine::setInputPeak(const unsigned short pluginId, const unsigned short id, double value) { - Q_ASSERT(pluginId < maxPluginNumber); + Q_ASSERT(pluginId < m_maxPluginNumber); Q_ASSERT(id < MAX_PEAKS); m_insPeak[pluginId*MAX_PEAKS + id] = value; @@ -464,7 +471,7 @@ void CarlaEngine::setInputPeak(const unsigned short pluginId, const unsigned sho void CarlaEngine::setOutputPeak(const unsigned short pluginId, const unsigned short id, double value) { - Q_ASSERT(pluginId < maxPluginNumber); + Q_ASSERT(pluginId < m_maxPluginNumber); Q_ASSERT(id < MAX_PEAKS); m_outsPeak[pluginId*MAX_PEAKS + id] = value; @@ -541,7 +548,7 @@ void CarlaEngine::bufferSizeChanged(uint32_t newBufferSize) bufferSize = newBufferSize; - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0; i < m_maxPluginNumber; i++) { if (m_carlaPlugins[i] && m_carlaPlugins[i]->enabled()) m_carlaPlugins[i]->bufferSizeChanged(newBufferSize); @@ -1105,9 +1112,9 @@ void CarlaEngineMidiPort::writeEvent(uint32_t time, const uint8_t* data, uint8_t #ifndef BUILD_BRIDGE void CarlaEngine::osc_send_control_add_plugin(const int32_t pluginId, const char* const pluginName) { - qDebug("CarlaEngine::osc_send_add_plugin(%i, \"%s\")", pluginId, pluginName); + qDebug("CarlaEngine::osc_send_control_add_plugin(%i, \"%s\")", pluginId, pluginName); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(pluginName); if (m_oscData && m_oscData->target) @@ -1121,7 +1128,7 @@ void CarlaEngine::osc_send_control_add_plugin(const int32_t pluginId, const char void CarlaEngine::osc_send_control_remove_plugin(const int32_t pluginId) { - qDebug("CarlaEngine::osc_send_remove_plugin(%i)", pluginId); + qDebug("CarlaEngine::osc_send_control_remove_plugin(%i)", pluginId); Q_ASSERT(m_oscData); if (m_oscData && m_oscData->target) @@ -1135,9 +1142,9 @@ void CarlaEngine::osc_send_control_remove_plugin(const int32_t pluginId) void CarlaEngine::osc_send_control_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId) { - qDebug("CarlaEngine::osc_send_set_plugin_data(%i, %i, %i, %i, \"%s\", \"%s\", \"%s\", \"%s\", %li)", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId); + qDebug("CarlaEngine::osc_send_control_set_plugin_data(%i, %i, %i, %i, \"%s\", \"%s\", \"%s\", \"%s\", %li)", pluginId, type, category, hints, realName, label, maker, copyright, uniqueId); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(type != PLUGIN_NONE); if (m_oscData && m_oscData->target) @@ -1151,9 +1158,9 @@ void CarlaEngine::osc_send_control_set_plugin_data(const int32_t pluginId, const void CarlaEngine::osc_send_control_set_plugin_ports(const int32_t pluginId, const int32_t audioIns, const int32_t audioOuts, const int32_t midiIns, const int32_t midiOuts, const int32_t cIns, const int32_t cOuts, const int32_t cTotals) { - qDebug("CarlaEngine::osc_send_set_plugin_ports(%i, %i, %i, %i, %i, %i, %i, %i)", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals); + qDebug("CarlaEngine::osc_send_control_set_plugin_ports(%i, %i, %i, %i, %i, %i, %i, %i)", pluginId, audioIns, audioOuts, midiIns, midiOuts, cIns, cOuts, cTotals); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); if (m_oscData && m_oscData->target) { @@ -1166,9 +1173,9 @@ void CarlaEngine::osc_send_control_set_plugin_ports(const int32_t pluginId, cons void CarlaEngine::osc_send_control_set_parameter_data(const int32_t pluginId, const int32_t index, const int32_t type, const int32_t hints, const char* const name, const char* const label, const double current) { - qDebug("CarlaEngine::osc_send_set_parameter_data(%i, %i, %i, %i, \"%s\", \"%s\", %g)", pluginId, index, type, hints, name, label, current); + qDebug("CarlaEngine::osc_send_control_set_parameter_data(%i, %i, %i, %i, \"%s\", \"%s\", %g)", pluginId, index, type, hints, name, label, current); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); Q_ASSERT(type != PARAMETER_UNKNOWN); @@ -1183,9 +1190,9 @@ void CarlaEngine::osc_send_control_set_parameter_data(const int32_t pluginId, co void CarlaEngine::osc_send_control_set_parameter_ranges(const int32_t pluginId, const int32_t index, const double min, const double max, const double def, const double step, const double stepSmall, const double stepLarge) { - qDebug("CarlaEngine::osc_send_set_parameter_ranges(%i, %i, %g, %g, %g, %g, %g, %g)", pluginId, index, min, max, def, step, stepSmall, stepLarge); + qDebug("CarlaEngine::osc_send_control_set_parameter_ranges(%i, %i, %g, %g, %g, %g, %g, %g)", pluginId, index, min, max, def, step, stepSmall, stepLarge); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); Q_ASSERT(min < max); @@ -1200,9 +1207,9 @@ void CarlaEngine::osc_send_control_set_parameter_ranges(const int32_t pluginId, void CarlaEngine::osc_send_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc) { - qDebug("CarlaEngine::osc_send_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc); + qDebug("CarlaEngine::osc_send_control_set_parameter_midi_cc(%i, %i, %i)", pluginId, index, cc); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); if (m_oscData && m_oscData->target) @@ -1216,9 +1223,9 @@ void CarlaEngine::osc_send_control_set_parameter_midi_cc(const int32_t pluginId, void CarlaEngine::osc_send_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel) { - qDebug("CarlaEngine::osc_send_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel); + qDebug("CarlaEngine::osc_send_control_set_parameter_midi_channel(%i, %i, %i)", pluginId, index, channel); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); Q_ASSERT(channel >= 0 && channel < 16); @@ -1234,13 +1241,13 @@ void CarlaEngine::osc_send_control_set_parameter_midi_channel(const int32_t plug void CarlaEngine::osc_send_control_set_parameter_value(const int32_t pluginId, const int32_t index, const double value) { #if DEBUG - if (index < 0) - qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %s, %g)", pluginId, InternalParametersIndex2str((InternalParametersIndex)index), value); + if (index < -1) + qDebug("CarlaEngine::osc_send_control_set_parameter_value(%i, %s, %g)", pluginId, InternalParametersIndex2str((InternalParametersIndex)index), value); else - qDebug("CarlaEngine::osc_send_set_parameter_value(%i, %i, %g)", pluginId, index, value); + qDebug("CarlaEngine::osc_send_control_set_parameter_value(%i, %i, %g)", pluginId, index, value); #endif Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); if (m_oscData && m_oscData->target) { @@ -1253,9 +1260,9 @@ void CarlaEngine::osc_send_control_set_parameter_value(const int32_t pluginId, c void CarlaEngine::osc_send_control_set_default_value(const int32_t pluginId, const int32_t index, const double value) { - qDebug("CarlaEngine::osc_send_set_default_value(%i, %i, %g)", pluginId, index, value); + qDebug("CarlaEngine::osc_send_control_set_default_value(%i, %i, %g)", pluginId, index, value); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); if (m_oscData && m_oscData->target) @@ -1269,9 +1276,9 @@ void CarlaEngine::osc_send_control_set_default_value(const int32_t pluginId, con void CarlaEngine::osc_send_control_set_program(const int32_t pluginId, const int32_t index) { - qDebug("CarlaEngine::osc_send_set_program(%i, %i)", pluginId, index); + qDebug("CarlaEngine::osc_send_control_set_program(%i, %i)", pluginId, index); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); if (m_oscData && m_oscData->target) { @@ -1284,9 +1291,9 @@ void CarlaEngine::osc_send_control_set_program(const int32_t pluginId, const int void CarlaEngine::osc_send_control_set_program_count(const int32_t pluginId, const int32_t count) { - qDebug("CarlaEngine::osc_send_set_program_count(%i, %i)", pluginId, count); + qDebug("CarlaEngine::osc_send_control_set_program_count(%i, %i)", pluginId, count); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(count >= 0); if (m_oscData && m_oscData->target) @@ -1300,9 +1307,9 @@ void CarlaEngine::osc_send_control_set_program_count(const int32_t pluginId, con void CarlaEngine::osc_send_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name) { - qDebug("CarlaEngine::osc_send_set_program_name(%i, %i, %s)", pluginId, index, name); + qDebug("CarlaEngine::osc_send_control_set_program_name(%i, %i, %s)", pluginId, index, name); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); Q_ASSERT(name); @@ -1317,9 +1324,9 @@ void CarlaEngine::osc_send_control_set_program_name(const int32_t pluginId, cons void CarlaEngine::osc_send_control_set_midi_program(const int32_t pluginId, const int32_t index) { - qDebug("CarlaEngine::osc_send_set_midi_program(%i, %i)", pluginId, index); + qDebug("CarlaEngine::osc_send_control_set_midi_program(%i, %i)", pluginId, index); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); if (m_oscData && m_oscData->target) { @@ -1332,9 +1339,9 @@ void CarlaEngine::osc_send_control_set_midi_program(const int32_t pluginId, cons void CarlaEngine::osc_send_control_set_midi_program_count(const int32_t pluginId, const int32_t count) { - qDebug("CarlaEngine::osc_send_set_midi_program_count(%i, %i)", pluginId, count); + qDebug("CarlaEngine::osc_send_control_set_midi_program_count(%i, %i)", pluginId, count); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(count >= 0); if (m_oscData && m_oscData->target) @@ -1348,9 +1355,9 @@ void CarlaEngine::osc_send_control_set_midi_program_count(const int32_t pluginId void CarlaEngine::osc_send_control_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name) { - qDebug("CarlaEngine::osc_send_set_midi_program_data(%i, %i, %i, %i, %s)", pluginId, index, bank, program, name); + qDebug("CarlaEngine::osc_send_control_set_midi_program_data(%i, %i, %i, %i, %s)", pluginId, index, bank, program, name); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(index >= 0); Q_ASSERT(bank >= 0); Q_ASSERT(program >= 0); @@ -1367,9 +1374,9 @@ void CarlaEngine::osc_send_control_set_midi_program_data(const int32_t pluginId, void CarlaEngine::osc_send_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo) { - qDebug("CarlaEngine::osc_send_note_on(%i, %i, %i, %i)", pluginId, channel, note, velo); + qDebug("CarlaEngine::osc_send_control_note_on(%i, %i, %i, %i)", pluginId, channel, note, velo); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(channel >= 0 && channel < 16); Q_ASSERT(note >= 0 && note < 128); Q_ASSERT(velo > 0 && velo < 128); @@ -1385,9 +1392,9 @@ void CarlaEngine::osc_send_control_note_on(const int32_t pluginId, const int32_t void CarlaEngine::osc_send_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note) { - qDebug("CarlaEngine::osc_send_note_off(%i, %i, %i)", pluginId, channel, note); + qDebug("CarlaEngine::osc_send_control_note_off(%i, %i, %i)", pluginId, channel, note); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(channel >= 0 && channel < 16); Q_ASSERT(note >= 0 && note < 128); @@ -1402,9 +1409,9 @@ void CarlaEngine::osc_send_control_note_off(const int32_t pluginId, const int32_ void CarlaEngine::osc_send_control_set_input_peak_value(const int32_t pluginId, const int32_t portId, const double value) { - qDebug("CarlaEngine::osc_send_set_input_peak_value(%i, %i, %g)", pluginId, portId, value); + qDebug("CarlaEngine::osc_send_control_set_input_peak_value(%i, %i, %g)", pluginId, portId, value); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(portId == 1 || portId == 2); if (m_oscData && m_oscData->target) @@ -1418,9 +1425,9 @@ void CarlaEngine::osc_send_control_set_input_peak_value(const int32_t pluginId, void CarlaEngine::osc_send_control_set_output_peak_value(const int32_t pluginId, const int32_t portId, const double value) { - qDebug("CarlaEngine::osc_send_set_output_peak_value(%i, %i, %g)", pluginId, portId, value); + qDebug("CarlaEngine::osc_send_control_set_output_peak_value(%i, %i, %g)", pluginId, portId, value); Q_ASSERT(m_oscData); - Q_ASSERT(pluginId >= 0 && pluginId < maxPluginNumber); + Q_ASSERT(pluginId >= 0 && pluginId < m_maxPluginNumber); Q_ASSERT(portId == 1 || portId == 2); if (m_oscData && m_oscData->target) @@ -1434,7 +1441,7 @@ void CarlaEngine::osc_send_control_set_output_peak_value(const int32_t pluginId, void CarlaEngine::osc_send_control_exit() { - qDebug("CarlaEngine::osc_send_exit()"); + qDebug("CarlaEngine::osc_send_control_exit()"); Q_ASSERT(m_oscData); if (m_oscData && m_oscData->target) @@ -1532,53 +1539,53 @@ void CarlaEngine::osc_send_bridge_plugin_info(const int32_t category, const int3 if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+20]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_plugin_info"); lo_send(m_oscData->target, target_path, "iissssh", category, hints, name, label, maker, copyright, uniqueId); } } -void CarlaEngine::osc_send_bridge_param_info(const int32_t index, const char* const name, const char* const unit) +void CarlaEngine::osc_send_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit) { - qDebug("CarlaEngine::osc_send_bridge_param_info(%i, \"%s\", \"%s\")", index, name, unit); + qDebug("CarlaEngine::osc_send_bridge_parameter_info(%i, \"%s\", \"%s\")", index, name, unit); Q_ASSERT(m_oscData); Q_ASSERT(name); Q_ASSERT(unit); if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+23]; strcpy(target_path, m_oscData->path); - strcat(target_path, "/bridge_param_info"); + strcat(target_path, "/bridge_parameter_info"); lo_send(m_oscData->target, target_path, "iss", index, name, unit); } } -void CarlaEngine::osc_send_bridge_param_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC) +void CarlaEngine::osc_send_bridge_parameter_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC) { - qDebug("CarlaEngine::osc_send_bridge_param_data(%i, %i, %i, %i, %i, %i)", index, type, rindex, hints, midiChannel, midiCC); + qDebug("CarlaEngine::osc_send_bridge_parameter_data(%i, %i, %i, %i, %i, %i)", index, type, rindex, hints, midiChannel, midiCC); Q_ASSERT(m_oscData); if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+23]; strcpy(target_path, m_oscData->path); - strcat(target_path, "/bridge_param_data"); + strcat(target_path, "/bridge_parameter_data"); lo_send(m_oscData->target, target_path, "iiiiii", index, type, rindex, hints, midiChannel, midiCC); } } -void CarlaEngine::osc_send_bridge_param_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge) +void CarlaEngine::osc_send_bridge_parameter_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge) { - qDebug("CarlaEngine::osc_send_bridge_param_ranges(%i, %g, %g, %g, %g, %g, %g)", index, def, min, max, step, stepSmall, stepLarge); + qDebug("CarlaEngine::osc_send_bridge_parameter_ranges(%i, %g, %g, %g, %g, %g, %g)", index, def, min, max, step, stepSmall, stepLarge); Q_ASSERT(m_oscData); if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+25]; strcpy(target_path, m_oscData->path); - strcat(target_path, "/bridge_param_ranges"); + strcat(target_path, "/bridge_parameter_ranges"); lo_send(m_oscData->target, target_path, "idddddd", index, def, min, max, step, stepSmall, stepLarge); } } @@ -1590,9 +1597,9 @@ void CarlaEngine::osc_send_bridge_program_info(const int32_t index, const char* if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+21]; strcpy(target_path, m_oscData->path); - strcat(target_path, "/bridge_midi_program_info"); + strcat(target_path, "/bridge_program_info"); lo_send(m_oscData->target, target_path, "is", index, name); } } @@ -1604,7 +1611,7 @@ void CarlaEngine::osc_send_bridge_midi_program_info(const int32_t index, const i if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+26]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_midi_program_info"); lo_send(m_oscData->target, target_path, "iiis", index, bank, program, label); @@ -1618,7 +1625,7 @@ void CarlaEngine::osc_send_bridge_set_parameter_value(const int32_t index, const if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+28]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_set_parameter_value"); lo_send(m_oscData->target, target_path, "id", index, value); @@ -1632,7 +1639,7 @@ void CarlaEngine::osc_send_bridge_set_default_value(const int32_t index, const d if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+26]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_set_default_value"); lo_send(m_oscData->target, target_path, "id", index, value); @@ -1646,7 +1653,7 @@ void CarlaEngine::osc_send_bridge_set_program(const int32_t index) if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+20]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_set_program"); lo_send(m_oscData->target, target_path, "i", index); @@ -1660,12 +1667,40 @@ void CarlaEngine::osc_send_bridge_set_midi_program(const int32_t index) if (m_oscData && m_oscData->target) { - char target_path[strlen(m_oscData->path)+27]; + char target_path[strlen(m_oscData->path)+25]; strcpy(target_path, m_oscData->path); strcat(target_path, "/bridge_set_midi_program"); lo_send(m_oscData->target, target_path, "i", index); } } + +void CarlaEngine::osc_send_bridge_set_input_peak_value(const int32_t portId, const double value) +{ + Q_ASSERT(m_oscData); + Q_ASSERT(portId == 1 || portId == 2); + + if (m_oscData && m_oscData->target) + { + char target_path[strlen(m_oscData->path)+28]; + strcpy(target_path, m_oscData->path); + strcat(target_path, "/bridge_set_input_peak_value"); + lo_send(m_oscData->target, target_path, "id", portId, value); + } +} + +void CarlaEngine::osc_send_bridge_set_output_peak_value(const int32_t portId, const double value) +{ + Q_ASSERT(m_oscData); + Q_ASSERT(portId == 1 || portId == 2); + + if (m_oscData && m_oscData->target) + { + char target_path[strlen(m_oscData->path)+29]; + strcpy(target_path, m_oscData->path); + strcat(target_path, "/bridge_set_output_peak_value"); + lo_send(m_oscData->target, target_path, "id", portId, value); + } +} #endif CARLA_BACKEND_END_NAMESPACE diff --git a/c++/carla-backend/carla_engine.h b/c++/carla-backend/carla_engine.h index d37a253..9fcd73c 100644 --- a/c++/carla-backend/carla_engine.h +++ b/c++/carla-backend/carla_engine.h @@ -192,6 +192,7 @@ public: static int maxClientNameSize(); static int maxPortNameSize(); + static unsigned short maxPluginNumber(); // ------------------------------------------------------------------- // Virtual, per-engine type calls @@ -270,20 +271,19 @@ public: void osc_send_bridge_program_count(const int32_t count); void osc_send_bridge_midi_program_count(const int32_t count); void osc_send_bridge_plugin_info(const int32_t category, const int32_t hints, const char* const name, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); - void osc_send_bridge_param_info(const int32_t index, const char* const name, const char* const unit); - void osc_send_bridge_param_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC); - void osc_send_bridge_param_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge); + void osc_send_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit); + void osc_send_bridge_parameter_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC); + void osc_send_bridge_parameter_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge); void osc_send_bridge_program_info(const int32_t index, const char* const name); void osc_send_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label); void osc_send_bridge_set_parameter_value(const int32_t index, const double value); void osc_send_bridge_set_default_value(const int32_t index, const double value); void osc_send_bridge_set_program(const int32_t index); void osc_send_bridge_set_midi_program(const int32_t index); - //void osc_send_bridge_program(const int32_t index); - //void osc_send_bridge_midi_program(const int32_t index); + void osc_send_bridge_set_input_peak_value(const int32_t portId, const double value); + void osc_send_bridge_set_output_peak_value(const int32_t portId, const double value); //void osc_send_bridge_custom_data(const char* const stype, const char* const key, const char* const value); //void osc_send_bridge_chunk_data(const char* const stringData); - //void osc_send_bridge_update(); #else void osc_send_control_add_plugin(const int32_t pluginId, const char* const pluginName); void osc_send_control_remove_plugin(const int32_t pluginId); @@ -366,7 +366,6 @@ protected: uint32_t bufferSize; double sampleRate; CarlaTimeInfo timeInfo; - unsigned short maxPluginNumber; void bufferSizeChanged(uint32_t newBufferSize); @@ -389,6 +388,8 @@ private: double m_insPeak[MAX_PLUGINS * MAX_PEAKS]; double m_outsPeak[MAX_PLUGINS * MAX_PEAKS]; + + static unsigned short m_maxPluginNumber; }; // ----------------------------------------------------------------------- diff --git a/c++/carla-backend/carla_engine_jack.cpp b/c++/carla-backend/carla_engine_jack.cpp index db76709..7365ef5 100644 --- a/c++/carla-backend/carla_engine_jack.cpp +++ b/c++/carla-backend/carla_engine_jack.cpp @@ -266,7 +266,7 @@ void CarlaEngineJack::handleFreewheelCallback(bool isFreewheel) void CarlaEngineJack::handleProcessCallback(uint32_t nframes) { - if (maxPluginNumber == 0) + if (maxPluginNumber() == 0) return; state = jackbridge_transport_query(client, &pos); @@ -302,7 +302,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) #ifndef BUILD_BRIDGE if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT) { - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0, max=maxPluginNumber(); i < max; i++) { CarlaPlugin* const plugin = getPluginUnchecked(i); @@ -436,7 +436,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) bool processed = false; // process plugins - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0, max=maxPluginNumber(); i < max; i++) { CarlaPlugin* const plugin = getPluginUnchecked(i); @@ -581,7 +581,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) void CarlaEngineJack::handleShutdownCallback() { - //for (unsigned short i=0; i < maxPluginNumber; i++) + //for (unsigned short i=0, max=maxPluginNumber(); i < max; i++) //{ //CarlaPlugin* const plugin = getPluginUnchecked(i); //plugin->x_client diff --git a/c++/carla-backend/carla_engine_rtaudio.cpp b/c++/carla-backend/carla_engine_rtaudio.cpp index 86a3383..edc0a67 100644 --- a/c++/carla-backend/carla_engine_rtaudio.cpp +++ b/c++/carla-backend/carla_engine_rtaudio.cpp @@ -42,8 +42,6 @@ CarlaEngineRtAudio::CarlaEngineRtAudio(RtAudio::Api api) qDebug("CarlaEngineRtAudio::CarlaEngineRtAudio()"); type = CarlaEngineTypeRtAudio; - - procThread = nullptr; } CarlaEngineRtAudio::~CarlaEngineRtAudio() @@ -55,8 +53,6 @@ bool CarlaEngineRtAudio::init(const char* const clientName) { qDebug("CarlaEngineRtAudio::init(\"%s\")", clientName); - procThread = nullptr; - if (adac.getDeviceCount() < 1) { setLastError("No audio devices available"); @@ -134,11 +130,6 @@ bool CarlaEngineRtAudio::close() return true; } -bool CarlaEngineRtAudio::isOnAudioThread() -{ - return (QThread::currentThread() == procThread); -} - bool CarlaEngineRtAudio::isOffline() { return false; @@ -180,10 +171,7 @@ CarlaEngineClient* CarlaEngineRtAudio::addClient(CarlaPlugin* const plugin) void CarlaEngineRtAudio::handleProcessCallback(void* outputBuffer, void* inputBuffer, unsigned int nframes, double streamTime, RtAudioStreamStatus status) { - if (procThread == nullptr) - procThread = QThread::currentThread(); - - if (maxPluginNumber == 0) + if (maxPluginNumber() == 0) return; // get buffers from RtAudio @@ -233,7 +221,7 @@ void CarlaEngineRtAudio::handleProcessCallback(void* outputBuffer, void* inputBu bool processed = false; // process plugins - for (unsigned short i=0; i < maxPluginNumber; i++) + for (unsigned short i=0, max=maxPluginNumber(); i < max; i++) { CarlaPlugin* const plugin = getPluginUnchecked(i); diff --git a/c++/carla-backend/carla_osc.cpp b/c++/carla-backend/carla_osc.cpp index 2a34bef..824449a 100644 --- a/c++/carla-backend/carla_osc.cpp +++ b/c++/carla-backend/carla_osc.cpp @@ -91,7 +91,11 @@ void CarlaOsc::close() int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg* const* const argv, const char* const types, const lo_message msg) { - qDebug("CarlaOsc::handleMessage(%s, %i, %p, %s, %p)", path, argc, argv, types, msg); +#if DEBUG + if (! QString(path).contains("put_peak_value")) + qDebug("CarlaOsc::handleMessage(%s, %i, %p, %s, %p)", path, argc, argv, types, msg); +#endif + Q_ASSERT(m_serverThread); Q_ASSERT(path); @@ -122,14 +126,14 @@ int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg if (std::isdigit(path[m_name_len+3])) pluginId += (path[m_name_len+3]-'0')*10; - if (pluginId < 0 || pluginId > CarlaBackend::MAX_PLUGINS) + if (pluginId < 0 || pluginId > CarlaEngine::maxPluginNumber()) { qCritical("CarlaOsc::handleMessage() - failed to get plugin, wrong id -> %i", pluginId); return 1; } // Get plugin - CarlaBackend::CarlaPlugin* const plugin = engine->getPlugin(pluginId); + CarlaPlugin* const plugin = engine->getPluginUnchecked(pluginId); if (plugin == nullptr || plugin->id() != pluginId) { @@ -142,8 +146,6 @@ int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg char method[32] = { 0 }; memcpy(method, path + (m_name_len + offset), 32); - qWarning("CarlaOsc::handleMessage() method: %s", method); - // Common OSC methods if (strcmp(method, "/update") == 0) { @@ -194,42 +196,48 @@ int CarlaOsc::handleMessage(const char* const path, const int argc, const lo_arg return handle_lv2_event_transfer(plugin, argc, argv, types); // Plugin Bridges - if (plugin->hints() & CarlaBackend::PLUGIN_IS_BRIDGE) + if (plugin->hints() & PLUGIN_IS_BRIDGE) { - qWarning("CarlaOsc::handleMessage() TO PLUGIN"); - - if (strcmp(method, "/bridge_ains_peak") == 0) - return handle_bridge_ains_peak(plugin, argc, argv, types); - if (strcmp(method, "/bridge_aouts_peak") == 0) - return handle_bridge_aouts_peak(plugin, argc, argv, types); + if (strcmp(method, "/bridge_set_input_peak_value") == 0) + return handle_bridge_set_input_peak_value(plugin, argc, argv, types); + if (strcmp(method, "/bridge_set_output_peak_value") == 0) + return handle_bridge_set_output_peak_value(plugin, argc, argv, types); if (strcmp(method, "/bridge_audio_count") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeAudioCount, argv); + return plugin->setOscBridgeInfo(PluginBridgeAudioCount, argc, argv, types); if (strcmp(method, "/bridge_midi_count") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeMidiCount, argv); - if (strcmp(method, "/bridge_param_count") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeParameterCount, argv); + return plugin->setOscBridgeInfo(PluginBridgeMidiCount, argc, argv, types); + if (strcmp(method, "/bridge_parameter_count") == 0) + return plugin->setOscBridgeInfo(PluginBridgeParameterCount, argc, argv, types); if (strcmp(method, "/bridge_program_count") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeProgramCount, argv); + return plugin->setOscBridgeInfo(PluginBridgeProgramCount, argc, argv, types); if (strcmp(method, "/bridge_midi_program_count") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeMidiProgramCount, argv); + return plugin->setOscBridgeInfo(PluginBridgeMidiProgramCount, argc, argv, types); if (strcmp(method, "/bridge_plugin_info") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgePluginInfo, argv); - if (strcmp(method, "/bridge_param_info") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeParameterInfo, argv); - if (strcmp(method, "/bridge_param_data") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeParameterDataInfo, argv); - if (strcmp(method, "/bridge_param_ranges") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeParameterRangesInfo, argv); + return plugin->setOscBridgeInfo(PluginBridgePluginInfo, argc, argv, types); + if (strcmp(method, "/bridge_parameter_info") == 0) + return plugin->setOscBridgeInfo(PluginBridgeParameterInfo, argc, argv, types); + if (strcmp(method, "/bridge_parameter_data") == 0) + return plugin->setOscBridgeInfo(PluginBridgeParameterData, argc, argv, types); + if (strcmp(method, "/bridge_parameter_ranges") == 0) + return plugin->setOscBridgeInfo(PluginBridgeParameterRanges, argc, argv, types); if (strcmp(method, "/bridge_program_info") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeProgramInfo, argv); + return plugin->setOscBridgeInfo(PluginBridgeProgramInfo, argc, argv, types); if (strcmp(method, "/bridge_midi_program_info") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeMidiProgramInfo, argv); - if (strcmp(method, "/bridge_custom_data") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeCustomData, argv); - if (strcmp(method, "/bridge_chunk_data") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeChunkData, argv); + return plugin->setOscBridgeInfo(PluginBridgeMidiProgramInfo, argc, argv, types); + if (strcmp(method, "/bridge_set_parameter_value") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetParameterValue, argc, argv, types); + if (strcmp(method, "/bridge_set_default_value") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetDefaultValue, argc, argv, types); + if (strcmp(method, "/bridge_set_program") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetProgram, argc, argv, types); + if (strcmp(method, "/bridge_set_midi_program") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetMidiProgram, argc, argv, types); + if (strcmp(method, "/bridge_set_custom_data") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetCustomData, argc, argv, types); + if (strcmp(method, "/bridge_set_chunk_data") == 0) + return plugin->setOscBridgeInfo(PluginBridgeSetChunkData, argc, argv, types); if (strcmp(method, "/bridge_update") == 0) - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeUpdateNow, argv); + return plugin->setOscBridgeInfo(PluginBridgeUpdateNow, argc, argv, types); } qWarning("CarlaOsc::handleMessage() - unsupported OSC method '%s'", method); @@ -268,9 +276,9 @@ int CarlaOsc::handle_register(const int argc, const lo_arg* const* const argv, c free((void*)port); // FIXME - max plugins - for (unsigned short i=0; i < CarlaBackend::MAX_PLUGINS; i++) + for (unsigned short i=0; i < CarlaEngine::maxPluginNumber(); i++) { - CarlaBackend::CarlaPlugin* const plugin = engine->getPluginUnchecked(i); + CarlaPlugin* const plugin = engine->getPluginUnchecked(i); if (plugin && plugin->enabled()) plugin->registerToOsc(); @@ -314,21 +322,21 @@ int CarlaOsc::handle_configure(CARLA_OSC_HANDLE_ARGS2) const char* const key = (const char*)&argv[0]->s; const char* const value = (const char*)&argv[1]->s; - if (plugin->hints() & CarlaBackend::PLUGIN_IS_BRIDGE) - { - if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_HIDE_GUI) == 0) - { - engine->callback(CarlaBackend::CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0); - return 0; - } +// if (plugin->hints() & PLUGIN_IS_BRIDGE) +// { +// if (strcmp(key, CARLA_BRIDGE_MSG_HIDE_GUI) == 0) +// { +// engine->callback(CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0); +// return 0; +// } - if (strcmp(key, CarlaBackend::CARLA_BRIDGE_MSG_SAVED) == 0) - { - return plugin->setOscBridgeInfo(CarlaBackend::PluginBridgeSaved, nullptr); - } - } +// if (strcmp(key, CARLA_BRIDGE_MSG_SAVED) == 0) +// { +// return plugin->setOscBridgeInfo(PluginBridgeSaved, nullptr); +// } +// } - plugin->setCustomData(CarlaBackend::CUSTOM_DATA_STRING, key, value, false); + plugin->setCustomData(CUSTOM_DATA_STRING, key, value, false); return 0; } @@ -416,7 +424,7 @@ int CarlaOsc::handle_exiting(CARLA_OSC_HANDLE_ARGS1) qDebug("CarlaOsc::handle_exiting()"); // TODO - check for non-UIs (dssi-vst) and set to -1 instead - engine->callback(CarlaBackend::CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0); + engine->callback(CALLBACK_SHOW_GUI, plugin->id(), 0, 0, 0.0); plugin->clearOscData(); return 0; @@ -429,7 +437,7 @@ int CarlaOsc::handle_set_active(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_active()"); CARLA_OSC_CHECK_OSC_TYPES(1, "i"); - bool active = (bool)argv[0]->i; + const bool active = (bool)argv[0]->i; plugin->setActive(active, false, true); return 0; @@ -440,7 +448,7 @@ int CarlaOsc::handle_set_drywet(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_drywet()"); CARLA_OSC_CHECK_OSC_TYPES(1, "d"); - double value = argv[0]->d; + const double value = argv[0]->d; plugin->setDryWet(value, false, true); return 0; @@ -451,7 +459,7 @@ int CarlaOsc::handle_set_volume(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_volume()"); CARLA_OSC_CHECK_OSC_TYPES(1, "d"); - double value = argv[0]->d; + const double value = argv[0]->d; plugin->setVolume(value, false, true); return 0; @@ -462,7 +470,7 @@ int CarlaOsc::handle_set_balance_left(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_balance_left()"); CARLA_OSC_CHECK_OSC_TYPES(1, "d"); - double value = argv[0]->d; + const double value = argv[0]->d; plugin->setBalanceLeft(value, false, true); return 0; @@ -473,7 +481,7 @@ int CarlaOsc::handle_set_balance_right(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_balance_right()"); CARLA_OSC_CHECK_OSC_TYPES(1, "d"); - double value = argv[0]->d; + const double value = argv[0]->d; plugin->setBalanceRight(value, false, true); return 0; @@ -484,8 +492,8 @@ int CarlaOsc::handle_set_parameter_value(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_parameter_value()"); CARLA_OSC_CHECK_OSC_TYPES(2, "id"); - const uint32_t index = argv[0]->i; - const double value = argv[1]->d; + const int32_t index = argv[0]->i; + const double value = argv[1]->d; plugin->setParameterValue(index, value, true, false, true); return 0; @@ -496,8 +504,8 @@ int CarlaOsc::handle_set_parameter_midi_cc(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_parameter_midi_cc()"); CARLA_OSC_CHECK_OSC_TYPES(2, "ii"); - const uint32_t index = argv[0]->i; - const int32_t cc = argv[1]->i; + const int32_t index = argv[0]->i; + const int32_t cc = argv[1]->i; plugin->setParameterMidiCC(index, cc, false, true); return 0; @@ -508,8 +516,8 @@ int CarlaOsc::handle_set_parameter_midi_channel(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_parameter_midi_channel()"); CARLA_OSC_CHECK_OSC_TYPES(2, "ii"); - const uint32_t index = argv[0]->i; - const uint32_t channel = argv[1]->i; + const int32_t index = argv[0]->i; + const int32_t channel = argv[1]->i; plugin->setParameterMidiChannel(index, channel, false, true); return 0; @@ -520,7 +528,7 @@ int CarlaOsc::handle_set_program(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_program()"); CARLA_OSC_CHECK_OSC_TYPES(1, "i"); - const uint32_t index = argv[0]->i; + const int32_t index = argv[0]->i; plugin->setProgram(index, true, false, true, true); return 0; @@ -531,7 +539,7 @@ int CarlaOsc::handle_set_midi_program(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_set_midi_program()"); CARLA_OSC_CHECK_OSC_TYPES(1, "i"); - const uint32_t index = argv[0]->i; + const int32_t index = argv[0]->i; plugin->setMidiProgram(index, true, false, true, true); return 0; @@ -542,9 +550,9 @@ int CarlaOsc::handle_note_on(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_note_on()"); CARLA_OSC_CHECK_OSC_TYPES(3, "iii"); - const int channel = argv[0]->i; - const int note = argv[1]->i; - const int velo = argv[2]->i; + const int32_t channel = argv[0]->i; + const int32_t note = argv[1]->i; + const int32_t velo = argv[2]->i; plugin->sendMidiSingleNote(channel, note, velo, true, false, true); return 0; @@ -555,30 +563,30 @@ int CarlaOsc::handle_note_off(CARLA_OSC_HANDLE_ARGS2) qDebug("CarlaOsc::handle_note_off()"); CARLA_OSC_CHECK_OSC_TYPES(2, "ii"); - const int channel = argv[0]->i; - const int note = argv[1]->i; + const int32_t channel = argv[0]->i; + const int32_t note = argv[1]->i; plugin->sendMidiSingleNote(channel, note, 0, true, false, true); return 0; } -int CarlaOsc::handle_bridge_ains_peak(CARLA_OSC_HANDLE_ARGS2) +int CarlaOsc::handle_bridge_set_input_peak_value(CARLA_OSC_HANDLE_ARGS2) { CARLA_OSC_CHECK_OSC_TYPES(2, "id"); - const int index = argv[0]->i; - const double value = argv[1]->d; + const int32_t index = argv[0]->i; + const double value = argv[1]->d; engine->setInputPeak(plugin->id(), index-1, value); return 0; } -int CarlaOsc::handle_bridge_aouts_peak(CARLA_OSC_HANDLE_ARGS2) +int CarlaOsc::handle_bridge_set_output_peak_value(CARLA_OSC_HANDLE_ARGS2) { CARLA_OSC_CHECK_OSC_TYPES(2, "id"); - const int index = argv[0]->i; - const double value = argv[1]->d; + const int32_t index = argv[0]->i; + const double value = argv[1]->d; engine->setOutputPeak(plugin->id(), index-1, value); return 0; diff --git a/c++/carla-backend/carla_osc.h b/c++/carla-backend/carla_osc.h index 28d9e90..3e70016 100644 --- a/c++/carla-backend/carla_osc.h +++ b/c++/carla-backend/carla_osc.h @@ -121,8 +121,8 @@ private: int handle_lv2_atom_transfer(CARLA_OSC_HANDLE_ARGS2); int handle_lv2_event_transfer(CARLA_OSC_HANDLE_ARGS2); - int handle_bridge_ains_peak(CARLA_OSC_HANDLE_ARGS2); - int handle_bridge_aouts_peak(CARLA_OSC_HANDLE_ARGS2); + int handle_bridge_set_input_peak_value(CARLA_OSC_HANDLE_ARGS2); + int handle_bridge_set_output_peak_value(CARLA_OSC_HANDLE_ARGS2); }; CARLA_BACKEND_END_NAMESPACE diff --git a/c++/carla-backend/carla_plugin.h b/c++/carla-backend/carla_plugin.h index 2ef944c..0b9e332 100644 --- a/c++/carla-backend/carla_plugin.h +++ b/c++/carla-backend/carla_plugin.h @@ -73,12 +73,16 @@ enum PluginBridgeInfoType { PluginBridgeMidiProgramCount, PluginBridgePluginInfo, PluginBridgeParameterInfo, - PluginBridgeParameterDataInfo, - PluginBridgeParameterRangesInfo, + PluginBridgeParameterData, + PluginBridgeParameterRanges, PluginBridgeProgramInfo, PluginBridgeMidiProgramInfo, - PluginBridgeCustomData, - PluginBridgeChunkData, + PluginBridgeSetParameterValue, + PluginBridgeSetDefaultValue, + PluginBridgeSetProgram, + PluginBridgeSetMidiProgram, + PluginBridgeSetCustomData, + PluginBridgeSetChunkData, PluginBridgeUpdateNow, PluginBridgeSaved }; @@ -198,7 +202,7 @@ public: * This is the constructor of the base plugin class. * * \param engine The engine which this plugin belongs to, must not be null - * \param id The 'id' of this plugin, must between 0 and MAX_PLUGINS + * \param id The 'id' of this plugin, must between 0 and CarlaEngine::maxPluginNumber() */ CarlaPlugin(CarlaEngine* const engine, const unsigned short id) : m_id(id), @@ -210,7 +214,7 @@ public: x_balanceRight(1.0) { Q_ASSERT(engine); - Q_ASSERT(id < MAX_PLUGINS); + Q_ASSERT(id < CarlaEngine::maxPluginNumber()); qDebug("CarlaPlugin::CarlaPlugin(%p, %i)", engine, id); m_type = PLUGIN_NONE; @@ -690,7 +694,7 @@ public: { Q_ASSERT(index < prog.count); - if (index < prog.count) + if (index < prog.count && prog.names[index]) strncpy(strBuf, prog.names[index], STR_MAX); else *strBuf = 0; @@ -705,7 +709,7 @@ public: { Q_ASSERT(index < midiprog.count); - if (index < midiprog.count) + if (index < midiprog.count && midiprog.data[index].name) strncpy(strBuf, midiprog.data[index].name, STR_MAX); else *strBuf = 0; @@ -787,18 +791,17 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, PARAMETER_ACTIVE, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, PARAMETER_ACTIVE, value); - } #else Q_UNUSED(sendOsc); #endif if (sendCallback) x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, PARAMETER_ACTIVE, 0, value); +#ifndef BUILD_BRIDGE + else if (m_hints & PLUGIN_IS_BRIDGE) + osc_send_control(&osc.data, PARAMETER_ACTIVE, value); +#endif } /*! @@ -821,18 +824,17 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, PARAMETER_DRYWET, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, PARAMETER_DRYWET, value); - } #else Q_UNUSED(sendOsc); #endif if (sendCallback) x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, PARAMETER_DRYWET, 0, value); +#ifndef BUILD_BRIDGE + else if (m_hints & PLUGIN_IS_BRIDGE) + osc_send_control(&osc.data, PARAMETER_DRYWET, value); +#endif } /*! @@ -855,18 +857,17 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, PARAMETER_VOLUME, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, PARAMETER_VOLUME, value); - } #else Q_UNUSED(sendOsc); #endif if (sendCallback) x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, PARAMETER_VOLUME, 0, value); +#ifndef BUILD_BRIDGE + else if (m_hints & PLUGIN_IS_BRIDGE) + osc_send_control(&osc.data, PARAMETER_VOLUME, value); +#endif } /*! @@ -889,18 +890,17 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, PARAMETER_BALANCE_LEFT, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, PARAMETER_BALANCE_LEFT, value); - } #else Q_UNUSED(sendOsc); #endif if (sendCallback) x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, PARAMETER_BALANCE_LEFT, 0, value); +#ifndef BUILD_BRIDGE + else if (m_hints & PLUGIN_IS_BRIDGE) + osc_send_control(&osc.data, PARAMETER_BALANCE_LEFT, value); +#endif } /*! @@ -923,29 +923,30 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, PARAMETER_BALANCE_RIGHT, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, PARAMETER_BALANCE_RIGHT, value); - } #else Q_UNUSED(sendOsc); #endif if (sendCallback) x_engine->callback(CALLBACK_PARAMETER_VALUE_CHANGED, m_id, PARAMETER_BALANCE_RIGHT, 0, value); +#ifndef BUILD_BRIDGE + else if (m_hints & PLUGIN_IS_BRIDGE) + osc_send_control(&osc.data, PARAMETER_BALANCE_RIGHT, value); +#endif } #ifndef BUILD_BRIDGE /*! * BridgePlugin call used to set internal data. */ - virtual int setOscBridgeInfo(const PluginBridgeInfoType type, const lo_arg* const* const argv) + virtual int setOscBridgeInfo(const PluginBridgeInfoType type, const int argc, const lo_arg* const* const argv, const char* const types) { return 1; Q_UNUSED(type); + Q_UNUSED(argc); Q_UNUSED(argv); + Q_UNUSED(types); } #endif @@ -972,12 +973,7 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_parameter_value(m_id, parameterId, value); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_control(&osc.data, parameterId, value); - } #else Q_UNUSED(sendOsc); #endif @@ -1174,12 +1170,7 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_program(m_id, index); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_program(&osc.data, index); - } #else Q_UNUSED(sendOsc); #endif @@ -1232,12 +1223,7 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) - { x_engine->osc_send_control_set_midi_program(m_id, index); - - if (m_hints & PLUGIN_IS_BRIDGE) - osc_send_midi_program(&osc.data, index); - } #else Q_UNUSED(sendOsc); #endif @@ -1485,9 +1471,9 @@ public: getParameterUnit(i, bufUnit); #ifdef BUILD_BRIDGE - x_engine->osc_send_bridge_param_info(i, bufName, bufUnit); - x_engine->osc_send_bridge_param_data(i, param.data[i].type, param.data[i].rindex, param.data[i].hints, param.data[i].midiChannel, param.data[i].midiCC); - x_engine->osc_send_bridge_param_ranges(i, param.ranges[i].def, param.ranges[i].min, param.ranges[i].max, param.ranges[i].step, param.ranges[i].stepSmall, param.ranges[i].stepLarge); + x_engine->osc_send_bridge_parameter_info(i, bufName, bufUnit); + x_engine->osc_send_bridge_parameter_data(i, param.data[i].type, param.data[i].rindex, param.data[i].hints, param.data[i].midiChannel, param.data[i].midiCC); + x_engine->osc_send_bridge_parameter_ranges(i, param.ranges[i].def, param.ranges[i].min, param.ranges[i].max, param.ranges[i].step, param.ranges[i].stepSmall, param.ranges[i].stepLarge); x_engine->osc_send_bridge_set_parameter_value(i, getParameterValue(i)); #else x_engine->osc_send_control_set_parameter_data(m_id, i, param.data[i].type, param.data[i].hints, bufName, bufUnit, getParameterValue(i)); @@ -1655,7 +1641,7 @@ public: if (sendGui) { - if (note > 0) + if (velo > 0) uiNoteOn(channel, note, velo); else uiNoteOff(channel, note); @@ -1664,19 +1650,10 @@ public: #ifndef BUILD_BRIDGE if (sendOsc) { - if (velo) + if (velo > 0) x_engine->osc_send_control_note_on(m_id, channel, note, velo); else x_engine->osc_send_control_note_off(m_id, channel, note); - - if (m_hints & PLUGIN_IS_BRIDGE) - { - uint8_t midiData[4] = { 0 }; - midiData[1] = (velo ? MIDI_STATUS_NOTE_ON : MIDI_STATUS_NOTE_OFF) + channel; - midiData[2] = note; - midiData[3] = velo; - osc_send_midi(&osc.data, midiData); - } } #else Q_UNUSED(sendOsc); diff --git a/c++/carla-backend/carla_threads.cpp b/c++/carla-backend/carla_threads.cpp index bba1487..1d68d28 100644 --- a/c++/carla-backend/carla_threads.cpp +++ b/c++/carla-backend/carla_threads.cpp @@ -24,12 +24,12 @@ // ----------------------------------------------------------------------- // CarlaCheckThread -CarlaCheckThread::CarlaCheckThread(CarlaBackend::CarlaEngine* const engine_, QObject* const parent) : - QThread(parent), - engine(engine_) +CarlaCheckThread::CarlaCheckThread(CarlaBackend::CarlaEngine* const engine_, QObject* const parent) + : QThread(parent), + engine(engine_) { - maxPluginNumber = 0; - qDebug("CarlaCheckThread::CarlaCheckThread(%p)", parent); + qDebug("CarlaCheckThread::CarlaCheckThread(%p, %p)", engine, parent); + Q_ASSERT(engine); } CarlaCheckThread::~CarlaCheckThread() @@ -37,9 +37,8 @@ CarlaCheckThread::~CarlaCheckThread() qDebug("CarlaCheckThread::~CarlaCheckThread()"); } -void CarlaCheckThread::startNow(const unsigned short maxPluginNumber_) +void CarlaCheckThread::startNow() { - maxPluginNumber = maxPluginNumber_; start(QThread::HighPriority); } @@ -63,7 +62,10 @@ void CarlaCheckThread::run() { qDebug("CarlaCheckThread::run()"); + using namespace CarlaBackend; + bool oscControllerRegisted, usesSingleThread; + unsigned short id, maxPluginNumber = CarlaEngine::maxPluginNumber(); double value; m_stopNow = false; @@ -80,14 +82,12 @@ void CarlaCheckThread::run() for (unsigned short i=0; i < maxPluginNumber; i++) { - CarlaBackend::CarlaPlugin* const plugin = engine->getPluginUnchecked(i); + CarlaPlugin* const plugin = engine->getPluginUnchecked(i); if (plugin && plugin->enabled()) { -#ifndef BUILD_BRIDGE - unsigned short id = plugin->id(); -#endif - usesSingleThread = (plugin->hints() & CarlaBackend::PLUGIN_USES_SINGLE_THREAD); + id = plugin->id(); + usesSingleThread = (plugin->hints() & PLUGIN_USES_SINGLE_THREAD); // ------------------------------------------------------- // Process postponed events @@ -121,7 +121,6 @@ void CarlaCheckThread::run() } } -#ifndef BUILD_BRIDGE // ------------------------------------------------------- // Update OSC control client @@ -130,16 +129,25 @@ void CarlaCheckThread::run() // Peak values if (plugin->audioInCount() > 0) { +#ifdef BUILD_BRIDGE + engine->osc_send_bridge_set_input_peak_value(1, engine->getInputPeak(id, 0)); + engine->osc_send_bridge_set_input_peak_value(2, engine->getInputPeak(id, 1)); +#else engine->osc_send_control_set_input_peak_value(id, 1, engine->getInputPeak(id, 0)); engine->osc_send_control_set_input_peak_value(id, 2, engine->getInputPeak(id, 1)); +#endif } if (plugin->audioOutCount() > 0) { +#ifdef BUILD_BRIDGE + engine->osc_send_bridge_set_output_peak_value(1, engine->getOutputPeak(id, 0)); + engine->osc_send_bridge_set_output_peak_value(2, engine->getOutputPeak(id, 1)); +#else engine->osc_send_control_set_output_peak_value(id, 1, engine->getOutputPeak(id, 0)); engine->osc_send_control_set_output_peak_value(id, 2, engine->getOutputPeak(id, 1)); +#endif } } -#endif } } diff --git a/c++/carla-backend/carla_threads.h b/c++/carla-backend/carla_threads.h index 55cb9ae..7ae190b 100644 --- a/c++/carla-backend/carla_threads.h +++ b/c++/carla-backend/carla_threads.h @@ -32,7 +32,7 @@ public: CarlaCheckThread(CarlaBackend::CarlaEngine* const engine, QObject* const parent = nullptr); ~CarlaCheckThread(); - void startNow(const unsigned short maxPluginNumber); + void startNow(); void stopNow(); protected: @@ -42,7 +42,6 @@ private: CarlaBackend::CarlaEngine* const engine; QMutex mutex; bool m_stopNow; - unsigned short maxPluginNumber; // ---------------------------------------------- diff --git a/c++/carla-backend/dssi.cpp b/c++/carla-backend/dssi.cpp index f31d4ce..353dff7 100644 --- a/c++/carla-backend/dssi.cpp +++ b/c++/carla-backend/dssi.cpp @@ -742,10 +742,13 @@ public: #ifndef BUILD_BRIDGE // Update OSC Names - x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); + if (x_engine->isOscControllerRegisted()) + { + x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); - for (i=0; i < midiprog.count; i++) - x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + for (i=0; i < midiprog.count; i++) + x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + } #endif if (init) @@ -1014,7 +1017,6 @@ public: // ---------------------------------------------------------------------------------------------------- // MIDI Input (External) - if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16) { engineMidiLock(); @@ -1515,7 +1517,7 @@ CarlaPlugin* CarlaPlugin::newDSSI(const initializer& init, const void* const ext short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/fluidsynth.cpp b/c++/carla-backend/fluidsynth.cpp index 6054a16..cded9be 100644 --- a/c++/carla-backend/fluidsynth.cpp +++ b/c++/carla-backend/fluidsynth.cpp @@ -768,13 +768,17 @@ public: #ifndef BUILD_BRIDGE // Update OSC Names - //osc_global_send_set_midi_program_count(m_id, midiprog.count); + if (x_engine->isOscControllerRegisted()) + { + x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); - //for (i=0; i < midiprog.count; i++) - // osc_global_send_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + for (i=0; i < midiprog.count; i++) + x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + } +#endif + // FIXME x_engine->callback(CALLBACK_RELOAD_PROGRAMS, m_id, 0, 0, 0.0); -#endif if (init) { @@ -1285,7 +1289,7 @@ CarlaPlugin* CarlaPlugin::newSF2(const initializer& init) #ifdef WANT_FLUIDSYNTH short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/ladspa.cpp b/c++/carla-backend/ladspa.cpp index 2bc714d..b283b04 100644 --- a/c++/carla-backend/ladspa.cpp +++ b/c++/carla-backend/ladspa.cpp @@ -1125,7 +1125,7 @@ CarlaPlugin* CarlaPlugin::newLADSPA(const initializer& init, const void* const e short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/linuxsampler.cpp b/c++/carla-backend/linuxsampler.cpp index b7b5c12..6a7f265 100644 --- a/c++/carla-backend/linuxsampler.cpp +++ b/c++/carla-backend/linuxsampler.cpp @@ -254,14 +254,17 @@ public: #ifndef BUILD_BRIDGE // Update OSC Names - //osc_global_send_set_midi_program_count(m_id, midiprog.count); - - //for (i=0; i < midiprog.count; i++) - // osc_global_send_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + if (x_engine->isOscControllerRegisted()) + { + x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); - x_engine->callback(CALLBACK_RELOAD_PROGRAMS, m_id, 0, 0, 0.0); + for (i=0; i < midiprog.count; i++) + x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + } #endif + // TODO + if (init) { if (midiprog.count > 0) @@ -578,7 +581,7 @@ CarlaPlugin* LinuxSamplerPlugin::newLinuxSampler(const initializer& init, bool i short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/lv2.cpp b/c++/carla-backend/lv2.cpp index 4c45d0e..331e046 100644 --- a/c++/carla-backend/lv2.cpp +++ b/c++/carla-backend/lv2.cpp @@ -1706,10 +1706,13 @@ public: #ifndef BUILD_BRIDGE // Update OSC Names - x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); + if (x_engine->isOscControllerRegisted()) + { + x_engine->osc_send_control_set_midi_program_count(m_id, midiprog.count); - for (i=0; i < midiprog.count; i++) - x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + for (i=0; i < midiprog.count; i++) + x_engine->osc_send_control_set_midi_program_data(m_id, i, midiprog.data[i].bank, midiprog.data[i].program, midiprog.data[i].name); + } #endif if (init) @@ -2036,7 +2039,6 @@ public: // ---------------------------------------------------------------------------------------------------- // MIDI Input (External) - if (evIn.count > 0 && m_ctrlInChannel >= 0 && m_ctrlInChannel < 16) { engineMidiLock(); @@ -4257,7 +4259,7 @@ CarlaPlugin* CarlaPlugin::newLV2(const initializer& init) short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-backend/qtcreator/carla-backend.pro b/c++/carla-backend/qtcreator/carla-backend.pro index 24bb74c..b3715f8 100644 --- a/c++/carla-backend/qtcreator/carla-backend.pro +++ b/c++/carla-backend/qtcreator/carla-backend.pro @@ -28,8 +28,8 @@ SOURCES = \ ../lv2.cpp \ ../vst.cpp \ ../fluidsynth.cpp \ - ../linuxsampler.cpp -# ../../carla-jackbridge/carla_jackbridge.cpp + ../linuxsampler.cpp \ + ../../carla-jackbridge/carla_jackbridge.cpp HEADERS = \ ../carla_backend.h \ @@ -65,7 +65,7 @@ DEFINES += CARLA_ENGINE_LV2 DEFINES += HAVE_SUIL DEFINES += WANT_FLUIDSYNTH WANT_LINUXSAMPLER LIBS = ../../carla-lilv/carla_lilv.a -ldl -LIBS += -L../../carla-jackbridge -lcarla-jackbridge-native +#LIBS += -L../../carla-jackbridge -lcarla-jackbridge-native INCLUDEPATH += ../rtaudio-4.0.11 INCLUDEPATH += ../rtmidi-2.0.0 diff --git a/c++/carla-backend/vst.cpp b/c++/carla-backend/vst.cpp index c3def71..191b741 100644 --- a/c++/carla-backend/vst.cpp +++ b/c++/carla-backend/vst.cpp @@ -64,6 +64,7 @@ public: gui.height = 0; isProcessing = false; + needIdle = false; memset(midiEvents, 0, sizeof(VstMidiEvent)*MAX_MIDI_EVENTS*2); @@ -422,11 +423,12 @@ public: void idleGui() { - //effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); - - if (gui.type != GUI_EXTERNAL_OSC && gui.visible) + if (gui.type != GUI_EXTERNAL_OSC) effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); + if (needIdle) + effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f); + CarlaPlugin::idleGui(); } @@ -743,10 +745,13 @@ public: #ifndef BUILD_BRIDGE // Update OSC Names - x_engine->osc_send_control_set_program_count(m_id, prog.count); + if (x_engine->isOscControllerRegisted()) + { + x_engine->osc_send_control_set_program_count(m_id, prog.count); - for (i=0; i < prog.count; i++) - x_engine->osc_send_control_set_program_name(m_id, i, prog.names[i]); + for (i=0; i < prog.count; i++) + x_engine->osc_send_control_set_program_name(m_id, i, prog.names[i]); + } #endif if (init) @@ -1011,7 +1016,6 @@ public: // ---------------------------------------------------------------------------------------------------- // MIDI Input (External) - if (m_ctrlInChannel >= 0 && m_ctrlInChannel < 16) { engineMidiLock(); @@ -1165,7 +1169,7 @@ public: // FIXME - make this a global option // don't process if not needed - //if ((effect->flags & effFlagsNoSoundInStop) > 0 && aInsPeak[0] == 0.0 && aInsPeak[1] == 0.0 && midiEventCount == 0 && ! midi.port_mout) + //if ((effect->flags & effFlagsNoSoundInStop) > 0 && aInsPeak[0] == 0.0 && aInsPeak[1] == 0.0 && midiEventCount == 0 && ! midi.portMout) //{ if (m_hints & PLUGIN_CAN_PROCESS_REPLACING) { @@ -1438,7 +1442,7 @@ public: if (timeInfo->playing) vstTimeInfo.flags |= kVstTransportPlaying; - vstTimeInfo.samplePos = timeInfo->frame; + //vstTimeInfo.samplePos = timeInfo->frame; // FIXME - currentSamplePosition ? vstTimeInfo.sampleRate = x_engine->getSampleRate(); vstTimeInfo.nanoSeconds = timeInfo->time; @@ -1533,6 +1537,11 @@ public: return 1; } + void handleAudioMasterNeedIdle() + { + needIdle = true; + } + intptr_t handleAudioMasterProcessEvents(const VstEvents* const vstEvents) { Q_ASSERT(m_enabled); @@ -1726,6 +1735,8 @@ public: case audioMasterAutomate: if (self) self->handleAudioMasterAutomate(index, opt); + else + qWarning("VstPlugin::hostCallback::audioMasterAutomate called without valid object"); break; case audioMasterVersion: @@ -1737,8 +1748,10 @@ public: break; case audioMasterIdle: - //if (effect) - // effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); + if (effect) + effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); + else + qWarning("VstPlugin::hostCallback::audioMasterIdle called without valid object"); break; #if ! VST_FORCE_DEPRECATED @@ -1751,6 +1764,8 @@ public: // Deprecated in VST SDK 2.4 if (self) self->handleAudioMasterWantMidi(); + else + qWarning("VstPlugin::hostCallback::audioMasterWantMidi called without valid object"); break; #endif @@ -1761,6 +1776,8 @@ public: } else { + qWarning("VstPlugin::hostCallback::audioMasterGetTime called without valid object"); + static VstTimeInfo_R timeInfo; memset(&timeInfo, 0, sizeof(VstTimeInfo_R)); timeInfo.sampleRate = 44100.0; @@ -1779,8 +1796,15 @@ public: break; case audioMasterProcessEvents: - if (self && ptr) - ret = self->handleAudioMasterProcessEvents((const VstEvents*)ptr); + if (self) + { + if (ptr) + ret = self->handleAudioMasterProcessEvents((const VstEvents*)ptr); + else + qWarning("VstPlugin::hostCallback::audioMasterProcessEvents called with invalid pointer"); + } + else + qWarning("VstPlugin::hostCallback::audioMasterProcessEvents called without valid object"); break; #if ! VST_FORCE_DEPRECATED @@ -1792,6 +1816,8 @@ public: // Deprecated in VST SDK 2.4 if (self) ret = self->handleAudioMasterTempoAt(); + else + qWarning("stPlugin::hostCallback::audioMasterTempoAt called without valid object"); if (ret == 0) ret = 120 * 10000; break; @@ -1814,30 +1840,48 @@ public: case audioMasterIOChanged: if (self) ret = self->handleAudioMasterIOChanged(); + else + qWarning("VstPlugin::hostCallback::audioMasterIOChanged called without valid object"); break; case audioMasterNeedIdle: // Deprecated in VST SDK 2.4 - // TODO + if (self) + self->handleAudioMasterNeedIdle(); + else + qWarning("VstPlugin::hostCallback::audioMasterNeedIdle called without valid object"); break; case audioMasterSizeWindow: - if (self && index > 0 && value > 0) - ret = self->handleAdioMasterSizeWindow(index, value); + if (self) + { + if (index > 0 && value > 0) + ret = self->handleAdioMasterSizeWindow(index, value); + else + qWarning("VstPlugin::hostCallback::audioMasterSizeWindow called with invalid size"); + } + else + qWarning("VstPlugin::hostCallback::audioMasterSizeWindow called without valid object"); break; case audioMasterGetSampleRate: if (self) ret = self->handleAudioMasterGetSampleRate(); else + { + qWarning("stPlugin::hostCallback::audioMasterGetSampleRate called without valid object"); ret = 44100; + } break; case audioMasterGetBlockSize: if (self) ret = self->handleAudioMasterGetBlockSize(); else + { + qWarning("stPlugin::hostCallback::audioMasterGetBlockSize called without valid object"); ret = 512; + } break; case audioMasterGetInputLatency: @@ -1868,7 +1912,10 @@ public: if (self) ret = self->handleAudioMasterGetCurrentProcessLevel(); else + { + qWarning("VstPlugin::hostCallback::audioMasterGetCurrentProcessLevel called without valid object"); ret = kVstProcessLevelUnknown; + } break; case audioMasterGetAutomationState: @@ -1901,11 +1948,15 @@ public: case audioMasterGetVendorString: if (ptr) strcpy((char*)ptr, "Cadence"); + else + qWarning("VstPlugin::hostCallback::audioMasterGetVendorString called with invalid pointer"); break; case audioMasterGetProductString: if (ptr) strcpy((char*)ptr, "Carla"); + else + qWarning("VstPlugin::hostCallback::audioMasterGetProductString called with invalid pointer"); break; case audioMasterGetVendorVersion: @@ -1925,6 +1976,8 @@ public: case audioMasterCanDo: if (ptr) ret = hostCanDo((const char*)ptr); + else + qWarning("VstPlugin::hostCallback::audioMasterCanDo called with invalid pointer"); break; case audioMasterGetLanguage: @@ -1946,6 +1999,10 @@ public: case audioMasterUpdateDisplay: if (self) self->handleAudioMasterUpdateDisplay(); + else + qWarning("VstPlugin::hostCallback::audioMasterUpdateDisplay called without valid object"); + if (effect) + effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0.0f); break; case audioMasterBeginEdit: @@ -2048,6 +2105,12 @@ public: // --------------------------------------------------------------- // initialize VST stuff +#ifdef VESTIGE_HEADER + effect->ptr1 = this; +#else + effect->resvd1 = (intptr_t)this; +#endif + effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); #if ! VST_FORCE_DEPRECATED effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, x_engine->getBufferSize(), nullptr, x_engine->getSampleRate()); @@ -2056,12 +2119,6 @@ public: effect->dispatcher(effect, effSetBlockSize, 0, x_engine->getBufferSize(), nullptr, 0.0f); effect->dispatcher(effect, effSetProcessPrecision, 0, kVstProcessPrecision32, nullptr, 0.0f); -#ifdef VESTIGE_HEADER - effect->ptr1 = this; -#else - effect->resvd1 = (intptr_t)this; -#endif - #if ! VST_FORCE_DEPRECATED // dummy pre-start to catch possible wantEvents() call on old plugins effect->dispatcher(effect, effStartProcess, 0, 0, nullptr, 0.0f); @@ -2145,6 +2202,7 @@ private: } gui; bool isProcessing; + bool needIdle; int unique2; }; @@ -2155,7 +2213,7 @@ CarlaPlugin* CarlaPlugin::newVST(const initializer& init) short id = init.engine->getNewPluginId(); - if (id < 0 || id > MAX_PLUGINS) + if (id < 0 || id > CarlaEngine::maxPluginNumber()) { setLastError("Maximum number of plugins reached"); return nullptr; diff --git a/c++/carla-bridge/Makefile b/c++/carla-bridge/Makefile index c729b38..cae1226 100644 --- a/c++/carla-bridge/Makefile +++ b/c++/carla-bridge/Makefile @@ -7,12 +7,13 @@ CXX ?= g++ STRIP ?= strip -BASE_FLAGS = -O2 -ffast-math -fomit-frame-pointer -mtune=generic -msse -mfpmath=sse -Wall +# BASE_FLAGS = -O2 -ffast-math -fomit-frame-pointer -mtune=generic -msse -mfpmath=sse -Wall BASE_FLAGS = -O0 -g BUILD_FLAGS = $(BASE_FLAGS) -std=c++0x $(CXXFLAGS) BUILD_FLAGS += -I. -I../carla-includes $(shell pkg-config --cflags liblo QtCore) -BUILD_FLAGS += -DBUILD_BRIDGE -DDEBUG # -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT # -DNDEBUG +# BUILD_FLAGS += -DBUILD_BRIDGE -DQT_NO_DEBUG -DQT_NO_DEBUG_STREAM -DQT_NO_DEBUG_OUTPUT -DNDEBUG +BUILD_FLAGS += -DBUILD_BRIDGE -DDEBUG BUILD_FLAGS += -DVESTIGE_HEADER # Comment this line to not use vestige header 32BIT_FLAGS = -m32 diff --git a/c++/carla-bridge/carla_bridge_osc.cpp b/c++/carla-bridge/carla_bridge_osc.cpp index 3ba18ec..8611d6d 100644 --- a/c++/carla-bridge/carla_bridge_osc.cpp +++ b/c++/carla-bridge/carla_bridge_osc.cpp @@ -250,14 +250,23 @@ int CarlaOsc::handleMsgProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) int CarlaOsc::handleMsgMidiProgram(CARLA_BRIDGE_OSC_HANDLE_ARGS) { qDebug("CarlaOsc::handleMsgMidiProgram()"); +#ifdef BUILD_BRIDGE_PLUGIN + CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(1, "i"); +#else CARLA_BRIDGE_OSC_CHECK_OSC_TYPES(2, "ii"); +#endif if (! client) return 1; +#ifdef BUILD_BRIDGE_PLUGIN + const int32_t index = argv[0]->i; + client->quequeMessage(MESSAGE_MIDI_PROGRAM, index, -1, 0.0); +#else const int32_t bank = argv[0]->i; const int32_t program = argv[1]->i; client->quequeMessage(MESSAGE_MIDI_PROGRAM, bank, program, 0.0); +#endif return 0; } diff --git a/c++/carla-bridge/carla_bridge_plugin.cpp b/c++/carla-bridge/carla_bridge_plugin.cpp index d968b6f..2d290ff 100644 --- a/c++/carla-bridge/carla_bridge_plugin.cpp +++ b/c++/carla-bridge/carla_bridge_plugin.cpp @@ -93,6 +93,9 @@ public: void setStuff(CarlaBackend::CarlaEngine* const engine_, CarlaBackend::CarlaPlugin* const plugin_) { + Q_ASSERT(engine_); + Q_ASSERT(plugin_); + engine = engine_; plugin = plugin_; } @@ -114,25 +117,47 @@ public: void setProgram(const uint32_t index) { qDebug("CarlaPluginClient::setProgram(%i)", index); - Q_ASSERT(plugin && index < plugin->programCount()); + Q_ASSERT(engine); + Q_ASSERT(plugin); + Q_ASSERT(index < plugin->programCount()); - if (! plugin) + if (! (plugin && engine)) return; if (index >= plugin->programCount()) return; plugin->setProgram(index, true, true, false, true); + + double value; + for (uint32_t i=0; i < plugin->parameterCount(); i++) + { + value = plugin->getParameterValue(i); + engine->osc_send_bridge_set_parameter_value(i, value); + engine->osc_send_bridge_set_default_value(i, value); + } } - void setMidiProgram(const uint32_t bank, const uint32_t program) + void setMidiProgram(const uint32_t index, const uint32_t test) { - qDebug("CarlaPluginClient::setMidiProgram(%i, %i)", bank, program); + qDebug("CarlaPluginClient::setMidiProgram(%i, %i)", index, test); + Q_ASSERT(engine); Q_ASSERT(plugin); + Q_ASSERT(test == -1); - if (! plugin) + if (! (plugin && engine)) return; + if (test != -1) + return; - plugin->setMidiProgramById(bank, program, true, true, false, true); + plugin->setMidiProgram(index, true, true, false, true); + + double value; + for (uint32_t i=0; i < plugin->parameterCount(); i++) + { + value = plugin->getParameterValue(i); + engine->osc_send_bridge_set_parameter_value(i, value); + engine->osc_send_bridge_set_default_value(i, value); + } } void noteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) @@ -149,7 +174,7 @@ public: void noteOff(const uint8_t channel, const uint8_t note) { - qDebug("CarlaPluginClient::noteOn(%i, %i)", channel, note); + qDebug("CarlaPluginClient::noteOff(%i, %i)", channel, note); Q_ASSERT(plugin); if (! plugin) @@ -163,6 +188,7 @@ public: void saveNow() { + qDebug("CarlaPluginClient::saveNow()"); Q_ASSERT(plugin); if (! plugin) @@ -206,6 +232,7 @@ public: void setCustomData(const char* const type, const char* const key, const char* const value) { + qDebug("CarlaPluginClient::setCustomData(\"%s\", \"%s\", \"%s\")", type, key, value); Q_ASSERT(plugin); if (! plugin) @@ -216,6 +243,7 @@ public: void setChunkData(const char* const filePath) { + qDebug("CarlaPluginClient::setChunkData(\"%s\")", filePath); Q_ASSERT(plugin); if (! plugin) @@ -391,6 +419,7 @@ public: qDebug("CarlaToolkitPlugin::CarlaToolkitPlugin()"); app = nullptr; dialog = nullptr; + m_resizable = false; } ~CarlaToolkitPlugin() @@ -478,16 +507,26 @@ public: qDebug("CarlaToolkitPlugin::resize(%i, %i)", width, height); Q_ASSERT(dialog); - if (dialog) + if (! dialog) + return; + + if (m_resizable) + dialog->resize(width, height); + else dialog->setFixedSize(width, height); } // --------------------------------------------------------------------- - void createWindow(const char* const pluginName, const bool createLayout) + void createWindow(const char* const pluginName, const bool createLayout, const bool resizable) { + qDebug("CarlaToolkitPlugin::createWindow(%s, %s, %s)", pluginName, bool2str(createLayout), bool2str(resizable)); + Q_ASSERT(pluginName); + + m_resizable = resizable; + dialog = new QDialog(nullptr); - dialog->resize(10, 10); + resize(10, 10); if (createLayout) { @@ -497,6 +536,11 @@ public: } dialog->setWindowTitle(QString("%1 (GUI)").arg(pluginName)); + +#ifdef Q_OS_WIN + if (! resizable) + dialog->setWindowFlags(dialog->windowFlags() | Qt::MSWindowsFixedSizeDialogHint); +#endif } CarlaBackend::GuiDataHandle getWindowHandle() const @@ -509,6 +553,7 @@ public: private: BridgeApplication* app; QDialog* dialog; + bool m_resizable; }; CarlaToolkit* CarlaToolkit::createNew(const char* const) @@ -608,7 +653,7 @@ int main(int argc, char* argv[]) if (guiType == CarlaBackend::GUI_INTERNAL_QT4 || guiType == CarlaBackend::GUI_INTERNAL_COCOA || guiType == CarlaBackend::GUI_INTERNAL_HWND || guiType == CarlaBackend::GUI_INTERNAL_X11) { - toolkit.createWindow(plugin->name(), (guiType == CarlaBackend::GUI_INTERNAL_QT4)); + toolkit.createWindow(plugin->name(), (guiType == CarlaBackend::GUI_INTERNAL_QT4), guiResizable); plugin->setGuiData(toolkit.getWindowHandle()); } diff --git a/c++/carla-bridge/carla_bridge_ui-vst.cpp b/c++/carla-bridge/carla_bridge_ui-vst.cpp index a970628..abf504d 100644 --- a/c++/carla-bridge/carla_bridge_ui-vst.cpp +++ b/c++/carla-bridge/carla_bridge_ui-vst.cpp @@ -94,6 +94,12 @@ public: // ----------------------------------------------------------------- // initialize VST stuff +#ifdef VESTIGE_HEADER + effect->ptr1 = this; +#else + effect->resvd1 = (intptr_t)this; +#endif + int32_t value = 0; #ifdef Q_WS_X11 value = (int64_t)QX11Info::display(); @@ -110,12 +116,6 @@ public: if (effect->dispatcher(effect, effEditOpen, 0, value, (void*)widget->winId(), 0.0f) != 1) return false; -#ifdef VESTIGE_HEADER - effect->ptr1 = this; -#else - effect->resvd1 = (intptr_t)this; -#endif - // ----------------------------------------------------------------- // initialize gui stuff diff --git a/src/shared_carla.py b/src/shared_carla.py index ddec81b..d36bb82 100644 --- a/src/shared_carla.py +++ b/src/shared_carla.py @@ -1988,6 +1988,9 @@ class PluginGUI(QDialog): self.setNewSize(50, 50) self.setWindowTitle("%s (GUI)" % pluginName) + if (WINDOWS and not resizable): + self.setWindowFlags(self.windowFlags() | Qt.MSWindowsFixedSizeDialogHint) + self.connect(self, SIGNAL("finished(int)"), SLOT("slot_finished()")) def setNewSize(self, width, height):