diff options
Diffstat (limited to 'firmware/pcm_playback.c')
-rw-r--r-- | firmware/pcm_playback.c | 42 |
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) { |