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 fd35bb6769..03cbdaefe1 100644
--- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
+++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
@@ -449,11 +449,22 @@ public:
virtual ~Param() override = default;
- void updateParameterInfo()
+ bool updateParameterInfo()
{
- toString128 (info.title, param.getName (128));
- toString128 (info.shortTitle, param.getName (8));
- toString128 (info.units, param.getLabel());
+ auto updateParamIfChanged = [] (Vst::String128& paramToUpdate, const String& newValue)
+ {
+ if (juce::toString (paramToUpdate) == newValue)
+ return false;
+
+ toString128 (paramToUpdate, newValue);
+ return true;
+ };
+
+ auto anyUpdated = updateParamIfChanged (info.title, param.getName (128));
+ anyUpdated |= updateParamIfChanged (info.shortTitle, param.getName (8));
+ anyUpdated |= updateParamIfChanged (info.units, param.getLabel());
+
+ return anyUpdated;
}
bool setNormalized (Vst::ParamValue v) override
@@ -883,21 +894,42 @@ public:
void audioProcessorChanged (AudioProcessor*) override
{
- auto numParameters = parameters.getParameterCount();
+ int32 flags = 0;
- for (int32 i = 0; i < numParameters; ++i)
+ for (int32 i = 0; i < parameters.getParameterCount(); ++i)
if (auto* param = dynamic_cast (parameters.getParameterByIndex (i)))
- param->updateParameterInfo();
+ if (param->updateParameterInfo() && (flags & Vst::kParamTitlesChanged) == 0)
+ flags |= Vst::kParamTitlesChanged;
if (auto* pluginInstance = getPluginInstance())
{
- if (pluginInstance->getNumPrograms() > 1)
- EditController::setParamNormalized (JuceAudioProcessor::paramPreset, static_cast (pluginInstance->getCurrentProgram())
- / static_cast (pluginInstance->getNumPrograms() - 1));
+ auto newNumPrograms = pluginInstance->getNumPrograms();
+
+ if (newNumPrograms != lastNumPrograms)
+ {
+ if (newNumPrograms > 1)
+ {
+ auto paramValue = static_cast (pluginInstance->getCurrentProgram())
+ / static_cast (pluginInstance->getNumPrograms() - 1);
+
+ EditController::setParamNormalized (JuceAudioProcessor::paramPreset, paramValue);
+ flags |= Vst::kParamValuesChanged;
+ }
+
+ lastNumPrograms = newNumPrograms;
+ }
+
+ auto newLatencySamples = pluginInstance->getLatencySamples();
+
+ if (newLatencySamples != lastLatencySamples)
+ {
+ flags |= Vst::kLatencyChanged;
+ lastLatencySamples = newLatencySamples;
+ }
}
- if (componentHandler != nullptr && ! inSetupProcessing)
- componentHandler->restartComponent (Vst::kLatencyChanged | Vst::kParamValuesChanged | Vst::kParamTitlesChanged);
+ if (flags != 0 && componentHandler != nullptr && ! inSetupProcessing)
+ componentHandler->restartComponent (flags);
}
void parameterValueChanged (int, float newValue) override
@@ -943,6 +975,8 @@ private:
std::atomic vst3IsPlaying { false },
inSetupProcessing { false };
+ int lastNumPrograms = 0, lastLatencySamples = 0;
+
#if ! JUCE_MAC
float lastScaleFactorReceived = 1.0f;
#endif