diff options
author | Max Kellermann <max@duempel.org> | 2009-11-11 08:55:55 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-11-11 08:55:55 +0100 |
commit | dca4d9cf83849877206379a20a1e478ed1b5dc55 (patch) | |
tree | 11e6364f1f80dee1ca5d17580dff38360d52b3c7 | |
parent | 68f77e4163db78bbc3740555591b95aad824d82c (diff) | |
download | mpd-dca4d9cf83849877206379a20a1e478ed1b5dc55.tar.gz mpd-dca4d9cf83849877206379a20a1e478ed1b5dc55.tar.xz mpd-dca4d9cf83849877206379a20a1e478ed1b5dc55.zip |
decoder/flac: fixed CUE seeking range check
If flac_container_decode() gets a seek destination which is out of
range, it ignores the SEEK command (never finishes it). This leads to
MPD lockup, because the player thread waits for completion.
Diffstat (limited to '')
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/decoder/flac_plugin.c | 22 |
2 files changed, 9 insertions, 14 deletions
@@ -7,6 +7,7 @@ ver 0.15.6 (2009/??/??) * decoders: - ffmpeg: convert metadata - oggflac: rewind stream after FLAC detection + - flac: fixed CUE seeking range check * output_thread: check again if output is open on PAUSE * update: delete ignored symlinks from database * database: increased maximum line length to 32 kB diff --git a/src/decoder/flac_plugin.c b/src/decoder/flac_plugin.c index 1d5d48d09..0c0d994b7 100644 --- a/src/decoder/flac_plugin.c +++ b/src/decoder/flac_plugin.c @@ -629,21 +629,15 @@ flac_container_decode(struct decoder* decoder, FLAC__uint64 seek_sample = t_start + (decoder_seek_where(decoder) * data.audio_format.sample_rate); - //if (seek_sample >= t_start && seek_sample <= t_end && data.total_time > 30) - if (seek_sample >= t_start && seek_sample <= t_end) - { - if (flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) - { - data.time = (float)(seek_sample - t_start) / - data.audio_format.sample_rate; - data.position = 0; + if (seek_sample >= t_start && seek_sample <= t_end && + flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) { + data.time = (float)(seek_sample - t_start) / + data.audio_format.sample_rate; + data.position = 0; - decoder_command_finished(decoder); - } - else - decoder_seek_error(decoder); - //decoder_command_finished(decoder); - } + decoder_command_finished(decoder); + } else + decoder_seek_error(decoder); } else if (flac_get_state(flac_dec) == flac_decoder_eof) break; |