in pedalboard/ExternalPlugin.h [817:877]
void setNumChannels(int numChannels) {
if (!pluginInstance)
return;
if (numChannels == 0)
return;
auto mainInputBus = pluginInstance->getBus(true, 0);
auto mainOutputBus = pluginInstance->getBus(false, 0);
// Try to disable all non-main input buses if possible:
for (int i = 1; i < pluginInstance->getBusCount(true); i++) {
auto *bus = pluginInstance->getBus(true, i);
if (bus->isNumberOfChannelsSupported(0))
bus->enable(false);
}
// ...and all non-main output buses too:
for (int i = 1; i < pluginInstance->getBusCount(false); i++) {
auto *bus = pluginInstance->getBus(false, i);
if (bus->isNumberOfChannelsSupported(0))
bus->enable(false);
}
if ((!mainInputBus || mainInputBus->getNumberOfChannels() == numChannels) &&
mainOutputBus->getNumberOfChannels() == numChannels) {
return;
}
// Cache these values in case the plugin fails to update:
auto previousInputChannelCount =
mainInputBus ? mainInputBus->getNumberOfChannels() : 0;
auto previousOutputChannelCount = mainOutputBus->getNumberOfChannels();
// Try to change the input and output bus channel counts...
if (mainInputBus)
mainInputBus->setNumberOfChannels(numChannels);
mainOutputBus->setNumberOfChannels(numChannels);
// If, post-reload, we still can't use the right number of channels, let's
// conclude the plugin doesn't allow this channel count.
if ((!mainInputBus || mainInputBus->getNumberOfChannels() != numChannels) ||
mainOutputBus->getNumberOfChannels() != numChannels) {
// Reset the bus configuration to what it was before, so we don't
// leave one of the buses smaller than the other:
if (mainInputBus)
mainInputBus->setNumberOfChannels(previousInputChannelCount);
mainOutputBus->setNumberOfChannels(previousOutputChannelCount);
throw std::invalid_argument(
"Plugin '" + pluginInstance->getName().toStdString() +
"' does not support " + std::to_string(numChannels) +
"-channel output. (Main bus currently expects " +
std::to_string(mainInputBus ? mainInputBus->getNumberOfChannels()
: 0) +
" input channels and " +
std::to_string(mainOutputBus->getNumberOfChannels()) +
" output channels.)");
}
}