PlayerControl: use SignedSongTime for the song duration
This commit is contained in:
parent
ca252804c6
commit
2289968634
@ -89,7 +89,7 @@ struct player_status {
|
||||
PlayerState state;
|
||||
uint16_t bit_rate;
|
||||
AudioFormat audio_format;
|
||||
float total_time;
|
||||
SignedSongTime total_time;
|
||||
float elapsed_time;
|
||||
};
|
||||
|
||||
@ -151,7 +151,7 @@ struct PlayerControl {
|
||||
|
||||
uint16_t bit_rate;
|
||||
AudioFormat audio_format;
|
||||
float total_time;
|
||||
SignedSongTime total_time;
|
||||
float elapsed_time;
|
||||
|
||||
/**
|
||||
|
@ -349,7 +349,7 @@ Player::WaitForDecoder()
|
||||
decoder_starting = true;
|
||||
|
||||
/* 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.audio_format.Clear();
|
||||
|
||||
@ -368,21 +368,21 @@ Player::WaitForDecoder()
|
||||
* Returns the real duration of the song, comprising the duration
|
||||
* indicated by the decoder plugin.
|
||||
*/
|
||||
static double
|
||||
real_song_duration(const DetachedSong &song, double decoder_duration)
|
||||
static SignedSongTime
|
||||
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
|
||||
back to Song::GetDuration() */
|
||||
return song.GetDuration().ToDoubleS();
|
||||
return song.GetDuration();
|
||||
|
||||
const SongTime start_time = song.GetStartTime();
|
||||
const SongTime end_time = song.GetEndTime();
|
||||
|
||||
if (end_time.IsPositive() && end_time.ToDoubleS() < decoder_duration)
|
||||
return (end_time - start_time).ToDoubleS();
|
||||
if (end_time.IsPositive() && end_time < SongTime(decoder_duration))
|
||||
return SignedSongTime(end_time - start_time);
|
||||
|
||||
return decoder_duration - start_time.ToDoubleS();
|
||||
return SignedSongTime(SongTime(decoder_duration) - start_time);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -450,7 +450,7 @@ Player::CheckDecoderStartup()
|
||||
return true;
|
||||
|
||||
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.Unlock();
|
||||
|
||||
@ -562,8 +562,8 @@ Player::SeekDecoder()
|
||||
/* send the SEEK command */
|
||||
|
||||
SongTime where = pc.seek_time;
|
||||
if (pc.total_time > 0) {
|
||||
const SongTime total_time = SongTime::FromS(pc.total_time);
|
||||
if (!pc.total_time.IsNegative()) {
|
||||
const SongTime total_time(pc.total_time);
|
||||
if (where > total_time)
|
||||
where = total_time;
|
||||
}
|
||||
|
@ -176,7 +176,9 @@ handle_status(Client &client,
|
||||
"elapsed: %1.3f\n"
|
||||
COMMAND_STATUS_BITRATE ": %u\n",
|
||||
(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.bit_rate);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user