From 2982dad7ec26f94f82061570556ceff42530b7b3 Mon Sep 17 00:00:00 2001 From: gvnnz Date: Mon, 20 May 2024 22:28:49 +0200 Subject: [PATCH] Use model::ChannelView for advancing channels in Renderer --- src/core/model/channels.cpp | 4 ++-- src/core/model/channels.h | 10 +++++----- src/core/rendering/renderer.cpp | 24 ++++++++++++++++-------- src/core/rendering/renderer.h | 16 ++++++++++++---- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/core/model/channels.cpp b/src/core/model/channels.cpp index 524604c1b..e03973edf 100644 --- a/src/core/model/channels.cpp +++ b/src/core/model/channels.cpp @@ -69,11 +69,11 @@ const std::vector& Channels::getAll() const /* -------------------------------------------------------------------------- */ -const std::vector& Channels::getView() +const std::vector& Channels::getView() const { // TODO - add caching m_channelsView.clear(); - for (Channel& ch : m_channels) + for (const Channel& ch : m_channels) { ChannelView channelView; channelView.channel = &ch; diff --git a/src/core/model/channels.h b/src/core/model/channels.h index 63240b799..ecd7a67e4 100644 --- a/src/core/model/channels.h +++ b/src/core/model/channels.h @@ -34,8 +34,8 @@ namespace giada::m::model { struct ChannelView { - Channel* channel = nullptr; - std::vector children; + const Channel* channel = nullptr; + std::vector children; }; /* -------------------------------------------------------------------------- */ @@ -45,7 +45,7 @@ class Channels public: const Channel& get(ID) const; const std::vector& getAll() const; - const std::vector& getView(); + const std::vector& getView() const; /* anyOf Returns true if any channel satisfies the callback 'f'. */ @@ -64,8 +64,8 @@ class Channels void remove(ID); private: - std::vector m_channels; - std::vector m_channelsView; + std::vector m_channels; + mutable std::vector m_channelsView; }; } // namespace giada::m::model diff --git a/src/core/rendering/renderer.cpp b/src/core/rendering/renderer.cpp index d103e1802..f56e60e18 100644 --- a/src/core/rendering/renderer.cpp +++ b/src/core/rendering/renderer.cpp @@ -119,7 +119,7 @@ void Renderer::render(mcl::AudioBuffer& out, const mcl::AudioBuffer& in, const m const Sequencer::EventBuffer& events = m_sequencer.advance(sequencer, bufferSize, kernelAudio.samplerate, actions); m_sequencer.render(out, document_RT); if (!document_RT.locked) - advanceChannels(events, channels, renderRange, quantizerStep); + advanceChannels(events, channels.getView(), renderRange, quantizerStep); } /* Then render Mixer, channels and finalize output. */ @@ -150,19 +150,27 @@ void Renderer::render(mcl::AudioBuffer& out, const mcl::AudioBuffer& in, const m /* -------------------------------------------------------------------------- */ -void Renderer::advanceChannels(const Sequencer::EventBuffer& events, - const model::Channels& channels, geompp::Range block, int quantizerStep) const +void Renderer::advanceChannels( + const Sequencer::EventBuffer& events, + const std::vector& views, + geompp::Range block, + int quantizerStep) const { - for (const Channel& c : channels.getAll()) - if (!c.isInternal()) - advanceChannel(c, events, block, quantizerStep); + for (const model::ChannelView& view : views) + if (!view.channel->isInternal()) + advanceChannel(view, events, block, quantizerStep); } /* -------------------------------------------------------------------------- */ -void Renderer::advanceChannel(const Channel& ch, const Sequencer::EventBuffer& events, - geompp::Range block, Frame quantizerStep) const +void Renderer::advanceChannel( + const model::ChannelView& view, + const Sequencer::EventBuffer& events, + geompp::Range block, + Frame quantizerStep) const { + const Channel& ch = *view.channel; + if (ch.shared->quantizer) ch.shared->quantizer->advance(block, quantizerStep); diff --git a/src/core/rendering/renderer.h b/src/core/rendering/renderer.h index 0da10ebf9..330664c5e 100644 --- a/src/core/rendering/renderer.h +++ b/src/core/rendering/renderer.h @@ -53,6 +53,7 @@ namespace giada::m::model { class Model; class Channels; +struct ChannelView; } // namespace giada::m::model namespace giada::m::rendering @@ -70,13 +71,20 @@ class Renderer private: /* advanceChannels - Processes Channels' static events (e.g. pre-recorded actions or sequencer + Processes Channels' static events (e.g. pre-recorded actions or sequencer events) in the current audio block. Called when the sequencer is running. */ - void advanceChannels(const Sequencer::EventBuffer&, const model::Channels&, - geompp::Range, int quantizerStep) const; + void advanceChannels( + const Sequencer::EventBuffer&, + const std::vector&, + geompp::Range, + int quantizerStep) const; - void advanceChannel(const Channel&, const Sequencer::EventBuffer&, geompp::Range, Frame quantizerStep) const; + void advanceChannel( + const model::ChannelView&, + const Sequencer::EventBuffer&, + geompp::Range, + Frame quantizerStep) const; void renderNormalChannels(const std::vector& channels, mcl::AudioBuffer& out, const mcl::AudioBuffer& in, bool hasSolos, bool seqIsRunning) const;