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.c50
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
556bool pcm_insert_buffer(char *buf, size_t length) 554bool pcm_insert_buffer(char *buf, size_t length)