diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-25 11:12:54 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-25 11:12:54 +0000 |
commit | 4e2384eb0747548c56599cfe92db45bea1fabda3 (patch) | |
tree | df495c30c5650e3a2534f8d4b56d15db660fc35e /firmware/mpeg.c | |
parent | 3b919cbda3f542dafb34e40ae36c49ecfaaba2b1 (diff) | |
download | rockbox-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.c | 41 |
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 | { |