From 87dcb5e02bacaf5a6aa1443d1fe6fa6d33244688 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Fri, 16 Mar 2018 11:24:06 +0000 Subject: [PATCH] Fixed an issue with recursive VST3 parameter changed callbacks --- .../VST3/juce_VST3_Wrapper.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 135c232e96..dd438c410f 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -112,6 +112,8 @@ private: class JuceVST3Component; +static ThreadLocalValue inParameterChangedCallback; + //============================================================================== class JuceVST3EditController : public Vst::EditController, public Vst::IMidiMapping, @@ -252,6 +254,8 @@ public: if (auto* param = owner.getParameters()[paramIndex]) { param->setValue (value); + + inParameterChangedCallback = true; param->sendValueChangedMessageToListeners (value); } else @@ -602,6 +606,12 @@ public: void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { + if (inParameterChangedCallback.get()) + { + inParameterChangedCallback = false; + return; + } + // NB: Cubase has problems if performEdit is called without setParamNormalized EditController::setParamNormalized (getVSTParamIDForIndex (index), (double) newValue); performEdit (getVSTParamIDForIndex (index), (double) newValue); @@ -1137,6 +1147,8 @@ public: : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)), host (h) { + inParameterChangedCallback = false; + #ifdef JucePlugin_PreferredChannelConfigurations short configs[][2] = { JucePlugin_PreferredChannelConfigurations }; const int numConfigs = sizeof (configs) / sizeof (short[2]); @@ -2031,6 +2043,8 @@ public: if (auto* param = pluginInstance->getParameters()[index]) { param->setValue (floatValue); + + inParameterChangedCallback = true; param->sendValueChangedMessageToListeners (floatValue); } else if (isPositiveAndBelow (index, pluginInstance->getNumParameters()))