diff options
author | Max Kellermann <max@duempel.org> | 2013-12-02 11:45:03 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-12-02 11:48:10 +0100 |
commit | c6ef0e88879d2cd203a74cfda2a574e949486877 (patch) | |
tree | 8c20019846a355f23c3a6bf9d7c0e48e1fdb5ea3 /src | |
parent | f761d583b579e4bdfe3013b52a46a76a8f31abf8 (diff) | |
download | mpd-c6ef0e88879d2cd203a74cfda2a574e949486877.tar.gz mpd-c6ef0e88879d2cd203a74cfda2a574e949486877.tar.xz mpd-c6ef0e88879d2cd203a74cfda2a574e949486877.zip |
pcm/Traits: add typedef "sum_type"
Allow 32 bit platforms to use 32 bit instead of 64 bit for summing 24
bit samples.
Diffstat (limited to 'src')
-rw-r--r-- | src/pcm/PcmChannels.cxx | 8 | ||||
-rw-r--r-- | src/pcm/PcmMix.cxx | 2 | ||||
-rw-r--r-- | src/pcm/Traits.hxx | 11 |
3 files changed, 16 insertions, 5 deletions
diff --git a/src/pcm/PcmChannels.cxx b/src/pcm/PcmChannels.cxx index b90e48580..2e433e611 100644 --- a/src/pcm/PcmChannels.cxx +++ b/src/pcm/PcmChannels.cxx @@ -44,8 +44,8 @@ static typename Traits::value_type StereoToMono(typename Traits::value_type _a, typename Traits::value_type _b) { - typename Traits::long_type a(_a); - typename Traits::long_type b(_b); + typename Traits::sum_type a(_a); + typename Traits::sum_type b(_b); return typename Traits::value_type((a + b) / 2); } @@ -76,7 +76,7 @@ NToStereo(typename Traits::pointer_type dest, assert((end - src) % src_channels == 0); while (src != end) { - typename Traits::long_type sum = *src++; + typename Traits::sum_type sum = *src++; for (unsigned c = 1; c < src_channels; ++c) sum += *src++; @@ -101,7 +101,7 @@ NToM(typename Traits::pointer_type dest, assert((end - src) % src_channels == 0); while (src != end) { - typename Traits::long_type sum = *src++; + typename Traits::sum_type sum = *src++; for (unsigned c = 1; c < src_channels; ++c) sum += *src++; diff --git a/src/pcm/PcmMix.cxx b/src/pcm/PcmMix.cxx index 6a1c40db9..fab2d8154 100644 --- a/src/pcm/PcmMix.cxx +++ b/src/pcm/PcmMix.cxx @@ -125,7 +125,7 @@ template<SampleFormat F, class Traits=SampleTraits<F>> static typename Traits::value_type PcmAdd(typename Traits::value_type _a, typename Traits::value_type _b) { - typename Traits::long_type a(_a), b(_b); + typename Traits::sum_type a(_a), b(_b); return PcmClamp<F, Traits>(a + b); } diff --git a/src/pcm/Traits.hxx b/src/pcm/Traits.hxx index 7212b2dd6..0ec4aaf0a 100644 --- a/src/pcm/Traits.hxx +++ b/src/pcm/Traits.hxx @@ -51,6 +51,13 @@ struct SampleTraits<SampleFormat::S8> { typedef const value_type *const_pointer_type; /** + * A "long" type that is large and accurate enough for adding + * two values without risking an (integer) overflow or + * (floating point) precision loss. + */ + typedef int sum_type; + + /** * A "long" type that is large and accurate enough for * arithmetic without risking an (integer) overflow or * (floating point) precision loss. @@ -75,6 +82,7 @@ struct SampleTraits<SampleFormat::S16> { typedef value_type *pointer_type; typedef const value_type *const_pointer_type; + typedef int_least32_t sum_type; typedef int_least32_t long_type; static constexpr size_t SAMPLE_SIZE = sizeof(value_type); @@ -87,6 +95,7 @@ struct SampleTraits<SampleFormat::S32> { typedef value_type *pointer_type; typedef const value_type *const_pointer_type; + typedef int_least64_t sum_type; typedef int_least64_t long_type; static constexpr size_t SAMPLE_SIZE = sizeof(value_type); @@ -99,6 +108,7 @@ struct SampleTraits<SampleFormat::S24_P32> { typedef value_type *pointer_type; typedef const value_type *const_pointer_type; + typedef int_least32_t sum_type; typedef int_least64_t long_type; static constexpr size_t SAMPLE_SIZE = sizeof(value_type); @@ -111,6 +121,7 @@ struct SampleTraits<SampleFormat::FLOAT> { typedef value_type *pointer_type; typedef const value_type *const_pointer_type; + typedef float sum_type; typedef float long_type; static constexpr size_t SAMPLE_SIZE = sizeof(value_type); |