summaryrefslogtreecommitdiff
path: root/firmware/mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/mpeg.c')
-rw-r--r--firmware/mpeg.c66
1 files changed, 38 insertions, 28 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 4ef00d9c29..dd990a781c 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -52,8 +52,7 @@
52#define MPEG_SWAP_DATA 101 52#define MPEG_SWAP_DATA 101
53#define MPEG_TRACK_CHANGE 102 53#define MPEG_TRACK_CHANGE 102
54 54
55extern char* peek_next_track(int type); 55extern char* playlist_next(int steps);
56extern char* peek_prev_track(int type);
57 56
58static char *units[] = 57static char *units[] =
59{ 58{
@@ -428,13 +427,21 @@ static void mas_poll_start(int interval_in_ms)
428 TSTR |= 0x02; /* Start timer 2 */ 427 TSTR |= 0x02; /* Start timer 2 */
429} 428}
430 429
430static int get_unplayed_space(void)
431{
432 int space = mp3buf_write - mp3buf_read;
433 if (space < 0)
434 space = mp3buflen + space;
435 return space;
436}
437
431static void init_dma(void) 438static void init_dma(void)
432{ 439{
433 SAR3 = (unsigned int) mp3buf + mp3buf_read; 440 SAR3 = (unsigned int) mp3buf + mp3buf_read;
434 DAR3 = 0x5FFFEC3; 441 DAR3 = 0x5FFFEC3;
435 CHCR3 &= ~0x0002; /* Clear interrupt */ 442 CHCR3 &= ~0x0002; /* Clear interrupt */
436 CHCR3 = 0x1504; /* Single address destination, TXI0, IE=1 */ 443 CHCR3 = 0x1504; /* Single address destination, TXI0, IE=1 */
437 last_dma_chunk_size = MIN(65536, mp3buf_write - mp3buf_read); 444 last_dma_chunk_size = MIN(65536, get_unplayed_space());
438 DTCR3 = last_dma_chunk_size & 0xffff; 445 DTCR3 = last_dma_chunk_size & 0xffff;
439 DMAOR = 0x0001; /* Enable DMA */ 446 DMAOR = 0x0001; /* Enable DMA */
440 CHCR3 |= 0x0001; /* Enable DMA IRQ */ 447 CHCR3 |= 0x0001; /* Enable DMA IRQ */
@@ -494,12 +501,12 @@ void IRQ6(void)
494#pragma interrupt 501#pragma interrupt
495void DEI3(void) 502void DEI3(void)
496{ 503{
497 int unplayed_space_left;
498 int space_until_end_of_buffer;
499 int track_offset = (tag_read_idx+1) & MAX_ID3_TAGS_MASK;
500
501 if(playing) 504 if(playing)
502 { 505 {
506 int unplayed_space_left = get_unplayed_space();
507 int space_until_end_of_buffer;
508 int track_offset = (tag_read_idx+1) & MAX_ID3_TAGS_MASK;
509
503 mp3buf_read += last_dma_chunk_size; 510 mp3buf_read += last_dma_chunk_size;
504 if(mp3buf_read >= mp3buflen) 511 if(mp3buf_read >= mp3buflen)
505 mp3buf_read = 0; 512 mp3buf_read = 0;
@@ -514,10 +521,6 @@ void DEI3(void)
514 } 521 }
515 } 522 }
516 523
517 unplayed_space_left = mp3buf_write - mp3buf_read;
518 if(unplayed_space_left < 0)
519 unplayed_space_left = mp3buflen + unplayed_space_left;
520
521 space_until_end_of_buffer = mp3buflen - mp3buf_read; 524 space_until_end_of_buffer = mp3buflen - mp3buf_read;
522 525
523 if(!filling && unplayed_space_left < MPEG_LOW_WATER) 526 if(!filling && unplayed_space_left < MPEG_LOW_WATER)
@@ -593,12 +596,12 @@ static void add_track_to_tag_list(char *filename)
593} 596}
594 597
595/* If next_track is true, opens the next track, if false, opens prev track */ 598/* If next_track is true, opens the next track, if false, opens prev track */
596static int new_file(bool next_track) 599static int new_file(int steps)
597{ 600{
598 char *trackname; 601 char *trackname;
599 602
600 do { 603 do {
601 trackname = peek_next_track( next_track ? 1 : -1 ); 604 trackname = playlist_next( steps );
602 if ( !trackname ) 605 if ( !trackname )
603 return -1; 606 return -1;
604 607
@@ -629,6 +632,19 @@ static void stop_playing(void)
629 remove_all_tags(); 632 remove_all_tags();
630} 633}
631 634
635static void track_change(void)
636{
637 DEBUGF("Track change\n");
638
639#ifdef HAVE_MAS3587F
640 /* Reset the AVC */
641 mpeg_sound_set(SOUND_AVC, -1);
642#endif
643 remove_current_tag();
644
645 current_track_counter++;
646}
647
632static void mpeg_thread(void) 648static void mpeg_thread(void)
633{ 649{
634 struct event ev; 650 struct event ev;
@@ -667,7 +683,7 @@ static void mpeg_thread(void)
667 mpeg_file = open((char*)ev.data, O_RDONLY); 683 mpeg_file = open((char*)ev.data, O_RDONLY);
668 while (mpeg_file < 0) { 684 while (mpeg_file < 0) {
669 DEBUGF("Couldn't open file: %s\n",ev.data); 685 DEBUGF("Couldn't open file: %s\n",ev.data);
670 if ( new_file(true) == -1 ) 686 if ( new_file(1) == -1 )
671 return; 687 return;
672 } 688 }
673 689
@@ -721,7 +737,7 @@ static void mpeg_thread(void)
721 last_dma_tick = current_tick; 737 last_dma_tick = current_tick;
722 init_dma(); 738 init_dma();
723 start_dma(); 739 start_dma();
724 queue_post(&mpeg_queue, MPEG_TRACK_CHANGE, 0); 740 track_change();
725 } 741 }
726 else { 742 else {
727 reset_mp3_buffer(); 743 reset_mp3_buffer();
@@ -731,7 +747,7 @@ static void mpeg_thread(void)
731 if (mpeg_file >= 0) 747 if (mpeg_file >= 0)
732 close(mpeg_file); 748 close(mpeg_file);
733 749
734 if (new_file(true) < 0) { 750 if (new_file(1) < 0) {
735 DEBUGF("No more files to play\n"); 751 DEBUGF("No more files to play\n");
736 filling = false; 752 filling = false;
737 } else { 753 } else {
@@ -748,7 +764,8 @@ static void mpeg_thread(void)
748 } 764 }
749 break; 765 break;
750 766
751 case MPEG_PREV: 767 case MPEG_PREV: {
768 int numtracks = num_tracks_in_memory();
752 DEBUGF("MPEG_PREV\n"); 769 DEBUGF("MPEG_PREV\n");
753 /* stop the current stream */ 770 /* stop the current stream */
754 play_pending = false; 771 play_pending = false;
@@ -762,7 +779,7 @@ static void mpeg_thread(void)
762 if (mpeg_file >= 0) 779 if (mpeg_file >= 0)
763 close(mpeg_file); 780 close(mpeg_file);
764 781
765 if (new_file(false) < 0) { 782 if (new_file(-numtracks) < 0) {
766 DEBUGF("No more files to play\n"); 783 DEBUGF("No more files to play\n");
767 filling = false; 784 filling = false;
768 } else { 785 } else {
@@ -776,7 +793,8 @@ static void mpeg_thread(void)
776 793
777 current_track_counter++; 794 current_track_counter++;
778 } 795 }
779 break; 796 break;
797 }
780 798
781 case MPEG_SWAP_DATA: 799 case MPEG_SWAP_DATA:
782 free_space_left = mp3buf_write - mp3buf_swapwrite; 800 free_space_left = mp3buf_write - mp3buf_swapwrite;
@@ -930,15 +948,7 @@ static void mpeg_thread(void)
930 break; 948 break;
931 949
932 case MPEG_TRACK_CHANGE: 950 case MPEG_TRACK_CHANGE:
933 DEBUGF("Track change\n"); 951 track_change();
934
935#ifdef HAVE_MAS3587F
936 /* Reset the AVC */
937 mpeg_sound_set(SOUND_AVC, -1);
938#endif
939 remove_current_tag();
940
941 current_track_counter++;
942 break; 952 break;
943 953
944 case SYS_USB_CONNECTED: 954 case SYS_USB_CONNECTED: