From faca8bc02a67ed06e60a4d827d5d7bb69027b4f3 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 11 Nov 2015 17:20:27 +0100 Subject: decoder/Control: Seek() returns Error information --- src/decoder/DecoderControl.cxx | 17 ++++++++++++++--- src/decoder/DecoderControl.hxx | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'src/decoder') diff --git a/src/decoder/DecoderControl.cxx b/src/decoder/DecoderControl.cxx index c41165d1e..fc3ab7ad8 100644 --- a/src/decoder/DecoderControl.cxx +++ b/src/decoder/DecoderControl.cxx @@ -19,6 +19,7 @@ #include "config.h" #include "DecoderControl.hxx" +#include "DecoderError.hxx" #include "MusicPipe.hxx" #include "DetachedSong.hxx" @@ -105,7 +106,7 @@ DecoderControl::Stop() } bool -DecoderControl::Seek(SongTime t) +DecoderControl::Seek(SongTime t, Error &error_r) { assert(state != DecoderState::START); assert(state != DecoderState::ERROR); @@ -116,20 +117,30 @@ DecoderControl::Seek(SongTime t) gcc_unreachable(); case DecoderState::STOP: + /* TODO: if this happens, the caller should be given a + chance to restart the decoder */ + error_r.Set(decoder_domain, "Decoder is dead"); return false; case DecoderState::DECODE: break; } - if (!seekable) + if (!seekable) { + error_r.Set(decoder_domain, "Not seekable"); return false; + } seek_time = t; seek_error = false; LockSynchronousCommand(DecoderCommand::SEEK); - return !seek_error; + if (seek_error) { + error_r.Set(decoder_domain, "Decoder failed to seek"); + return false; + } + + return true; } void diff --git a/src/decoder/DecoderControl.hxx b/src/decoder/DecoderControl.hxx index a8e675bba..4147f5acc 100644 --- a/src/decoder/DecoderControl.hxx +++ b/src/decoder/DecoderControl.hxx @@ -365,7 +365,7 @@ public: void Stop(); - bool Seek(SongTime t); + bool Seek(SongTime t, Error &error_r); void Quit(); -- cgit v1.2.3