in pedalboard/juce_overrides/juce_PatchedVST3PluginFormat.cpp [2363:2443]
void prepareToPlay(double newSampleRate,
int estimatedSamplesPerBlock) override {
// The VST3 spec requires that IComponent::setupProcessing() is called on
// the message thread. If you call it from a different thread, some plugins
// may break.
//
// NOTE(psobot, 2024-02-21): Pedalboard intentionally comments out the below
// two lines, which violates the VST3 spec. However, this allows for
// parallelism when using VST3 plugins, at the risk of breaking some
// plugins.
//
// JUCE_ASSERT_MESSAGE_THREAD
// MessageManagerLock lock;
const SpinLock::ScopedLockType processLock(processMutex);
// Avoid redundantly calling things like setActive, which can be a
// heavy-duty call for some plugins:
if (isActive && getSampleRate() == newSampleRate &&
getBlockSize() == estimatedSamplesPerBlock)
return;
using namespace Vst;
ProcessSetup setup;
setup.symbolicSampleSize = isUsingDoublePrecision() ? kSample64 : kSample32;
setup.maxSamplesPerBlock = estimatedSamplesPerBlock;
setup.sampleRate = newSampleRate;
setup.processMode = isNonRealtime() ? kOffline : kRealtime;
warnOnFailure(processor->setupProcessing(setup));
holder->initialise();
Array<Vst::SpeakerArrangement> inputArrangements, outputArrangements;
processorLayoutsToArrangements(inputArrangements, outputArrangements);
// Some plug-ins will crash if you pass a nullptr to setBusArrangements!
SpeakerArrangement nullArrangement = {};
auto *inputArrangementData = inputArrangements.isEmpty()
? &nullArrangement
: inputArrangements.getRawDataPointer();
auto *outputArrangementData = outputArrangements.isEmpty()
? &nullArrangement
: outputArrangements.getRawDataPointer();
warnOnFailure(processor->setBusArrangements(
inputArrangementData, inputArrangements.size(), outputArrangementData,
outputArrangements.size()));
Array<Vst::SpeakerArrangement> actualInArr, actualOutArr;
repopulateArrangements(actualInArr, actualOutArr);
jassert(actualInArr == inputArrangements &&
actualOutArr == outputArrangements);
// Needed for having the same sample rate in processBlock(); some plugins
// need this!
setRateAndBufferSizeDetails(newSampleRate, estimatedSamplesPerBlock);
auto numInputBuses = getBusCount(true);
auto numOutputBuses = getBusCount(false);
for (int i = 0; i < numInputBuses; ++i)
warnOnFailure(holder->component->activateBus(
Vst::kAudio, Vst::kInput, i, getBus(true, i)->isEnabled() ? 1 : 0));
for (int i = 0; i < numOutputBuses; ++i)
warnOnFailure(holder->component->activateBus(
Vst::kAudio, Vst::kOutput, i, getBus(false, i)->isEnabled() ? 1 : 0));
setLatencySamples(jmax(0, (int)processor->getLatencySamples()));
cachedBusLayouts = getBusesLayout();
setStateForAllMidiBuses(true);
warnOnFailure(holder->component->setActive(true));
warnOnFailureIfImplemented(processor->setProcessing(true));
isActive = true;
}