From 448aefaace840ccd8b8c1fb82ff72ef986b84f12 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 8 Oct 2009 22:09:25 +0200 Subject: player_thread: get "elapsed" from audio outputs Tracking the "elapsed" time from the chunks which we have sent to the output pipe is very imprecise: since we have implemented the music pipe, we're sending large number of chunks at once, giving the "elapsed" time stamp a resolution of usually more than a second. This patch changes the source of this information to the outputs. If a chunk has been played by all outputs, the "elapsed" time stamp is updated. The new command PLAYER_COMMAND_REFRESH makes the player thread update its status information: it tells the outputs to update the chunk time stamp. After that, player_control.elapsed_time is current. --- src/player_thread.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/player_thread.c') diff --git a/src/player_thread.c b/src/player_thread.c index 7368b4d4b..6777d5d61 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -151,7 +151,6 @@ player_wait_for_decoder(struct player *player) player->song = pc.next_song; pc.next_song = NULL; - pc.elapsed_time = 0; player->queued = false; /* set the "starting" flag, which will be cleared by @@ -330,7 +329,6 @@ static bool player_seek_decoder(struct player *player) return false; } - pc.elapsed_time = where; player_command_finished(); player->xfade = XFADE_UNKNOWN; @@ -409,6 +407,14 @@ static void player_process_command(struct player *player) player->queued = false; player_command_finished(); break; + + case PLAYER_COMMAND_REFRESH: + if (audio_format_defined(&player->play_audio_format)) + audio_output_all_check(); + + pc.elapsed_time = audio_output_all_get_elapsed_time(); + player_command_finished(); + break; } } @@ -456,7 +462,6 @@ play_chunk(struct song *song, struct music_chunk *chunk, return true; } - pc.elapsed_time = chunk->times; pc.bit_rate = chunk->bit_rate; /* send the chunk to the audio outputs */ @@ -630,7 +635,6 @@ static void do_play(void) return; } - pc.elapsed_time = 0; pc.state = PLAYER_STATE_PLAY; player_command_finished(); @@ -813,6 +817,11 @@ static gpointer player_task(G_GNUC_UNUSED gpointer arg) player_command_finished(); break; + case PLAYER_COMMAND_REFRESH: + /* no-op when not playing */ + player_command_finished(); + break; + case PLAYER_COMMAND_NONE: notify_wait(&pc.notify); break; -- cgit v1.2.3