| @@ -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 | |||
| @@ -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 | |||
| @@ -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). | |||
| @@ -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<float>(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<float>(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<float>(-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<float>(-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<float>(-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<int32_t>(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 | |||
| @@ -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) | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
| @@ -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() | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| break; | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
| @@ -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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||
| @@ -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<int32_t>(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<int32_t>(k), 0, value); | |||
| setParameterValueRT(k, value); | |||
| } | |||
| if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param < MAX_MIDI_CONTROL) | |||