From c0c08e88980a32113a551a17b119deea3202bcb4 Mon Sep 17 00:00:00 2001 From: falkTX Date: Thu, 18 Jan 2018 07:20:46 +0100 Subject: [PATCH] Start splitting RT and non-RT plugin functions --- data/stoat/run-stoat.sh | 3 +- data/stoat/whitelist.txt | 1 + source/backend/CarlaPlugin.hpp | 14 ++ source/backend/plugin/CarlaPlugin.cpp | 69 +++++++++ source/backend/plugin/CarlaPluginBridge.cpp | 14 +- source/backend/plugin/CarlaPluginDSSI.cpp | 26 ++-- .../backend/plugin/CarlaPluginFluidSynth.cpp | 141 ++++++++++-------- source/backend/plugin/CarlaPluginJack.cpp | 14 +- source/backend/plugin/CarlaPluginLADSPA.cpp | 26 ++-- source/backend/plugin/CarlaPluginLV2.cpp | 26 ++-- .../plugin/CarlaPluginLinuxSampler.cpp | 37 +++-- source/backend/plugin/CarlaPluginNative.cpp | 33 ++-- source/backend/plugin/CarlaPluginVST2.cpp | 26 ++-- 13 files changed, 290 insertions(+), 140 deletions(-) diff --git a/data/stoat/run-stoat.sh b/data/stoat/run-stoat.sh index 62ae7d292..6547e7b16 100755 --- a/data/stoat/run-stoat.sh +++ b/data/stoat/run-stoat.sh @@ -11,4 +11,5 @@ export CXXFLAGS=${CFLAGS} export LDFLAGS="-ljack" make -j 8 EXTERNAL_PLUGINS=false backend -stoat --recursive build/ -G stoat-output.png -b data/stoat/blacklist.txt -w data/stoat/whitelist.txt +stoat --recursive build/ -b data/stoat/blacklist.txt -w data/stoat/whitelist.txt +# -G stoat-output.png diff --git a/data/stoat/whitelist.txt b/data/stoat/whitelist.txt index 24f40a1ef..e3163ee12 100644 --- a/data/stoat/whitelist.txt +++ b/data/stoat/whitelist.txt @@ -210,6 +210,7 @@ fluid_synth_set_chorus_on fluid_synth_set_chorus fluid_synth_set_polyphony fluid_synth_set_interp_method +LinuxSampler::InstrumentManager::LoadInstrumentInBackground # Report upstream llround diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 2fd61338f..1cdabbbb2 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -513,6 +513,15 @@ public: * @note Force-Stereo plugins only! */ void setPanning(const float value, const bool sendOsc, const bool sendCallback) noexcept; + + /*! + * 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; #endif /*! @@ -539,6 +548,11 @@ public: */ virtual void setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept; + /*! + * Overloaded function, to be called from within RT context only. + */ + virtual void setParameterValueRT(const uint32_t parameterId, const float value) noexcept; + /*! * Set a plugin's parameter value, including internal parameters. * @a rindex can be negative to allow internal parameters change (as defined in InternalParametersIndex). diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 72396148c..36df4cb9a 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -1417,6 +1417,70 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s // may be unused return; (void)sendOsc; } + +void CarlaPlugin::setDryWetRT(const float value) noexcept +{ + CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.0f); + + const float fixedValue(carla_fixedValue(0.0f, 1.0f, value)); + + if (carla_isEqual(pData->postProc.dryWet, fixedValue)) + return; + + pData->postProc.dryWet = fixedValue; + pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, fixedValue); +} + +void CarlaPlugin::setVolumeRT(const float value) noexcept +{ + CARLA_SAFE_ASSERT(value >= 0.0f && value <= 1.27f); + + const float fixedValue(carla_fixedValue(0.0f, 1.27f, value)); + + if (carla_isEqual(pData->postProc.volume, fixedValue)) + return; + + pData->postProc.volume = fixedValue; + pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, fixedValue); +} + +void CarlaPlugin::setBalanceLeftRT(const float value) noexcept +{ + CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); + + const float fixedValue(carla_fixedValue(-1.0f, 1.0f, value)); + + if (carla_isEqual(pData->postProc.balanceLeft, fixedValue)) + return; + + pData->postProc.balanceLeft = fixedValue; + pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, fixedValue); +} + +void CarlaPlugin::setBalanceRightRT(const float value) noexcept +{ + CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); + + const float fixedValue(carla_fixedValue(-1.0f, 1.0f, value)); + + if (carla_isEqual(pData->postProc.balanceRight, fixedValue)) + return; + + pData->postProc.balanceRight = fixedValue; + pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, fixedValue); +} + +void CarlaPlugin::setPanningRT(const float value) noexcept +{ + CARLA_SAFE_ASSERT(value >= -1.0f && value <= 1.0f); + + const float fixedValue(carla_fixedValue(-1.0f, 1.0f, value)); + + if (carla_isEqual(pData->postProc.panning, fixedValue)) + return; + + pData->postProc.panning = fixedValue; +} #endif // ! BUILD_BRIDGE void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept @@ -1469,6 +1533,11 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu return; (void)sendOsc; } +void CarlaPlugin::setParameterValueRT(const uint32_t parameterId, const float value) noexcept +{ + pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(parameterId), 0, value); +} + void CarlaPlugin::setParameterValueByRealIndex(const int32_t rindex, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept { #ifndef BUILD_BRIDGE diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index 7e3e5ba25..f3fe57523 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -1195,15 +1195,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1227,10 +1225,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -2567,7 +2563,7 @@ private: return; fTimedOut = true; - carla_stderr("waitForClient(%s) timed out", action); + carla_stderr2("waitForClient(%s) timed out", action); } CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginBridge) diff --git a/source/backend/plugin/CarlaPluginDSSI.cpp b/source/backend/plugin/CarlaPluginDSSI.cpp index 1b9e567bc..d5093e06f 100644 --- a/source/backend/plugin/CarlaPluginDSSI.cpp +++ b/source/backend/plugin/CarlaPluginDSSI.cpp @@ -555,6 +555,17 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + fParamBuffers[parameterId] = fixedValue; + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override { CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr,); @@ -1432,15 +1443,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1464,10 +1473,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1500,8 +1507,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) diff --git a/source/backend/plugin/CarlaPluginFluidSynth.cpp b/source/backend/plugin/CarlaPluginFluidSynth.cpp index 2c98e3c45..9d6834133 100644 --- a/source/backend/plugin/CarlaPluginFluidSynth.cpp +++ b/source/backend/plugin/CarlaPluginFluidSynth.cpp @@ -388,69 +388,93 @@ public: { CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + float fixedValue; + + { + const ScopedSingleProcessLocker spl(this, (sendGui || sendOsc || sendCallback)); + fixedValue = setParameterValueInFluidSynth(parameterId, value); + + } + + CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); + } + + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + const float fixedValue = setParameterValueInFluidSynth(parameterId, value); + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + + float setParameterValueInFluidSynth(const uint32_t parameterId, const float value) noexcept + { + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, value); + const float fixedValue(pData->param.getFixedValue(parameterId, value)); fParamBuffers[parameterId] = fixedValue; + switch (parameterId) { - const ScopedSingleProcessLocker spl(this, (sendGui || sendOsc || sendCallback)); + case FluidSynthReverbOnOff: + try { + fluid_synth_set_reverb_on(fSynth, (fixedValue > 0.5f) ? 1 : 0); + } CARLA_SAFE_EXCEPTION("fluid_synth_set_reverb_on") + break; - switch (parameterId) - { - case FluidSynthReverbOnOff: - try { - fluid_synth_set_reverb_on(fSynth, (fixedValue > 0.5f) ? 1 : 0); - } catch(...) {} - break; - - case FluidSynthReverbRoomSize: - case FluidSynthReverbDamp: - case FluidSynthReverbLevel: - case FluidSynthReverbWidth: - try { - fluid_synth_set_reverb(fSynth, fParamBuffers[FluidSynthReverbRoomSize], fParamBuffers[FluidSynthReverbDamp], fParamBuffers[FluidSynthReverbWidth], fParamBuffers[FluidSynthReverbLevel]); - } catch(...) {} - break; + case FluidSynthReverbRoomSize: + case FluidSynthReverbDamp: + case FluidSynthReverbLevel: + case FluidSynthReverbWidth: + try { + fluid_synth_set_reverb(fSynth, + fParamBuffers[FluidSynthReverbRoomSize], + fParamBuffers[FluidSynthReverbDamp], + fParamBuffers[FluidSynthReverbWidth], + fParamBuffers[FluidSynthReverbLevel]); + } CARLA_SAFE_EXCEPTION("fluid_synth_set_reverb") + break; - case FluidSynthChorusOnOff: - try { - fluid_synth_set_chorus_on(fSynth, (value > 0.5f) ? 1 : 0); - } catch(...) {} - break; - - case FluidSynthChorusNr: - case FluidSynthChorusLevel: - case FluidSynthChorusSpeedHz: - case FluidSynthChorusDepthMs: - case FluidSynthChorusType: - try { - fluid_synth_set_chorus(fSynth, (int)fParamBuffers[FluidSynthChorusNr], fParamBuffers[FluidSynthChorusLevel], fParamBuffers[FluidSynthChorusSpeedHz], fParamBuffers[FluidSynthChorusDepthMs], (int)fParamBuffers[FluidSynthChorusType]); - } catch(...) {} - break; + case FluidSynthChorusOnOff: + try { + fluid_synth_set_chorus_on(fSynth, (value > 0.5f) ? 1 : 0); + } CARLA_SAFE_EXCEPTION("fluid_synth_set_chorus_on") + break; - case FluidSynthPolyphony: - try { - fluid_synth_set_polyphony(fSynth, (int)value); - } catch(...) {} - break; + case FluidSynthChorusNr: + case FluidSynthChorusLevel: + case FluidSynthChorusSpeedHz: + case FluidSynthChorusDepthMs: + case FluidSynthChorusType: + try { + fluid_synth_set_chorus(fSynth, + (int)fParamBuffers[FluidSynthChorusNr], + fParamBuffers[FluidSynthChorusLevel], + fParamBuffers[FluidSynthChorusSpeedHz], + fParamBuffers[FluidSynthChorusDepthMs], + (int)fParamBuffers[FluidSynthChorusType]); + } CARLA_SAFE_EXCEPTION("fluid_synth_set_chorus") + break; - case FluidSynthInterpolation: - for (int i=0; i < MAX_MIDI_CHANNELS; ++i) - { - try { - fluid_synth_set_interp_method(fSynth, i, (int)value); - } - catch(...) { - break; - } - } - break; + case FluidSynthPolyphony: + try { + fluid_synth_set_polyphony(fSynth, (int)value); + } CARLA_SAFE_EXCEPTION("fluid_synth_set_polyphony") + break; - default: - break; + case FluidSynthInterpolation: + for (int i=0; i < MAX_MIDI_CHANNELS; ++i) + { + try { + fluid_synth_set_interp_method(fSynth, i, (int)value); + } CARLA_SAFE_EXCEPTION_BREAK("fluid_synth_set_interp_method") } + break; + + default: + break; } - CarlaPlugin::setParameterValue(parameterId, value, sendGui, sendOsc, sendCallback); + return fixedValue; } void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override @@ -1128,15 +1152,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1160,10 +1182,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1196,8 +1216,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) diff --git a/source/backend/plugin/CarlaPluginJack.cpp b/source/backend/plugin/CarlaPluginJack.cpp index f7797c1b9..d0991a88f 100644 --- a/source/backend/plugin/CarlaPluginJack.cpp +++ b/source/backend/plugin/CarlaPluginJack.cpp @@ -722,15 +722,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -754,10 +752,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1427,7 +1423,7 @@ private: return; fTimedOut = true; - carla_stderr("waitForClient(%s) timed out", action); + carla_stderr2("waitForClient(%s) timed out", action); } bool restartBridgeThread() diff --git a/source/backend/plugin/CarlaPluginLADSPA.cpp b/source/backend/plugin/CarlaPluginLADSPA.cpp index 30c1e69e4..7ec82a3b3 100644 --- a/source/backend/plugin/CarlaPluginLADSPA.cpp +++ b/source/backend/plugin/CarlaPluginLADSPA.cpp @@ -401,6 +401,17 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + fParamBuffers[parameterId] = fixedValue; + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + // ------------------------------------------------------------------- // Misc @@ -965,15 +976,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -997,10 +1006,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1033,8 +1040,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } break; diff --git a/source/backend/plugin/CarlaPluginLV2.cpp b/source/backend/plugin/CarlaPluginLV2.cpp index a3d9b42bb..3ac5ff911 100644 --- a/source/backend/plugin/CarlaPluginLV2.cpp +++ b/source/backend/plugin/CarlaPluginLV2.cpp @@ -1146,6 +1146,17 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(fParamBuffers != nullptr,); + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + fParamBuffers[parameterId] = fixedValue; + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override { CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); @@ -3141,15 +3152,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -3173,10 +3182,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -3210,8 +3217,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) diff --git a/source/backend/plugin/CarlaPluginLinuxSampler.cpp b/source/backend/plugin/CarlaPluginLinuxSampler.cpp index 344be7e40..560928ce4 100644 --- a/source/backend/plugin/CarlaPluginLinuxSampler.cpp +++ b/source/backend/plugin/CarlaPluginLinuxSampler.cpp @@ -438,6 +438,28 @@ public: // ------------------------------------------------------------------- // Set data (plugin-specific stuff) + void setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + + // nothing here for now + + CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); + } + + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + + // nothing here for now + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override { CARLA_SAFE_ASSERT_RETURN(type != nullptr && type[0] != '\0',); @@ -906,15 +928,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -938,10 +958,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -971,8 +989,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 712711d62..de4bb0dee 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -614,6 +614,24 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); + CARLA_SAFE_ASSERT_RETURN(fDescriptor->set_parameter_value != nullptr,); + CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + + // FIXME - try + fDescriptor->set_parameter_value(fHandle, parameterId, fixedValue); + + if (fHandle2 != nullptr) + fDescriptor->set_parameter_value(fHandle2, parameterId, fixedValue); + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override { CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); @@ -1509,15 +1527,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) @@ -1541,10 +1557,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1577,8 +1591,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index f0ccc75a1..29ef3fc06 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -360,6 +360,17 @@ public: CarlaPlugin::setParameterValue(parameterId, fixedValue, sendGui, sendOsc, sendCallback); } + void setParameterValueRT(const uint32_t parameterId, const float value) noexcept override + { + CARLA_SAFE_ASSERT_RETURN(fEffect != nullptr,); + CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); + + const float fixedValue(pData->param.getFixedValue(parameterId, value)); + fEffect->setParameter(fEffect, static_cast(parameterId), fixedValue); + + CarlaPlugin::setParameterValueRT(parameterId, fixedValue); + } + void setChunkData(const void* const data, const std::size_t dataSize) override { CARLA_SAFE_ASSERT_RETURN(pData->options & PLUGIN_OPTION_USE_CHUNKS,); @@ -1231,15 +1242,13 @@ public: if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) { value = ctrlEvent.value; - setDryWet(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); + setDryWetRT(value); } if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) { value = ctrlEvent.value*127.0f/100.0f; - setVolume(value, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); + setVolumeRT(value); } if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) @@ -1263,10 +1272,8 @@ public: right = 1.0f; } - setBalanceLeft(left, false, false); - setBalanceRight(right, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_LEFT, 0, left); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_BALANCE_RIGHT, 0, right); + setBalanceLeftRT(left); + setBalanceRightRT(right); } } #endif @@ -1300,8 +1307,7 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); - pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); + setParameterValueRT(k, value); } if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL)