summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
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)
1100 pcmbuf_play_stop(); 1100 pcmbuf_play_stop();
1101} 1101}
1102 1102
1103/* Wait for any in-progress fade to complete */
1104static void audio_wait_fade_complete(void)
1105{
1106 /* Just loop until it's done */
1107 while (pcmbuf_fading())
1108 sleep(0);
1109}
1110
1103/* End the ff/rw mode */ 1111/* End the ff/rw mode */
1104static void audio_ff_rewind_end(void) 1112static void audio_ff_rewind_end(void)
1105{ 1113{
@@ -2439,7 +2447,12 @@ static void audio_stop_playback(void)
2439 if (play_status == PLAY_STOPPED) 2447 if (play_status == PLAY_STOPPED)
2440 return; 2448 return;
2441 2449
2442 pcmbuf_fade(global_settings.fade_on_stop, false); 2450 bool do_fade = global_settings.fade_on_stop && filling != STATE_ENDED;
2451
2452 pcmbuf_fade(do_fade, false);
2453
2454 /* Wait for fade-out */
2455 audio_wait_fade_complete();
2443 2456
2444 /* Stop the codec and unload it */ 2457 /* Stop the codec and unload it */
2445 halt_decoding_track(true); 2458 halt_decoding_track(true);
@@ -2480,27 +2493,22 @@ static void audio_on_pause(bool pause)
2480 if (play_status == PLAY_STOPPED || pause == (play_status == PLAY_PAUSED)) 2493 if (play_status == PLAY_STOPPED || pause == (play_status == PLAY_PAUSED))
2481 return; 2494 return;
2482 2495
2483 bool const do_fade = global_settings.fade_on_stop; 2496 play_status = pause ? PLAY_PAUSED : PLAY_PLAYING;
2484
2485 if (pause)
2486 pcmbuf_fade(do_fade, false);
2487 2497
2488 if (!ff_rw_mode) 2498 if (!pause && codec_skip_pending)
2489 { 2499 {
2490 /* Not in ff/rw mode - may set the state (otherwise this could make 2500 /* Actually do the skip that is due - resets the status flag */
2491 old data play because seek hasn't completed and cleared it) */ 2501 audio_on_codec_complete(codec_skip_status);
2492 pcmbuf_pause(pause);
2493 } 2502 }
2494 2503
2495 if (!pause) 2504 bool do_fade = global_settings.fade_on_stop;
2496 pcmbuf_fade(do_fade, true);
2497 2505
2498 play_status = pause ? PLAY_PAUSED : PLAY_PLAYING; 2506 pcmbuf_fade(do_fade, !pause);
2499 2507
2500 if (!pause && codec_skip_pending) 2508 if (!ff_rw_mode && !(do_fade && pause))
2501 { 2509 {
2502 /* Actually do the skip that is due - resets the status flag */ 2510 /* Not in ff/rw mode - can actually change the audio state now */
2503 audio_on_codec_complete(codec_skip_status); 2511 pcmbuf_pause(pause);
2504 } 2512 }
2505} 2513}
2506 2514
@@ -2644,6 +2652,8 @@ static void audio_on_pre_ff_rewind(void)
2644 2652
2645 ff_rw_mode = true; 2653 ff_rw_mode = true;
2646 2654
2655 audio_wait_fade_complete();
2656
2647 if (play_status == PLAY_PAUSED) 2657 if (play_status == PLAY_PAUSED)
2648 return; 2658 return;
2649 2659