aboutsummaryrefslogtreecommitdiffstats
path: root/src/player_thread.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-10-30 16:28:15 +0100
committerMax Kellermann <max@duempel.org>2009-10-30 16:28:15 +0100
commit73cff374fd94a1c16e0201fcda020396c0f41962 (patch)
tree20fd66a68625db58cbad46ecf674dbfeda29c36d /src/player_thread.c
parentcec019efffe4ebb87ec2c630003e6bce5083bb5e (diff)
downloadmpd-73cff374fd94a1c16e0201fcda020396c0f41962.tar.gz
mpd-73cff374fd94a1c16e0201fcda020396c0f41962.tar.xz
mpd-73cff374fd94a1c16e0201fcda020396c0f41962.zip
{player,output}_thread: fixed elapsed_time quirks
Right after seeking and song change, the elapsed_time shows old information, because the output thread didn't finish a full chunk yet. This patch re-adds a second elapsed_time variable, and keeps track of a fallback value, in case the output thread can't provide a reliable value.
Diffstat (limited to 'src/player_thread.c')
-rw-r--r--src/player_thread.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/player_thread.c b/src/player_thread.c
index 9d13e44f9..dbafa168f 100644
--- a/src/player_thread.c
+++ b/src/player_thread.c
@@ -93,6 +93,15 @@ struct player {
* The current audio format for the audio outputs.
*/
struct audio_format play_audio_format;
+
+ /**
+ * The time stamp of the chunk most recently sent to the
+ * output thread. This attribute is only used if
+ * audio_output_all_get_elapsed_time() didn't return a usable
+ * value; the output thread can estimate the elapsed time more
+ * precisly.
+ */
+ float elapsed_time;
};
static struct music_buffer *player_buffer;
@@ -152,6 +161,7 @@ player_wait_for_decoder(struct player *player)
player->song = pc.next_song;
pc.next_song = NULL;
player->queued = false;
+ player->elapsed_time = 0.0;
/* set the "starting" flag, which will be cleared by
player_check_decoder_startup() */
@@ -329,6 +339,8 @@ static bool player_seek_decoder(struct player *player)
return false;
}
+ player->elapsed_time = where;
+
player_command_finished();
player->xfade = XFADE_UNKNOWN;
@@ -419,6 +431,9 @@ static void player_process_command(struct player *player)
audio_output_all_check();
pc.elapsed_time = audio_output_all_get_elapsed_time();
+ if (pc.elapsed_time < 0.0)
+ pc.elapsed_time = player->elapsed_time;
+
player_command_finished();
break;
}
@@ -625,6 +640,7 @@ static void do_play(void)
.xfade = XFADE_UNKNOWN,
.cross_fading = false,
.cross_fade_chunks = 0,
+ .elapsed_time = 0.0,
};
player.pipe = music_pipe_new();