From 8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 10 Nov 2014 22:52:17 +0100 Subject: [PATCH] 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. --- NEWS | 1 + src/pcm/SoxrResampler.cxx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 933a980db..b1cc2cf04 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ ver 0.19.3 (not yet released) - audiofile: fix crash while playing streams - audiofile: fix bit rate calculation - ffmpeg: support opus +* fix distorted audio with soxr resampler ver 0.19.2 (2014/11/02) * input 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);