From 01ffa9557806ecd9b2ecd5763aba16367e5f9935 Mon Sep 17 00:00:00 2001 From: saker Date: Sat, 15 Jun 2024 18:34:10 -0400 Subject: [PATCH] Use `src_set_ratio` to fix artifacts within `Sample` playback (#7321) --- include/AudioResampler.h | 1 + src/core/AudioResampler.cpp | 5 +++++ src/core/Sample.cpp | 2 ++ 3 files changed, 8 insertions(+) diff --git a/include/AudioResampler.h b/include/AudioResampler.h index 379146962a8..6dd6fcc6039 100644 --- a/include/AudioResampler.h +++ b/include/AudioResampler.h @@ -52,6 +52,7 @@ class LMMS_EXPORT AudioResampler auto resample(const float* in, long inputFrames, float* out, long outputFrames, double ratio) -> ProcessResult; auto interpolationMode() const -> int { return m_interpolationMode; } auto channels() const -> int { return m_channels; } + void setRatio(double ratio); private: int m_interpolationMode = -1; diff --git a/src/core/AudioResampler.cpp b/src/core/AudioResampler.cpp index 5f6b6a23955..8fb7d95a2aa 100644 --- a/src/core/AudioResampler.cpp +++ b/src/core/AudioResampler.cpp @@ -61,4 +61,9 @@ auto AudioResampler::resample(const float* in, long inputFrames, float* out, lon return {src_process(m_state, &data), data.input_frames_used, data.output_frames_gen}; } +void AudioResampler::setRatio(double ratio) +{ + src_set_ratio(m_state, ratio); +} + } // namespace lmms diff --git a/src/core/Sample.cpp b/src/core/Sample.cpp index 584d1bc13c9..f1fe1ec1a73 100644 --- a/src/core/Sample.cpp +++ b/src/core/Sample.cpp @@ -134,6 +134,8 @@ bool Sample::play(sampleFrame* dst, PlaybackState* state, size_t numFrames, floa auto playBuffer = std::vector(numFrames / resampleRatio + marginSize); playRaw(playBuffer.data(), playBuffer.size(), state, loopMode); + state->resampler().setRatio(resampleRatio); + const auto resampleResult = state->resampler().resample(&playBuffer[0][0], playBuffer.size(), &dst[0][0], numFrames, resampleRatio); advance(state, resampleResult.inputFramesUsed, loopMode);