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