From 9bc526c1a6ef66476f3103dd38901d174125d406 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 1 Nov 2019 13:00:40 +0100 Subject: [PATCH] Tweak CarlaPlugin API to make RT engine callbacks optional --- source/backend/CarlaPlugin.hpp | 16 +-- source/backend/engine/CarlaEngineNative.cpp | 17 +-- source/backend/plugin/CarlaPlugin.cpp | 116 ++++++++++-------- source/backend/plugin/CarlaPluginBridge.cpp | 29 ++++- source/backend/plugin/CarlaPluginDSSI.cpp | 24 ++-- .../backend/plugin/CarlaPluginFluidSynth.cpp | 23 ++-- source/backend/plugin/CarlaPluginInternal.cpp | 3 +- source/backend/plugin/CarlaPluginInternal.hpp | 4 +- source/backend/plugin/CarlaPluginJack.cpp | 10 +- source/backend/plugin/CarlaPluginJuce.cpp | 12 +- source/backend/plugin/CarlaPluginLADSPA.cpp | 12 +- source/backend/plugin/CarlaPluginLV2.cpp | 28 +++-- source/backend/plugin/CarlaPluginNative.cpp | 23 ++-- source/backend/plugin/CarlaPluginSFZero.cpp | 12 +- source/backend/plugin/CarlaPluginVST2.cpp | 28 +++-- 15 files changed, 205 insertions(+), 152 deletions(-) diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index a8bd73fd6..f5958c51d 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -542,11 +542,11 @@ public: /*! * Overloaded functions, to be called from within RT context only. */ - void setDryWetRT(const float value) noexcept; - void setVolumeRT(const float value) noexcept; - void setBalanceLeftRT(const float value) noexcept; - void setBalanceRightRT(const float value) noexcept; - void setPanningRT(const float value) noexcept; + void setDryWetRT(const float value, const bool sendCallbackLater) noexcept; + void setVolumeRT(const float value, const bool sendCallbackLater) noexcept; + void setBalanceLeftRT(const float value, const bool sendCallbackLater) noexcept; + void setBalanceRightRT(const float value, const bool sendCallbackLater) noexcept; + void setPanningRT(const float value, const bool sendCallbackLater) noexcept; #endif // ! BUILD_BRIDGE_ALTERNATIVE_ARCH /*! @@ -576,7 +576,7 @@ public: /*! * Overloaded function, to be called from within RT context only. */ - virtual void setParameterValueRT(const uint32_t parameterId, const float value) noexcept; + virtual void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept; /*! * Set a plugin's parameter value, including internal parameters. @@ -660,8 +660,8 @@ public: /*! * Overloaded functions, to be called from within RT context only. */ - virtual void setProgramRT(const uint32_t index) noexcept; - virtual void setMidiProgramRT(const uint32_t index) noexcept; + virtual void setProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept; + virtual void setMidiProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept; // ------------------------------------------------------------------- // Plugin state diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 67d77a5c6..71c687233 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -571,12 +571,12 @@ protected: CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); std::snprintf(tmpBuf, STR_MAX, "%f:%f:%f:%f:%f:%f\n", - static_cast(paramRanges.def), - static_cast(paramRanges.min), - static_cast(paramRanges.max), - static_cast(paramRanges.step), - static_cast(paramRanges.stepSmall), - static_cast(paramRanges.stepLarge)); + static_cast(paramRanges.def), + static_cast(paramRanges.min), + static_cast(paramRanges.max), + static_cast(paramRanges.step), + static_cast(paramRanges.stepSmall), + static_cast(paramRanges.stepLarge)); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); std::snprintf(tmpBuf, STR_MAX, "PARAMVAL_%i:%i\n", pluginId, i); @@ -1042,7 +1042,10 @@ protected: if (CarlaPlugin* const plugin = _getFirstPlugin()) { if (index < plugin->getParameterCount()) - plugin->setParameterValueRT(index, value); + { + const float rvalue = plugin->getParameterRanges(index).getUnnormalizedValue(value); + plugin->setParameterValueRT(index, rvalue, false); + } } fParameters[index] = value; diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 68cb6f32e..f6fc7b84b 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -50,7 +50,7 @@ static const MidiProgramData kMidiProgramDataNull = { 0, 0, nullptr }; static const CustomData kCustomDataFallback = { nullptr, nullptr, nullptr }; static /* */ CustomData kCustomDataFallbackNC = { nullptr, nullptr, nullptr }; -static const PluginPostRtEvent kPluginPostRtEventFallback = { kPluginPostRtEventNull, 0, 0, 0, 0.0f }; +static const PluginPostRtEvent kPluginPostRtEventFallback = { kPluginPostRtEventNull, false, 0, 0, 0, 0.0f }; // ------------------------------------------------------------------- // ParamSymbol struct, needed for CarlaPlugin::loadStateSave() @@ -1508,7 +1508,7 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s nullptr); } -void CarlaPlugin::setDryWetRT(const float value) noexcept +void CarlaPlugin::setDryWetRT(const float value, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f); @@ -1518,10 +1518,10 @@ void CarlaPlugin::setDryWetRT(const float value) noexcept return; pData->postProc.dryWet = fixedValue; - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_DRYWET, 0, 0, fixedValue); } -void CarlaPlugin::setVolumeRT(const float value) noexcept +void CarlaPlugin::setVolumeRT(const float value, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.27f); @@ -1531,10 +1531,10 @@ void CarlaPlugin::setVolumeRT(const float value) noexcept return; pData->postProc.volume = fixedValue; - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_VOLUME, 0, 0, fixedValue); } -void CarlaPlugin::setBalanceLeftRT(const float value) noexcept +void CarlaPlugin::setBalanceLeftRT(const float value, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); @@ -1544,10 +1544,10 @@ void CarlaPlugin::setBalanceLeftRT(const float value) noexcept return; pData->postProc.balanceLeft = fixedValue; - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_BALANCE_LEFT, 0, 0, fixedValue); } -void CarlaPlugin::setBalanceRightRT(const float value) noexcept +void CarlaPlugin::setBalanceRightRT(const float value, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); @@ -1557,10 +1557,10 @@ void CarlaPlugin::setBalanceRightRT(const float value) noexcept return; pData->postProc.balanceRight = fixedValue; - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_BALANCE_RIGHT, 0, 0, fixedValue); } -void CarlaPlugin::setPanningRT(const float value) noexcept +void CarlaPlugin::setPanningRT(const float value, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); @@ -1570,6 +1570,7 @@ void CarlaPlugin::setPanningRT(const float value) noexcept return; pData->postProc.panning = fixedValue; + pData->postponeRtEvent(kPluginPostRtEventParameterChange, sendCallbackLater, PARAMETER_PANNING, 0, 0, fixedValue); } #endif // ! BUILD_BRIDGE_ALTERNATIVE_ARCH @@ -1626,9 +1627,10 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu nullptr); } -void CarlaPlugin::setParameterValueRT(const uint32_t parameterId, const float value) noexcept +void CarlaPlugin::setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept { - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(parameterId), 1, 0, value); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, + sendCallbackLater, static_cast(parameterId), 0, 0, value); } void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept @@ -1832,7 +1834,7 @@ void CarlaPlugin::setMidiProgramById(const uint32_t bank, const uint32_t program } } -void CarlaPlugin::setProgramRT(const uint32_t uindex) noexcept +void CarlaPlugin::setProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT_RETURN(uindex < pData->prog.count,); @@ -1851,10 +1853,10 @@ void CarlaPlugin::setProgramRT(const uint32_t uindex) noexcept break; } - pData->postponeRtEvent(kPluginPostRtEventProgramChange, index, 0, 0, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventProgramChange, sendCallbackLater, index, 0, 0, 0.0f); } -void CarlaPlugin::setMidiProgramRT(const uint32_t uindex) noexcept +void CarlaPlugin::setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept { CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); @@ -1873,7 +1875,7 @@ void CarlaPlugin::setMidiProgramRT(const uint32_t uindex) noexcept break; } - pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, index, 0, 0, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, sendCallbackLater, index, 0, 0, 0.0f); } // ------------------------------------------------------------------- @@ -1962,7 +1964,7 @@ void CarlaPlugin::idle() uiParameterChange(static_cast(event.value1), event.valuef); } - if (event.value2 != 0) + if (event.sendCallback) { // Update Host pData->engine->callback(true, true, @@ -2007,13 +2009,15 @@ void CarlaPlugin::idle() nullptr); } - // Update Host - pData->engine->callback(true, true, - ENGINE_CALLBACK_PROGRAM_CHANGED, - pData->id, - event.value1, - 0, 0, 0.0f, nullptr); - + if (event.sendCallback) + { + // Update Host + pData->engine->callback(true, true, + ENGINE_CALLBACK_PROGRAM_CHANGED, + pData->id, + event.value1, + 0, 0, 0.0f, nullptr); + } } break; case kPluginPostRtEventMidiProgramChange: { @@ -2048,13 +2052,15 @@ void CarlaPlugin::idle() nullptr); } - // Update Host - pData->engine->callback(true, true, - ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, - pData->id, - event.value1, - 0, 0, 0.0f, nullptr); - + if (event.sendCallback) + { + // Update Host + pData->engine->callback(true, true, + ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, + pData->id, + event.value1, + 0, 0, 0.0f, nullptr); + } } break; case kPluginPostRtEventNoteOn: { @@ -2075,14 +2081,17 @@ void CarlaPlugin::idle() uiNoteOn(channel, note, velocity); } - // Update Host - pData->engine->callback(true, true, - ENGINE_CALLBACK_NOTE_ON, - pData->id, - event.value1, - event.value2, - event.value3, - 0.0f, nullptr); + if (event.sendCallback) + { + // Update Host + pData->engine->callback(true, true, + ENGINE_CALLBACK_NOTE_ON, + pData->id, + event.value1, + event.value2, + event.value3, + 0.0f, nullptr); + } } break; case kPluginPostRtEventNoteOff: { @@ -2101,13 +2110,16 @@ void CarlaPlugin::idle() uiNoteOff(channel, note); } - // Update Host - pData->engine->callback(true, true, - ENGINE_CALLBACK_NOTE_OFF, - pData->id, - event.value1, - event.value2, - 0, 0.0f, nullptr); + if (event.sendCallback) + { + // Update Host + pData->engine->callback(true, true, + ENGINE_CALLBACK_NOTE_OFF, + pData->id, + event.value1, + event.value2, + 0, 0.0f, nullptr); + } } break; } } @@ -2201,12 +2213,12 @@ void CarlaPlugin::postponeRtAllNotesOff() if (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS) return; - PluginPostRtEvent postEvent; - postEvent.type = kPluginPostRtEventNoteOff; - postEvent.value1 = pData->ctrlChannel; - postEvent.value2 = 0; - postEvent.value3 = 0; - postEvent.valuef = 0.0f; + PluginPostRtEvent postEvent = { + kPluginPostRtEventNoteOff, + true, + pData->ctrlChannel, + 0, 0, 0.0f + }; for (int32_t i=0; i < MAX_MIDI_NOTE; ++i) { diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index 3cf5811fa..b23e18cb4 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -781,6 +781,21 @@ public: CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback, doingInit); } + void setProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(index < pData->prog.count,); + + { + const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); + + fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientSetProgram); + fShmNonRtClientControl.writeInt(static_cast(index)); + fShmNonRtClientControl.commitWrite(); + } + + CarlaPlugin::setProgramRT(index, sendCallbackLater); + } + void setMidiProgram(const int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback, const bool doingInit) noexcept override { CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast(pData->midiprog.count),); @@ -797,7 +812,7 @@ public: CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); } - void setMidiProgramRT(const uint32_t uindex) noexcept override + void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); @@ -809,7 +824,7 @@ public: fShmNonRtClientControl.commitWrite(); } - CarlaPlugin::setMidiProgramRT(uindex); + CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); } void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override @@ -1244,13 +1259,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1274,8 +1289,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1399,6 +1414,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiData[1], midiData[2], @@ -1407,6 +1423,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiData[1], 0, 0.0f); diff --git a/source/backend/plugin/CarlaPluginDSSI.cpp b/source/backend/plugin/CarlaPluginDSSI.cpp index d51bec5cd..14d406654 100644 --- a/source/backend/plugin/CarlaPluginDSSI.cpp +++ b/source/backend/plugin/CarlaPluginDSSI.cpp @@ -564,7 +564,7 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); @@ -572,7 +572,7 @@ public: const float fixedValue(pData->param.getFixedValue(parameterId, value)); fParamBuffers[parameterId] = fixedValue; - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override @@ -661,7 +661,7 @@ public: CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); } - void setMidiProgramRT(const uint32_t uindex) noexcept override + void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr,); CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->select_program != nullptr,); @@ -669,7 +669,7 @@ public: setMidiProgramInDSSI(uindex); - CarlaPlugin::setMidiProgramRT(uindex); + CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); } void setMidiProgramInDSSI(const uint32_t uindex) noexcept @@ -1459,13 +1459,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1489,8 +1489,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1523,7 +1523,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -1558,7 +1558,7 @@ public: { if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId) { - setMidiProgramRT(k); + setMidiProgramRT(k, true); break; } } @@ -1636,7 +1636,7 @@ public: seqEvent.data.note.channel = event.channel; seqEvent.data.note.note = note; - pData->postponeRtEvent(kPluginPostRtEventNoteOff, event.channel, note, 0, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f); break; } @@ -1649,7 +1649,7 @@ public: seqEvent.data.note.note = note; seqEvent.data.note.velocity = velo; - pData->postponeRtEvent(kPluginPostRtEventNoteOn, event.channel, note, velo, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f); break; } diff --git a/source/backend/plugin/CarlaPluginFluidSynth.cpp b/source/backend/plugin/CarlaPluginFluidSynth.cpp index a77ef0709..20aca8071 100644 --- a/source/backend/plugin/CarlaPluginFluidSynth.cpp +++ b/source/backend/plugin/CarlaPluginFluidSynth.cpp @@ -409,11 +409,11 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override { const float fixedValue = setParameterValueInFluidSynth(parameterId, value); - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } float setParameterValueInFluidSynth(const uint32_t parameterId, const float value) noexcept @@ -564,7 +564,7 @@ public: } // FIXME: this is never used - void setMidiProgramRT(const uint32_t uindex) noexcept override + void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fSynth != nullptr,); CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); @@ -581,7 +581,7 @@ public: fCurMidiProgs[pData->ctrlChannel] = static_cast(uindex); } - CarlaPlugin::setMidiProgramRT(uindex); + CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); } // ------------------------------------------------------------------- @@ -1198,13 +1198,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1228,8 +1228,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1262,7 +1262,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -1294,6 +1294,7 @@ public: if (event.channel == pData->ctrlChannel) { pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, + true, static_cast(k), 0, 0, 0.0f); } @@ -1347,7 +1348,7 @@ public: fluid_synth_noteoff(fSynth, event.channel, note); - pData->postponeRtEvent(kPluginPostRtEventNoteOff, event.channel, note, 0, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventNoteOff, true, event.channel, note, 0, 0.0f); break; } @@ -1357,7 +1358,7 @@ public: fluid_synth_noteon(fSynth, event.channel, note, velo); - pData->postponeRtEvent(kPluginPostRtEventNoteOn, event.channel, note, velo, 0.0f); + pData->postponeRtEvent(kPluginPostRtEventNoteOn, true, event.channel, note, velo, 0.0f); break; } diff --git a/source/backend/plugin/CarlaPluginInternal.cpp b/source/backend/plugin/CarlaPluginInternal.cpp index 00d205aa9..2f28f90fc 100644 --- a/source/backend/plugin/CarlaPluginInternal.cpp +++ b/source/backend/plugin/CarlaPluginInternal.cpp @@ -750,6 +750,7 @@ void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEvent& rtEven } void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEventType type, + const bool sendCallbackLater, const int32_t value1, const int32_t value2, const int32_t value3, @@ -757,7 +758,7 @@ void CarlaPlugin::ProtectedData::postponeRtEvent(const PluginPostRtEventType typ { CARLA_SAFE_ASSERT_RETURN(type != kPluginPostRtEventNull,); - PluginPostRtEvent rtEvent = { type, value1, value2, value3, valuef }; + PluginPostRtEvent rtEvent = { type, sendCallbackLater, value1, value2, value3, valuef }; postRtEvents.appendRT(rtEvent); } diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index a717c418c..20251f4af 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -74,7 +74,7 @@ enum SpecialParameterType { enum PluginPostRtEventType { kPluginPostRtEventNull = 0, kPluginPostRtEventDebug, - kPluginPostRtEventParameterChange, // param, SP (*), unused, value (SP: if 1 report to Callback and OSC) + kPluginPostRtEventParameterChange, // param, (unused), (unused), value kPluginPostRtEventProgramChange, // index kPluginPostRtEventMidiProgramChange, // index kPluginPostRtEventNoteOn, // channel, note, velo @@ -87,6 +87,7 @@ enum PluginPostRtEventType { */ struct PluginPostRtEvent { PluginPostRtEventType type; + bool sendCallback; int32_t value1; int32_t value2; int32_t value3; @@ -360,6 +361,7 @@ struct CarlaPlugin::ProtectedData { void postponeRtEvent(const PluginPostRtEvent& rtEvent) noexcept; void postponeRtEvent(const PluginPostRtEventType type, + const bool sendCallbackLater, const int32_t value1, const int32_t value2, const int32_t value3, const float valuef) noexcept; diff --git a/source/backend/plugin/CarlaPluginJack.cpp b/source/backend/plugin/CarlaPluginJack.cpp index 133b84ef8..a8434bff8 100644 --- a/source/backend/plugin/CarlaPluginJack.cpp +++ b/source/backend/plugin/CarlaPluginJack.cpp @@ -1008,13 +1008,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1038,8 +1038,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1136,6 +1136,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiData[1], midiData[2], @@ -1144,6 +1145,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiData[1], 0, 0.0f); diff --git a/source/backend/plugin/CarlaPluginJuce.cpp b/source/backend/plugin/CarlaPluginJuce.cpp index b861f891e..042806034 100644 --- a/source/backend/plugin/CarlaPluginJuce.cpp +++ b/source/backend/plugin/CarlaPluginJuce.cpp @@ -821,13 +821,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -851,8 +851,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -886,7 +886,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -999,6 +999,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiData[1], midiData[2], @@ -1007,6 +1008,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiData[1], 0, 0.0f); diff --git a/source/backend/plugin/CarlaPluginLADSPA.cpp b/source/backend/plugin/CarlaPluginLADSPA.cpp index 83a562574..677951b23 100644 --- a/source/backend/plugin/CarlaPluginLADSPA.cpp +++ b/source/backend/plugin/CarlaPluginLADSPA.cpp @@ -400,7 +400,7 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater = true) noexcept override { CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); @@ -408,7 +408,7 @@ public: const float fixedValue(pData->param.getFixedValue(parameterId, value)); fParamBuffers[parameterId] = fixedValue; - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } // ------------------------------------------------------------------- @@ -979,13 +979,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1009,8 +1009,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif diff --git a/source/backend/plugin/CarlaPluginLV2.cpp b/source/backend/plugin/CarlaPluginLV2.cpp index 0b455742b..136a5d212 100644 --- a/source/backend/plugin/CarlaPluginLV2.cpp +++ b/source/backend/plugin/CarlaPluginLV2.cpp @@ -1365,14 +1365,14 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); const float fixedValue = setParamterValueCommon(parameterId, value); - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override @@ -1455,7 +1455,7 @@ public: CarlaPlugin::setMidiProgram(index, sendGui, sendOsc, sendCallback, doingInit); } - void setMidiProgramRT(const uint32_t uindex) noexcept override + void setMidiProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); CARLA_SAFE_ASSERT_RETURN(uindex < pData->midiprog.count,); @@ -1477,7 +1477,7 @@ public: } } - CarlaPlugin::setMidiProgramRT(uindex); + CarlaPlugin::setMidiProgramRT(uindex, sendCallbackLater); } // ------------------------------------------------------------------- @@ -3342,6 +3342,7 @@ public: if (doPostRt) pData->postponeRtEvent(kPluginPostRtEventParameterChange, + true, static_cast(k), 0, 0, @@ -3604,13 +3605,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -3634,8 +3635,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -3669,7 +3670,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -3731,7 +3732,7 @@ public: { if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId) { - setMidiProgramRT(k); + setMidiProgramRT(k, true); break; } } @@ -3849,6 +3850,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiData[1], midiData[2], @@ -3857,6 +3859,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiData[1], 0, 0.0f); @@ -4139,6 +4142,7 @@ public: { fParamBuffers[k] = pData->param.ranges[k].def; pData->postponeRtEvent(kPluginPostRtEventParameterChange, + true, static_cast(k), 1, 0, fParamBuffers[k]); @@ -4411,6 +4415,7 @@ public: fParamBuffers[k] = sampleRatef; pData->postponeRtEvent(kPluginPostRtEventParameterChange, + true, static_cast(k), 0, 0, @@ -4429,6 +4434,7 @@ public: { fParamBuffers[k] = isOffline ? pData->param.ranges[k].max : pData->param.ranges[k].min; pData->postponeRtEvent(kPluginPostRtEventParameterChange, + true, static_cast(k), 0, 0, @@ -5459,7 +5465,7 @@ public: { if (pData->param.data[i].rindex == rindex) { - setParameterValueRT(i, paramValue); + setParameterValueRT(i, paramValue, true); break; } } diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 0c3457b54..63ef1b574 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -688,7 +688,7 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); CARLA_SAFE_ASSERT_RETURN(fDescriptor->set_parameter_value != nullptr,); @@ -703,7 +703,7 @@ public: if (fHandle2 != nullptr) fDescriptor->set_parameter_value(fHandle2, parameterId, fixedValue); - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override @@ -826,7 +826,7 @@ public: } // FIXME: this is never used - void setMidiProgramRT(const uint32_t index) noexcept override + void setMidiProgramRT(const uint32_t index, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); @@ -834,7 +834,7 @@ public: // TODO, put into check below if ((pData->hints & PLUGIN_IS_SYNTH) != 0 && (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS)) - return CarlaPlugin::setMidiProgramRT(index); + return CarlaPlugin::setMidiProgramRT(index, sendCallbackLater); const uint8_t channel = uint8_t((pData->ctrlChannel >= 0 && pData->ctrlChannel < MAX_MIDI_CHANNELS) ? pData->ctrlChannel : 0); const uint32_t bank = pData->midiprog.data[index].bank; @@ -853,7 +853,7 @@ public: fCurMidiProgs[channel] = static_cast(index); - CarlaPlugin::setMidiProgramRT(index); + CarlaPlugin::setMidiProgramRT(index, sendCallbackLater); } // ------------------------------------------------------------------- @@ -1816,13 +1816,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) @@ -1846,8 +1846,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1880,7 +1880,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -1944,6 +1944,7 @@ public: if (event.channel == pData->ctrlChannel) { pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, + true, static_cast(k), 0, 0, 0.0f); } @@ -2055,6 +2056,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiEvent.data[1], midiEvent.data[2], @@ -2063,6 +2065,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiEvent.data[1], 0, 0.0f); diff --git a/source/backend/plugin/CarlaPluginSFZero.cpp b/source/backend/plugin/CarlaPluginSFZero.cpp index 99e23571e..1e08bc834 100644 --- a/source/backend/plugin/CarlaPluginSFZero.cpp +++ b/source/backend/plugin/CarlaPluginSFZero.cpp @@ -416,13 +416,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -446,8 +446,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -477,7 +477,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -543,6 +543,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiData[1], midiData[2], @@ -551,6 +552,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiData[1], 0, 0.0f); diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index 539d39c5d..089cf39f0 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -388,7 +388,7 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } - void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + void setParameterValueRT(const uint32_t parameterId, const float value, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); @@ -396,7 +396,7 @@ public: const float fixedValue(pData->param.getFixedValue(parameterId, value)); fEffect->setParameter(fEffect, static_cast(parameterId), fixedValue); - CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + CarlaPlugin::setParameterValueRT(parameterId, fixedValue, sendCallbackLater); } void setChunkData(const void* const data, const std::size_t dataSize) override @@ -459,7 +459,7 @@ public: CarlaPlugin::setProgram(index, sendGui, sendOsc, sendCallback, doingInit); } - void setProgramRT(const uint32_t uindex) noexcept override + void setProgramRT(const uint32_t uindex, const bool sendCallbackLater) noexcept override { CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); CARLA_SAFE_ASSERT_RETURN(uindex < pData->prog.count,); @@ -476,7 +476,7 @@ public: dispatcher(effEndSetProgram); } CARLA_SAFE_EXCEPTION("effEndSetProgram"); - CarlaPlugin::setProgramRT(uindex); + CarlaPlugin::setProgramRT(uindex, sendCallbackLater); } // ------------------------------------------------------------------- @@ -1310,13 +1310,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWetRT(value); + setDryWetRT(value, true); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolumeRT(value); + setVolumeRT(value, true); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1340,8 +1340,8 @@ public: right = 1.0f; } - setBalanceLeftRT(left); - setBalanceRightRT(right); + setBalanceLeftRT(left, true); + setBalanceRightRT(right, true); } } #endif @@ -1375,7 +1375,7 @@ public: value = std::rint(value); } - setParameterValueRT(k, value); + setParameterValueRT(k, value, true); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) @@ -1428,7 +1428,7 @@ public: { if (ctrlEvent.param < pData->prog.count) { - setProgramRT(ctrlEvent.param); + setProgramRT(ctrlEvent.param, true); break; } } @@ -1533,6 +1533,7 @@ public: if (status == MIDI_STATUS_NOTE_ON) { pData->postponeRtEvent(kPluginPostRtEventNoteOn, + true, event.channel, midiEvent.data[1], midiEvent.data[2], @@ -1541,6 +1542,7 @@ public: else if (status == MIDI_STATUS_NOTE_OFF) { pData->postponeRtEvent(kPluginPostRtEventNoteOff, + true, event.channel, midiEvent.data[1], 0, 0.0f); @@ -1911,19 +1913,19 @@ protected: else if (pthread_equal(thisThread, fProcThread)) { CARLA_SAFE_ASSERT(fIsProcessing); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); } // Called from effSetChunk or effSetProgram else if (pthread_equal(thisThread, fChangingValuesThread)) { carla_debug("audioMasterAutomate called while setting state"); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); } // Called from effIdle else if (pthread_equal(thisThread, fIdleThread)) { carla_debug("audioMasterAutomate called from idle thread"); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, index, 1, 0, fixedValue); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, true, index, 0, 0, fixedValue); } // Called from UI? else if (fUI.isVisible)