Skip to content

Commit

Permalink
Use model::ChannelView for advancing channels in Renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
gvnnz committed May 20, 2024
1 parent e92776c commit 2982dad
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 19 deletions.
4 changes: 2 additions & 2 deletions src/core/model/channels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ const std::vector<Channel>& Channels::getAll() const

/* -------------------------------------------------------------------------- */

const std::vector<ChannelView>& Channels::getView()
const std::vector<ChannelView>& 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;
Expand Down
10 changes: 5 additions & 5 deletions src/core/model/channels.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ namespace giada::m::model
{
struct ChannelView
{
Channel* channel = nullptr;
std::vector<Channel*> children;
const Channel* channel = nullptr;
std::vector<const Channel*> children;
};

/* -------------------------------------------------------------------------- */
Expand All @@ -45,7 +45,7 @@ class Channels
public:
const Channel& get(ID) const;
const std::vector<Channel>& getAll() const;
const std::vector<ChannelView>& getView();
const std::vector<ChannelView>& getView() const;

/* anyOf
Returns true if any channel satisfies the callback 'f'. */
Expand All @@ -64,8 +64,8 @@ class Channels
void remove(ID);

private:
std::vector<Channel> m_channels;
std::vector<ChannelView> m_channelsView;
std::vector<Channel> m_channels;
mutable std::vector<ChannelView> m_channelsView;
};
} // namespace giada::m::model

Expand Down
24 changes: 16 additions & 8 deletions src/core/rendering/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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<Frame> block, int quantizerStep) const
void Renderer::advanceChannels(
const Sequencer::EventBuffer& events,
const std::vector<model::ChannelView>& views,
geompp::Range<Frame> 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<Frame> block, Frame quantizerStep) const
void Renderer::advanceChannel(
const model::ChannelView& view,
const Sequencer::EventBuffer& events,
geompp::Range<Frame> block,
Frame quantizerStep) const
{
const Channel& ch = *view.channel;

if (ch.shared->quantizer)
ch.shared->quantizer->advance(block, quantizerStep);

Expand Down
16 changes: 12 additions & 4 deletions src/core/rendering/renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ namespace giada::m::model
{
class Model;
class Channels;
struct ChannelView;
} // namespace giada::m::model

namespace giada::m::rendering
Expand All @@ -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<Frame>, int quantizerStep) const;
void advanceChannels(
const Sequencer::EventBuffer&,
const std::vector<model::ChannelView>&,
geompp::Range<Frame>,
int quantizerStep) const;

void advanceChannel(const Channel&, const Sequencer::EventBuffer&, geompp::Range<Frame>, Frame quantizerStep) const;
void advanceChannel(
const model::ChannelView&,
const Sequencer::EventBuffer&,
geompp::Range<Frame>,
Frame quantizerStep) const;

void renderNormalChannels(const std::vector<Channel>& channels, mcl::AudioBuffer& out,
const mcl::AudioBuffer& in, bool hasSolos, bool seqIsRunning) const;
Expand Down

0 comments on commit 2982dad

Please sign in to comment.