| @@ -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<int32_t>(index), static_cast<int32_t>(rindex), static_cast<int32_t>(type), static_cast<int32_t>(hints), name, unit); | |||
| @@ -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<uint32_t>(index), value, (opcode == kPluginBridgeOpcodeSetParameterNonRt), false, false); | |||
| } | |||
| break; | |||
| } | |||
| @@ -148,7 +148,7 @@ struct BridgeAudioPool { | |||
| struct BridgeControl : public RingBufferControl<StackBuffer> { | |||
| 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<int32_t>(parameterId)); | |||
| fShmControl.writeFloat(value); | |||
| fShmControl.commitWrite(); | |||
| fShmControl.writeOpcode(sendGui ? kPluginBridgeOpcodeSetParameterNonRt : kPluginBridgeOpcodeSetParameterRt); | |||
| fShmControl.writeInt(static_cast<int32_t>(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<int32_t>(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<int32_t>(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<char>(note.note); | |||
| data3 = static_cast<char>(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<char>(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<float>(newSampleRate)); | |||
| @@ -1406,11 +1416,11 @@ public: | |||
| CARLA_SAFE_ASSERT_INT2(ins+outs <= static_cast<int32_t>(pData->engine->getOptions().maxParameters), ins+outs, pData->engine->getOptions().maxParameters); | |||
| const uint32_t count(static_cast<uint32_t>(carla_min<int32_t>(ins+outs, static_cast<int32_t>(pData->engine->getOptions().maxParameters), 0))); | |||
| const uint32_t count(carla_fixValue<uint32_t>(0, pData->engine->getOptions().maxParameters, static_cast<uint32_t>(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<int32_t>(pData->param.count)) | |||
| { | |||
| pData->param.data[index].index = index; | |||
| pData->param.data[index].rindex = rindex; | |||
| pData->param.data[index].hints = static_cast<uint>(hints); | |||
| pData->param.data[index].type = static_cast<ParameterType>(type); | |||
| pData->param.data[index].index = index; | |||
| pData->param.data[index].rindex = rindex; | |||
| pData->param.data[index].hints = static_cast<uint>(hints); | |||
| fParams[index].name = name; | |||
| fParams[index].unit = unit; | |||
| } | |||
| @@ -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<int32_t>(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<int>(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<char>(bufName, STR_MAX, '\0'); | |||
| carla_fill<char>(bufUnit, STR_MAX, '\0'); | |||
| carla_zeroChar(bufName, STR_MAX); | |||
| carla_zeroChar(bufUnit, STR_MAX); | |||
| getParameterName(i, bufName); | |||
| getParameterUnit(i, bufUnit); | |||
| @@ -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 | |||
| @@ -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; | |||
| @@ -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<const char*> 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<const char*>::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',); | |||
| @@ -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; | |||
| @@ -351,7 +351,7 @@ public: | |||
| if (params > 0) | |||
| { | |||
| pData->param.createNew(params, false); | |||
| pData->param.createNew(params, false, false); | |||
| needsCtrlIn = true; | |||
| } | |||
| @@ -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); | |||
| @@ -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); | |||
| } | |||
| @@ -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()); | |||
| @@ -552,7 +552,7 @@ public: | |||
| if (params > 0) | |||
| { | |||
| pData->param.createNew(params, false); | |||
| pData->param.createNew(params, false, true); | |||
| needsCtrlIn = true; | |||
| } | |||
| @@ -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<int32_t>(pData->engine->getOptions().maxParameters)) | |||
| ret = static_cast<intptr_t>(pData->engine->getOptions().maxParameters); | |||
| else | |||
| ret = fEffect->numParams; | |||
| ret = carla_fixValue<intptr_t>(0, static_cast<intptr_t>(pData->engine->getOptions().maxParameters), fEffect->numParams); | |||
| break; | |||
| case audioMasterGetParameterQuantization: | |||
| @@ -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<uint32_t>(value1), value3); | |||
| } | |||
| break; | |||
| case ENGINE_CALLBACK_UI_STATE_CHANGED: | |||
| @@ -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() | |||
| @@ -207,7 +207,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t | |||
| break; | |||
| case DECLARE_VST_DEPRECATED(audioMasterGetNumAutomatableParameters): | |||
| ret = carla_min<intptr_t>(effect->numParams, MAX_DEFAULT_PARAMETERS, 0); | |||
| ret = carla_fixValue<intptr_t>(0, MAX_DEFAULT_PARAMETERS, effect->numParams); | |||
| break; | |||
| case DECLARE_VST_DEPRECATED(audioMasterGetParameterQuantization): | |||
| @@ -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: | |||