commit 28ea3aa85208894b5cc3a30fa9035395bcbda060
parent 11a0877fd5c289e8b2e770491c63548eca489d3b
Author: falkTX <falktx@falktx.com>
Date: Fri, 9 Sep 2022 09:55:42 +0100
Implement clap transport
Diffstat:
2 files changed, 19 insertions(+), 16 deletions(-)
diff --git 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<double>(clapPos & 0x7fffffff) / CLAP_BEATTIME_FACTOR;
+
+ fTimePosition.bbt.bar = static_cast<int32_t>(clapBeats) / transport->tsig_num + 1;
+ fTimePosition.bbt.beat = static_cast<int32_t>(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<int32_t>(ppqPos) / ppqPerBar + 1;
- fTimePosition.bbt.beat = static_cast<int32_t>(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
@@ -33,6 +33,7 @@ endif # HAVE_OPENGL
TARGETS += lv2_sep
TARGETS += vst2
TARGETS += vst3
+TARGETS += clap
all: $(TARGETS)