diff options
author | Max Kellermann <max@duempel.org> | 2013-12-23 10:07:28 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-12-23 10:35:35 +0100 |
commit | 7be2abe6b5bae45fb91b79aa232db0392ec1046f (patch) | |
tree | 83c2210d4cad6441ad143c2900944ba3aec2aebb | |
parent | 4a62cd4ad89405f34a15bc4eb914d8ff97f9a7ae (diff) | |
download | mpd-7be2abe6b5bae45fb91b79aa232db0392ec1046f.tar.gz mpd-7be2abe6b5bae45fb91b79aa232db0392ec1046f.tar.xz mpd-7be2abe6b5bae45fb91b79aa232db0392ec1046f.zip |
pcm/Volume: convert i386 code to template specialization
-rw-r--r-- | src/pcm/Volume.cxx | 84 |
1 files changed, 42 insertions, 42 deletions
diff --git a/src/pcm/Volume.cxx b/src/pcm/Volume.cxx index 8a2ec13b6..f4e750bf7 100644 --- a/src/pcm/Volume.cxx +++ b/src/pcm/Volume.cxx @@ -40,31 +40,8 @@ pcm_volume_sample(typename Traits::value_type _sample, return PcmClamp<F, Traits>(sample); } -template<SampleFormat F, class Traits=SampleTraits<F>> -static void -pcm_volume_change(typename Traits::pointer_type buffer, - typename Traits::const_pointer_type end, - int volume) -{ - while (buffer < end) { - const auto sample = *buffer; - *buffer++ = pcm_volume_sample<F, Traits>(sample, volume); - } -} - -static void -pcm_volume_change_8(int8_t *buffer, const int8_t *end, int volume) -{ - pcm_volume_change<SampleFormat::S8>(buffer, end, volume); -} - -static void -pcm_volume_change_16(int16_t *buffer, const int16_t *end, int volume) -{ - pcm_volume_change<SampleFormat::S16>(buffer, end, volume); -} - #ifdef __i386__ + /** * Optimized volume function for i386. Use the EDX:EAX 2*32 bit * multiplication result instead of emulating 64 bit multiplication. @@ -93,37 +70,60 @@ pcm_volume_sample_24(int32_t sample, int32_t volume, gcc_unused int32_t dither) return result; } + +template<> +inline int32_t +pcm_volume_sample<SampleFormat::S24_P32, + SampleTraits<SampleFormat::S24_P32>>(int32_t sample, + int volume) +{ + return pcm_volume_sample_24(sample, volume, pcm_volume_dither()); +} + +template<> +inline int32_t +pcm_volume_sample<SampleFormat::S32, + SampleTraits<SampleFormat::S32>>(int32_t sample, int volume) +{ + return pcm_volume_sample_24(sample, volume, pcm_volume_dither()); +} + #endif +template<SampleFormat F, class Traits=SampleTraits<F>> static void -pcm_volume_change_24(int32_t *buffer, const int32_t *end, int volume) +pcm_volume_change(typename Traits::pointer_type buffer, + typename Traits::const_pointer_type end, + int volume) { -#ifdef __i386__ while (buffer < end) { - /* assembly version for i386 */ - int32_t sample = *buffer; - - sample = pcm_volume_sample_24(sample, volume, - pcm_volume_dither()); + const auto sample = *buffer; + *buffer++ = pcm_volume_sample<F, Traits>(sample, volume); } -#else +} + +static void +pcm_volume_change_8(int8_t *buffer, const int8_t *end, int volume) +{ + pcm_volume_change<SampleFormat::S8>(buffer, end, volume); +} + +static void +pcm_volume_change_16(int16_t *buffer, const int16_t *end, int volume) +{ + pcm_volume_change<SampleFormat::S16>(buffer, end, volume); +} + +static void +pcm_volume_change_24(int32_t *buffer, const int32_t *end, int volume) +{ pcm_volume_change<SampleFormat::S24_P32>(buffer, end, volume); -#endif } static void pcm_volume_change_32(int32_t *buffer, const int32_t *end, int volume) { -#ifdef __i386__ - while (buffer < end) { - /* assembly version for i386 */ - int32_t sample = *buffer; - - *buffer++ = pcm_volume_sample_24(sample, volume, 0); - } -#else pcm_volume_change<SampleFormat::S32>(buffer, end, volume); -#endif } static void |