| 1001 | } |
| 1002 | |
| 1003 | void vst_processReplacing(const float** const inputs, float** const outputs, const int32_t sampleFrames) |
| 1004 | { |
| 1005 | if (! fPlugin.isActive()) |
| 1006 | { |
| 1007 | // host has not activated the plugin yet, nasty! |
| 1008 | vst_dispatcher(VST_EFFECT_OPCODE_SUSPEND, 0, 1, nullptr, 0.0f); |
| 1009 | } |
| 1010 | |
| 1011 | if (sampleFrames <= 0) |
| 1012 | { |
| 1013 | updateParameterOutputsAndTriggers(); |
| 1014 | return; |
| 1015 | } |
| 1016 | |
| 1017 | #if DISTRHO_PLUGIN_WANT_TIMEPOS |
| 1018 | static constexpr const int kWantVstTimeFlags = 0x2602; |
| 1019 | |
| 1020 | if (const VstTimeInfo* const vstTimeInfo = (const VstTimeInfo*)hostCallback(VST_HOST_OPCODE_07, 0, kWantVstTimeFlags)) |
| 1021 | { |
| 1022 | fTimePosition.frame = vstTimeInfo->samplePos; |
| 1023 | fTimePosition.playing = vstTimeInfo->flags & 0x2; |
| 1024 | |
| 1025 | // ticksPerBeat is not possible with VST2 |
| 1026 | fTimePosition.bbt.ticksPerBeat = 1920.0; |
| 1027 | |
| 1028 | if (vstTimeInfo->flags & 0x400) |
| 1029 | fTimePosition.bbt.beatsPerMinute = vstTimeInfo->tempo; |
| 1030 | else |
| 1031 | fTimePosition.bbt.beatsPerMinute = 120.0; |
| 1032 | |
| 1033 | if ((vstTimeInfo->flags & 0x2200) == 0x2200) |
| 1034 | { |
| 1035 | const double ppqPos = std::abs(vstTimeInfo->ppqPos); |
| 1036 | const int ppqPerBar = vstTimeInfo->timeSigNumerator * 4 / vstTimeInfo->timeSigDenominator; |
| 1037 | const double barBeats = (std::fmod(ppqPos, ppqPerBar) / ppqPerBar) * vstTimeInfo->timeSigNumerator; |
| 1038 | const double rest = std::fmod(barBeats, 1.0); |
| 1039 | |
| 1040 | fTimePosition.bbt.valid = true; |
| 1041 | fTimePosition.bbt.bar = static_cast<int32_t>(ppqPos) / ppqPerBar + 1; |
| 1042 | fTimePosition.bbt.beat = static_cast<int32_t>(barBeats - rest + 0.5) + 1; |
| 1043 | fTimePosition.bbt.tick = rest * fTimePosition.bbt.ticksPerBeat; |
| 1044 | fTimePosition.bbt.beatsPerBar = vstTimeInfo->timeSigNumerator; |
| 1045 | fTimePosition.bbt.beatType = vstTimeInfo->timeSigDenominator; |
| 1046 | |
| 1047 | if (vstTimeInfo->ppqPos < 0.0) |
| 1048 | { |
| 1049 | --fTimePosition.bbt.bar; |
| 1050 | fTimePosition.bbt.beat = vstTimeInfo->timeSigNumerator - fTimePosition.bbt.beat + 1; |
| 1051 | fTimePosition.bbt.tick = fTimePosition.bbt.ticksPerBeat - fTimePosition.bbt.tick - 1; |
| 1052 | } |
| 1053 | } |
| 1054 | else |
| 1055 | { |
| 1056 | fTimePosition.bbt.valid = false; |
| 1057 | fTimePosition.bbt.bar = 1; |
| 1058 | fTimePosition.bbt.beat = 1; |
| 1059 | fTimePosition.bbt.tick = 0.0; |
| 1060 | fTimePosition.bbt.beatsPerBar = 4.0f; |
nothing calls this directly
no test coverage detected