From aa7694047bd678bbeb9df734087c4c15c3cc137a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 31 Dec 2015 13:30:35 +0100 Subject: [PATCH] decoder/Thread: pass InputStream errors to DecoderControl::error Give MPD clients access to the error condition. --- NEWS | 1 + src/decoder/DecoderThread.cxx | 30 ++++++++++-------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/NEWS b/NEWS index 2fe023d6c..4d1d146da 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ ver 0.20 (not yet released) are ISO-Latin-1 * decoder - improved error logging + - report I/O errors to clients - ffmpeg: support ReplayGain and MixRamp - ffmpeg: support stream tags - gme: add option "accuracy" diff --git a/src/decoder/DecoderThread.cxx b/src/decoder/DecoderThread.cxx index 175f7a905..3ba7922b0 100644 --- a/src/decoder/DecoderThread.cxx +++ b/src/decoder/DecoderThread.cxx @@ -56,18 +56,12 @@ static constexpr Domain decoder_thread_domain("decoder_thread"); * received, nullptr on error */ static std::unique_ptr -decoder_input_stream_open(DecoderControl &dc, const char *uri) +decoder_input_stream_open(DecoderControl &dc, const char *uri, Error &error) { - Error error; - std::unique_ptr is(InputStream::Open(uri, dc.mutex, dc.cond, error)); - if (is == nullptr) { - if (error.IsDefined()) - LogError(error); - + if (is == nullptr) return nullptr; - } /* wait for the input stream to become ready; its metadata will be available then */ @@ -82,25 +76,19 @@ decoder_input_stream_open(DecoderControl &dc, const char *uri) is->Update(); } - if (!is->Check(error)) { - LogError(error); + if (!is->Check(error)) return nullptr; - } return is; } static std::unique_ptr -decoder_input_stream_open(DecoderControl &dc, Path path) +decoder_input_stream_open(DecoderControl &dc, Path path, Error &error) { - Error error; - std::unique_ptr is(OpenLocalInputStream(path, dc.mutex, dc.cond, error)); - if (is == nullptr) { - LogError(error); + if (is == nullptr) return nullptr; - } assert(is->IsReady()); @@ -264,7 +252,7 @@ decoder_run_stream(Decoder &decoder, const char *uri) DecoderControl &dc = decoder.dc; std::unique_ptr input_stream = - decoder_input_stream_open(dc, uri); + decoder_input_stream_open(dc, uri, decoder.error); if (input_stream == nullptr) return false; @@ -311,9 +299,11 @@ TryDecoderFile(Decoder &decoder, Path path_fs, const char *suffix, return decoder_file_decode(plugin, decoder, path_fs); } else if (plugin.stream_decode != nullptr) { std::unique_ptr input_stream = - decoder_input_stream_open(dc, path_fs); + decoder_input_stream_open(dc, path_fs, decoder.error); if (input_stream == nullptr) - return false; + /* returning true to stop the search for + another decoder plugin */ + return true; const ScopeLock protect(dc.mutex); return decoder_stream_decode(plugin, decoder, *input_stream);