diff options
author | Max Kellermann <max@duempel.org> | 2013-11-22 22:50:29 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-11-22 23:27:56 +0100 |
commit | fc7d5b055d98306af0c882282902a23e963f026d (patch) | |
tree | be38c99eef3be2c4acfcbba4077842b7c17b738d /src/pcm/PcmResampleLibsamplerate.cxx | |
parent | 87c8953e8ed660b59ea2452b4d3a431785c47495 (diff) | |
download | mpd-fc7d5b055d98306af0c882282902a23e963f026d.tar.gz mpd-fc7d5b055d98306af0c882282902a23e963f026d.tar.xz mpd-fc7d5b055d98306af0c882282902a23e963f026d.zip |
PcmResampleLibsamplerate: clip 24 bit data
Using pcm_resample_lsr_32() for 24 bit samples works, but may cause 24
bit overflows. This commit makes 24 bit a special case with explicit
clipping.
Diffstat (limited to '')
-rw-r--r-- | src/pcm/PcmResampleLibsamplerate.cxx | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/pcm/PcmResampleLibsamplerate.cxx b/src/pcm/PcmResampleLibsamplerate.cxx index 1986e8821..9eac2d545 100644 --- a/src/pcm/PcmResampleLibsamplerate.cxx +++ b/src/pcm/PcmResampleLibsamplerate.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "PcmResampleInternal.hxx" +#include "PcmUtils.hxx" #include "util/ASCII.hxx" #include "util/Error.hxx" #include "util/Domain.hxx" @@ -283,3 +284,27 @@ pcm_resample_lsr_32(PcmResampler *state, return dest_buffer; } + +const int32_t * +pcm_resample_lsr_24(PcmResampler *state, + unsigned channels, + unsigned src_rate, + const int32_t *src_buffer, size_t src_size, + unsigned dest_rate, size_t *dest_size_r, + Error &error) +{ + const auto result = pcm_resample_lsr_32(state, channels, + src_rate, src_buffer, src_size, + dest_rate, dest_size_r, + error); + if (result != nullptr) + /* src_float_to_int_array() clamps for 32 bit + integers; now make sure everything's fine for 24 + bit */ + /* TODO: eliminate the 32 bit clamp to reduce overhead */ + PcmClampN<int32_t, int32_t, 24>(const_cast<int32_t *>(result), + result, + *dest_size_r / sizeof(*result)); + + return result; +} |