diff options
author | Max Kellermann <max@duempel.org> | 2015-08-05 23:18:21 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-10-16 18:12:32 +0200 |
commit | a7ee64a25b7ffe0ccd499341916070c7b6d02f7a (patch) | |
tree | 3c9801e7a146e7d7b2b3d8aa2ca617506175b058 | |
parent | 2a58f2264936787ddd96b40c7626046592c2d1a0 (diff) | |
download | mpd-a7ee64a25b7ffe0ccd499341916070c7b6d02f7a.tar.gz mpd-a7ee64a25b7ffe0ccd499341916070c7b6d02f7a.tar.xz mpd-a7ee64a25b7ffe0ccd499341916070c7b6d02f7a.zip |
decoder/mpcdec: use SampleTraits<SampleFormat::S24_P32>
Eliminates some duplicate code, and as a side effect, this works
around clang 3.8 compiler warning because a negative value was
shifted.
-rw-r--r-- | src/decoder/plugins/MpcdecDecoderPlugin.cxx | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/decoder/plugins/MpcdecDecoderPlugin.cxx b/src/decoder/plugins/MpcdecDecoderPlugin.cxx index 91b5b55b9..391b5d691 100644 --- a/src/decoder/plugins/MpcdecDecoderPlugin.cxx +++ b/src/decoder/plugins/MpcdecDecoderPlugin.cxx @@ -22,6 +22,7 @@ #include "../DecoderAPI.hxx" #include "input/InputStream.hxx" #include "CheckAudioFormat.hxx" +#include "pcm/Traits.hxx" #include "tag/TagHandler.hxx" #include "util/Error.hxx" #include "util/Domain.hxx" @@ -43,6 +44,9 @@ struct mpc_decoder_data { static constexpr Domain mpcdec_domain("mpcdec"); +static constexpr SampleFormat mpcdec_sample_format = SampleFormat::S24_P32; +typedef SampleTraits<mpcdec_sample_format> MpcdecSampleTraits; + static mpc_int32_t mpc_read_cb(mpc_reader *reader, void *ptr, mpc_int32_t size) { @@ -92,18 +96,15 @@ mpc_getsize_cb(mpc_reader *reader) } /* this _looks_ performance-critical, don't de-inline -- eric */ -static inline int32_t +static inline MpcdecSampleTraits::value_type mpc_to_mpd_sample(MPC_SAMPLE_FORMAT sample) { /* only doing 16-bit audio for now */ - int32_t val; - - enum { - bits = 24, - }; + MpcdecSampleTraits::value_type val; - const int clip_min = -1 << (bits - 1); - const int clip_max = (1 << (bits - 1)) - 1; + constexpr int bits = MpcdecSampleTraits::BITS; + constexpr auto clip_min = MpcdecSampleTraits::MIN; + constexpr auto clip_max = MpcdecSampleTraits::MAX; #ifdef MPC_FIXED_POINT const int shift = bits - MPC_FIXED_POINT_SCALE_SHIFT; @@ -122,7 +123,8 @@ mpc_to_mpd_sample(MPC_SAMPLE_FORMAT sample) } static void -mpc_to_mpd_buffer(int32_t *dest, const MPC_SAMPLE_FORMAT *src, +mpc_to_mpd_buffer(MpcdecSampleTraits::pointer_type dest, + const MPC_SAMPLE_FORMAT *src, unsigned num_samples) { while (num_samples-- > 0) @@ -158,7 +160,7 @@ mpcdec_decode(Decoder &mpd_decoder, InputStream &is) Error error; AudioFormat audio_format; if (!audio_format_init_checked(audio_format, info.sample_freq, - SampleFormat::S24_P32, + mpcdec_sample_format, info.channels, error)) { LogError(error); mpc_demux_exit(demux); @@ -210,7 +212,7 @@ mpcdec_decode(Decoder &mpd_decoder, InputStream &is) mpc_uint32_t ret = frame.samples; ret *= info.channels; - int32_t chunk[ARRAY_SIZE(sample_buffer)]; + MpcdecSampleTraits::value_type chunk[ARRAY_SIZE(sample_buffer)]; mpc_to_mpd_buffer(chunk, sample_buffer, ret); long bit_rate = vbr_update_bits * audio_format.sample_rate |