diff options
author | Max Kellermann <max@duempel.org> | 2008-08-26 08:27:16 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-08-26 08:27:16 +0200 |
commit | 6df980a996192fc459a0b60b73fa7a33a24a2f49 (patch) | |
tree | 6d56dd5e3fe17c33e10c46832a1cec91733b8875 | |
parent | 8a5109483dc2d705cf927ab107f2b4a8e8008415 (diff) | |
download | mpd-6df980a996192fc459a0b60b73fa7a33a24a2f49.tar.gz mpd-6df980a996192fc459a0b60b73fa7a33a24a2f49.tar.xz mpd-6df980a996192fc459a0b60b73fa7a33a24a2f49.zip |
flac: decoder command means EOF
It was possible for the decoder thread to go into an endless loop
(flac and oggflac decoders): when a "STOP" command arrived, the Read()
callback would return 0, but the EOF() callback returned false. Fix:
when decoder_get_command()!=NONE, return EOF==true.
-rw-r--r-- | src/inputPlugins/flac_plugin.c | 14 | ||||
-rw-r--r-- | src/inputPlugins/oggflac_plugin.c | 6 |
2 files changed, 9 insertions, 11 deletions
diff --git a/src/inputPlugins/flac_plugin.c b/src/inputPlugins/flac_plugin.c index c90ff21ca..4d9f8e8d4 100644 --- a/src/inputPlugins/flac_plugin.c +++ b/src/inputPlugins/flac_plugin.c @@ -36,16 +36,14 @@ static flac_read_status flacRead(mpd_unused const flac_decoder * flacDec, r = decoder_read(data->decoder, data->inStream, (void *)buf, *bytes); *bytes = r; - if (r == 0 && decoder_get_command(data->decoder) == DECODE_COMMAND_NONE) { - if (inputStreamAtEOF(data->inStream)) + if (r == 0) { + if (decoder_get_command(data->decoder) != DECODE_COMMAND_NONE || + inputStreamAtEOF(data->inStream)) return flac_read_status_eof; else return flac_read_status_abort; } - if (r == 0 && decoder_get_command(data->decoder) == DECODE_COMMAND_SEEK) - return flac_read_status_eof; - return flac_read_status_continue; } @@ -88,9 +86,9 @@ static FLAC__bool flacEOF(mpd_unused const flac_decoder * flacDec, void *fdata) { FlacData *data = (FlacData *) fdata; - if (inputStreamAtEOF(data->inStream) == 1) - return true; - return false; + return (decoder_get_command(data->decoder) != DECODE_COMMAND_NONE && + decoder_get_command(data->decoder) != DECODE_COMMAND_SEEK) || + inputStreamAtEOF(data->inStream); } static void flacError(mpd_unused const flac_decoder *dec, diff --git a/src/inputPlugins/oggflac_plugin.c b/src/inputPlugins/oggflac_plugin.c index 2adbaed60..e0527f7b7 100644 --- a/src/inputPlugins/oggflac_plugin.c +++ b/src/inputPlugins/oggflac_plugin.c @@ -104,9 +104,9 @@ static FLAC__bool of_EOF_cb(const OggFLAC__SeekableStreamDecoder * decoder, { FlacData *data = (FlacData *) fdata; - if (inputStreamAtEOF(data->inStream) == 1) - return true; - return false; + return (decoder_get_command(data->decoder) != DECODE_COMMAND_NONE && + decoder_get_command(data->decoder) != DECODE_COMMAND_SEEK) || + inputStreamAtEOF(data->inStream); } static void of_error_cb(const OggFLAC__SeekableStreamDecoder * decoder, |