Commit c6ef0e88 authored by Max Kellermann's avatar Max Kellermann

pcm/Traits: add typedef "sum_type"

Allow 32 bit platforms to use 32 bit instead of 64 bit for summing 24 bit samples.
parent f761d583
......@@ -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++;
......
......@@ -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);
}
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment