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;
|
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 {
|
|||||||
|
|
||||||
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()
|
|||||||
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()
|
|||||||
* 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()
|
|||||||
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()
|
|||||||
/* 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,
|
|||||||
"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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user