diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 50 |
1 files changed, 39 insertions, 11 deletions
diff --git a/apps/playback.c b/apps/playback.c index 62fa8de854..e7baf5b072 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -819,9 +819,19 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
819 | int rc, i; | 819 | int rc, i; |
820 | int copy_n; | 820 | int copy_n; |
821 | 821 | ||
822 | if (track_count >= MAX_TRACK || tracks[track_widx].filesize != 0) | 822 | /* Stop buffer filling if there is no free track entries. */ |
823 | if (track_count >= MAX_TRACK) { | ||
824 | fill_bytesleft = 0; | ||
823 | return false; | 825 | return false; |
824 | 826 | } | |
827 | |||
828 | /* Don't start loading track if the current write position already | ||
829 | contains a BUFFERED track. The entry may contain the metadata | ||
830 | which is ok. */ | ||
831 | if (tracks[track_widx].filesize != 0) | ||
832 | return false; | ||
833 | |||
834 | /* Get track name from current playlist read position. */ | ||
825 | logf("Buffering track:%d/%d", track_widx, track_ridx); | 835 | logf("Buffering track:%d/%d", track_widx, track_ridx); |
826 | trackname = playlist_peek(peek_offset); | 836 | trackname = playlist_peek(peek_offset); |
827 | if (!trackname) { | 837 | if (!trackname) { |
@@ -835,7 +845,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
835 | logf("Open failed"); | 845 | logf("Open failed"); |
836 | return false; | 846 | return false; |
837 | } | 847 | } |
838 | 848 | ||
849 | /* Initialize track entry. */ | ||
839 | size = filesize(fd); | 850 | size = filesize(fd); |
840 | tracks[track_widx].filerem = size; | 851 | tracks[track_widx].filerem = size; |
841 | tracks[track_widx].filesize = size; | 852 | tracks[track_widx].filesize = size; |
@@ -844,7 +855,6 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
844 | tracks[track_widx].taginfo_ready = false; | 855 | tracks[track_widx].taginfo_ready = false; |
845 | tracks[track_widx].playlist_offset = offset; | 856 | tracks[track_widx].playlist_offset = offset; |
846 | 857 | ||
847 | /* Load the codec */ | ||
848 | if (buf_widx >= codecbuflen) | 858 | if (buf_widx >= codecbuflen) |
849 | buf_widx -= codecbuflen; | 859 | buf_widx -= codecbuflen; |
850 | 860 | ||
@@ -856,17 +866,19 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
856 | dsp_configure(DSP_RESET, 0); | 866 | dsp_configure(DSP_RESET, 0); |
857 | ci.configure(CODEC_DSP_ENABLE, false); | 867 | ci.configure(CODEC_DSP_ENABLE, false); |
858 | } | 868 | } |
859 | 869 | ||
870 | /* Load the codec. */ | ||
860 | tracks[track_widx].codecbuf = &codecbuf[buf_widx]; | 871 | tracks[track_widx].codecbuf = &codecbuf[buf_widx]; |
861 | if (!loadcodec(trackname, start_play)) { | 872 | if (!loadcodec(trackname, start_play)) { |
862 | close(fd); | 873 | close(fd); |
874 | /* Stop buffer filling if codec load failed. */ | ||
875 | fill_bytesleft = 0; | ||
863 | return false; | 876 | return false; |
864 | } | 877 | } |
865 | // tracks[track_widx].filebuf = &codecbuf[buf_widx]; | 878 | // tracks[track_widx].filebuf = &codecbuf[buf_widx]; |
866 | tracks[track_widx].start_pos = 0; | 879 | tracks[track_widx].start_pos = 0; |
867 | 880 | ||
868 | //logf("%s", trackname); | 881 | /* Get track metadata if we don't already have it. */ |
869 | |||
870 | if (!tracks[track_widx].taginfo_ready) { | 882 | if (!tracks[track_widx].taginfo_ready) { |
871 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { | 883 | if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) { |
872 | close(fd); | 884 | close(fd); |
@@ -902,7 +914,8 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
902 | track_count++; | 914 | track_count++; |
903 | audiobuffer_add_event(codec_track_changed); | 915 | audiobuffer_add_event(codec_track_changed); |
904 | } | 916 | } |
905 | 917 | ||
918 | /* Do some initial file buffering. */ | ||
906 | i = tracks[track_widx].start_pos; | 919 | i = tracks[track_widx].start_pos; |
907 | size = MIN(size, AUDIO_FILL_CYCLE); | 920 | size = MIN(size, AUDIO_FILL_CYCLE); |
908 | while (i < size) { | 921 | while (i < size) { |
@@ -1189,9 +1202,16 @@ static void audio_stop_playback(void) | |||
1189 | filling = false; | 1202 | filling = false; |
1190 | } | 1203 | } |
1191 | 1204 | ||
1205 | /* Request the next track with new codec. */ | ||
1192 | void audio_change_track(void) | 1206 | void audio_change_track(void) |
1193 | { | 1207 | { |
1194 | logf("change track"); | 1208 | logf("change track"); |
1209 | |||
1210 | /* Wait for new track data. */ | ||
1211 | while (track_ridx == track_widx && filling) | ||
1212 | yield(); | ||
1213 | |||
1214 | /* If we are not filling, then it must be end-of-playlist. */ | ||
1195 | if (track_ridx == track_widx) { | 1215 | if (track_ridx == track_widx) { |
1196 | logf("No more tracks"); | 1216 | logf("No more tracks"); |
1197 | while (pcm_is_playing()) | 1217 | while (pcm_is_playing()) |
@@ -1216,9 +1236,13 @@ bool codec_request_next_track_callback(void) | |||
1216 | 1236 | ||
1217 | /* Advance to next track. */ | 1237 | /* Advance to next track. */ |
1218 | if (ci.reload_codec && new_track > 0) { | 1238 | if (ci.reload_codec && new_track > 0) { |
1219 | last_peek_offset--; | 1239 | /* Wait for new track data. */ |
1240 | while (track_ridx == track_widx && filling) | ||
1241 | yield(); | ||
1242 | |||
1220 | if (!playlist_check(1)) | 1243 | if (!playlist_check(1)) |
1221 | return false; | 1244 | return false; |
1245 | last_peek_offset--; | ||
1222 | playlist_next(1); | 1246 | playlist_next(1); |
1223 | if (++track_ridx == MAX_TRACK) | 1247 | if (++track_ridx == MAX_TRACK) |
1224 | track_ridx = 0; | 1248 | track_ridx = 0; |
@@ -1232,9 +1256,9 @@ bool codec_request_next_track_callback(void) | |||
1232 | 1256 | ||
1233 | /* Advance to previous track. */ | 1257 | /* Advance to previous track. */ |
1234 | else if (ci.reload_codec && new_track < 0) { | 1258 | else if (ci.reload_codec && new_track < 0) { |
1235 | last_peek_offset++; | ||
1236 | if (!playlist_check(-1)) | 1259 | if (!playlist_check(-1)) |
1237 | return false; | 1260 | return false; |
1261 | last_peek_offset++; | ||
1238 | playlist_next(-1); | 1262 | playlist_next(-1); |
1239 | if (--track_ridx < 0) | 1263 | if (--track_ridx < 0) |
1240 | track_ridx = MAX_TRACK-1; | 1264 | track_ridx = MAX_TRACK-1; |
@@ -1250,9 +1274,13 @@ bool codec_request_next_track_callback(void) | |||
1250 | 1274 | ||
1251 | /* Codec requested track change (next track). */ | 1275 | /* Codec requested track change (next track). */ |
1252 | else { | 1276 | else { |
1253 | last_peek_offset--; | 1277 | /* Wait for new track data. */ |
1278 | while (track_ridx == track_widx && filling) | ||
1279 | yield(); | ||
1280 | |||
1254 | if (!playlist_check(1)) | 1281 | if (!playlist_check(1)) |
1255 | return false; | 1282 | return false; |
1283 | last_peek_offset--; | ||
1256 | playlist_next(1); | 1284 | playlist_next(1); |
1257 | if (++track_ridx >= MAX_TRACK) | 1285 | if (++track_ridx >= MAX_TRACK) |
1258 | track_ridx = 0; | 1286 | track_ridx = 0; |