From 6d7eaba845e3b1896a5b57391482a3326a6f26bd Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 23 Aug 2014 15:25:40 +0200 Subject: decoder/dsdiff: refactor the main decoder loop Check for STOP before decoding the first chunk. This reduces the command latency. --- src/decoder/plugins/DsdiffDecoderPlugin.cxx | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) (limited to 'src/decoder/plugins/DsdiffDecoderPlugin.cxx') diff --git a/src/decoder/plugins/DsdiffDecoderPlugin.cxx b/src/decoder/plugins/DsdiffDecoderPlugin.cxx index c7495fe89..de72a0644 100644 --- a/src/decoder/plugins/DsdiffDecoderPlugin.cxx +++ b/src/decoder/plugins/DsdiffDecoderPlugin.cxx @@ -365,8 +365,9 @@ dsdiff_decode_chunk(Decoder &decoder, InputStream &is, const unsigned buffer_frames = sizeof(buffer) / frame_size; const size_t buffer_size = buffer_frames * frame_size; + auto cmd = decoder_get_command(decoder); for (offset_type remaining_bytes = total_bytes; - remaining_bytes >= frame_size;) { + remaining_bytes >= frame_size && cmd != DecoderCommand::STOP;) { /* see how much aligned data from the remaining chunk fits into the local buffer */ size_t now_size = buffer_size; @@ -384,22 +385,8 @@ dsdiff_decode_chunk(Decoder &decoder, InputStream &is, if (lsbitfirst) bit_reverse_buffer(buffer, buffer + nbytes); - const auto cmd = decoder_data(decoder, is, buffer, nbytes, - sample_rate / 1000); - switch (cmd) { - case DecoderCommand::NONE: - break; - - case DecoderCommand::START: - case DecoderCommand::STOP: - return false; - - case DecoderCommand::SEEK: - - /* Not implemented yet */ - decoder_seek_error(decoder); - break; - } + cmd = decoder_data(decoder, is, buffer, nbytes, + sample_rate / 1000); } return true; -- cgit v1.2.3