diff options
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r-- | firmware/mpeg.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c index d6fdf907ee..82e30ca0ba 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #define MPEG_PREV 6 | 48 | #define MPEG_PREV 6 |
49 | #define MPEG_NEED_DATA 100 | 49 | #define MPEG_NEED_DATA 100 |
50 | #define MPEG_SWAP_DATA 101 | 50 | #define MPEG_SWAP_DATA 101 |
51 | #define MPEG_TRACK_CHANGE 102 | ||
51 | 52 | ||
52 | extern char* peek_next_track(int type); | 53 | extern char* peek_next_track(int type); |
53 | extern char* peek_prev_track(int type); | 54 | extern char* peek_prev_track(int type); |
@@ -408,6 +409,7 @@ void DEI3(void) | |||
408 | { | 409 | { |
409 | int unplayed_space_left; | 410 | int unplayed_space_left; |
410 | int space_until_end_of_buffer; | 411 | int space_until_end_of_buffer; |
412 | int track_offset = 0; | ||
411 | 413 | ||
412 | if(playing) | 414 | if(playing) |
413 | { | 415 | { |
@@ -420,15 +422,8 @@ void DEI3(void) | |||
420 | { | 422 | { |
421 | if (mp3buf_read == id3tags[1].mempos) | 423 | if (mp3buf_read == id3tags[1].mempos) |
422 | { | 424 | { |
423 | /* shift array so index 0 is current track */ | 425 | queue_post(&mpeg_queue, MPEG_TRACK_CHANGE, 0); |
424 | int i; | 426 | track_offset = 1; |
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 | } | 427 | } |
433 | } | 428 | } |
434 | 429 | ||
@@ -451,14 +446,16 @@ void DEI3(void) | |||
451 | space_until_end_of_buffer); | 446 | space_until_end_of_buffer); |
452 | 447 | ||
453 | /* several tracks loaded? */ | 448 | /* several tracks loaded? */ |
454 | if (last_tag>1) | 449 | if ((last_tag - track_offset) > 1) |
455 | { | 450 | { |
456 | /* will we move across the track boundary? */ | 451 | /* will we move across the track boundary? */ |
457 | if (( mp3buf_read < id3tags[1].mempos ) && | 452 | if (( mp3buf_read < id3tags[1+track_offset].mempos ) && |
458 | ((mp3buf_read+last_dma_chunk_size) > id3tags[1].mempos )) | 453 | ((mp3buf_read+last_dma_chunk_size) > |
454 | id3tags[1+track_offset].mempos )) | ||
459 | { | 455 | { |
460 | /* Make sure that we end exactly on the boundary */ | 456 | /* Make sure that we end exactly on the boundary */ |
461 | last_dma_chunk_size = id3tags[1].mempos - mp3buf_read; | 457 | last_dma_chunk_size = id3tags[1+track_offset].mempos |
458 | - mp3buf_read; | ||
462 | } | 459 | } |
463 | } | 460 | } |
464 | 461 | ||
@@ -532,7 +529,8 @@ static void mpeg_thread(void) | |||
532 | int unplayed_space_left; | 529 | int unplayed_space_left; |
533 | int amount_to_read; | 530 | int amount_to_read; |
534 | int amount_to_swap; | 531 | int amount_to_swap; |
535 | 532 | int i; | |
533 | |||
536 | play_pending = false; | 534 | play_pending = false; |
537 | playing = false; | 535 | playing = false; |
538 | mpeg_file = -1; | 536 | mpeg_file = -1; |
@@ -799,6 +797,17 @@ static void mpeg_thread(void) | |||
799 | } | 797 | } |
800 | break; | 798 | break; |
801 | 799 | ||
800 | case MPEG_TRACK_CHANGE: | ||
801 | DEBUGF("Track change\n"); | ||
802 | |||
803 | /* shift array so index 0 is current track */ | ||
804 | for (i=0; i<last_tag-1; i++) | ||
805 | { | ||
806 | id3tags[i] = id3tags[i+1]; | ||
807 | } | ||
808 | last_tag--; | ||
809 | break; | ||
810 | |||
802 | case SYS_USB_CONNECTED: | 811 | case SYS_USB_CONNECTED: |
803 | stop_playing(); | 812 | stop_playing(); |
804 | 813 | ||