pcm/PcmUtils: use the SampleTraits library

This commit is contained in:
Max Kellermann 2013-12-02 09:09:19 +01:00
parent 80eb8d9e26
commit 3a0f3eaa50
4 changed files with 14 additions and 17 deletions

View File

@ -57,9 +57,7 @@ ConvertFromFloat(typename Traits::pointer_type dest,
while (src != end) { while (src != end) {
typename Traits::long_type sample(*src++ * factor); typename Traits::long_type sample(*src++ * factor);
*dest++ = PcmClamp<typename Traits::value_type, *dest++ = PcmClamp<F, Traits>(sample);
typename Traits::long_type,
Traits::BITS>(sample);
} }
} }

View File

@ -38,9 +38,7 @@ PcmAddVolume(typename Traits::value_type _a, typename Traits::value_type _b,
pcm_volume_dither() + PCM_VOLUME_1 / 2) pcm_volume_dither() + PCM_VOLUME_1 / 2)
/ PCM_VOLUME_1; / PCM_VOLUME_1;
return PcmClamp<typename Traits::value_type, return PcmClamp<F, Traits>(c);
typename Traits::long_type,
Traits::BITS>(c);
} }
template<SampleFormat F, class Traits=SampleTraits<F>> template<SampleFormat F, class Traits=SampleTraits<F>>
@ -129,9 +127,7 @@ PcmAdd(typename Traits::value_type _a, typename Traits::value_type _b)
{ {
typename Traits::long_type a(_a), b(_b); typename Traits::long_type a(_a), b(_b);
return PcmClamp<typename Traits::value_type, return PcmClamp<F, Traits>(a + b);
typename Traits::long_type,
Traits::BITS>(a + b);
} }
template<SampleFormat F, class Traits=SampleTraits<F>> template<SampleFormat F, class Traits=SampleTraits<F>>

View File

@ -26,6 +26,9 @@
#include <stdint.h> #include <stdint.h>
enum class SampleFormat : uint8_t;
template<SampleFormat F> struct SampleTraits;
/** /**
* Add a byte count to the specified pointer. This is a utility * Add a byte count to the specified pointer. This is a utility
* function to convert a source pointer and a byte count to an "end" * function to convert a source pointer and a byte count to an "end"
@ -42,13 +45,15 @@ pcm_end_pointer(const T *p, size_t size)
* Check if the value is within the range of the provided bit size, * Check if the value is within the range of the provided bit size,
* and caps it if necessary. * and caps it if necessary.
*/ */
template<typename T, typename U, unsigned bits> template<SampleFormat F, class Traits=SampleTraits<F>>
gcc_const gcc_const
static inline T static inline typename Traits::value_type
PcmClamp(U x) PcmClamp(typename Traits::long_type x)
{ {
constexpr U MIN_VALUE = -(U(1) << (bits - 1)); typedef typename Traits::value_type T;
constexpr U MAX_VALUE = (U(1) << (bits - 1)) - 1; typedef typename Traits::long_type U;
constexpr U MIN_VALUE = -(U(1) << (Traits::BITS - 1));
constexpr U MAX_VALUE = (U(1) << (Traits::BITS - 1)) - 1;
typedef std::numeric_limits<T> limits; typedef std::numeric_limits<T> limits;
static_assert(MIN_VALUE >= limits::min(), "out of range"); static_assert(MIN_VALUE >= limits::min(), "out of range");

View File

@ -39,9 +39,7 @@ pcm_volume_change(typename Traits::pointer_type buffer,
PCM_VOLUME_1 / 2) PCM_VOLUME_1 / 2)
/ PCM_VOLUME_1; / PCM_VOLUME_1;
*buffer++ = PcmClamp<typename Traits::value_type, *buffer++ = PcmClamp<F, Traits>(sample);
typename Traits::long_type,
Traits::BITS>(sample);
} }
} }