decoder/Thread: pass InputStream errors to DecoderControl::error

Give MPD clients access to the error condition.
This commit is contained in:
Max Kellermann 2015-12-31 13:30:35 +01:00
parent e2bc63217a
commit aa7694047b
2 changed files with 11 additions and 20 deletions

1
NEWS
View File

@ -15,6 +15,7 @@ ver 0.20 (not yet released)
are ISO-Latin-1 are ISO-Latin-1
* decoder * decoder
- improved error logging - improved error logging
- report I/O errors to clients
- ffmpeg: support ReplayGain and MixRamp - ffmpeg: support ReplayGain and MixRamp
- ffmpeg: support stream tags - ffmpeg: support stream tags
- gme: add option "accuracy" - gme: add option "accuracy"

View File

@ -56,18 +56,12 @@ static constexpr Domain decoder_thread_domain("decoder_thread");
* received, nullptr on error * received, nullptr on error
*/ */
static std::unique_ptr<InputStream> static std::unique_ptr<InputStream>
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<InputStream> is(InputStream::Open(uri, dc.mutex, std::unique_ptr<InputStream> is(InputStream::Open(uri, dc.mutex,
dc.cond, error)); dc.cond, error));
if (is == nullptr) { if (is == nullptr)
if (error.IsDefined())
LogError(error);
return nullptr; return nullptr;
}
/* wait for the input stream to become ready; its metadata /* wait for the input stream to become ready; its metadata
will be available then */ will be available then */
@ -82,25 +76,19 @@ decoder_input_stream_open(DecoderControl &dc, const char *uri)
is->Update(); is->Update();
} }
if (!is->Check(error)) { if (!is->Check(error))
LogError(error);
return nullptr; return nullptr;
}
return is; return is;
} }
static std::unique_ptr<InputStream> static std::unique_ptr<InputStream>
decoder_input_stream_open(DecoderControl &dc, Path path) decoder_input_stream_open(DecoderControl &dc, Path path, Error &error)
{ {
Error error;
std::unique_ptr<InputStream> is(OpenLocalInputStream(path, dc.mutex, std::unique_ptr<InputStream> is(OpenLocalInputStream(path, dc.mutex,
dc.cond, error)); dc.cond, error));
if (is == nullptr) { if (is == nullptr)
LogError(error);
return nullptr; return nullptr;
}
assert(is->IsReady()); assert(is->IsReady());
@ -264,7 +252,7 @@ decoder_run_stream(Decoder &decoder, const char *uri)
DecoderControl &dc = decoder.dc; DecoderControl &dc = decoder.dc;
std::unique_ptr<InputStream> input_stream = std::unique_ptr<InputStream> input_stream =
decoder_input_stream_open(dc, uri); decoder_input_stream_open(dc, uri, decoder.error);
if (input_stream == nullptr) if (input_stream == nullptr)
return false; return false;
@ -311,9 +299,11 @@ TryDecoderFile(Decoder &decoder, Path path_fs, const char *suffix,
return decoder_file_decode(plugin, decoder, path_fs); return decoder_file_decode(plugin, decoder, path_fs);
} else if (plugin.stream_decode != nullptr) { } else if (plugin.stream_decode != nullptr) {
std::unique_ptr<InputStream> input_stream = std::unique_ptr<InputStream> input_stream =
decoder_input_stream_open(dc, path_fs); decoder_input_stream_open(dc, path_fs, decoder.error);
if (input_stream == nullptr) if (input_stream == nullptr)
return false; /* returning true to stop the search for
another decoder plugin */
return true;
const ScopeLock protect(dc.mutex); const ScopeLock protect(dc.mutex);
return decoder_stream_decode(plugin, decoder, *input_stream); return decoder_stream_decode(plugin, decoder, *input_stream);