From 5078d460c678705aa3226fd2768bc85d7b3008ad Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Tue, 23 Aug 2011 01:37:59 +0000 Subject: Fix FS#12238 - WPS delay on pause introduced by r30097 which was the excuse I wanted anyway to do a better PCM fade on stop/pause implementation. New fade is asynchronous tick-based. Restores skin update points in the WPS that were removed when fading mechanism was changed. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30340 a1c6a512-1295-4272-9138-f99709370657 --- apps/playback.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) (limited to 'apps/playback.c') diff --git a/apps/playback.c b/apps/playback.c index a38534a..3adf6f6 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -1100,6 +1100,14 @@ static void audio_clear_paused_pcm(void) pcmbuf_play_stop(); } +/* Wait for any in-progress fade to complete */ +static void audio_wait_fade_complete(void) +{ + /* Just loop until it's done */ + while (pcmbuf_fading()) + sleep(0); +} + /* End the ff/rw mode */ static void audio_ff_rewind_end(void) { @@ -2439,7 +2447,12 @@ static void audio_stop_playback(void) if (play_status == PLAY_STOPPED) return; - pcmbuf_fade(global_settings.fade_on_stop, false); + bool do_fade = global_settings.fade_on_stop && filling != STATE_ENDED; + + pcmbuf_fade(do_fade, false); + + /* Wait for fade-out */ + audio_wait_fade_complete(); /* Stop the codec and unload it */ halt_decoding_track(true); @@ -2480,27 +2493,22 @@ static void audio_on_pause(bool pause) if (play_status == PLAY_STOPPED || pause == (play_status == PLAY_PAUSED)) return; - bool const do_fade = global_settings.fade_on_stop; - - if (pause) - pcmbuf_fade(do_fade, false); + play_status = pause ? PLAY_PAUSED : PLAY_PLAYING; - if (!ff_rw_mode) + if (!pause && codec_skip_pending) { - /* Not in ff/rw mode - may set the state (otherwise this could make - old data play because seek hasn't completed and cleared it) */ - pcmbuf_pause(pause); + /* Actually do the skip that is due - resets the status flag */ + audio_on_codec_complete(codec_skip_status); } - if (!pause) - pcmbuf_fade(do_fade, true); + bool do_fade = global_settings.fade_on_stop; - play_status = pause ? PLAY_PAUSED : PLAY_PLAYING; + pcmbuf_fade(do_fade, !pause); - if (!pause && codec_skip_pending) + if (!ff_rw_mode && !(do_fade && pause)) { - /* Actually do the skip that is due - resets the status flag */ - audio_on_codec_complete(codec_skip_status); + /* Not in ff/rw mode - can actually change the audio state now */ + pcmbuf_pause(pause); } } @@ -2644,6 +2652,8 @@ static void audio_on_pre_ff_rewind(void) ff_rw_mode = true; + audio_wait_fade_complete(); + if (play_status == PLAY_PAUSED) return; -- cgit v1.1