in pedalboard/juce_overrides/juce_PatchedVST3PluginFormat.cpp [2602:2653]
bool syncBusLayouts(const BusesLayout &layouts) const {
for (int dir = 0; dir < 2; ++dir) {
bool isInput = (dir == 0);
auto n = getBusCount(isInput);
const Vst::BusDirection vstDir = (isInput ? Vst::kInput : Vst::kOutput);
for (int busIdx = 0; busIdx < n; ++busIdx) {
const bool isEnabled =
(!layouts.getChannelSet(isInput, busIdx).isDisabled());
if (holder->component->activateBus(Vst::kAudio, vstDir, busIdx,
(isEnabled ? 1 : 0)) != kResultOk)
return false;
}
}
Array<Vst::SpeakerArrangement> inputArrangements, outputArrangements;
for (int i = 0; i < layouts.inputBuses.size(); ++i) {
const auto &requested = layouts.getChannelSet(true, i);
inputArrangements.add(getVst3SpeakerArrangement(
requested.isDisabled() ? getBus(true, i)->getLastEnabledLayout()
: requested));
}
for (int i = 0; i < layouts.outputBuses.size(); ++i) {
const auto &requested = layouts.getChannelSet(false, i);
outputArrangements.add(getVst3SpeakerArrangement(
requested.isDisabled() ? getBus(false, i)->getLastEnabledLayout()
: requested));
}
// Some plug-ins will crash if you pass a nullptr to setBusArrangements!
Vst::SpeakerArrangement nullArrangement = {};
auto *inputArrangementData = inputArrangements.isEmpty()
? &nullArrangement
: inputArrangements.getRawDataPointer();
auto *outputArrangementData = outputArrangements.isEmpty()
? &nullArrangement
: outputArrangements.getRawDataPointer();
if (processor->setBusArrangements(
inputArrangementData, inputArrangements.size(),
outputArrangementData, outputArrangements.size()) != kResultTrue)
return false;
// check if the layout matches the request
Array<Vst::SpeakerArrangement> actualIn, actualOut;
repopulateArrangements(actualIn, actualOut);
return (actualIn == inputArrangements && actualOut == outputArrangements);
}