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);