diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index 5f51b4f0c4..328a3f5f94 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -780,12 +780,25 @@ namespace AAXClasses return AAX_SUCCESS; } + void setAudioProcessorParameter (int index, float value) + { + if (auto* param = pluginInstance->getParameters()[index]) + { + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + } + else + { + pluginInstance->setParameter (index, value); + } + } + AAX_Result UpdateParameterNormalizedValue (AAX_CParamID paramID, double value, AAX_EUpdateSource source) override { auto result = AAX_CEffectParameters::UpdateParameterNormalizedValue (paramID, value, source); if (! isBypassParam (paramID)) - pluginInstance->setParameter (getParamIndexFromID (paramID), (float) value); + setAudioProcessorParameter (getParamIndexFromID (paramID), (float) value); return result; } @@ -856,7 +869,8 @@ namespace AAXClasses if (auto* p = mParameterManager.GetParameterByID (paramID)) p->SetValueWithFloat ((float) newValue); - pluginInstance->setParameter (getParamIndexFromID (paramID), (float) newValue); + setAudioProcessorParameter (getParamIndexFromID (paramID), (float) newValue); + return AAX_SUCCESS; } @@ -867,7 +881,8 @@ namespace AAXClasses auto paramIndex = getParamIndexFromID (paramID); auto newValue = pluginInstance->getParameter (paramIndex) + (float) newDeltaValue; - pluginInstance->setParameter (paramIndex, jlimit (0.0f, 1.0f, newValue)); + + setAudioProcessorParameter (paramIndex, jlimit (0.0f, 1.0f, newValue)); if (auto* p = mParameterManager.GetParameterByID (paramID)) p->SetValueWithFloat (newValue); diff --git a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index b2f2902ac3..75c875f0f1 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -957,8 +957,19 @@ public: { if (inScope == kAudioUnitScope_Global && juceFilter != nullptr) { - const auto index = getJuceIndexForAUParameterID (inID); - juceFilter->setParameter (index, inValue / getMaximumParameterValue (index)); + auto index = getJuceIndexForAUParameterID (inID); + auto value = inValue / getMaximumParameterValue (index); + + if (auto* param = juceFilter->getParameters()[index]) + { + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + } + else + { + juceFilter->setParameter (index, value); + } + return noErr; } diff --git a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm index 61d6a44bd6..a09342e394 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm @@ -1251,6 +1251,19 @@ private: } } + void setAudioProcessorParameter (int index, float value) + { + if (auto* param = getAudioProcessor().getParameters()[index]) + { + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + } + else if (isPositiveAndBelow (index, getAudioProcessor().getNumParameters())) + { + getAudioProcessor().setParameter (index, value); + } + } + void addPresets() { factoryPresets = [[NSMutableArray alloc] init]; @@ -1303,8 +1316,7 @@ private: const AUParameterEvent& paramEvent = event->parameter; const int idx = getJuceParameterIndexForAUAddress (paramEvent.parameterAddress); - if (isPositiveAndBelow (idx, numParams)) - getAudioProcessor().setParameter (idx, paramEvent.value); + setAudioProcessorParameter (idx, paramEvent.value); } break; @@ -1450,11 +1462,10 @@ private: { if (param != nullptr) { - const int idx = getJuceParameterIndexForAUAddress ([param address]); - auto& processor = getAudioProcessor(); + int idx = getJuceParameterIndexForAUAddress ([param address]); + auto normalisedValue = value / getMaximumParameterValue (idx); - if (isPositiveAndBelow (idx, processor.getNumParameters())) - processor.setParameter (idx, value / getMaximumParameterValue (idx)); + setAudioProcessorParameter (idx, normalisedValue); } } diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp index 373a3e833c..b77cda1e13 100644 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp @@ -685,9 +685,24 @@ public: ComponentResult UpdateControlValue (long controlIndex, long value) override { if (controlIndex != bypassControlIndex) - juceFilter->setParameter (controlIndex - 2, longToFloat (value)); + { + auto paramIndex = controlIndex - 2; + auto floatValue = longToFloat (value); + + if (auto* param = owner.getParameters()[paramIndex]) + { + param->setValue (floatValue); + param->sendValueChangedMessageToListeners (floatValue); + } + else + { + juceFilter->setParameter (paramIndex, floatValue); + } + } else + { mBypassed = (value > 0); + } return CProcess::UpdateControlValue (controlIndex, value); } diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index c573f0c10a..8831d6263f 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -720,8 +720,16 @@ public: { if (processor != nullptr) { - jassert (isPositiveAndBelow (index, processor->getNumParameters())); - processor->setParameter (index, value); + if (auto* param = processor->getParameters()[index]) + { + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + } + else + { + jassert (isPositiveAndBelow (index, processor->getNumParameters())); + processor->setParameter (index, value); + } } } @@ -1816,9 +1824,12 @@ private: { jassert (isPositiveAndBelow (args.index, processor->getNumParameters())); - if (auto* p = processor->getParameters()[args.index]) + if (auto* param = processor->getParameters()[args.index]) { - processor->setParameter (args.index, p->getValueForText (String::fromUTF8 ((char*) args.ptr))); + auto value = param->getValueForText (String::fromUTF8 ((char*) args.ptr)); + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + return 1; } } diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 1dd1798b9c..c48416bbef 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -246,7 +246,19 @@ public: // otherwise we get parallel streams of parameter value updates // during playback if (owner.vst3IsPlaying.get() == 0) - owner.setParameter (paramIndex, static_cast (v)); + { + auto value = static_cast (v); + + if (auto* param = owner.getParameters()[paramIndex]) + { + param->setValue (value); + param->sendValueChangedMessageToListeners (value); + } + else + { + owner.setParameter (paramIndex, value); + } + } changed(); return true; @@ -1998,9 +2010,17 @@ public: else { auto index = getJuceIndexForVSTParamID (vstParamID); + auto floatValue = static_cast (value); - if (isPositiveAndBelow (index, pluginInstance->getNumParameters())) - pluginInstance->setParameter (index, static_cast (value)); + if (auto* param = pluginInstance->getParameters()[index]) + { + param->setValue (floatValue); + param->sendValueChangedMessageToListeners (floatValue); + } + else if (isPositiveAndBelow (index, pluginInstance->getNumParameters())) + { + pluginInstance->setParameter (index, floatValue); + } } } }