decoder/Control: Seek() returns Error information

This commit is contained in:
Max Kellermann 2015-11-11 17:20:27 +01:00
parent 5e93c05095
commit faca8bc02a
3 changed files with 18 additions and 5 deletions

View File

@ -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

View File

@ -365,7 +365,7 @@ public:
void Stop();
bool Seek(SongTime t);
bool Seek(SongTime t, Error &error_r);
void Quit();

View File

@ -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;
}