From ea66479447ef59ae922d17a1fc9ff32c822740ea Mon Sep 17 00:00:00 2001 From: cfillion Date: Tue, 12 Mar 2024 00:26:19 -0400 Subject: [PATCH] fix CF_Preview dropping samples near the end of the source when pitch shifting Fixes #1854 --- cfillion/pitchshiftsource.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cfillion/pitchshiftsource.cpp b/cfillion/pitchshiftsource.cpp index 7a429355..6277fab9 100644 --- a/cfillion/pitchshiftsource.cpp +++ b/cfillion/pitchshiftsource.cpp @@ -177,20 +177,23 @@ void PitchShiftSource_Audio::getShiftedSamples(const Block &block) m_ps->Reset(); // to give immediate feedback with very slow play rates } + bool isEOF = false; do { - const int remaining { block.tx->length - block.tx->samples_out }; - ReaSample *sample { block.tx->samples + (block.tx->samples_out * block.tx->nch) }; - block.tx->samples_out += m_ps->GetSamples(remaining, sample); - if(block.tx->samples_out >= block.tx->length) - break; // output block is full - // feed the pitch shifter until it has enough data to fill the output block sourceBlock.samples = m_ps->GetBuffer(sourceBlock.length); sourceBlock.time_s = m_readTime; m_src->GetSamples(&sourceBlock); m_ps->BufferDone(sourceBlock.samples_out); m_readTime += sourceBlock.samples_out * block.sampleTime; - } while(sourceBlock.samples_out == sourceBlock.length); // until EOF + + isEOF = sourceBlock.samples_out < sourceBlock.length; + if(isEOF) + m_ps->FlushSamples(); + + const int remaining { block.tx->length - block.tx->samples_out }; + ReaSample *sample { block.tx->samples + (block.tx->samples_out * block.tx->nch) }; + block.tx->samples_out += m_ps->GetSamples(remaining, sample); + } while(block.tx->samples_out < block.tx->length && !isEOF); } static unsigned char clamp7b(const int v)