diff options
author | Max Kellermann <max@duempel.org> | 2010-01-16 19:20:11 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2010-01-16 19:20:11 +0100 |
commit | 90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf (patch) | |
tree | 875b1434df81666531be0013527e33986a5e0a43 /src/decoder | |
parent | 777bd7c1e175740a6ac9eb2f70c449c50e425f41 (diff) | |
download | mpd-90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf.tar.gz mpd-90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf.tar.xz mpd-90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | src/decoder_thread.c | 15 |
1 files changed, 10 insertions, 5 deletions
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) |