aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-11-13 20:57:09 +0100
committerMax Kellermann <max@duempel.org>2013-11-13 20:57:13 +0100
commit4ee147ea34057c0bcef31afed55f98b025b997dc (patch)
tree7077ad343ded2228d2e2dcc6d038515d92201d87
parentf1ca61d7d7fac7a0a93daa244bf86c2ae7ebabd7 (diff)
downloadmpd-4ee147ea34057c0bcef31afed55f98b025b997dc.tar.gz
mpd-4ee147ea34057c0bcef31afed55f98b025b997dc.tar.xz
mpd-4ee147ea34057c0bcef31afed55f98b025b997dc.zip
DecoderAPI: stop decoder on MPD error
This commit adds the basic infrastructure for reporting bugs from DecoderAPI.cxx via DecoderThread.cxx to DecoderControl.
-rw-r--r--src/DecoderAPI.cxx4
-rw-r--r--src/DecoderInternal.hxx7
-rw-r--r--src/DecoderThread.cxx7
3 files changed, 17 insertions, 1 deletions
diff --git a/src/DecoderAPI.cxx b/src/DecoderAPI.cxx
index a59999bb3..7b850265b 100644
--- a/src/DecoderAPI.cxx
+++ b/src/DecoderAPI.cxx
@@ -134,6 +134,10 @@ gcc_pure
static DecoderCommand
decoder_get_virtual_command(Decoder &decoder)
{
+ if (decoder.error.IsDefined())
+ /* an error has occurred: stop the decoder plugin */
+ return DecoderCommand::STOP;
+
const DecoderControl &dc = decoder.dc;
assert(dc.pipe != nullptr);
diff --git a/src/DecoderInternal.hxx b/src/DecoderInternal.hxx
index e98e0aae3..87c6828d4 100644
--- a/src/DecoderInternal.hxx
+++ b/src/DecoderInternal.hxx
@@ -22,6 +22,7 @@
#include "DecoderCommand.hxx"
#include "ReplayGainInfo.hxx"
+#include "util/Error.hxx"
class PcmConvert;
struct DecoderControl;
@@ -87,6 +88,12 @@ struct Decoder {
*/
unsigned replay_gain_serial;
+ /**
+ * An error has occurred (in DecoderAPI.cxx), and the plugin
+ * will be asked to stop.
+ */
+ Error error;
+
Decoder(DecoderControl &_dc, bool _initial_seek_pending, Tag *_tag)
:dc(_dc),
convert(nullptr),
diff --git a/src/DecoderThread.cxx b/src/DecoderThread.cxx
index 4d0bc13b5..2df131d19 100644
--- a/src/DecoderThread.cxx
+++ b/src/DecoderThread.cxx
@@ -360,7 +360,12 @@ decoder_run_song(DecoderControl &dc,
dc.Lock();
- if (ret)
+ if (decoder.error.IsDefined()) {
+ /* copy the Error from sruct Decoder to
+ DecoderControl */
+ dc.state = DecoderState::ERROR;
+ dc.error = std::move(decoder.error);
+ } else if (ret)
dc.state = DecoderState::STOP;
else {
dc.state = DecoderState::ERROR;