Commit 22899686 authored by Max Kellermann's avatar Max Kellermann

PlayerControl: use SignedSongTime for the song duration

parent ca252804
...@@ -89,7 +89,7 @@ struct player_status { ...@@ -89,7 +89,7 @@ struct player_status {
PlayerState state; PlayerState state;
uint16_t bit_rate; uint16_t bit_rate;
AudioFormat audio_format; AudioFormat audio_format;
float total_time; SignedSongTime total_time;
float elapsed_time; float elapsed_time;
}; };
...@@ -151,7 +151,7 @@ struct PlayerControl { ...@@ -151,7 +151,7 @@ struct PlayerControl {
uint16_t bit_rate; uint16_t bit_rate;
AudioFormat audio_format; AudioFormat audio_format;
float total_time; SignedSongTime total_time;
float elapsed_time; float elapsed_time;
/** /**
......
...@@ -349,7 +349,7 @@ Player::WaitForDecoder() ...@@ -349,7 +349,7 @@ Player::WaitForDecoder()
decoder_starting = true; decoder_starting = true;
/* update PlayerControl's song information */ /* update PlayerControl's song information */
pc.total_time = pc.next_song->GetDuration().ToDoubleS(); pc.total_time = pc.next_song->GetDuration();
pc.bit_rate = 0; pc.bit_rate = 0;
pc.audio_format.Clear(); pc.audio_format.Clear();
...@@ -368,21 +368,21 @@ Player::WaitForDecoder() ...@@ -368,21 +368,21 @@ Player::WaitForDecoder()
* Returns the real duration of the song, comprising the duration * Returns the real duration of the song, comprising the duration
* indicated by the decoder plugin. * indicated by the decoder plugin.
*/ */
static double static SignedSongTime
real_song_duration(const DetachedSong &song, double decoder_duration) real_song_duration(const DetachedSong &song, SignedSongTime decoder_duration)
{ {
if (decoder_duration <= 0.0) if (decoder_duration.IsNegative())
/* the decoder plugin didn't provide information; fall /* the decoder plugin didn't provide information; fall
back to Song::GetDuration() */ back to Song::GetDuration() */
return song.GetDuration().ToDoubleS(); return song.GetDuration();
const SongTime start_time = song.GetStartTime(); const SongTime start_time = song.GetStartTime();
const SongTime end_time = song.GetEndTime(); const SongTime end_time = song.GetEndTime();
if (end_time.IsPositive() && end_time.ToDoubleS() < decoder_duration) if (end_time.IsPositive() && end_time < SongTime(decoder_duration))
return (end_time - start_time).ToDoubleS(); return SignedSongTime(end_time - start_time);
return decoder_duration - start_time.ToDoubleS(); return SignedSongTime(SongTime(decoder_duration) - start_time);
} }
bool bool
...@@ -450,7 +450,7 @@ Player::CheckDecoderStartup() ...@@ -450,7 +450,7 @@ Player::CheckDecoderStartup()
return true; return true;
pc.Lock(); pc.Lock();
pc.total_time = real_song_duration(*dc.song, dc.total_time.ToDoubleS()); pc.total_time = real_song_duration(*dc.song, dc.total_time);
pc.audio_format = dc.in_audio_format; pc.audio_format = dc.in_audio_format;
pc.Unlock(); pc.Unlock();
...@@ -562,8 +562,8 @@ Player::SeekDecoder() ...@@ -562,8 +562,8 @@ Player::SeekDecoder()
/* send the SEEK command */ /* send the SEEK command */
SongTime where = pc.seek_time; SongTime where = pc.seek_time;
if (pc.total_time > 0) { if (!pc.total_time.IsNegative()) {
const SongTime total_time = SongTime::FromS(pc.total_time); const SongTime total_time(pc.total_time);
if (where > total_time) if (where > total_time)
where = total_time; where = total_time;
} }
......
...@@ -176,7 +176,9 @@ handle_status(Client &client, ...@@ -176,7 +176,9 @@ handle_status(Client &client,
"elapsed: %1.3f\n" "elapsed: %1.3f\n"
COMMAND_STATUS_BITRATE ": %u\n", COMMAND_STATUS_BITRATE ": %u\n",
(int)(player_status.elapsed_time + 0.5), (int)(player_status.elapsed_time + 0.5),
(int)(player_status.total_time + 0.5), player_status.total_time.IsNegative()
? 0u
: unsigned(player_status.total_time.RoundS()),
player_status.elapsed_time, player_status.elapsed_time,
player_status.bit_rate); player_status.bit_rate);
......
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