summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/mpeg.c37
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
52extern char* peek_next_track(int type); 53extern char* peek_next_track(int type);
53extern char* peek_prev_track(int type); 54extern 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