Skip to content

Commit

Permalink
Fix bug in rendering for sample channels in one-shot retrig mode
Browse files Browse the repository at this point in the history
The sample was incorrectly put in OFF play mode when filling the buffer during the preparation for the RenderInfo::Mode::REWIND state.
  • Loading branch information
gvnnz committed Nov 17, 2024
1 parent 9f35ec0 commit 6901ad0
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions src/core/rendering/sampleRendering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void stop_(const Channel& ch, mcl::AudioBuffer& buf, Frame offset, bool seqIsRun

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

Frame render_(const Channel& ch, mcl::AudioBuffer& buf, Frame tracker, Frame offset, bool seqIsRunning)
Frame render_(const Channel& ch, mcl::AudioBuffer& buf, Frame tracker, Frame offset, bool seqIsRunning, bool testEnd)
{
const Frame begin = ch.sampleChannel->begin;
const Frame end = ch.sampleChannel->end;
Expand All @@ -143,9 +143,13 @@ Frame render_(const Channel& ch, mcl::AudioBuffer& buf, Frame tracker, Frame off
{
tracker = begin;
ch.shared->resampler->last();
const bool shouldLoop = onSampleEnd_(ch, seqIsRunning, /*natural=*/true);
if (!shouldLoop)
break;

if (testEnd)
{
const bool shouldLoop = onSampleEnd_(ch, seqIsRunning, /*natural=*/true);
if (!shouldLoop)
break;
}
}
}

Expand All @@ -171,22 +175,24 @@ void renderSampleChannel(const Channel& ch, bool seqIsRunning)

if (renderInfo.mode == RenderInfo::Mode::NORMAL)
{
tracker = render_(ch, buf, tracker, renderInfo.offset, seqIsRunning);
tracker = render_(ch, buf, tracker, renderInfo.offset, seqIsRunning, /*testEnd=*/true);
}
else
{
/* Both modes: fill whole buffer first: [abcdefghijklmnopq]. Also tell
resampler this is the last read before either a rewind or a stop. */
resampler this is the last read before either a rewind or a stop. Don't run
complex logic on sample end (testEnd=false), we just want to fill the buffer
as much as possible here. */

render_(ch, buf, tracker, 0, seqIsRunning);
render_(ch, buf, tracker, 0, seqIsRunning, /*testEnd=*/false);
resampler.last();

/* Mode::REWIND: fill buffer from offset: [abcdefghi|abcdfefg]
Mode::STOP: clear buffer from offset: [abcdefghi|--------] */

if (renderInfo.mode == RenderInfo::Mode::REWIND)
{
tracker = render_(ch, buf, begin, renderInfo.offset, seqIsRunning);
tracker = render_(ch, buf, begin, renderInfo.offset, seqIsRunning, /*testEnd=*/true);
}
else
{
Expand Down

0 comments on commit 6901ad0

Please sign in to comment.