aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2015-08-05 23:18:21 +0200
committerMax Kellermann <max@duempel.org>2015-10-16 18:12:32 +0200
commita7ee64a25b7ffe0ccd499341916070c7b6d02f7a (patch)
tree3c9801e7a146e7d7b2b3d8aa2ca617506175b058
parent2a58f2264936787ddd96b40c7626046592c2d1a0 (diff)
downloadmpd-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.cxx24
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