diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index b268e7184..38ef98869 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -2445,7 +2445,7 @@ void CarlaEngine::oscSend_bridge_parameter_data(const uint32_t index, const int3 CARLA_SAFE_ASSERT_RETURN(unit != nullptr,); carla_debug("CarlaEngine::oscSend_bridge_parameter_data(%i, %i, %i:%s, %X, \"%s\", \"%s\")", index, rindex, type, ParameterType2Str(type), hints, name, unit); - char targetPath[std::strlen(pData->oscData->path)+23]; + char targetPath[std::strlen(pData->oscData->path)+24]; std::strcpy(targetPath, pData->oscData->path); std::strcat(targetPath, "/bridge_parameter_data"); try_lo_send(pData->oscData->target, targetPath, "iiiiss", static_cast(index), static_cast(rindex), static_cast(type), static_cast(hints), name, unit); diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index 8eebf9355..34522eeb5 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -408,7 +408,8 @@ public: break; } - case kPluginBridgeOpcodeSetParameter: { + case kPluginBridgeOpcodeSetParameterRt: + case kPluginBridgeOpcodeSetParameterNonRt:{ const int32_t index(fShmControl.readInt()); const float value(fShmControl.readFloat()); @@ -416,10 +417,15 @@ public: if (plugin != nullptr && plugin->isEnabled()) { - plugin->setParameterValueByRealIndex(index, value, false, false, false); + if (index == PARAMETER_ACTIVE) + { + plugin->setActive((value > 0.0f), false, false); + break; + } + + CARLA_SAFE_ASSERT_BREAK(index >= 0); - //if (index >= 0) - // plugin->postponeRtEvent(kPluginPostRtEventParameterChange, index, 0, value); + plugin->setParameterValue(static_cast(index), value, (opcode == kPluginBridgeOpcodeSetParameterNonRt), false, false); } break; } diff --git a/source/backend/plugin/BridgePlugin.cpp b/source/backend/plugin/BridgePlugin.cpp index c5ce60ff2..3afcb8a39 100644 --- a/source/backend/plugin/BridgePlugin.cpp +++ b/source/backend/plugin/BridgePlugin.cpp @@ -148,7 +148,7 @@ struct BridgeAudioPool { struct BridgeControl : public RingBufferControl { CarlaString filename; - CarlaRecursiveMutex lock; + CarlaMutex lock; BridgeShmControl* data; shm_t shm; @@ -323,6 +323,10 @@ public: { carla_debug("BridgePlugin::~BridgePlugin()"); + // close UI + if (pData->hints & PLUGIN_HAS_CUSTOM_UI) + pData->transientTryCounter = 0; + pData->singleMutex.lock(); pData->masterMutex.lock(); @@ -520,12 +524,14 @@ public: const float fixedValue(pData->param.getFixedValue(parameterId, value)); fParams[parameterId].value = fixedValue; - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + { + const CarlaMutexLocker _cml(fShmControl.lock); - fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter); - fShmControl.writeInt(static_cast(parameterId)); - fShmControl.writeFloat(value); - fShmControl.commitWrite(); + fShmControl.writeOpcode(sendGui ? kPluginBridgeOpcodeSetParameterNonRt : kPluginBridgeOpcodeSetParameterRt); + fShmControl.writeInt(static_cast(parameterId)); + fShmControl.writeFloat(value); + fShmControl.commitWrite(); + } CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } @@ -534,11 +540,13 @@ public: { CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast(pData->prog.count),); - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + { + const CarlaMutexLocker _cml(fShmControl.lock); - fShmControl.writeOpcode(kPluginBridgeOpcodeSetProgram); - fShmControl.writeInt(index); - fShmControl.commitWrite(); + fShmControl.writeOpcode(kPluginBridgeOpcodeSetProgram); + fShmControl.writeInt(index); + fShmControl.commitWrite(); + } CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback); } @@ -547,11 +555,13 @@ public: { CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast(pData->midiprog.count),); - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + { + const CarlaMutexLocker _cml(fShmControl.lock); - fShmControl.writeOpcode(kPluginBridgeOpcodeSetMidiProgram); - fShmControl.writeInt(index); - fShmControl.commitWrite(); + fShmControl.writeOpcode(kPluginBridgeOpcodeSetMidiProgram); + fShmControl.writeInt(index); + fShmControl.commitWrite(); + } CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback); } @@ -769,9 +779,9 @@ public: void activate() noexcept override { { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); - fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter); + fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameterNonRt); fShmControl.writeInt(PARAMETER_ACTIVE); fShmControl.writeFloat(1.0f); fShmControl.commitWrite(); @@ -790,9 +800,9 @@ public: void deactivate() noexcept override { { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); - fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameter); + fShmControl.writeOpcode(kPluginBridgeOpcodeSetParameterNonRt); fShmControl.writeInt(PARAMETER_ACTIVE); fShmControl.writeFloat(0.0f); fShmControl.commitWrite(); @@ -852,7 +862,7 @@ public: data2 = static_cast(note.note); data3 = static_cast(note.velo); - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent); fShmControl.writeLong(0); @@ -988,7 +998,7 @@ public: if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent); fShmControl.writeLong(event.time); @@ -1083,7 +1093,7 @@ public: data[j] = static_cast(midiEvent.data[j]); { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent); fShmControl.writeLong(event.time); @@ -1176,7 +1186,7 @@ public: // Run plugin { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); fShmControl.writeOpcode(kPluginBridgeOpcodeProcess); fShmControl.commitWrite(); @@ -1263,7 +1273,7 @@ public: void bufferSizeChanged(const uint32_t newBufferSize) override { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); resizeAudioPool(newBufferSize); @@ -1274,7 +1284,7 @@ public: void sampleRateChanged(const double newSampleRate) override { - const CarlaRecursiveMutexLocker _crml(fShmControl.lock); + const CarlaMutexLocker _cml(fShmControl.lock); fShmControl.writeOpcode(kPluginBridgeOpcodeSetSampleRate); fShmControl.writeFloat(static_cast(newSampleRate)); @@ -1406,11 +1416,11 @@ public: CARLA_SAFE_ASSERT_INT2(ins+outs <= static_cast(pData->engine->getOptions().maxParameters), ins+outs, pData->engine->getOptions().maxParameters); - const uint32_t count(static_cast(carla_min(ins+outs, static_cast(pData->engine->getOptions().maxParameters), 0))); + const uint32_t count(carla_fixValue(0, pData->engine->getOptions().maxParameters, static_cast(ins+outs))); if (count > 0) { - pData->param.createNew(count, false); + pData->param.createNew(count, false, true); fParams = new BridgeParamInfo[count]; } break; @@ -1466,9 +1476,10 @@ public: if (index < static_cast(pData->param.count)) { - pData->param.data[index].index = index; - pData->param.data[index].rindex = rindex; - pData->param.data[index].hints = static_cast(hints); + pData->param.data[index].type = static_cast(type); + pData->param.data[index].index = index; + pData->param.data[index].rindex = rindex; + pData->param.data[index].hints = static_cast(hints); fParams[index].name = name; fParams[index].unit = unit; } diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 33c52a067..09ac42445 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -1124,11 +1124,15 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu #ifdef BUILD_BRIDGE if (! gIsLoadingProject) { - CARLA_ASSERT(! sendGui); // this should never happen + //CARLA_ASSERT(! sendGui); // this should never happen } #endif -#ifndef BUILD_BRIDGE +#ifdef BUILD_BRIDGE + if (sendGui == sendOsc && sendOsc == sendCallback && ! sendCallback) { + //pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(parameterId), 1, value); + } +#else if (sendGui && (pData->hints & PLUGIN_HAS_CUSTOM_UI) != 0) uiParameterChange(parameterId, value); @@ -1138,14 +1142,6 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu if (sendCallback) pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, static_cast(parameterId), 0, value, nullptr); - -#ifdef BUILD_BRIDGE - return; - - // unused - (void)sendGui; - (void)sendOsc; -#endif } void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept @@ -1598,8 +1594,8 @@ void CarlaPlugin::registerToOscClient() noexcept for (uint32_t i=0; i < pData->param.count; ++i) { - carla_fill(bufName, STR_MAX, '\0'); - carla_fill(bufUnit, STR_MAX, '\0'); + carla_zeroChar(bufName, STR_MAX); + carla_zeroChar(bufUnit, STR_MAX); getParameterName(i, bufName); getParameterUnit(i, bufUnit); diff --git a/source/backend/plugin/CarlaPluginInternal.cpp b/source/backend/plugin/CarlaPluginInternal.cpp index ecc90c67e..6418e5a7e 100644 --- a/source/backend/plugin/CarlaPluginInternal.cpp +++ b/source/backend/plugin/CarlaPluginInternal.cpp @@ -219,7 +219,7 @@ PluginParameterData::~PluginParameterData() noexcept CARLA_ASSERT(special == nullptr); } -void PluginParameterData::createNew(const uint32_t newCount, const bool withSpecial) +void PluginParameterData::createNew(const uint32_t newCount, const bool withSpecial, const bool doReset) { CARLA_ASSERT_INT(count == 0, count); CARLA_SAFE_ASSERT_RETURN(data == nullptr,); @@ -233,6 +233,28 @@ void PluginParameterData::createNew(const uint32_t newCount, const bool withSpec if (withSpecial) special = new SpecialParameterType[newCount]; + + if (! doReset) + return; + + for (uint32_t i=0; i < newCount; ++i) + { + data[i].type = PARAMETER_UNKNOWN; + data[i].hints = 0x0; + data[i].index = PARAMETER_NULL; + data[i].rindex = PARAMETER_NULL; + data[i].midiCC = -1; + data[i].midiChannel = 0; + ranges[i].def = 0.0f; + ranges[i].min = 0.0f; + ranges[i].max = 0.0f; + ranges[i].step = 0.0f; + ranges[i].stepSmall = 0.0f; + ranges[i].stepLarge = 0.0f; + + if (withSpecial) + special[i] = PARAMETER_SPECIAL_NULL; + } } void PluginParameterData::clear() noexcept diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index 5184c236b..d16ff238a 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -72,7 +72,7 @@ const unsigned int PLUGIN_EXTRA_HINT_USES_MULTI_PROGS = 0x08; * so events have to be postponned to be executed later, on a separate thread. */ enum PluginPostRtEventType { - kPluginPostRtEventNull, + kPluginPostRtEventNull = 0, kPluginPostRtEventDebug, kPluginPostRtEventParameterChange, // param, SP (*), value (SP: if 1, don't report change to Callback and OSC) kPluginPostRtEventProgramChange, // index @@ -183,7 +183,7 @@ struct PluginParameterData { PluginParameterData() noexcept; ~PluginParameterData() noexcept; - void createNew(const uint32_t newCount, const bool withSpecial); + void createNew(const uint32_t newCount, const bool withSpecial, const bool doReset); void clear() noexcept; float getFixedValue(const uint32_t parameterId, const float& value) const noexcept; diff --git a/source/backend/plugin/DssiPlugin.cpp b/source/backend/plugin/DssiPlugin.cpp index 51fc619fb..9af2b1e7f 100644 --- a/source/backend/plugin/DssiPlugin.cpp +++ b/source/backend/plugin/DssiPlugin.cpp @@ -510,7 +510,7 @@ public: if (params > 0) { - pData->param.createNew(params, true); + pData->param.createNew(params, true, false); fParamBuffers = new float[params]; FLOAT_CLEAR(fParamBuffers, params); @@ -1997,23 +1997,31 @@ private: static LinkedList sMultiSynthList; - static bool addUniqueMultiSynth(const char* const label) + static bool addUniqueMultiSynth(const char* const label) noexcept { CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0', false); + const char* dlabel = nullptr; + + try { + dlabel = carla_strdup(label); + } catch(...) { return false; } + for (LinkedList::Itenerator it = sMultiSynthList.begin(); it.valid(); it.next()) { const char* const itLabel(it.getValue()); - if (std::strcmp(label, itLabel) == 0) + if (std::strcmp(dlabel, itLabel) == 0) + { + delete[] dlabel; return false; + } } - sMultiSynthList.append(carla_strdup(label)); - return true; + return sMultiSynthList.append(dlabel); } - static void removeUniqueMultiSynth(const char* const label) + static void removeUniqueMultiSynth(const char* const label) noexcept { CARLA_SAFE_ASSERT_RETURN(label != nullptr && label[0] != '\0',); diff --git a/source/backend/plugin/FluidSynthPlugin.cpp b/source/backend/plugin/FluidSynthPlugin.cpp index e2d69e6f7..3b374170a 100644 --- a/source/backend/plugin/FluidSynthPlugin.cpp +++ b/source/backend/plugin/FluidSynthPlugin.cpp @@ -555,7 +555,7 @@ public: params = FluidSynthParametersMax; pData->audioOut.createNew(aOuts); - pData->param.createNew(params, false); + pData->param.createNew(params, false, false); const uint portNameSize(pData->engine->getMaxPortNameSize()); CarlaString portName; diff --git a/source/backend/plugin/JucePlugin.cpp b/source/backend/plugin/JucePlugin.cpp index f8418e25e..12cd6aee2 100644 --- a/source/backend/plugin/JucePlugin.cpp +++ b/source/backend/plugin/JucePlugin.cpp @@ -351,7 +351,7 @@ public: if (params > 0) { - pData->param.createNew(params, false); + pData->param.createNew(params, false, false); needsCtrlIn = true; } diff --git a/source/backend/plugin/LadspaPlugin.cpp b/source/backend/plugin/LadspaPlugin.cpp index f5d17a3b8..2d5cd5c55 100644 --- a/source/backend/plugin/LadspaPlugin.cpp +++ b/source/backend/plugin/LadspaPlugin.cpp @@ -496,7 +496,7 @@ public: if (params > 0) { - pData->param.createNew(params, true); + pData->param.createNew(params, true, false); fParamBuffers = new float[params]; FLOAT_CLEAR(fParamBuffers, params); diff --git a/source/backend/plugin/Lv2Plugin.cpp b/source/backend/plugin/Lv2Plugin.cpp index 64226eba9..1fed2fcc5 100644 --- a/source/backend/plugin/Lv2Plugin.cpp +++ b/source/backend/plugin/Lv2Plugin.cpp @@ -1428,7 +1428,7 @@ public: if (params > 0) { - pData->param.createNew(params, true); + pData->param.createNew(params, true, false); fParamBuffers = new float[params]; FLOAT_CLEAR(fParamBuffers, params); } diff --git a/source/backend/plugin/NativePlugin.cpp b/source/backend/plugin/NativePlugin.cpp index 5678a63d6..18551de46 100644 --- a/source/backend/plugin/NativePlugin.cpp +++ b/source/backend/plugin/NativePlugin.cpp @@ -175,7 +175,7 @@ public: carla_debug("NativePlugin::~NativePlugin()"); // close UI - if (pData->hints & PLUGIN_HAS_UI) + if (pData->hints & PLUGIN_HAS_CUSTOM_UI) { if (fIsUiVisible && fDescriptor != nullptr && fDescriptor->ui_show != nullptr && fHandle != nullptr) fDescriptor->ui_show(fHandle, false); @@ -826,7 +826,7 @@ public: if (params > 0) { - pData->param.createNew(params, true); + pData->param.createNew(params, true, false); } const uint portNameSize(pData->engine->getMaxPortNameSize()); diff --git a/source/backend/plugin/ReWirePlugin.cpp b/source/backend/plugin/ReWirePlugin.cpp index 055674568..7b949a97a 100644 --- a/source/backend/plugin/ReWirePlugin.cpp +++ b/source/backend/plugin/ReWirePlugin.cpp @@ -552,7 +552,7 @@ public: if (params > 0) { - pData->param.createNew(params, false); + pData->param.createNew(params, false, true); needsCtrlIn = true; } diff --git a/source/backend/plugin/VstPlugin.cpp b/source/backend/plugin/VstPlugin.cpp index c8d018af8..76df6fa02 100644 --- a/source/backend/plugin/VstPlugin.cpp +++ b/source/backend/plugin/VstPlugin.cpp @@ -560,7 +560,7 @@ public: if (params > 0) { - pData->param.createNew(params, false); + pData->param.createNew(params, false, false); needsCtrlIn = true; } @@ -1854,12 +1854,7 @@ protected: case audioMasterGetNumAutomatableParameters: // Deprecated in VST SDK 2.4 - if (fEffect->numParams <= 0) - ret = 0; - else if (fEffect->numParams > static_cast(pData->engine->getOptions().maxParameters)) - ret = static_cast(pData->engine->getOptions().maxParameters); - else - ret = fEffect->numParams; + ret = carla_fixValue(0, static_cast(pData->engine->getOptions().maxParameters), fEffect->numParams); break; case audioMasterGetParameterQuantization: diff --git a/source/bridges/CarlaBridgePlugin.cpp b/source/bridges/CarlaBridgePlugin.cpp index cf80f7215..28aad7ceb 100644 --- a/source/bridges/CarlaBridgePlugin.cpp +++ b/source/bridges/CarlaBridgePlugin.cpp @@ -377,7 +377,10 @@ protected: { case ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED: if (isOscControlRegistered()) - sendOscControl(value1, value3); + { + CARLA_SAFE_ASSERT_RETURN(value1 >= 0,); + fEngine->oscSend_bridge_parameter_value(static_cast(value1), value3); + } break; case ENGINE_CALLBACK_UI_STATE_CHANGED: diff --git a/source/carla_skin.py b/source/carla_skin.py index b072ea1e5..afea88f58 100644 --- a/source/carla_skin.py +++ b/source/carla_skin.py @@ -776,8 +776,10 @@ class PluginSlot_BasicFX(AbstractPluginSlot): paramRanges = gCarla.host.get_parameter_ranges(self.fPluginId, i) if paramData['type'] != PARAMETER_INPUT: + print("NOT input", paramData['type']) continue if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0: + print("NOT enabled", paramData['hints']) continue paramName = paramInfo['name'].split("/", 1)[0].split(" (", 1)[0].strip() diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp index 7b4de374a..c17f294c5 100644 --- a/source/discovery/carla-discovery.cpp +++ b/source/discovery/carla-discovery.cpp @@ -207,7 +207,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t break; case DECLARE_VST_DEPRECATED(audioMasterGetNumAutomatableParameters): - ret = carla_min(effect->numParams, MAX_DEFAULT_PARAMETERS, 0); + ret = carla_fixValue(0, MAX_DEFAULT_PARAMETERS, effect->numParams); break; case DECLARE_VST_DEPRECATED(audioMasterGetParameterQuantization): diff --git a/source/utils/CarlaBridgeUtils.hpp b/source/utils/CarlaBridgeUtils.hpp index fa34b7c63..967e99baa 100644 --- a/source/utils/CarlaBridgeUtils.hpp +++ b/source/utils/CarlaBridgeUtils.hpp @@ -52,16 +52,17 @@ enum PluginBridgeInfoType { }; enum PluginBridgeOpcode { - kPluginBridgeOpcodeNull = 0, - kPluginBridgeOpcodeSetAudioPool = 1, // long - kPluginBridgeOpcodeSetBufferSize = 2, // int - kPluginBridgeOpcodeSetSampleRate = 3, // float - kPluginBridgeOpcodeSetParameter = 4, // int, float - kPluginBridgeOpcodeSetProgram = 5, // int - kPluginBridgeOpcodeSetMidiProgram = 6, // int - kPluginBridgeOpcodeMidiEvent = 7, // long, int, char[] (long = timeFrame, int = size max 4) - kPluginBridgeOpcodeProcess = 8, - kPluginBridgeOpcodeQuit = 9 + kPluginBridgeOpcodeNull = 0, + kPluginBridgeOpcodeSetAudioPool = 1, // long + kPluginBridgeOpcodeSetBufferSize = 2, // int + kPluginBridgeOpcodeSetSampleRate = 3, // float + kPluginBridgeOpcodeSetParameterRt = 4, // int, float + kPluginBridgeOpcodeSetParameterNonRt = 5, // int, float + kPluginBridgeOpcodeSetProgram = 6, // int + kPluginBridgeOpcodeSetMidiProgram = 7, // int + kPluginBridgeOpcodeMidiEvent = 8, // long, int, char[] (long = timeFrame, int = size max 4) + kPluginBridgeOpcodeProcess = 9, + kPluginBridgeOpcodeQuit = 10 }; const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host call, tells host GUI is now hidden @@ -174,8 +175,10 @@ const char* PluginBridgeOpcode2str(const PluginBridgeOpcode opcode) noexcept return "kPluginBridgeOpcodeSetBufferSize"; case kPluginBridgeOpcodeSetSampleRate: return "kPluginBridgeOpcodeSetSampleRate"; - case kPluginBridgeOpcodeSetParameter: - return "kPluginBridgeOpcodeSetParameter"; + case kPluginBridgeOpcodeSetParameterRt: + return "kPluginBridgeOpcodeSetParameterRt"; + case kPluginBridgeOpcodeSetParameterNonRt: + return "kPluginBridgeOpcodeSetParameterNonRt"; case kPluginBridgeOpcodeSetProgram: return "kPluginBridgeOpcodeSetProgram"; case kPluginBridgeOpcodeSetMidiProgram: