From 63b33b6ec584a6730174c45a119a27b4add76777 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 6 Oct 2011 20:55:52 +0200 Subject: player_thread: move code to player_open_output() Common function that manages "player" attributes after audio_output_all_open() has returned. --- src/player_thread.c | 59 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/player_thread.c b/src/player_thread.c index 31bb3d50d..9a7c917f4 100644 --- a/src/player_thread.c +++ b/src/player_thread.c @@ -276,6 +276,41 @@ real_song_duration(const struct song *song, double decoder_duration) return decoder_duration - song->start_ms / 1000.0; } +/** + * Wrapper for audio_output_all_open(). Upon failure, it pauses the + * player. + * + * @return true on success + */ +static bool +player_open_output(struct player *player) +{ + assert(audio_format_defined(&player->play_audio_format)); + assert(pc.state == PLAYER_STATE_PLAY || + pc.state == PLAYER_STATE_PAUSE); + + if (audio_output_all_open(&player->play_audio_format, player_buffer)) { + player->paused = false; + + player_lock(); + pc.state = PLAYER_STATE_PLAY; + player_unlock(); + + return true; + } else { + /* pause: the user may resume playback as soon as an + audio output becomes available */ + player->paused = true; + + player_lock(); + pc.error = PLAYER_ERROR_AUDIO; + pc.state = PLAYER_STATE_PAUSE; + player_unlock(); + + return false; + } +} + /** * The decoder has acknowledged the "START" command (see * player_wait_for_decoder()). This function checks if the decoder @@ -321,23 +356,12 @@ player_check_decoder_startup(struct player *player) player->play_audio_format = dc->out_audio_format; player->decoder_starting = false; - if (!player->paused && - !audio_output_all_open(&dc->out_audio_format, - player_buffer)) { + if (!player->paused && !player_open_output(player)) { char *uri = song_get_uri(dc->song); g_warning("problems opening audio device " "while playing \"%s\"", uri); g_free(uri); - player_lock(); - pc.error = PLAYER_ERROR_AUDIO; - - /* pause: the user may resume playback as soon - as an audio output becomes available */ - pc.state = PLAYER_STATE_PAUSE; - player_unlock(); - - player->paused = true; return true; } @@ -516,18 +540,9 @@ static void player_process_command(struct player *player) yet - don't open the audio device yet */ player_lock(); - pc.state = PLAYER_STATE_PLAY; - } else if (audio_output_all_open(&player->play_audio_format, player_buffer)) { - /* unpaused, continue playing */ - player_lock(); - pc.state = PLAYER_STATE_PLAY; } else { - /* the audio device has failed - rollback to - pause mode */ - pc.error = PLAYER_ERROR_AUDIO; - - player->paused = true; + player_open_output(player); player_lock(); } -- cgit v1.2.3