aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/PlayerControl.cxx4
-rw-r--r--src/PlayerControl.hxx5
-rw-r--r--src/PlayerThread.cxx19
-rw-r--r--src/queue/PlaylistControl.cxx3
4 files changed, 17 insertions, 14 deletions
diff --git a/src/PlayerControl.cxx b/src/PlayerControl.cxx
index 244b64f5c..4f1c3d2ac 100644
--- a/src/PlayerControl.cxx
+++ b/src/PlayerControl.cxx
@@ -221,7 +221,7 @@ PlayerControl::EnqueueSong(DetachedSong *song)
}
bool
-PlayerControl::Seek(DetachedSong *song, float seek_time)
+PlayerControl::Seek(DetachedSong *song, SongTime t)
{
assert(song != nullptr);
@@ -229,7 +229,7 @@ PlayerControl::Seek(DetachedSong *song, float seek_time)
delete next_song;
next_song = song;
- seek_where = seek_time;
+ seek_time = t;
SynchronousCommand(PlayerCommand::SEEK);
Unlock();
diff --git a/src/PlayerControl.hxx b/src/PlayerControl.hxx
index b60227d23..ac5e6602d 100644
--- a/src/PlayerControl.hxx
+++ b/src/PlayerControl.hxx
@@ -26,6 +26,7 @@
#include "thread/Thread.hxx"
#include "util/Error.hxx"
#include "CrossFade.hxx"
+#include "Chrono.hxx"
#include <stdint.h>
@@ -161,7 +162,7 @@ struct PlayerControl {
*/
DetachedSong *next_song;
- double seek_where;
+ SongTime seek_time;
CrossFadeSettings cross_fade;
@@ -434,7 +435,7 @@ public:
* @return true on success, false on failure (e.g. if MPD isn't
* playing currently)
*/
- bool Seek(DetachedSong *song, float seek_time);
+ bool Seek(DetachedSong *song, SongTime t);
void SetCrossFade(float cross_fade_seconds);
diff --git a/src/PlayerThread.cxx b/src/PlayerThread.cxx
index 00f8007a1..0aa8d105d 100644
--- a/src/PlayerThread.cxx
+++ b/src/PlayerThread.cxx
@@ -293,7 +293,7 @@ Player::StartDecoder(MusicPipe &_pipe)
unsigned start_ms = pc.next_song->GetStartMS();
if (pc.command == PlayerCommand::SEEK)
- start_ms += (unsigned)(pc.seek_where * 1000);
+ start_ms += pc.seek_time.ToMS();
dc.Start(new DetachedSong(*pc.next_song),
start_ms, pc.next_song->GetEndMS(),
@@ -561,19 +561,20 @@ Player::SeekDecoder()
/* send the SEEK command */
- double where = pc.seek_where;
- if (pc.total_time > 0 && where > pc.total_time)
- where = pc.total_time - 0.1;
- if (where < 0.0)
- where = 0.0;
+ SongTime where = pc.seek_time;
+ if (pc.total_time > 0) {
+ const SongTime total_time = SongTime::FromS(pc.total_time);
+ if (where > total_time)
+ where = total_time;
+ }
- if (!dc.Seek(SongTime::FromS(where) + SongTime::FromMS(start_ms))) {
+ if (!dc.Seek(where + SongTime::FromMS(start_ms))) {
/* decoder failure */
player_command_finished(pc);
return false;
}
- elapsed_time = where;
+ elapsed_time = where.ToDoubleS();
player_command_finished(pc);
@@ -923,7 +924,7 @@ Player::Run()
pc.state = PlayerState::PLAY;
if (pc.command == PlayerCommand::SEEK)
- elapsed_time = pc.seek_where;
+ elapsed_time = pc.seek_time.ToDoubleS();
pc.CommandFinished();
diff --git a/src/queue/PlaylistControl.cxx b/src/queue/PlaylistControl.cxx
index db0b8a25d..5d4a910b0 100644
--- a/src/queue/PlaylistControl.cxx
+++ b/src/queue/PlaylistControl.cxx
@@ -215,7 +215,8 @@ playlist::SeekSongPosition(PlayerControl &pc, unsigned song, float seek_time)
queued_song = nullptr;
}
- if (!pc.Seek(new DetachedSong(queue.GetOrder(i)), seek_time)) {
+ if (!pc.Seek(new DetachedSong(queue.GetOrder(i)),
+ SongTime::FromS(seek_time))) {
UpdateQueuedSong(pc, queued_song);
return PlaylistResult::NOT_PLAYING;