diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2011-08-23 01:37:59 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2011-08-23 01:37:59 +0000 |
commit | 5078d460c678705aa3226fd2768bc85d7b3008ad (patch) | |
tree | b32f638f99de904c4b5b4aee2b1e1b50b8bd77eb /apps/playback.c | |
parent | fbde6baab59d7c8d047ef267884373d6d9f9e59d (diff) | |
download | rockbox-5078d460c678705aa3226fd2768bc85d7b3008ad.tar.gz rockbox-5078d460c678705aa3226fd2768bc85d7b3008ad.zip |
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
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/apps/playback.c b/apps/playback.c index a38534a2da..3adf6f6a49 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; |