summaryrefslogtreecommitdiffstats
path: root/apps/playback.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-08-23 01:37:59 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-08-23 01:37:59 +0000
commit5078d460c678705aa3226fd2768bc85d7b3008ad (patch)
treeb32f638f99de904c4b5b4aee2b1e1b50b8bd77eb /apps/playback.c
parentfbde6baab59d7c8d047ef267884373d6d9f9e59d (diff)
downloadrockbox-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.c40
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;