From 1a2c64309bb822515b386a9ac9066023c95d4359 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 14 Jan 2022 15:45:36 +0000 Subject: [PATCH] Make internal plugin context use const; Fix host time Signed-off-by: falkTX --- plugins/Cardinal/src/Carla.cpp | 8 ++-- plugins/Cardinal/src/HostParameters.cpp | 10 ++--- plugins/Cardinal/src/HostTime.cpp | 52 ++++++++++++++++++------- plugins/Cardinal/src/Ildaeil.cpp | 10 ++--- plugins/Cardinal/src/plugincontext.hpp | 6 +-- src/CardinalPlugin.cpp | 4 +- src/CardinalUI.cpp | 6 +-- src/PluginContext.hpp | 6 +-- 8 files changed, 63 insertions(+), 39 deletions(-) diff --git a/plugins/Cardinal/src/Carla.cpp b/plugins/Cardinal/src/Carla.cpp index 50455fc..7e634c7 100644 --- a/plugins/Cardinal/src/Carla.cpp +++ b/plugins/Cardinal/src/Carla.cpp @@ -76,7 +76,7 @@ struct CarlaModule : Module { NUM_LIGHTS }; - CardinalPluginContext* const pcontext; + const CardinalPluginContext* const pcontext; const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr; NativePluginHandle fCarlaPluginHandle = nullptr; @@ -398,7 +398,7 @@ static uint32_t host_get_buffer_size(const NativeHostHandle handle) static double host_get_sample_rate(const NativeHostHandle handle) { - CardinalPluginContext* const pcontext = static_cast(handle)->pcontext; + const CardinalPluginContext* const pcontext = static_cast(handle)->pcontext; DISTRHO_SAFE_ASSERT_RETURN(pcontext != nullptr, 48000.0); return pcontext->sampleRate; } @@ -516,7 +516,7 @@ struct CarlaModuleWidget : ModuleWidget, IdleCallback { return; const CarlaHostHandle handle = module->fCarlaHostHandle; - CardinalPluginContext* const pcontext = module->pcontext; + const CardinalPluginContext* const pcontext = module->pcontext; char winIdStr[24]; std::snprintf(winIdStr, sizeof(winIdStr), "%llx", (ulonglong)pcontext->nativeWindowId); @@ -539,7 +539,7 @@ struct CarlaModuleWidget : ModuleWidget, IdleCallback { return; const CarlaHostHandle handle = module->fCarlaHostHandle; - CardinalPluginContext* const pcontext = module->pcontext; + const CardinalPluginContext* const pcontext = module->pcontext; module->fUI = nullptr; diff --git a/plugins/Cardinal/src/HostParameters.cpp b/plugins/Cardinal/src/HostParameters.cpp index 37a2c1f..2ad13eb 100644 --- a/plugins/Cardinal/src/HostParameters.cpp +++ b/plugins/Cardinal/src/HostParameters.cpp @@ -42,7 +42,7 @@ struct HostParameters : Module { { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - CardinalPluginContext* const pcontext = static_cast(APP); + const CardinalPluginContext* const pcontext = static_cast(APP); if (pcontext == nullptr) throw rack::Exception("Plugin context is null."); @@ -57,7 +57,7 @@ struct HostParameters : Module { void process(const ProcessArgs&) override { - if (CardinalPluginContext* const pcontext = static_cast(APP)) + if (const CardinalPluginContext* const pcontext = static_cast(APP)) { for (uint32_t i=0; iparameters[i])); @@ -66,7 +66,7 @@ struct HostParameters : Module { void onSampleRateChange(const SampleRateChangeEvent& e) override { - if (CardinalPluginContext* const pcontext = static_cast(APP)) + if (const CardinalPluginContext* const pcontext = static_cast(APP)) { const double fall = 1.0 / (double(pcontext->bufferSize) / e.sampleRate); @@ -84,12 +84,12 @@ struct HostParameters : Module { #ifndef HEADLESS struct CardinalParameterPJ301MPort : PJ301MPort { void onDragStart(const DragStartEvent& e) override { - if (CardinalPluginContext* const pcontext = static_cast(APP)) + if (const CardinalPluginContext* const pcontext = static_cast(APP)) handleHostParameterDrag(pcontext, portId, true); PJ301MPort::onDragStart(e); } void onDragEnd(const DragEndEvent& e) override { - if (CardinalPluginContext* const pcontext = static_cast(APP)) + if (const CardinalPluginContext* const pcontext = static_cast(APP)) handleHostParameterDrag(pcontext, portId, false); PJ301MPort::onDragEnd(e); } diff --git a/plugins/Cardinal/src/HostTime.cpp b/plugins/Cardinal/src/HostTime.cpp index bb2a7a2..5b3b0a4 100644 --- a/plugins/Cardinal/src/HostTime.cpp +++ b/plugins/Cardinal/src/HostTime.cpp @@ -37,12 +37,21 @@ struct HostTime : Module { rack::dsp::PulseGenerator pulseReset, pulseBar, pulseBeat, pulseClock; float sampleTime = 0.0f; + int64_t lastBlockFrame = -1; + // cached time values + struct { + bool reset = true; + int32_t bar = 0; + int32_t beat = 0; + double tick = 0.0; + double tickClock = 0.0; + } timeInfo; HostTime() { config(NUM_PARAMS, NUM_INPUTS, kHostTimeCount, kHostTimeCount); - CardinalPluginContext* const pcontext = static_cast(APP); + const CardinalPluginContext* const pcontext = static_cast(APP); if (pcontext == nullptr) throw rack::Exception("Plugin context is null."); @@ -50,44 +59,57 @@ struct HostTime : Module { void process(const ProcessArgs& args) override { - if (CardinalPluginContext* const pcontext = static_cast(APP)) + if (const CardinalPluginContext* const pcontext = static_cast(APP)) { + const int64_t blockFrame = pcontext->engine->getBlockFrame(); + + // Update time position if running a new audio block + if (lastBlockFrame != blockFrame) + { + lastBlockFrame = blockFrame; + timeInfo.reset = pcontext->reset; + timeInfo.bar = pcontext->bar; + timeInfo.beat = pcontext->beat; + timeInfo.tick = pcontext->tick; + timeInfo.tickClock = pcontext->tickClock; + } + const bool playing = pcontext->playing; const bool playingWithBBT = playing && pcontext->bbtValid; if (playingWithBBT) { - if (pcontext->tick == 0.0) + if (timeInfo.tick == 0.0) { pulseReset.trigger(); pulseClock.trigger(); pulseBeat.trigger(); - if (pcontext->beat == 1) + if (timeInfo.beat == 1) pulseBar.trigger(); } - if (pcontext->reset) + if (timeInfo.reset) { - pcontext->reset = false; + timeInfo.reset = false; pulseReset.trigger(); } - if ((pcontext->tick += pcontext->ticksPerFrame) >= pcontext->ticksPerBeat) + if ((timeInfo.tick += pcontext->ticksPerFrame) >= pcontext->ticksPerBeat) { - pcontext->tick -= pcontext->ticksPerBeat; + timeInfo.tick -= pcontext->ticksPerBeat; pulseBeat.trigger(); - if (++pcontext->beat > pcontext->beatsPerBar) + if (++timeInfo.beat > pcontext->beatsPerBar) { - pcontext->beat = 1; - ++pcontext->bar; + timeInfo.beat = 1; + ++timeInfo.bar; pulseBar.trigger(); } } - if ((pcontext->tickClock += pcontext->ticksPerFrame) >= pcontext->ticksPerClock) + if ((timeInfo.tickClock += pcontext->ticksPerFrame) >= pcontext->ticksPerClock) { - pcontext->tickClock -= pcontext->ticksPerClock; + timeInfo.tickClock -= pcontext->ticksPerClock; pulseClock.trigger(); } } @@ -97,10 +119,10 @@ struct HostTime : Module { const bool hasBeat = pulseBeat.process(args.sampleTime); const bool hasClock = pulseClock.process(args.sampleTime); const float beatPhase = playingWithBBT && pcontext->ticksPerBeat > 0.0 - ? pcontext->tick / pcontext->ticksPerBeat + ? timeInfo.tick / pcontext->ticksPerBeat : 0.0f; const float barPhase = playingWithBBT && pcontext->beatsPerBar > 0 - ? ((float) (pcontext->beat - 1) + beatPhase) / pcontext->beatsPerBar + ? ((float) (timeInfo.beat - 1) + beatPhase) / pcontext->beatsPerBar : 0.0f; lights[kHostTimeRolling].setBrightness(playing ? 1.0f : 0.0f); diff --git a/plugins/Cardinal/src/Ildaeil.cpp b/plugins/Cardinal/src/Ildaeil.cpp index 376102a..f0d3fc2 100644 --- a/plugins/Cardinal/src/Ildaeil.cpp +++ b/plugins/Cardinal/src/Ildaeil.cpp @@ -248,7 +248,7 @@ struct IldaeilModule : Module { SharedResourcePointer juceInitializer; #endif - CardinalPluginContext* const pcontext; + const CardinalPluginContext* const pcontext; const NativePluginDescriptor* fCarlaPluginDescriptor = nullptr; NativePluginHandle fCarlaPluginHandle = nullptr; @@ -588,7 +588,7 @@ static uint32_t host_get_buffer_size(const NativeHostHandle handle) static double host_get_sample_rate(const NativeHostHandle handle) { - CardinalPluginContext* const pcontext = static_cast(handle)->pcontext; + const CardinalPluginContext* const pcontext = static_cast(handle)->pcontext; DISTRHO_SAFE_ASSERT_RETURN(pcontext != nullptr, 48000.0); return pcontext->sampleRate; } @@ -837,7 +837,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread { DISTRHO_SAFE_ASSERT_RETURN(idleCallbackActive,); DISTRHO_SAFE_ASSERT_RETURN(fPluginType == PLUGIN_INTERNAL || fPluginType == PLUGIN_LV2,); - CardinalPluginContext* const pcontext = module->pcontext; + const CardinalPluginContext* const pcontext = module->pcontext; // FIXME isEmbed FileBrowserOptions opts; @@ -1004,7 +1004,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread { { if (const CarlaHostHandle handle = module->fCarlaHostHandle) { - CardinalPluginContext* const pcontext = module->pcontext; + const CardinalPluginContext* const pcontext = module->pcontext; char winIdStr[24]; std::snprintf(winIdStr, sizeof(winIdStr), "%llx", (ulonglong)pcontext->nativeWindowId); @@ -1026,7 +1026,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread { { if (const CarlaHostHandle handle = module->fCarlaHostHandle) { - CardinalPluginContext* const pcontext = module->pcontext; + const CardinalPluginContext* const pcontext = module->pcontext; module->fCarlaHostDescriptor.uiParentId = 0; carla_set_engine_option(handle, ENGINE_OPTION_FRONTEND_WIN_ID, 0, "0"); diff --git a/plugins/Cardinal/src/plugincontext.hpp b/plugins/Cardinal/src/plugincontext.hpp index 0ede7a8..803e721 100644 --- a/plugins/Cardinal/src/plugincontext.hpp +++ b/plugins/Cardinal/src/plugincontext.hpp @@ -55,13 +55,13 @@ struct CardinalPluginContext : rack::Context { #endif CardinalPluginContext(Plugin* const p); #ifndef HEADLESS - bool addIdleCallback(IdleCallback* cb); - void removeIdleCallback(IdleCallback* cb); + bool addIdleCallback(IdleCallback* cb) const; + void removeIdleCallback(IdleCallback* cb) const; #endif }; #ifndef HEADLESS -void handleHostParameterDrag(CardinalPluginContext* pcontext, uint index, bool started); +void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started); #endif END_NAMESPACE_DISTRHO diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 48d847c..2eb83bb 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -930,12 +930,13 @@ protected: { const TimePosition& timePos(getTimePosition()); + bool reset = false; MidiEvent singleTimeMidiEvent = { 0, 1, { 0, 0, 0, 0 }, nullptr }; if (timePos.playing) { if (timePos.frame == 0 || fPreviousFrame + frames != timePos.frame) - context->reset = true; + reset = true; if (! context->playing) { @@ -977,6 +978,7 @@ protected: context->tickClock = std::fmod(timePos.bbt.tick, context->ticksPerClock); } + context->reset = reset; fPreviousFrame = timePos.frame; } diff --git a/src/CardinalUI.cpp b/src/CardinalUI.cpp index b46980b..74d5266 100644 --- a/src/CardinalUI.cpp +++ b/src/CardinalUI.cpp @@ -193,7 +193,7 @@ START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------------------------------------------- -bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb) +bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb) const { if (ui == nullptr) return false; @@ -202,7 +202,7 @@ bool CardinalPluginContext::addIdleCallback(IdleCallback* const cb) return true; } -void CardinalPluginContext::removeIdleCallback(IdleCallback* const cb) +void CardinalPluginContext::removeIdleCallback(IdleCallback* const cb) const { if (ui == nullptr) return; @@ -210,7 +210,7 @@ void CardinalPluginContext::removeIdleCallback(IdleCallback* const cb) ui->removeIdleCallback(cb); } -void handleHostParameterDrag(CardinalPluginContext* pcontext, uint index, bool started) +void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started) { DISTRHO_SAFE_ASSERT_RETURN(pcontext->ui != nullptr,); diff --git a/src/PluginContext.hpp b/src/PluginContext.hpp index 916bf3c..96c0051 100644 --- a/src/PluginContext.hpp +++ b/src/PluginContext.hpp @@ -91,13 +91,13 @@ struct CardinalPluginContext : rack::Context { } #ifndef HEADLESS - bool addIdleCallback(IdleCallback* cb); - void removeIdleCallback(IdleCallback* cb); + bool addIdleCallback(IdleCallback* cb) const; + void removeIdleCallback(IdleCallback* cb) const; #endif }; #ifndef HEADLESS -void handleHostParameterDrag(CardinalPluginContext* pcontext, uint index, bool started); +void handleHostParameterDrag(const CardinalPluginContext* pcontext, uint index, bool started); #endif // -----------------------------------------------------------------------------------------------------------