From 0836cf33b19900a655ddae3b8601b7d407a53663 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 20 Jun 2023 13:02:02 +0100 Subject: [PATCH] VST3 Client: Avoid assertion failure in setBusesLayout when using PreferredChannelConfigurations Using a preferred channel config with no input or output channels could cause an assertion here because the AudioProcessor will always have a single input/output bus by default. --- .../juce_audio_plugin_client_VST3.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 4ed1cdadf9..cdb72a1db5 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 @@ -3186,10 +3186,10 @@ public: if (type == Vst::kAudio) { - const auto numInputBuses = getNumAudioBuses (true); - const auto numOutputBuses = getNumAudioBuses (false); + const auto numPublicInputBuses = getNumAudioBuses (true); + const auto numPublicOutputBuses = getNumAudioBuses (false); - if (! isPositiveAndBelow (index, dir == Vst::kInput ? numInputBuses : numOutputBuses)) + if (! isPositiveAndBelow (index, dir == Vst::kInput ? numPublicInputBuses : numPublicOutputBuses)) return kResultFalse; // The host is allowed to enable/disable buses as it sees fit, so the plugin needs to be @@ -3212,12 +3212,18 @@ public: AudioProcessor::BusesLayout desiredLayout; - for (auto i = 0; i < numInputBuses; ++i) + for (auto i = 0; i < numPublicInputBuses; ++i) desiredLayout.inputBuses.add (bufferMapper.getRequestedLayoutForInputBus ((size_t) i)); - for (auto i = 0; i < numOutputBuses; ++i) + while (desiredLayout.inputBuses.size() < pluginInstance->getBusCount (true)) + desiredLayout.inputBuses.add (AudioChannelSet::disabled()); + + for (auto i = 0; i < numPublicOutputBuses; ++i) desiredLayout.outputBuses.add (bufferMapper.getRequestedLayoutForOutputBus ((size_t) i)); + while (desiredLayout.outputBuses.size() < pluginInstance->getBusCount (false)) + desiredLayout.outputBuses.add (AudioChannelSet::disabled()); + const auto prev = pluginInstance->getBusesLayout(); const auto busesLayoutSupported = [&]