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.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index 03cc106016..a7ee5cecde 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -606,30 +606,42 @@ bool pcm_insert_buffer(char *buf, long length)
606 606
607 if (!prepare_insert(length)) 607 if (!prepare_insert(length))
608 return false; 608 return false;
609 609
610 while (length > 0) { 610
611 if (crossfade_active) { 611 if (crossfade_active) {
612 while (length > 0 && crossfade_active) {
612 copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos); 613 copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos);
613 614
614 copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], 615 copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos],
615 (const short *)buf, copy_n/2); 616 (const short *)buf, copy_n/2);
616 buf += copy_n; 617 buf += copy_n;
617 length -= copy_n; 618 length -= copy_n;
618 crossfade_pos += copy_n; 619 crossfade_pos += copy_n;
619 if (crossfade_pos >= PCMBUF_SIZE) 620 if (crossfade_pos >= PCMBUF_SIZE)
620 crossfade_pos -= PCMBUF_SIZE; 621 crossfade_pos -= PCMBUF_SIZE;
621 continue ; 622 }
622 } else { 623
623 copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos - 624 while (length > 0) {
624 audiobuffer_fillpos); 625 copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos);
625 copy_n = MIN(CHUNK_SIZE - audiobuffer_fillpos, copy_n); 626 memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n);
626 627 audiobuffer_fillpos = copy_n;
627 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
628 buf, copy_n);
629 buf += copy_n; 628 buf += copy_n;
630 audiobuffer_free -= copy_n;
631 length -= copy_n; 629 length -= copy_n;
630 if (length > 0)
631 pcm_flush_fillpos();
632 } 632 }
633 }
634
635 while (length > 0) {
636 copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos -
637 audiobuffer_fillpos);
638 copy_n = MIN(CHUNK_SIZE - audiobuffer_fillpos, copy_n);
639
640 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
641 buf, copy_n);
642 buf += copy_n;
643 audiobuffer_free -= copy_n;
644 length -= copy_n;
633 645
634 /* Pre-buffer to meet CHUNK_SIZE requirement */ 646 /* Pre-buffer to meet CHUNK_SIZE requirement */
635 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { 647 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {