summaryrefslogtreecommitdiff
path: root/src/pcm
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 /src/pcm
parent8ff0d99092acfe8e80eba9709c2e93727f9e47b9 (diff)
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 'src/pcm')
-rw-r--r--src/pcm/SoxrResampler.cxx3
1 files changed, 2 insertions, 1 deletions
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);