aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-01-16 19:20:11 +0100
committerMax Kellermann <max@duempel.org>2010-01-16 19:20:11 +0100
commit90d16af66adfe1ef9d3fc07fe7b238f3c02adaaf (patch)
tree875b1434df81666531be0013527e33986a5e0a43 /src
parent777bd7c1e175740a6ac9eb2f70c449c50e425f41 (diff)
downloadmpd-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 'src')
-rw-r--r--src/decoder_thread.c15
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)