diff options
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) | |||
1100 | pcmbuf_play_stop(); | 1100 | pcmbuf_play_stop(); |
1101 | } | 1101 | } |
1102 | 1102 | ||
1103 | /* Wait for any in-progress fade to complete */ | ||
1104 | static 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 */ |
1104 | static void audio_ff_rewind_end(void) | 1112 | static 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 | ||