diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp index c095690e10e1..0d2f2c05c1e4 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp @@ -1240,6 +1240,24 @@ class JuceVST3EditController final : public Vst::EditController, return kResultOk; } + + //============================================================================== + tresult PLUGIN_API setComponentHandler (Steinberg::Vst::IComponentHandler* newHandler) override + { + auto result = Vst::EditController::setComponentHandler (newHandler); + // The following is needed because Studio One calls this method after our installAudioProcessor method, + // so installAudioProcessor is not able to set a non-null IComponentHandler on VST3ClientExtensions. + // Other DAWs call this method before our installAudioProcessor (when audioProcessor is still nullptr). + if(audioProcessor != nullptr) + { + if (auto* extensions = audioProcessor->get()->getVST3ClientExtensions()) + { + extensions->setIComponentHandler (componentHandler); + } + } + return result; + } + void setAudioProcessor (JuceAudioProcessor* audioProc) { if (audioProcessor.get() != audioProc) @@ -1706,7 +1724,10 @@ class JuceVST3EditController final : public Vst::EditController, if (auto* extensions = audioProcessor->get()->getVST3ClientExtensions()) { - extensions->setIComponentHandler (componentHandler); + if (componentHandler != nullptr) + { + extensions->setIComponentHandler (componentHandler); + } extensions->setIHostApplication (hostContext.get()); }