From 4d0b2df0a2914d72d71c9298aba11f5f8883f80f Mon Sep 17 00:00:00 2001 From: falkTX Date: Wed, 27 Feb 2019 13:03:56 +0100 Subject: [PATCH] Rework VST time info sync, in a way that actually works Signed-off-by: falkTX --- distrho/src/DistrhoPluginVST.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp index f8a133fd..58fcbac3 100644 --- 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(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(ppqPos / ppqPerBar + 0.5) + 1; + fTimePosition.bbt.beat = static_cast(barBeats + 0.5) + 1; + fTimePosition.bbt.tick = static_cast(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 {