From 73f7f7bb0aa4573dad2bebd4580500b57fd00765 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Wed, 7 Jun 2023 17:01:47 +0100 Subject: [PATCH] Fix handling of oversized process buffers in mid-side mode --- src/finer/R3Stretcher.cpp | 8 ++++++++ src/finer/R3Stretcher.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/finer/R3Stretcher.cpp b/src/finer/R3Stretcher.cpp index 735eba0..32fb8c1 100644 --- a/src/finer/R3Stretcher.cpp +++ b/src/finer/R3Stretcher.cpp @@ -669,6 +669,9 @@ R3Stretcher::ensureInbuf(int required, bool warn) for (int c = 0; c < m_parameters.channels; ++c) { auto newBuf = m_channelData[c]->inbuf->resized(newSize); m_channelData[c]->inbuf = std::unique_ptr>(newBuf); + // mixdown is used for mid-side mixing as well as the single + // hop output mix, so it needs to be enough to match the inbuf + m_channelData[c]->mixdown.resize(newSize, 0.f); } } @@ -913,6 +916,11 @@ R3Stretcher::prepareInput(const float *const *input, int ix, int n) if (useMidSide()) { auto &c0 = m_channelData.at(0)->mixdown; auto &c1 = m_channelData.at(1)->mixdown; + int bufsize = c0.size(); + if (n > bufsize) { + m_log.log(0, "R3Stretcher::prepareInput: WARNING: called with size greater than mixdown buffer length", n, bufsize); + n = bufsize; + } for (int i = 0; i < n; ++i) { float l = input[0][i + ix]; float r = input[1][i + ix]; diff --git a/src/finer/R3Stretcher.h b/src/finer/R3Stretcher.h index 0f97a28..cea3742 100644 --- a/src/finer/R3Stretcher.h +++ b/src/finer/R3Stretcher.h @@ -245,7 +245,7 @@ protected: BinClassifier::Classification::Residual), segmenter(new BinSegmenter(segmenterParameters)), segmentation(), prevSegmentation(), nextSegmentation(), - mixdown(hopBufferSize, 0.f), + mixdown(inRingBufferSize, 0.f), resampled(hopBufferSize, 0.f), inbuf(new RingBuffer(inRingBufferSize)), outbuf(new RingBuffer(outRingBufferSize)),