diff options
-rw-r--r-- | firmware/mpeg.c | 66 |
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 | ||
55 | extern char* peek_next_track(int type); | 55 | extern char* playlist_next(int steps); |
56 | extern char* peek_prev_track(int type); | ||
57 | 56 | ||
58 | static char *units[] = | 57 | static 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 | ||
430 | static 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 | |||
431 | static void init_dma(void) | 438 | static 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 |
495 | void DEI3(void) | 502 | void 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 */ |
596 | static int new_file(bool next_track) | 599 | static 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 | ||
635 | static 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 | |||
632 | static void mpeg_thread(void) | 648 | static 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: |