player/Control: use class Error as C++ exception, throw it
This commit is contained in:
@@ -151,8 +151,8 @@ playlist::UpdateQueuedSong(PlayerControl &pc, const DetachedSong *prev)
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::PlayOrder(PlayerControl &pc, unsigned order, Error &error)
|
||||
void
|
||||
playlist::PlayOrder(PlayerControl &pc, unsigned order)
|
||||
{
|
||||
playing = true;
|
||||
queued = -1;
|
||||
@@ -163,12 +163,9 @@ playlist::PlayOrder(PlayerControl &pc, unsigned order, Error &error)
|
||||
|
||||
current = order;
|
||||
|
||||
if (!pc.Play(new DetachedSong(song), error))
|
||||
return false;
|
||||
pc.Play(new DetachedSong(song));
|
||||
|
||||
SongStarted();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -227,8 +224,11 @@ playlist::ResumePlayback(PlayerControl &pc)
|
||||
Stop(pc);
|
||||
else
|
||||
/* continue playback at the next song */
|
||||
/* TODO: log error? */
|
||||
PlayNext(pc, IgnoreError());
|
||||
try {
|
||||
PlayNext(pc);
|
||||
} catch (...) {
|
||||
/* TODO: log error? */
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -275,41 +275,63 @@ public:
|
||||
|
||||
void Stop(PlayerControl &pc);
|
||||
|
||||
bool PlayPosition(PlayerControl &pc, int position, Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void PlayPosition(PlayerControl &pc, int position);
|
||||
|
||||
bool PlayOrder(PlayerControl &pc, unsigned order, Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void PlayOrder(PlayerControl &pc, unsigned order);
|
||||
|
||||
bool PlayId(PlayerControl &pc, int id, Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void PlayId(PlayerControl &pc, int id);
|
||||
|
||||
bool PlayNext(PlayerControl &pc, Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void PlayNext(PlayerControl &pc);
|
||||
|
||||
bool PlayPrevious(PlayerControl &pc, Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void PlayPrevious(PlayerControl &pc);
|
||||
|
||||
bool SeekSongOrder(PlayerControl &pc,
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void SeekSongOrder(PlayerControl &pc,
|
||||
unsigned song_order,
|
||||
SongTime seek_time,
|
||||
Error &error);
|
||||
SongTime seek_time);
|
||||
|
||||
bool SeekSongPosition(PlayerControl &pc,
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void SeekSongPosition(PlayerControl &pc,
|
||||
unsigned sonag_position,
|
||||
SongTime seek_time,
|
||||
Error &error);
|
||||
SongTime seek_time);
|
||||
|
||||
bool SeekSongId(PlayerControl &pc,
|
||||
unsigned song_id, SongTime seek_time,
|
||||
Error &error);
|
||||
/**
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*/
|
||||
void SeekSongId(PlayerControl &pc,
|
||||
unsigned song_id, SongTime seek_time);
|
||||
|
||||
/**
|
||||
* Seek within the current song. Fails if MPD is not currently
|
||||
* playing.
|
||||
*
|
||||
* Throws std::runtime_error or #Error on error.
|
||||
*
|
||||
* @param seek_time the time
|
||||
* @param relative if true, then the specified time is relative to the
|
||||
* current position
|
||||
*/
|
||||
bool SeekCurrent(PlayerControl &pc,
|
||||
SignedSongTime seek_time, bool relative,
|
||||
Error &error);
|
||||
void SeekCurrent(PlayerControl &pc,
|
||||
SignedSongTime seek_time, bool relative);
|
||||
|
||||
bool GetRepeat() const {
|
||||
return queue.repeat;
|
||||
|
@@ -56,8 +56,8 @@ playlist::Stop(PlayerControl &pc)
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::PlayPosition(PlayerControl &pc, int song, Error &error)
|
||||
void
|
||||
playlist::PlayPosition(PlayerControl &pc, int song)
|
||||
{
|
||||
pc.LockClearError();
|
||||
|
||||
@@ -66,13 +66,13 @@ playlist::PlayPosition(PlayerControl &pc, int song, Error &error)
|
||||
/* play any song ("current" song, or the first song */
|
||||
|
||||
if (queue.IsEmpty())
|
||||
return true;
|
||||
return;
|
||||
|
||||
if (playing) {
|
||||
/* already playing: unpause playback, just in
|
||||
case it was paused, and return */
|
||||
pc.LockSetPause(false);
|
||||
return true;
|
||||
return;
|
||||
}
|
||||
|
||||
/* select a song: "current" song, or the first one */
|
||||
@@ -102,24 +102,26 @@ playlist::PlayPosition(PlayerControl &pc, int song, Error &error)
|
||||
stop_on_error = false;
|
||||
error_count = 0;
|
||||
|
||||
return PlayOrder(pc, i, error);
|
||||
PlayOrder(pc, i);
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::PlayId(PlayerControl &pc, int id, Error &error)
|
||||
void
|
||||
playlist::PlayId(PlayerControl &pc, int id)
|
||||
{
|
||||
if (id == -1)
|
||||
return PlayPosition(pc, id, error);
|
||||
if (id == -1) {
|
||||
PlayPosition(pc, id);
|
||||
return;
|
||||
}
|
||||
|
||||
int song = queue.IdToPosition(id);
|
||||
if (song < 0)
|
||||
throw PlaylistError::NoSuchSong();
|
||||
|
||||
return PlayPosition(pc, song, error);
|
||||
PlayPosition(pc, song);
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::PlayNext(PlayerControl &pc, Error &error)
|
||||
void
|
||||
playlist::PlayNext(PlayerControl &pc)
|
||||
{
|
||||
if (!playing)
|
||||
throw PlaylistError::NotPlaying();
|
||||
@@ -156,19 +158,16 @@ playlist::PlayNext(PlayerControl &pc, Error &error)
|
||||
discard them anyway */
|
||||
}
|
||||
|
||||
if (!PlayOrder(pc, next_order, error))
|
||||
return false;
|
||||
PlayOrder(pc, next_order);
|
||||
}
|
||||
|
||||
/* Consume mode removes each played songs. */
|
||||
if (queue.consume)
|
||||
DeleteOrder(pc, old_current);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::PlayPrevious(PlayerControl &pc, Error &error)
|
||||
void
|
||||
playlist::PlayPrevious(PlayerControl &pc)
|
||||
{
|
||||
if (!playing)
|
||||
throw PlaylistError::NotPlaying();
|
||||
@@ -188,12 +187,11 @@ playlist::PlayPrevious(PlayerControl &pc, Error &error)
|
||||
order = current;
|
||||
}
|
||||
|
||||
return PlayOrder(pc, order, error);
|
||||
PlayOrder(pc, order);
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::SeekSongOrder(PlayerControl &pc, unsigned i, SongTime seek_time,
|
||||
Error &error)
|
||||
void
|
||||
playlist::SeekSongOrder(PlayerControl &pc, unsigned i, SongTime seek_time)
|
||||
{
|
||||
assert(queue.IsValidOrder(i));
|
||||
|
||||
@@ -215,20 +213,19 @@ playlist::SeekSongOrder(PlayerControl &pc, unsigned i, SongTime seek_time,
|
||||
|
||||
queued = -1;
|
||||
|
||||
if (!pc.LockSeek(new DetachedSong(queue.GetOrder(i)), seek_time, error)) {
|
||||
try {
|
||||
pc.LockSeek(new DetachedSong(queue.GetOrder(i)), seek_time);
|
||||
} catch (...) {
|
||||
UpdateQueuedSong(pc, queued_song);
|
||||
return false;
|
||||
throw;
|
||||
}
|
||||
|
||||
UpdateQueuedSong(pc, nullptr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
playlist::SeekSongPosition(PlayerControl &pc, unsigned song,
|
||||
SongTime seek_time,
|
||||
Error &error)
|
||||
SongTime seek_time)
|
||||
{
|
||||
if (!queue.IsValidPosition(song))
|
||||
throw PlaylistError::BadRange();
|
||||
@@ -237,24 +234,22 @@ playlist::SeekSongPosition(PlayerControl &pc, unsigned song,
|
||||
? queue.PositionToOrder(song)
|
||||
: song;
|
||||
|
||||
return SeekSongOrder(pc, i, seek_time, error);
|
||||
SeekSongOrder(pc, i, seek_time);
|
||||
}
|
||||
|
||||
bool
|
||||
playlist::SeekSongId(PlayerControl &pc, unsigned id, SongTime seek_time,
|
||||
Error &error)
|
||||
void
|
||||
playlist::SeekSongId(PlayerControl &pc, unsigned id, SongTime seek_time)
|
||||
{
|
||||
int song = queue.IdToPosition(id);
|
||||
if (song < 0)
|
||||
throw PlaylistError::NoSuchSong();
|
||||
|
||||
return SeekSongPosition(pc, song, seek_time, error);
|
||||
SeekSongPosition(pc, song, seek_time);
|
||||
}
|
||||
|
||||
bool
|
||||
void
|
||||
playlist::SeekCurrent(PlayerControl &pc,
|
||||
SignedSongTime seek_time, bool relative,
|
||||
Error &error)
|
||||
SignedSongTime seek_time, bool relative)
|
||||
{
|
||||
if (!playing)
|
||||
throw PlaylistError::NotPlaying();
|
||||
@@ -274,5 +269,5 @@ playlist::SeekCurrent(PlayerControl &pc,
|
||||
if (seek_time.IsNegative())
|
||||
seek_time = SignedSongTime::zero();
|
||||
|
||||
return SeekSongOrder(pc, current, SongTime(seek_time), error);
|
||||
SeekSongOrder(pc, current, SongTime(seek_time));
|
||||
}
|
||||
|
@@ -238,8 +238,11 @@ playlist::DeleteInternal(PlayerControl &pc,
|
||||
|
||||
if (current >= 0 && !paused)
|
||||
/* play the song after the deleted one */
|
||||
/* TODO: log error? */
|
||||
PlayOrder(pc, current, IgnoreError());
|
||||
try {
|
||||
PlayOrder(pc, current);
|
||||
} catch (...) {
|
||||
/* TODO: log error? */
|
||||
}
|
||||
else {
|
||||
/* stop the player */
|
||||
|
||||
|
@@ -195,12 +195,20 @@ playlist_state_restore(const char *line, TextFile &file,
|
||||
|
||||
if (state == PlayerState::STOP /* && config_option */)
|
||||
playlist.current = current;
|
||||
else if (seek_time.count() == 0)
|
||||
/* TODO: log error? */
|
||||
playlist.PlayPosition(pc, current, IgnoreError());
|
||||
else
|
||||
playlist.SeekSongPosition(pc, current, seek_time,
|
||||
IgnoreError());
|
||||
else if (seek_time.count() == 0) {
|
||||
try {
|
||||
playlist.PlayPosition(pc, current);
|
||||
} catch (...) {
|
||||
/* TODO: log error? */
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
playlist.SeekSongPosition(pc, current,
|
||||
seek_time);
|
||||
} catch (...) {
|
||||
/* TODO: log error? */
|
||||
}
|
||||
}
|
||||
|
||||
if (state == PlayerState::PAUSE)
|
||||
pc.LockPause();
|
||||
|
Reference in New Issue
Block a user