summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-07-25 11:12:54 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-07-25 11:12:54 +0000
commit4e2384eb0747548c56599cfe92db45bea1fabda3 (patch)
treedf495c30c5650e3a2534f8d4b56d15db660fc35e /firmware/mpeg.c
parent3b919cbda3f542dafb34e40ae36c49ecfaaba2b1 (diff)
downloadrockbox-4e2384eb0747548c56599cfe92db45bea1fabda3.tar.gz
rockbox-4e2384eb0747548c56599cfe92db45bea1fabda3.zip
Second-exact track change detection
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1444 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 3ca605b365..d6fdf907ee 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -415,6 +415,23 @@ void DEI3(void)
415 if(mp3buf_read >= mp3buflen) 415 if(mp3buf_read >= mp3buflen)
416 mp3buf_read = 0; 416 mp3buf_read = 0;
417 417
418 /* First, check if we are on a track boundary */
419 if (last_tag > 1)
420 {
421 if (mp3buf_read == id3tags[1].mempos)
422 {
423 /* shift array so index 0 is current track */
424 int i;
425
426 DEBUGF("Track change\n");
427 for (i=0; i<last_tag-1; i++)
428 {
429 id3tags[i] = id3tags[i+1];
430 }
431 last_tag--;
432 }
433 }
434
418 unplayed_space_left = mp3buf_write - mp3buf_read; 435 unplayed_space_left = mp3buf_write - mp3buf_read;
419 if(unplayed_space_left < 0) 436 if(unplayed_space_left < 0)
420 unplayed_space_left = mp3buflen + unplayed_space_left; 437 unplayed_space_left = mp3buflen + unplayed_space_left;
@@ -430,23 +447,23 @@ void DEI3(void)
430 if(unplayed_space_left) 447 if(unplayed_space_left)
431 { 448 {
432 last_dma_chunk_size = MIN(65536, unplayed_space_left); 449 last_dma_chunk_size = MIN(65536, unplayed_space_left);
433 last_dma_chunk_size = MIN(last_dma_chunk_size, space_until_end_of_buffer); 450 last_dma_chunk_size = MIN(last_dma_chunk_size,
434 DTCR3 = last_dma_chunk_size & 0xffff; 451 space_until_end_of_buffer);
435 SAR3 = (unsigned int)mp3buf + mp3buf_read;
436 452
437 /* several tracks loaded? */ 453 /* several tracks loaded? */
438 if ( last_tag>1 ) { 454 if (last_tag>1)
455 {
439 /* will we move across the track boundary? */ 456 /* will we move across the track boundary? */
440 if (( mp3buf_read <= id3tags[1].mempos ) && 457 if (( mp3buf_read < id3tags[1].mempos ) &&
441 ((mp3buf_read+last_dma_chunk_size) > id3tags[1].mempos )) { 458 ((mp3buf_read+last_dma_chunk_size) > id3tags[1].mempos ))
442 /* shift array so index 0 is current track */ 459 {
443 int i; 460 /* Make sure that we end exactly on the boundary */
444 for (i=0; i<last_tag-1; i++) 461 last_dma_chunk_size = id3tags[1].mempos - mp3buf_read;
445 id3tags[i] = id3tags[i+1];
446 last_tag--;
447 DEBUGF("Track change\n");
448 } 462 }
449 } 463 }
464
465 DTCR3 = last_dma_chunk_size & 0xffff;
466 SAR3 = (unsigned int)mp3buf + mp3buf_read;
450 } 467 }
451 else 468 else
452 { 469 {