diff options
-rw-r--r-- | src/decoder/pcm_decoder_plugin.c | 27 |
1 files changed, 12 insertions, 15 deletions
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 <glib.h> #include <unistd.h> @@ -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) |