summaryrefslogtreecommitdiff
path: root/firmware/pcm_playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r--firmware/pcm_playback.c23
1 files changed, 4 insertions, 19 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index a7ee5cecde..04630f100f 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -415,7 +415,7 @@ bool pcm_crossfade_init(void)
415 */ 415 */
416void pcm_flush_audio(void) 416void pcm_flush_audio(void)
417{ 417{
418 if (crossfade_init || crossfade_active) 418 if (crossfade_init || crossfade_active || !pcm_playing)
419 return ; 419 return ;
420 420
421 crossfade_mode = CFM_FLUSH; 421 crossfade_mode = CFM_FLUSH;
@@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length)
640 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], 640 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
641 buf, copy_n); 641 buf, copy_n);
642 buf += copy_n; 642 buf += copy_n;
643 audiobuffer_free -= copy_n; 643 audiobuffer_fillpos += copy_n;
644 length -= copy_n; 644 length -= copy_n;
645 645
646 /* Pre-buffer to meet CHUNK_SIZE requirement */ 646 /* Pre-buffer to meet CHUNK_SIZE requirement */
647 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { 647 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {
648 audiobuffer_fillpos += copy_n;
649 return true; 648 return true;
650 } 649 }
651 650
652 copy_n += audiobuffer_fillpos; 651 pcm_flush_fillpos();
653
654 while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos],
655 copy_n, pcm_event_handler)) {
656 pcm_boost(false);
657 yield();
658 }
659 pcm_event_handler = NULL;
660
661 audiobuffer_pos += copy_n;
662 audiobuffer_fillpos = 0;
663
664 if (audiobuffer_pos >= PCMBUF_SIZE) {
665 audiobuffer_pos = 0;
666 }
667 } 652 }
668 653
669 return true; 654 return true;