commit 4d0b2df0a2914d72d71c9298aba11f5f8883f80f parent a6e64ac9cae2bf3f4d7b298e04b203a30ef088a5 Author: falkTX <falktx@falktx.com> Date: Wed, 27 Feb 2019 13:03:29 +0100 Rework VST time info sync, in a way that actually works Signed-off-by: falkTX <falktx@falktx.com> Diffstat:
M | distrho/src/DistrhoPluginVST.cpp | | | 18 | +++++++++++++----- |
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp @@ -972,15 +972,23 @@ public: if (vstTimeInfo->flags & (kVstPpqPosValid|kVstTimeSigValid)) { - const int ppqPerBar = vstTimeInfo->timeSigNumerator * 4 / vstTimeInfo->timeSigDenominator; - const double barBeats = (std::fmod(vstTimeInfo->ppqPos, ppqPerBar) / ppqPerBar) * vstTimeInfo->timeSigNumerator; + const double ppqPos = std::abs(vstTimeInfo->ppqPos); + const double ppqPerBar = static_cast<double>(vstTimeInfo->timeSigNumerator * 4) / vstTimeInfo->timeSigDenominator; + const double barBeats = (std::fmod(ppqPos, ppqPerBar) / ppqPerBar) * vstTimeInfo->timeSigNumerator; const double rest = std::fmod(barBeats, 1.0); - fTimePosition.bbt.bar = int(vstTimeInfo->ppqPos)/ppqPerBar + 1; - fTimePosition.bbt.beat = barBeats-rest+1; - fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; + fTimePosition.bbt.bar = static_cast<int32_t>(ppqPos / ppqPerBar + 0.5) + 1; + fTimePosition.bbt.beat = static_cast<int32_t>(barBeats + 0.5) + 1; + fTimePosition.bbt.tick = static_cast<int32_t>(rest * fTimePosition.bbt.ticksPerBeat + 0.5); fTimePosition.bbt.beatsPerBar = vstTimeInfo->timeSigNumerator; fTimePosition.bbt.beatType = vstTimeInfo->timeSigDenominator; + + if (vstTimeInfo->ppqPos < 0.0) + { + --fTimePosition.bbt.bar; + fTimePosition.bbt.beat = vstTimeInfo->timeSigNumerator - fTimePosition.bbt.beat + 1; + fTimePosition.bbt.tick = int(fTimePosition.bbt.ticksPerBeat) - fTimePosition.bbt.tick - 1; + } } else {