void prepareToPlay()

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;
  }