Hi,
I am trying to solve a strange bug with regards to preset changes when we’re running as VST3 plugin and I’m pulling my hair out already…
As VST2, CLAP, AU everything works fine but not as VST3.
When a preset is changed, this can either be done by selecting a new preset via our built-in patch manager or just by sending a midi sysex to the plugin, we do the following:
Update parameters to the new values, parameters are derived from juce::RangedAudioParameter, we prevent to do that via setValueNotifyingHost() because when 2000+ parameters are modified some hosts don’t like that at all and go crazy (Ableton, Logic). Therefore we just use setValue()
After all parameters have been updated we call
updateHostDisplay (AudioProcessorListener::ChangeDetails().withProgramChanged (true));
If I’m not wrong this should be the correct way to do it and in VST2/CLAP/AU the DAW is nicely picking up the new values and everything is nice, but not when running as VST3.
The VST3 wrapper checks if the program parameter has changed, but as we don’t have something like that (and will never have due to multimode) I patched our Juce fork to call restartComponent as soon as updateHostDisplay is called with withProgramChanged.
However, it still doesn’t work. I verified that restartComponent() is called with the flag kParamValuesChanged but neither Cubase, nor Tracktion/Waveform 13 nor Bitwig are picking up the new parameter values. The function getValue() of our parameters is never called after calling updateHostDisplay()
My current guess is that setParamNormalized should be called by Juce without doing a performEdit() after updateHostDisplay() gets called by the plugin because, according to the VST3 doc, the edit controller should have the new values before the host calls it to query the new values. But I am not super certain here.
Who can shed some light into this?
Thanks!

