diff --git a/plugins/Cardinal/src/Carla.cpp b/plugins/Cardinal/src/Carla.cpp index 80c9256..48b60ed 100644 --- a/plugins/Cardinal/src/Carla.cpp +++ b/plugins/Cardinal/src/Carla.cpp @@ -84,7 +84,7 @@ struct CarlaModule : Module { NativeHostDescriptor fCarlaHostDescriptor = {}; CarlaHostHandle fCarlaHostHandle = nullptr; - mutable NativeTimeInfo fCarlaTimeInfo; + NativeTimeInfo fCarlaTimeInfo; void* fUI = nullptr; @@ -93,6 +93,7 @@ struct CarlaModule : Module { float* dataInPtr[NUM_INPUTS]; float* dataOutPtr[NUM_OUTPUTS]; unsigned audioDataFill = 0; + int64_t lastBlockFrame = -1; std::string patchStorage; CarlaModule() @@ -185,21 +186,6 @@ struct CarlaModule : Module { const NativeTimeInfo* hostGetTimeInfo() const noexcept { - if (pcontext != nullptr) - { - fCarlaTimeInfo.playing = pcontext->playing; - fCarlaTimeInfo.frame = pcontext->frame; - fCarlaTimeInfo.bbt.valid = pcontext->bbtValid; - fCarlaTimeInfo.bbt.bar = pcontext->bar; - fCarlaTimeInfo.bbt.beat = pcontext->beat; - fCarlaTimeInfo.bbt.tick = pcontext->tick; - fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick; - fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; - fCarlaTimeInfo.bbt.beatType = pcontext->beatType; - fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; - fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute; - } - return &fCarlaTimeInfo; } @@ -273,7 +259,7 @@ struct CarlaModule : Module { patchStorage = getPatchStorageDirectory(); } - void process(const ProcessArgs&) override + void process(const ProcessArgs& args) override { if (fCarlaPluginHandle == nullptr) return; @@ -295,6 +281,59 @@ struct CarlaModule : Module { if (audioDataFill == BUFFER_SIZE) { + const int64_t blockFrame = pcontext->engine->getBlockFrame(); + + // Update time position if running a new audio block + if (lastBlockFrame != blockFrame) + { + lastBlockFrame = blockFrame; + fCarlaTimeInfo.playing = pcontext->playing; + fCarlaTimeInfo.frame = pcontext->frame; + fCarlaTimeInfo.bbt.valid = pcontext->bbtValid; + fCarlaTimeInfo.bbt.bar = pcontext->bar; + fCarlaTimeInfo.bbt.beat = pcontext->beat; + fCarlaTimeInfo.bbt.tick = pcontext->tick; + fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick; + fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; + fCarlaTimeInfo.bbt.beatType = pcontext->beatType; + fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; + fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute; + } + // or advance time by BUFFER_SIZE frames if still under the same audio block + else if (fCarlaTimeInfo.playing) + { + fCarlaTimeInfo.frame += BUFFER_SIZE; + + // adjust BBT as well + if (fCarlaTimeInfo.bbt.valid) + { + const double samplesPerTick = 60.0 * args.sampleRate + / fCarlaTimeInfo.bbt.beatsPerMinute + / fCarlaTimeInfo.bbt.ticksPerBeat; + + int32_t newBar = fCarlaTimeInfo.bbt.bar; + int32_t newBeat = fCarlaTimeInfo.bbt.beat; + double newTick = fCarlaTimeInfo.bbt.tick + samplesPerTick * BUFFER_SIZE; + + while (newTick > pcontext->ticksPerBeat) + { + newTick -= pcontext->ticksPerBeat; + + if (++fCarlaTimeInfo.bbt.beat > pcontext->beatsPerBar) + { + fCarlaTimeInfo.bbt.beat = 1; + + if (++newBar) + fCarlaTimeInfo.bbt.barStartTick += pcontext->beatsPerBar * pcontext->ticksPerBeat; + } + } + + fCarlaTimeInfo.bbt.bar = newBar; + fCarlaTimeInfo.bbt.beat = newBeat; + fCarlaTimeInfo.bbt.tick = newTick; + } + } + audioDataFill = 0; fCarlaPluginDescriptor->process(fCarlaPluginHandle, dataInPtr, dataOutPtr, BUFFER_SIZE, nullptr, 0); } diff --git a/plugins/Cardinal/src/Ildaeil.cpp b/plugins/Cardinal/src/Ildaeil.cpp index e6878b0..fd2594f 100644 --- a/plugins/Cardinal/src/Ildaeil.cpp +++ b/plugins/Cardinal/src/Ildaeil.cpp @@ -256,7 +256,7 @@ struct IldaeilModule : Module { NativeHostDescriptor fCarlaHostDescriptor = {}; CarlaHostHandle fCarlaHostHandle = nullptr; - mutable NativeTimeInfo fCarlaTimeInfo; + NativeTimeInfo fCarlaTimeInfo; void* fUI = nullptr; @@ -265,6 +265,7 @@ struct IldaeilModule : Module { float audioDataOut1[BUFFER_SIZE]; float audioDataOut2[BUFFER_SIZE]; unsigned audioDataFill = 0; + int64_t lastBlockFrame = -1; IldaeilMidiGenerator midiGenerator; @@ -354,21 +355,6 @@ struct IldaeilModule : Module { const NativeTimeInfo* hostGetTimeInfo() const noexcept { - if (pcontext != nullptr) - { - fCarlaTimeInfo.playing = pcontext->playing; - fCarlaTimeInfo.frame = pcontext->frame; - fCarlaTimeInfo.bbt.valid = pcontext->bbtValid; - fCarlaTimeInfo.bbt.bar = pcontext->bar; - fCarlaTimeInfo.bbt.beat = pcontext->beat; - fCarlaTimeInfo.bbt.tick = pcontext->tick; - fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick; - fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; - fCarlaTimeInfo.bbt.beatType = pcontext->beatType; - fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; - fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute; - } - return &fCarlaTimeInfo; } @@ -480,6 +466,59 @@ struct IldaeilModule : Module { if (audioDataFill == BUFFER_SIZE) { + const int64_t blockFrame = pcontext->engine->getBlockFrame(); + + // Update time position if running a new audio block + if (lastBlockFrame != blockFrame) + { + lastBlockFrame = blockFrame; + fCarlaTimeInfo.playing = pcontext->playing; + fCarlaTimeInfo.frame = pcontext->frame; + fCarlaTimeInfo.bbt.valid = pcontext->bbtValid; + fCarlaTimeInfo.bbt.bar = pcontext->bar; + fCarlaTimeInfo.bbt.beat = pcontext->beat; + fCarlaTimeInfo.bbt.tick = pcontext->tick; + fCarlaTimeInfo.bbt.barStartTick = pcontext->barStartTick; + fCarlaTimeInfo.bbt.beatsPerBar = pcontext->beatsPerBar; + fCarlaTimeInfo.bbt.beatType = pcontext->beatType; + fCarlaTimeInfo.bbt.ticksPerBeat = pcontext->ticksPerBeat; + fCarlaTimeInfo.bbt.beatsPerMinute = pcontext->beatsPerMinute; + } + // or advance time by BUFFER_SIZE frames if still under the same audio block + else if (fCarlaTimeInfo.playing) + { + fCarlaTimeInfo.frame += BUFFER_SIZE; + + // adjust BBT as well + if (fCarlaTimeInfo.bbt.valid) + { + const double samplesPerTick = 60.0 * args.sampleRate + / fCarlaTimeInfo.bbt.beatsPerMinute + / fCarlaTimeInfo.bbt.ticksPerBeat; + + int32_t newBar = fCarlaTimeInfo.bbt.bar; + int32_t newBeat = fCarlaTimeInfo.bbt.beat; + double newTick = fCarlaTimeInfo.bbt.tick + samplesPerTick * BUFFER_SIZE; + + while (newTick > pcontext->ticksPerBeat) + { + newTick -= pcontext->ticksPerBeat; + + if (++fCarlaTimeInfo.bbt.beat > pcontext->beatsPerBar) + { + fCarlaTimeInfo.bbt.beat = 1; + + if (++newBar) + fCarlaTimeInfo.bbt.barStartTick += pcontext->beatsPerBar * pcontext->ticksPerBeat; + } + } + + fCarlaTimeInfo.bbt.bar = newBar; + fCarlaTimeInfo.bbt.beat = newBeat; + fCarlaTimeInfo.bbt.tick = newTick; + } + } + audioDataFill = 0; float* ins[2] = { audioDataIn1, audioDataIn2 }; float* outs[2] = { audioDataOut1, audioDataOut2 };