From 8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 10 Nov 2014 22:52:17 +0100 Subject: pcm/SoxrResampler: round output buffer size up The old formula calculates the output buffer size with "regular" rounding (to the nearest integer), however sometimes, that is insufficient and the last sample cannot be resampled. This causes audible distortions. By changing the formula to consider the worst case (always round up), this problem is eliminated. --- src/pcm/SoxrResampler.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/pcm') diff --git a/src/pcm/SoxrResampler.cxx b/src/pcm/SoxrResampler.cxx index 56b9760d5..b9d6fc099 100644 --- a/src/pcm/SoxrResampler.cxx +++ b/src/pcm/SoxrResampler.cxx @@ -147,7 +147,8 @@ SoxrPcmResampler::Resample(ConstBuffer src, Error &error) const size_t n_frames = src.size / frame_size; - const size_t o_frames = size_t(n_frames * ratio + 0.5); + /* always round up: worst case output buffer size */ + const size_t o_frames = size_t(n_frames * ratio) + 1; float *output_buffer = (float *)buffer.Get(o_frames * frame_size); -- cgit v1.2.3