Commit 73cff374 authored by Max Kellermann's avatar Max Kellermann

{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.
parent cec019ef
...@@ -55,7 +55,7 @@ static struct music_pipe *g_mp; ...@@ -55,7 +55,7 @@ static struct music_pipe *g_mp;
/** /**
* The "elapsed_time" stamp of the most recently finished chunk. * The "elapsed_time" stamp of the most recently finished chunk.
*/ */
static float audio_output_all_elapsed_time; static float audio_output_all_elapsed_time = -1.0;
unsigned int audio_output_count(void) unsigned int audio_output_count(void)
{ {
...@@ -482,6 +482,8 @@ audio_output_all_cancel(void) ...@@ -482,6 +482,8 @@ audio_output_all_cancel(void)
if (g_mp != NULL) if (g_mp != NULL)
music_pipe_clear(g_mp, g_music_buffer); music_pipe_clear(g_mp, g_music_buffer);
audio_output_all_elapsed_time = -1.0;
} }
void void
...@@ -498,12 +500,13 @@ audio_output_all_close(void) ...@@ -498,12 +500,13 @@ audio_output_all_close(void)
music_pipe_clear(g_mp, g_music_buffer); music_pipe_clear(g_mp, g_music_buffer);
music_pipe_free(g_mp); music_pipe_free(g_mp);
g_mp = NULL; g_mp = NULL;
audio_output_all_elapsed_time = 0.0;
} }
g_music_buffer = NULL; g_music_buffer = NULL;
audio_format_clear(&input_audio_format); audio_format_clear(&input_audio_format);
audio_output_all_elapsed_time = -1.0;
} }
float float
......
...@@ -137,7 +137,8 @@ audio_output_all_cancel(void); ...@@ -137,7 +137,8 @@ audio_output_all_cancel(void);
/** /**
* Returns the "elapsed_time" stamp of the most recently finished * Returns the "elapsed_time" stamp of the most recently finished
* chunk. * chunk. A negative value is returned when no chunk has been
* finished yet.
*/ */
float float
audio_output_all_get_elapsed_time(void); audio_output_all_get_elapsed_time(void);
......
...@@ -93,6 +93,15 @@ struct player { ...@@ -93,6 +93,15 @@ struct player {
* The current audio format for the audio outputs. * The current audio format for the audio outputs.
*/ */
struct audio_format play_audio_format; 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; static struct music_buffer *player_buffer;
...@@ -152,6 +161,7 @@ player_wait_for_decoder(struct player *player) ...@@ -152,6 +161,7 @@ player_wait_for_decoder(struct player *player)
player->song = pc.next_song; player->song = pc.next_song;
pc.next_song = NULL; pc.next_song = NULL;
player->queued = false; player->queued = false;
player->elapsed_time = 0.0;
/* set the "starting" flag, which will be cleared by /* set the "starting" flag, which will be cleared by
player_check_decoder_startup() */ player_check_decoder_startup() */
...@@ -329,6 +339,8 @@ static bool player_seek_decoder(struct player *player) ...@@ -329,6 +339,8 @@ static bool player_seek_decoder(struct player *player)
return false; return false;
} }
player->elapsed_time = where;
player_command_finished(); player_command_finished();
player->xfade = XFADE_UNKNOWN; player->xfade = XFADE_UNKNOWN;
...@@ -419,6 +431,9 @@ static void player_process_command(struct player *player) ...@@ -419,6 +431,9 @@ static void player_process_command(struct player *player)
audio_output_all_check(); audio_output_all_check();
pc.elapsed_time = audio_output_all_get_elapsed_time(); pc.elapsed_time = audio_output_all_get_elapsed_time();
if (pc.elapsed_time < 0.0)
pc.elapsed_time = player->elapsed_time;
player_command_finished(); player_command_finished();
break; break;
} }
...@@ -625,6 +640,7 @@ static void do_play(void) ...@@ -625,6 +640,7 @@ static void do_play(void)
.xfade = XFADE_UNKNOWN, .xfade = XFADE_UNKNOWN,
.cross_fading = false, .cross_fading = false,
.cross_fade_chunks = 0, .cross_fade_chunks = 0,
.elapsed_time = 0.0,
}; };
player.pipe = music_pipe_new(); player.pipe = music_pipe_new();
......
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