aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-11-10 22:52:17 +0100
committerMax Kellermann <max@duempel.org>2014-11-10 22:52:17 +0100
commit8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2 (patch)
tree595d3bff8ed82184fd81eac062c676e6355f3a7b
parent8ff0d99092acfe8e80eba9709c2e93727f9e47b9 (diff)
downloadmpd-8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2.tar.gz
mpd-8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2.tar.xz
mpd-8d036c4b7c3a09bd55bdc86a4fb7b5d525a805c2.zip
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.
Diffstat (limited to '')
-rw-r--r--NEWS1
-rw-r--r--src/pcm/SoxrResampler.cxx3
2 files changed, 3 insertions, 1 deletions
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<void> 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);