summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/pcmbuf.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index a5b5fd0c4b..c79b0d5fd9 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -717,7 +717,8 @@ static bool prepare_insert(size_t length)
717 return false; 717 return false;
718 } 718 }
719 719
720 if (audiobuffer_free < length && !crossfade_active) 720 /* Need to save PCMBUF_MIN_CHUNK to prevent wrapping overwriting */
721 if (audiobuffer_free < length + PCMBUF_MIN_CHUNK && !crossfade_active)
721 { 722 {
722 pcmbuf_boost(false); 723 pcmbuf_boost(false);
723 return false; 724 return false;
@@ -750,16 +751,18 @@ void* pcmbuf_request_buffer(size_t length, size_t *realsize)
750 if(prepare_insert(length)) 751 if(prepare_insert(length))
751 { 752 {
752 size_t audiobuffer_index = audiobuffer_pos + audiobuffer_fillpos; 753 size_t audiobuffer_index = audiobuffer_pos + audiobuffer_fillpos;
753 if (pcmbuf_size - audiobuffer_index < PCMBUF_MIN_CHUNK) { 754 *realsize = length;
754 pcmbuf_flush_fillpos(); 755 if (pcmbuf_size - audiobuffer_index >= PCMBUF_MIN_CHUNK)
755 audiobuffer_pos = 0; 756 {
756 *realsize = MIN(length, pcmbuf_size); 757 /* Usual case, there's space here */
757 return &audiobuffer[0]; 758 return &audiobuffer[audiobuffer_index];
758 } 759 }
759 else 760 else
760 { 761 {
761 *realsize = MIN(length, pcmbuf_size - audiobuffer_index); 762 /* Flush and wrap the buffer */
762 return &audiobuffer[audiobuffer_index]; 763 pcmbuf_flush_fillpos();
764 audiobuffer_pos = 0;
765 return &audiobuffer[0];
763 } 766 }
764 } 767 }
765 else 768 else