summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-06-30 16:28:40 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-06-30 16:28:40 +0000
commit3b90707fdd85a4b21258f6e11f10e15e0f668e3d (patch)
tree88a28be98ee3872e2a7ee473c11b1975394e5197 /firmware
parent8764bbc275c4b299f22a706d67c1b20240af94fb (diff)
downloadrockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.tar.gz
rockbox-3b90707fdd85a4b21258f6e11f10e15e0f668e3d.zip
Fixed a bug where a few seconds from end of a song was cut out.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6951 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/pcm_playback.c23
1 files changed, 4 insertions, 19 deletions
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c
index a7ee5cecde..04630f100f 100644
--- a/firmware/pcm_playback.c
+++ b/firmware/pcm_playback.c
@@ -415,7 +415,7 @@ bool pcm_crossfade_init(void)
415 */ 415 */
416void pcm_flush_audio(void) 416void pcm_flush_audio(void)
417{ 417{
418 if (crossfade_init || crossfade_active) 418 if (crossfade_init || crossfade_active || !pcm_playing)
419 return ; 419 return ;
420 420
421 crossfade_mode = CFM_FLUSH; 421 crossfade_mode = CFM_FLUSH;
@@ -640,30 +640,15 @@ bool pcm_insert_buffer(char *buf, long length)
640 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos], 640 memcpy(&audiobuffer[audiobuffer_pos+audiobuffer_fillpos],
641 buf, copy_n); 641 buf, copy_n);
642 buf += copy_n; 642 buf += copy_n;
643 audiobuffer_free -= copy_n; 643 audiobuffer_fillpos += copy_n;
644 length -= copy_n; 644 length -= copy_n;
645 645
646 /* Pre-buffer to meet CHUNK_SIZE requirement */ 646 /* Pre-buffer to meet CHUNK_SIZE requirement */
647 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) { 647 if (copy_n + audiobuffer_fillpos < CHUNK_SIZE && length == 0) {
648 audiobuffer_fillpos += copy_n;
649 return true; 648 return true;
650 } 649 }
651 650
652 copy_n += audiobuffer_fillpos; 651 pcm_flush_fillpos();
653
654 while (!pcm_play_add_chunk(&audiobuffer[audiobuffer_pos],
655 copy_n, pcm_event_handler)) {
656 pcm_boost(false);
657 yield();
658 }
659 pcm_event_handler = NULL;
660
661 audiobuffer_pos += copy_n;
662 audiobuffer_fillpos = 0;
663
664 if (audiobuffer_pos >= PCMBUF_SIZE) {
665 audiobuffer_pos = 0;
666 }
667 } 652 }
668 653
669 return true; 654 return true;