aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-11-11 08:55:55 +0100
committerMax Kellermann <max@duempel.org>2009-11-11 08:55:55 +0100
commitdca4d9cf83849877206379a20a1e478ed1b5dc55 (patch)
tree11e6364f1f80dee1ca5d17580dff38360d52b3c7
parent68f77e4163db78bbc3740555591b95aad824d82c (diff)
downloadmpd-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.
-rw-r--r--NEWS1
-rw-r--r--src/decoder/flac_plugin.c22
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;