bool syncBusLayouts()

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