summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-07-05 13:34:52 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-07-05 13:34:52 +0000
commit2d79df5086a3c632ef09bc273c201a8443a7c4a2 (patch)
tree50693afe219491f2040b5799c09209b14f6e6501
parenteaf8b2d76d3f69b919ff1c3a55e7ad2f07456bd4 (diff)
downloadrockbox-2d79df5086a3c632ef09bc273c201a8443a7c4a2.tar.gz
rockbox-2d79df5086a3c632ef09bc273c201a8443a7c4a2.zip
Fixed a problem that caused playback to stop on certain situations. Fixed
buffer filling issue if we try to buffer more than MAX_TRACK tracks at a same time. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7026 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/playback.c50
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. */
1192void audio_change_track(void) 1206void 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;