From 90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 16 Jan 2010 19:20:11 +0100 Subject: decoder_thread: fix CUE track playback The patch "input/file: don't fall back to parent directory" introduced a regression: when trying to play a CUE track, decoder_run_song() tries to open the file as a stream first, but this fails, because the path is virtual. This patch fixes decoder_run_song() (instead of reverting the previous patch) to accept input_stream_open() failures if the song is a local file. It passes the responsibility to handle non-existing files to the decoder's file_decode() method. --- src/decoder_thread.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/decoder_thread.c b/src/decoder_thread.c index d6ff058ec..cbb670616 100644 --- a/src/decoder_thread.c +++ b/src/decoder_thread.c @@ -89,7 +89,8 @@ static void decoder_run_song(const struct song *song, const char *uri) struct input_stream input_stream; const struct decoder_plugin *plugin; - if (!input_stream_open(&input_stream, uri)) { + close_instream = input_stream_open(&input_stream, uri); + if (!close_instream && !song_is_file(song)) { dc.state = DECODE_STATE_ERROR; return; } @@ -108,7 +109,7 @@ static void decoder_run_song(const struct song *song, const char *uri) /* wait for the input stream to become ready; its metadata will be available then */ - while (!input_stream.ready) { + while (close_instream && !input_stream.ready) { if (dc.command == DECODE_COMMAND_STOP) { input_stream_close(&input_stream); dc.state = DECODE_STATE_STOP; @@ -124,7 +125,8 @@ static void decoder_run_song(const struct song *song, const char *uri) } if (dc.command == DECODE_COMMAND_STOP) { - input_stream_close(&input_stream); + if (close_instream) + input_stream_close(&input_stream); dc.state = DECODE_STATE_STOP; return; } @@ -179,8 +181,11 @@ static void decoder_run_song(const struct song *song, const char *uri) const char *s = uri_get_suffix(uri); while ((plugin = decoder_plugin_from_suffix(s, next++))) { if (plugin->file_decode != NULL) { - input_stream_close(&input_stream); - close_instream = false; + if (close_instream) { + input_stream_close(&input_stream); + close_instream = false; + } + ret = decoder_file_decode(plugin, &decoder, uri); if (ret) -- cgit v1.2.3