From 7ebf8e66c9336f93ddf9d747a917f59595fd9dec Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 21 Mar 2012 19:07:15 +0100 Subject: decoder/pcm: always supply host byte order samples Don't use audio_format.reverse_endian. --- src/decoder/pcm_decoder_plugin.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src/decoder') diff --git a/src/decoder/pcm_decoder_plugin.c b/src/decoder/pcm_decoder_plugin.c index 545f7fc82..fc7dffc05 100644 --- a/src/decoder/pcm_decoder_plugin.c +++ b/src/decoder/pcm_decoder_plugin.c @@ -20,6 +20,7 @@ #include "config.h" #include "decoder/pcm_decoder_plugin.h" #include "decoder_api.h" +#include "util/byte_reverse.h" #include #include @@ -31,35 +32,25 @@ static void pcm_stream_decode(struct decoder *decoder, struct input_stream *is) { - static const struct audio_format host_audio_format = { + static const struct audio_format audio_format = { .sample_rate = 44100, .format = SAMPLE_FORMAT_S16, .channels = 2, }; - static const struct audio_format reverse_audio_format = { - .sample_rate = 44100, - .format = SAMPLE_FORMAT_S16, - .channels = 2, - .reverse_endian = true, - }; - - const struct audio_format *audio_format = - (is->mime == NULL || - strcmp(is->mime, "audio/x-mpd-cdda-pcm-reverse") != 0) - ? &host_audio_format - : &reverse_audio_format; + const bool reverse_endian = is->mime != NULL && + strcmp(is->mime, "audio/x-mpd-cdda-pcm-reverse") == 0; GError *error = NULL; enum decoder_command cmd; - double time_to_size = audio_format_time_to_size(audio_format); + double time_to_size = audio_format_time_to_size(&audio_format); float total_time = -1; if (is->size >= 0) total_time = is->size / time_to_size; - decoder_initialized(decoder, audio_format, is->seekable, total_time); + decoder_initialized(decoder, &audio_format, is->seekable, total_time); do { char buffer[4096]; @@ -70,6 +61,12 @@ pcm_stream_decode(struct decoder *decoder, struct input_stream *is) if (nbytes == 0 && input_stream_lock_eof(is)) break; + if (reverse_endian) + /* make sure we deliver samples in host byte order */ + reverse_bytes_16((uint16_t *)buffer, + (uint16_t *)buffer, + (uint16_t *)(buffer + nbytes)); + cmd = nbytes > 0 ? decoder_data(decoder, is, buffer, nbytes, 0) -- cgit v1.2.3