From bc9a378c4f25dccbf3cc3937357a31298f2cf845 Mon Sep 17 00:00:00 2001 From: Miika Pekkarinen Date: Wed, 29 Jun 2005 21:44:23 +0000 Subject: Crossfade works better for high bitrate vorbis files. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6937 a1c6a512-1295-4272-9138-f99709370657 --- firmware/pcm_playback.c | 42 +++++++++++++++++++++++++++--------------- 1 file 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) if (!prepare_insert(length)) return false; - - while (length > 0) { - if (crossfade_active) { + + + if (crossfade_active) { + while (length > 0 && crossfade_active) { copy_n = MIN(length, PCMBUF_SIZE - crossfade_pos); - - copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], - (const short *)buf, copy_n/2); + + copy_n = 2 * crossfade((short *)&audiobuffer[crossfade_pos], + (const short *)buf, copy_n/2); buf += copy_n; length -= copy_n; crossfade_pos += copy_n; if (crossfade_pos >= PCMBUF_SIZE) crossfade_pos -= PCMBUF_SIZE; - continue ; - } else { - copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos - - audiobuffer_fillpos); - copy_n = MIN(CHUNK_SIZE - audiobuffer_fillpos, copy_n); - - memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], - buf, copy_n); + } + + while (length > 0) { + copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos); + memcpy(&audiobuffer[audiobuffer_pos], buf, copy_n); + audiobuffer_fillpos = copy_n; buf += copy_n; - audiobuffer_free -= copy_n; length -= copy_n; + if (length > 0) + pcm_flush_fillpos(); } + } + + while (length > 0) { + copy_n = MIN(length, PCMBUF_SIZE - audiobuffer_pos - + audiobuffer_fillpos); + copy_n = MIN(CHUNK_SIZE - audiobuffer_fillpos, copy_n); + + memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], + buf, copy_n); + buf += copy_n; + audiobuffer_free -= copy_n; + length -= copy_n; /* Pre-buffer to meet CHUNK_SIZE requirement */ if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { -- cgit v1.2.3