From 2d9231111699b6ead3df922b07a95eec9db4c114 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Fri, 15 Dec 2017 11:31:45 +0000 Subject: [PATCH] VST3: Fixed an issue with parallel streams of parameter updates during playback --- .../VST3/juce_VST3_Wrapper.cpp | 14 ++++++++++++-- .../processors/juce_AudioProcessor.h | 6 ++++++ 2 files changed, 18 insertions(+), 2 deletions(-) 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 d0b65671e1..c2f4869626 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -241,7 +241,12 @@ public: if (v != valueNormalized) { valueNormalized = v; - owner.setParameter (paramIndex, static_cast (v)); + + // Only update the AudioProcessor here if we're not playing, + // otherwise we get parallel streams of parameter value updates + // during playback + if (owner.vst3IsPlaying.get() == 0) + owner.setParameter (paramIndex, static_cast (v)); changed(); return true; @@ -636,7 +641,6 @@ private: #endif Vst::ParamID bypassParamID; - //============================================================================== void setupParameters() { @@ -2031,9 +2035,15 @@ public: return kResultFalse; if (data.processContext != nullptr) + { processContext = *data.processContext; + pluginInstance->vst3IsPlaying = processContext.state & Vst::ProcessContext::kPlaying; + } else + { zerostruct (processContext); + pluginInstance->vst3IsPlaying = 0; + } midiBuffer.clear(); diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index e58ac7f97d..46f23eae72 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -1606,6 +1606,12 @@ private: template void processBypassed (AudioBuffer&, MidiBuffer&); + #if JucePlugin_Build_VST3 + friend class JuceVST3EditController; + friend class JuceVST3Component; + Atomic vst3IsPlaying { 0 }; + #endif + // This method is no longer used - you can delete it from your AudioProcessor classes. JUCE_DEPRECATED_WITH_BODY (virtual bool silenceInProducesSilenceOut() const, { return false; })