From dca4d9cf83849877206379a20a1e478ed1b5dc55 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 11 Nov 2009 08:55:55 +0100 Subject: 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. --- NEWS | 1 + src/decoder/flac_plugin.c | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index c04241c34..f1bdfeb1d 100644 --- a/NEWS +++ b/NEWS @@ -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; -- cgit v1.2.3