decoder/Thread: pass InputStream errors to DecoderControl::error
Give MPD clients access to the error condition.
This commit is contained in:
parent
e2bc63217a
commit
aa7694047b
1
NEWS
1
NEWS
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue