diff --git a/distrho/src/DistrhoPluginCLAP.cpp b/distrho/src/DistrhoPluginCLAP.cpp index 64847b71..163eb0bf 100644 --- a/distrho/src/DistrhoPluginCLAP.cpp +++ b/distrho/src/DistrhoPluginCLAP.cpp @@ -603,7 +603,8 @@ public: #if DISTRHO_PLUGIN_WANT_TIMEPOS if (const clap_event_transport_t* const transport = process->transport) { - fTimePosition.playing = transport->flags & CLAP_TRANSPORT_IS_PLAYING; + fTimePosition.playing = (transport->flags & CLAP_TRANSPORT_IS_PLAYING) != 0 && + (transport->flags & CLAP_TRANSPORT_IS_WITHIN_PRE_ROLL) == 0; fTimePosition.frame = process->steady_time >= 0 ? process->steady_time : 0; @@ -615,27 +616,28 @@ public: // ticksPerBeat is not possible with CLAP fTimePosition.bbt.ticksPerBeat = 1920.0; - // TODO verify if this works or makes any sense if ((transport->flags & (CLAP_TRANSPORT_HAS_BEATS_TIMELINE|CLAP_TRANSPORT_HAS_TIME_SIGNATURE)) == (CLAP_TRANSPORT_HAS_BEATS_TIMELINE|CLAP_TRANSPORT_HAS_TIME_SIGNATURE)) { - const double ppqPos = std::abs(transport->song_pos_beats); - const int ppqPerBar = transport->tsig_num * 4 / transport->tsig_denom; - const double barBeats = (std::fmod(ppqPos, ppqPerBar) / ppqPerBar) * transport->tsig_num; - const double rest = std::fmod(barBeats, 1.0); + if (transport->song_pos_beats >= 0) + { + const int64_t clapPos = std::abs(transport->song_pos_beats); + const int64_t clapBeats = clapPos >> 31; + const double clapRest = static_cast(clapPos & 0x7fffffff) / CLAP_BEATTIME_FACTOR; + + fTimePosition.bbt.bar = static_cast(clapBeats) / transport->tsig_num + 1; + fTimePosition.bbt.beat = static_cast(clapBeats % transport->tsig_num) + 1; + fTimePosition.bbt.tick = clapRest * fTimePosition.bbt.ticksPerBeat; + } + else + { + fTimePosition.bbt.bar = 1; + fTimePosition.bbt.beat = 1; + fTimePosition.bbt.tick = 0.0; + } fTimePosition.bbt.valid = true; - fTimePosition.bbt.bar = static_cast(ppqPos) / ppqPerBar + 1; - fTimePosition.bbt.beat = static_cast(barBeats - rest + 0.5) + 1; - fTimePosition.bbt.tick = rest * fTimePosition.bbt.ticksPerBeat; fTimePosition.bbt.beatsPerBar = transport->tsig_num; fTimePosition.bbt.beatType = transport->tsig_denom; - - if (transport->song_pos_beats < 0.0) - { - --fTimePosition.bbt.bar; - fTimePosition.bbt.beat = transport->tsig_num - fTimePosition.bbt.beat + 1; - fTimePosition.bbt.tick = fTimePosition.bbt.ticksPerBeat - fTimePosition.bbt.tick - 1; - } } else { diff --git a/examples/Info/Makefile b/examples/Info/Makefile index 163ec7e1..1ee6b4e0 100644 --- a/examples/Info/Makefile +++ b/examples/Info/Makefile @@ -33,6 +33,7 @@ endif # HAVE_OPENGL TARGETS += lv2_sep TARGETS += vst2 TARGETS += vst3 +TARGETS += clap all: $(TARGETS)