static void toProcessContext()

in pedalboard/juce_overrides/juce_PatchedVST3PluginFormat.cpp [369:431]


static void toProcessContext(Vst::ProcessContext &context,
                             AudioPlayHead *playHead, double sampleRate) {
  jassert(sampleRate > 0.0); // Must always be valid, as stated by the VST3 SDK

  using namespace Vst;

  zerostruct(context);
  context.sampleRate = sampleRate;
  auto &fr = context.frameRate;

  if (playHead != nullptr) {
    AudioPlayHead::CurrentPositionInfo position;
    playHead->getCurrentPosition(position);

    context.projectTimeSamples =
        position
            .timeInSamples; // Must always be valid, as stated by the VST3 SDK
    context.projectTimeMusic =
        position.ppqPosition; // Does not always need to be valid...
    context.tempo = position.bpm;
    context.timeSigNumerator = position.timeSigNumerator;
    context.timeSigDenominator = position.timeSigDenominator;
    context.barPositionMusic = position.ppqPositionOfLastBarStart;
    context.cycleStartMusic = position.ppqLoopStart;
    context.cycleEndMusic = position.ppqLoopEnd;

    context.frameRate.framesPerSecond =
        (Steinberg::uint32)position.frameRate.getBaseRate();
    context.frameRate.flags = (Steinberg::uint32)(
        (position.frameRate.isDrop() ? FrameRate::kDropRate : 0) |
        (position.frameRate.isPullDown() ? FrameRate::kPullDownRate : 0));

    if (position.isPlaying)
      context.state |= ProcessContext::kPlaying;
    if (position.isRecording)
      context.state |= ProcessContext::kRecording;
    if (position.isLooping)
      context.state |= ProcessContext::kCycleActive;
  } else {
    context.tempo = 120.0;
    context.timeSigNumerator = 4;
    context.timeSigDenominator = 4;
    fr.framesPerSecond = 30;
    fr.flags = 0;
  }

  if (context.projectTimeMusic >= 0.0)
    context.state |= ProcessContext::kProjectTimeMusicValid;
  if (context.barPositionMusic >= 0.0)
    context.state |= ProcessContext::kBarPositionValid;
  if (context.tempo > 0.0)
    context.state |= ProcessContext::kTempoValid;
  if (context.frameRate.framesPerSecond > 0)
    context.state |= ProcessContext::kSmpteValid;

  if (context.cycleStartMusic >= 0.0 && context.cycleEndMusic > 0.0 &&
      context.cycleEndMusic > context.cycleStartMusic) {
    context.state |= ProcessContext::kCycleValid;
  }

  if (context.timeSigNumerator > 0 && context.timeSigDenominator > 0)
    context.state |= ProcessContext::kTimeSigValid;
}