diff options
-rw-r--r-- | src/Partition.hxx | 7 | ||||
-rw-r--r-- | src/command/PlayerCommands.cxx | 14 | ||||
-rw-r--r-- | src/protocol/ArgParser.cxx | 23 | ||||
-rw-r--r-- | src/protocol/ArgParser.hxx | 8 | ||||
-rw-r--r-- | src/queue/Playlist.hxx | 8 | ||||
-rw-r--r-- | src/queue/PlaylistControl.cxx | 20 | ||||
-rw-r--r-- | src/queue/PlaylistState.cxx | 8 |
7 files changed, 62 insertions, 26 deletions
diff --git a/src/Partition.hxx b/src/Partition.hxx index 4341a9ed3..ad0187de0 100644 --- a/src/Partition.hxx +++ b/src/Partition.hxx @@ -25,6 +25,7 @@ #include "mixer/Listener.hxx" #include "PlayerControl.hxx" #include "PlayerListener.hxx" +#include "Chrono.hxx" struct Instance; class MultipleOutputs; @@ -141,15 +142,15 @@ struct Partition final : private PlayerListener, private MixerListener { } PlaylistResult SeekSongPosition(unsigned song_position, - float seek_time) { + SongTime seek_time) { return playlist.SeekSongPosition(pc, song_position, seek_time); } - PlaylistResult SeekSongId(unsigned song_id, float seek_time) { + PlaylistResult SeekSongId(unsigned song_id, SongTime seek_time) { return playlist.SeekSongId(pc, song_id, seek_time); } - PlaylistResult SeekCurrent(float seek_time, bool relative) { + PlaylistResult SeekCurrent(SignedSongTime seek_time, bool relative) { return playlist.SeekCurrent(pc, seek_time, relative); } diff --git a/src/command/PlayerCommands.cxx b/src/command/PlayerCommands.cxx index f167b0edb..7b033368a 100644 --- a/src/command/PlayerCommands.cxx +++ b/src/command/PlayerCommands.cxx @@ -300,11 +300,12 @@ handle_clearerror(gcc_unused Client &client, CommandResult handle_seek(Client &client, gcc_unused unsigned argc, char *argv[]) { - unsigned song, seek_time; + unsigned song; + SongTime seek_time; if (!check_unsigned(client, &song, argv[1])) return CommandResult::ERROR; - if (!check_unsigned(client, &seek_time, argv[2])) + if (!ParseCommandArg(client, seek_time, argv[2])) return CommandResult::ERROR; PlaylistResult result = @@ -315,11 +316,12 @@ handle_seek(Client &client, gcc_unused unsigned argc, char *argv[]) CommandResult handle_seekid(Client &client, gcc_unused unsigned argc, char *argv[]) { - unsigned id, seek_time; + unsigned id; + SongTime seek_time; if (!check_unsigned(client, &id, argv[1])) return CommandResult::ERROR; - if (!check_unsigned(client, &seek_time, argv[2])) + if (!ParseCommandArg(client, seek_time, argv[2])) return CommandResult::ERROR; PlaylistResult result = @@ -332,8 +334,8 @@ handle_seekcur(Client &client, gcc_unused unsigned argc, char *argv[]) { const char *p = argv[1]; bool relative = *p == '+' || *p == '-'; - int seek_time; - if (!check_int(client, &seek_time, p)) + SignedSongTime seek_time; + if (!ParseCommandArg(client, seek_time, p)) return CommandResult::ERROR; PlaylistResult result = diff --git a/src/protocol/ArgParser.cxx b/src/protocol/ArgParser.cxx index d2c40bbd6..709d12962 100644 --- a/src/protocol/ArgParser.cxx +++ b/src/protocol/ArgParser.cxx @@ -20,6 +20,7 @@ #include "config.h" #include "ArgParser.hxx" #include "Result.hxx" +#include "Chrono.hxx" #include <limits> @@ -186,3 +187,25 @@ check_float(Client &client, float *value_r, const char *s) *value_r = value; return true; } + +bool +ParseCommandArg(Client &client, SongTime &value_r, const char *s) +{ + unsigned value; + bool success = check_unsigned(client, &value, s); + if (success) + value_r = SongTime::FromS(value); + + return success; +} + +bool +ParseCommandArg(Client &client, SignedSongTime &value_r, const char *s) +{ + int value; + bool success = check_int(client, &value, s); + if (success) + value_r = SignedSongTime::FromS(value); + + return success; +} diff --git a/src/protocol/ArgParser.hxx b/src/protocol/ArgParser.hxx index f7f9531d0..0f79e7ab2 100644 --- a/src/protocol/ArgParser.hxx +++ b/src/protocol/ArgParser.hxx @@ -25,6 +25,8 @@ #include <stdint.h> class Client; +class SongTime; +class SignedSongTime; bool check_uint32(Client &client, uint32_t *dst, const char *s); @@ -45,4 +47,10 @@ check_bool(Client &client, bool *value_r, const char *s); bool check_float(Client &client, float *value_r, const char *s); +bool +ParseCommandArg(Client &client, SongTime &value_r, const char *s); + +bool +ParseCommandArg(Client &client, SignedSongTime &value_r, const char *s); + #endif diff --git a/src/queue/Playlist.hxx b/src/queue/Playlist.hxx index 0f73a0513..75e861a82 100644 --- a/src/queue/Playlist.hxx +++ b/src/queue/Playlist.hxx @@ -29,6 +29,8 @@ class DetachedSong; class Database; class Error; class SongLoader; +class SongTime; +class SignedSongTime; struct playlist { /** @@ -251,10 +253,10 @@ public: PlaylistResult SeekSongPosition(PlayerControl &pc, unsigned song_position, - float seek_time); + SongTime seek_time); PlaylistResult SeekSongId(PlayerControl &pc, - unsigned song_id, float seek_time); + unsigned song_id, SongTime seek_time); /** * Seek within the current song. Fails if MPD is not currently @@ -265,7 +267,7 @@ public: * current position */ PlaylistResult SeekCurrent(PlayerControl &pc, - float seek_time, bool relative); + SignedSongTime seek_time, bool relative); bool GetRepeat() const { return queue.repeat; diff --git a/src/queue/PlaylistControl.cxx b/src/queue/PlaylistControl.cxx index 5d4a910b0..e33386e41 100644 --- a/src/queue/PlaylistControl.cxx +++ b/src/queue/PlaylistControl.cxx @@ -190,7 +190,8 @@ playlist::PlayPrevious(PlayerControl &pc) } PlaylistResult -playlist::SeekSongPosition(PlayerControl &pc, unsigned song, float seek_time) +playlist::SeekSongPosition(PlayerControl &pc, + unsigned song, SongTime seek_time) { if (!queue.IsValidPosition(song)) return PlaylistResult::BAD_RANGE; @@ -215,8 +216,7 @@ playlist::SeekSongPosition(PlayerControl &pc, unsigned song, float seek_time) queued_song = nullptr; } - if (!pc.Seek(new DetachedSong(queue.GetOrder(i)), - SongTime::FromS(seek_time))) { + if (!pc.Seek(new DetachedSong(queue.GetOrder(i)), seek_time)) { UpdateQueuedSong(pc, queued_song); return PlaylistResult::NOT_PLAYING; @@ -229,7 +229,7 @@ playlist::SeekSongPosition(PlayerControl &pc, unsigned song, float seek_time) } PlaylistResult -playlist::SeekSongId(PlayerControl &pc, unsigned id, float seek_time) +playlist::SeekSongId(PlayerControl &pc, unsigned id, SongTime seek_time) { int song = queue.IdToPosition(id); if (song < 0) @@ -239,7 +239,8 @@ playlist::SeekSongId(PlayerControl &pc, unsigned id, float seek_time) } PlaylistResult -playlist::SeekCurrent(PlayerControl &pc, float seek_time, bool relative) +playlist::SeekCurrent(PlayerControl &pc, + SignedSongTime seek_time, bool relative) { if (!playing) return PlaylistResult::NOT_PLAYING; @@ -251,11 +252,10 @@ playlist::SeekCurrent(PlayerControl &pc, float seek_time, bool relative) status.state != PlayerState::PAUSE) return PlaylistResult::NOT_PLAYING; - seek_time += (int)status.elapsed_time; + seek_time += SignedSongTime::FromS(status.elapsed_time); + if (seek_time.IsNegative()) + seek_time = SignedSongTime::zero(); } - if (seek_time < 0) - seek_time = 0; - - return SeekSongPosition(pc, current, seek_time); + return SeekSongPosition(pc, current, SongTime(seek_time)); } diff --git a/src/queue/PlaylistState.cxx b/src/queue/PlaylistState.cxx index 18d8c9dc5..316a0767f 100644 --- a/src/queue/PlaylistState.cxx +++ b/src/queue/PlaylistState.cxx @@ -132,7 +132,7 @@ playlist_state_restore(const char *line, TextFile &file, struct playlist &playlist, PlayerControl &pc) { int current = -1; - int seek_time = 0; + SongTime seek_time = SongTime::zero(); bool random_mode = false; if (!StringStartsWith(line, PLAYLIST_STATE_FILE_STATE)) @@ -150,8 +150,8 @@ playlist_state_restore(const char *line, TextFile &file, while ((line = file.ReadLine()) != nullptr) { if (StringStartsWith(line, PLAYLIST_STATE_FILE_TIME)) { - seek_time = - atoi(&(line[strlen(PLAYLIST_STATE_FILE_TIME)])); + unsigned seconds = atoi(&(line[strlen(PLAYLIST_STATE_FILE_TIME)])); + seek_time = SongTime::FromS(seconds); } else if (StringStartsWith(line, PLAYLIST_STATE_FILE_REPEAT)) { playlist.SetRepeat(pc, strcmp(&(line[strlen(PLAYLIST_STATE_FILE_REPEAT)]), @@ -209,7 +209,7 @@ playlist_state_restore(const char *line, TextFile &file, if (state == PlayerState::STOP /* && config_option */) playlist.current = current; - else if (seek_time == 0) + else if (seek_time.count() == 0) playlist.PlayPosition(pc, current); else playlist.SeekSongPosition(pc, current, seek_time); |