diff options
-rw-r--r-- | firmware/pcm_playback.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 12ecfd14e2..04a3278d81 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -520,37 +520,35 @@ void pcm_flush_buffer(size_t length) | |||
520 | crossfade_pos -= PCMBUF_SIZE; | 520 | crossfade_pos -= PCMBUF_SIZE; |
521 | } | 521 | } |
522 | 522 | ||
523 | if (length > 0) { | 523 | while (length > 0) { |
524 | memcpy(&audiobuffer[audiobuffer_pos], buf, length); | 524 | copy_n = MIN(length, PCMBUF_SIZE - (unsigned)audiobuffer_pos); |
525 | memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n); | ||
525 | audiobuffer_fillpos = length; | 526 | audiobuffer_fillpos = length; |
526 | goto try_flush; | 527 | buf += copy_n; |
528 | length -= copy_n; | ||
529 | if (length > 0) | ||
530 | pcm_flush_fillpos(); | ||
527 | } | 531 | } |
528 | } else { | 532 | } |
529 | /* if (length == 0) { | ||
530 | pcm_flush_fillpos(); | ||
531 | audiobuffer_pos = 0; | ||
532 | return ; | ||
533 | } */ | ||
534 | 533 | ||
535 | audiobuffer_fillpos += length; | 534 | audiobuffer_fillpos += length; |
536 | 535 | ||
537 | try_flush: | 536 | try_flush: |
538 | if (audiobuffer_fillpos < CHUNK_SIZE && PCMBUF_SIZE | 537 | if (audiobuffer_fillpos < CHUNK_SIZE && PCMBUF_SIZE |
539 | - audiobuffer_pos - audiobuffer_fillpos > 0) | 538 | - audiobuffer_pos - audiobuffer_fillpos > 0) |
540 | return ; | 539 | return ; |
541 | 540 | ||
542 | copy_n = MIN((long)(audiobuffer_fillpos - (PCMBUF_SIZE | 541 | copy_n = MIN((long)(audiobuffer_fillpos - (PCMBUF_SIZE |
543 | - audiobuffer_pos)), PCMBUF_GUARD); | 542 | - audiobuffer_pos)), PCMBUF_GUARD); |
544 | if (copy_n > 0) { | 543 | if (copy_n > 0) { |
545 | //logf("guard buf used:%d", copy_n); | 544 | //logf("guard buf used:%d", copy_n); |
546 | audiobuffer_fillpos -= copy_n; | 545 | audiobuffer_fillpos -= copy_n; |
547 | pcm_flush_fillpos(); | ||
548 | memcpy(&audiobuffer[0], &guardbuf[0], copy_n); | ||
549 | audiobuffer_fillpos = copy_n; | ||
550 | goto try_flush; | ||
551 | } | ||
552 | pcm_flush_fillpos(); | 546 | pcm_flush_fillpos(); |
547 | memcpy(&audiobuffer[0], &guardbuf[0], copy_n); | ||
548 | audiobuffer_fillpos = copy_n; | ||
549 | goto try_flush; | ||
553 | } | 550 | } |
551 | pcm_flush_fillpos(); | ||
554 | } | 552 | } |
555 | 553 | ||
556 | bool pcm_insert_buffer(char *buf, size_t length) | 554 | bool pcm_insert_buffer(char *buf, size_t length) |