Commit faca8bc0 authored by Max Kellermann's avatar Max Kellermann

decoder/Control: Seek() returns Error information

parent 5e93c050
......@@ -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
......
......@@ -365,7 +365,7 @@ public:
void Stop();
bool Seek(SongTime t);
bool Seek(SongTime t, Error &error_r);
void Quit();
......
......@@ -605,8 +605,10 @@ Player::SeekDecoder()
where = total_time;
}
if (!dc.Seek(where + start_time)) {
Error error;
if (!dc.Seek(where + start_time, error)) {
/* decoder failure */
pc.SetError(PlayerError::DECODER, std::move(error));
pc.LockCommandFinished();
return false;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment