diff options
author | Brandon Low <lostlogic@rockbox.org> | 2006-02-13 17:08:53 +0000 |
---|---|---|
committer | Brandon Low <lostlogic@rockbox.org> | 2006-02-13 17:08:53 +0000 |
commit | 3bbd93b26019e638739641b70557d17eebfac08a (patch) | |
tree | 1787a202d5e96c77f8e724402bf6813648d7ebfb /apps/pcmbuf.c | |
parent | 3a37faee5719d14218cd003a43b70c177810c838 (diff) | |
download | rockbox-3bbd93b26019e638739641b70557d17eebfac08a.tar.gz rockbox-3bbd93b26019e638739641b70557d17eebfac08a.zip |
Add comments, and prevent a nearly impossible wrapping bug. There's always enough space for the next whole audio chunk now, so it's faster too
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8678 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/pcmbuf.c')
-rw-r--r-- | apps/pcmbuf.c | 19 |
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 |