diff options
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/apps/playback.c b/apps/playback.c index c91a3a8155..df0353b1d6 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -125,19 +125,19 @@ static volatile int buf_widx; | |||
125 | 125 | ||
126 | #define MAX_TRACK 10 | 126 | #define MAX_TRACK 10 |
127 | struct track_info { | 127 | struct track_info { |
128 | struct mp3entry id3; | 128 | struct mp3entry id3; /* TAG metadata */ |
129 | struct mp3info mp3data; | 129 | struct mp3info mp3data; /* MP3 metadata */ |
130 | char *codecbuf; | 130 | char *codecbuf; /* Pointer to codec buffer */ |
131 | size_t codecsize; | 131 | size_t codecsize; /* Codec length in bytes */ |
132 | int codectype; | 132 | int codectype; /* Codec type (example AFMT_MPA_L3) */ |
133 | 133 | ||
134 | volatile char *filebuf; | 134 | off_t filerem; /* Remaining bytes of file NOT in buffer */ |
135 | off_t filerem; | 135 | off_t filesize; /* File total length */ |
136 | off_t filesize; | 136 | off_t filepos; /* Read position of file for next buffer fill */ |
137 | off_t filepos; | 137 | off_t start_pos; /* Position to first bytes of file in buffer */ |
138 | volatile int available; | 138 | volatile int available; /* Available bytes to read from buffer */ |
139 | bool taginfo_ready; | 139 | bool taginfo_ready; /* Is metadata read */ |
140 | int playlist_offset; | 140 | int playlist_offset; /* File location in playlist */ |
141 | }; | 141 | }; |
142 | 142 | ||
143 | /* Track information (count in file buffer, read/write indexes for | 143 | /* Track information (count in file buffer, read/write indexes for |
@@ -286,7 +286,11 @@ void codec_advance_buffer_callback(size_t amount) | |||
286 | 286 | ||
287 | if ((int)amount > cur_ti->available) { | 287 | if ((int)amount > cur_ti->available) { |
288 | codecbufused = 0; | 288 | codecbufused = 0; |
289 | buf_ridx = buf_widx; | 289 | buf_ridx = 0; |
290 | buf_widx = 0; | ||
291 | cur_ti->start_pos += amount; | ||
292 | amount -= cur_ti->available; | ||
293 | ci.curpos += cur_ti->available; | ||
290 | cur_ti->available = 0; | 294 | cur_ti->available = 0; |
291 | while ((int)amount < cur_ti->available && !ci.stop_codec) | 295 | while ((int)amount < cur_ti->available && !ci.stop_codec) |
292 | yield(); | 296 | yield(); |
@@ -343,7 +347,8 @@ bool codec_seek_buffer_callback(off_t newpos) | |||
343 | if (ci.curpos - difference < 0) | 347 | if (ci.curpos - difference < 0) |
344 | difference = ci.curpos; | 348 | difference = ci.curpos; |
345 | 349 | ||
346 | if (codecbufused + difference > codecbuflen) { | 350 | if (ci.curpos - difference < cur_ti->start_pos) { |
351 | logf("Seek failed (reload song)"); | ||
347 | /* We need to reload the song. FIX THIS! */ | 352 | /* We need to reload the song. FIX THIS! */ |
348 | return false; | 353 | return false; |
349 | } | 354 | } |
@@ -473,8 +478,9 @@ void audio_fill_file_buffer(void) | |||
473 | fill_bytesleft -= rc; | 478 | fill_bytesleft -= rc; |
474 | } | 479 | } |
475 | 480 | ||
476 | tracks[track_widx].filerem -= i; | ||
477 | codecbufused += i; | 481 | codecbufused += i; |
482 | tracks[track_widx].filerem -= i; | ||
483 | tracks[track_widx].start_pos = tracks[track_widx].filepos; | ||
478 | tracks[track_widx].filepos += i; | 484 | tracks[track_widx].filepos += i; |
479 | logf("Done:%d", tracks[track_widx].available); | 485 | logf("Done:%d", tracks[track_widx].available); |
480 | if (tracks[track_widx].filerem == 0) { | 486 | if (tracks[track_widx].filerem == 0) { |
@@ -653,7 +659,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
653 | close(fd); | 659 | close(fd); |
654 | return false; | 660 | return false; |
655 | } | 661 | } |
656 | tracks[track_widx].filebuf = &codecbuf[buf_widx]; | 662 | // tracks[track_widx].filebuf = &codecbuf[buf_widx]; |
663 | tracks[track_widx].start_pos = 0; | ||
657 | 664 | ||
658 | //logf("%s", trackname); | 665 | //logf("%s", trackname); |
659 | logf("Buffering track:%d/%d", track_widx, track_ridx); | 666 | logf("Buffering track:%d/%d", track_widx, track_ridx); |
@@ -681,6 +688,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
681 | tracks[track_widx].filepos = offset; | 688 | tracks[track_widx].filepos = offset; |
682 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; | 689 | tracks[track_widx].filerem = tracks[track_widx].filesize - offset; |
683 | ci.curpos = offset; | 690 | ci.curpos = offset; |
691 | tracks[track_widx].start_pos = offset; | ||
684 | } else { | 692 | } else { |
685 | lseek(fd, 0, SEEK_SET); | 693 | lseek(fd, 0, SEEK_SET); |
686 | } | 694 | } |
@@ -943,7 +951,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
943 | 951 | ||
944 | track_changed = true; | 952 | track_changed = true; |
945 | track_count++; | 953 | track_count++; |
946 | i = tracks[track_widx].filepos; | 954 | i = tracks[track_widx].start_pos; |
947 | while (i < size) { | 955 | while (i < size) { |
948 | /* Give codecs some processing time to prevent glitches. */ | 956 | /* Give codecs some processing time to prevent glitches. */ |
949 | yield_codecs(); | 957 | yield_codecs(); |