summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/mpeg.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/firmware/mpeg.c b/firmware/mpeg.c
index 2e3080f47d..17d92c25fb 100644
--- a/firmware/mpeg.c
+++ b/firmware/mpeg.c
@@ -794,23 +794,33 @@ static void mpeg_thread(void)
794 794
795 /* is next track in ram? */ 795 /* is next track in ram? */
796 if ( num_tracks_in_memory() > 1 ) { 796 if ( num_tracks_in_memory() > 1 ) {
797 int track_offset = (tag_read_idx+1) & MAX_ID3_TAGS_MASK; 797 int unplayed_space_left, unswapped_space_left;
798 mp3buf_read = id3tags[track_offset]->mempos; 798
799 track_change();
800 mp3buf_read = id3tags[tag_read_idx]->mempos;
799 init_dma(); 801 init_dma();
800 last_dma_tick = current_tick; 802 last_dma_tick = current_tick;
801 803
804 unplayed_space_left = get_unplayed_space();
805 unswapped_space_left = mp3buf_write - mp3buf_swapwrite;
806 if (unswapped_space_left < 0)
807 unswapped_space_left += mp3buflen;
808
802 /* should we start reading more data? */ 809 /* should we start reading more data? */
803 if(!filling && (get_unplayed_space() < MPEG_LOW_WATER)) { 810 if(!filling && (unplayed_space_left < MPEG_LOW_WATER)) {
804 filling = true; 811 filling = true;
805 queue_post(&mpeg_queue, MPEG_NEED_DATA, 0); 812 queue_post(&mpeg_queue, MPEG_NEED_DATA, 0);
806 play_pending = true; 813 play_pending = true;
814 } else if(unswapped_space_left &&
815 unswapped_space_left > unplayed_space_left) {
816 /* Stop swapping the data from the previous file */
817 mp3buf_swapwrite = mp3buf_read;
818 play_pending = true;
807 } else { 819 } else {
808 playing = true; 820 playing = true;
809 if (!paused) 821 if (!paused)
810 start_dma(); 822 start_dma();
811 } 823 }
812
813 track_change();
814 } 824 }
815 else { 825 else {
816 reset_mp3_buffer(); 826 reset_mp3_buffer();
@@ -904,6 +914,11 @@ static void mpeg_thread(void)
904 /* Not enough information to FF/Rewind */ 914 /* Not enough information to FF/Rewind */
905 break; 915 break;
906 916
917 /* Don't seek right to the end of the file so that we can
918 transition properly to the next song */
919 if (newpos >= (int)(id3->filesize - id3->id3v1len))
920 newpos = id3->filesize - id3->id3v1len - 1;
921
907 newpos = newpos & ~1; 922 newpos = newpos & ~1;
908 curpos = lseek(mpeg_file, 0, SEEK_CUR); 923 curpos = lseek(mpeg_file, 0, SEEK_CUR);
909 924