diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-13 22:09:12 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-06-13 22:09:12 +0000 |
commit | 58af47c8f23531fe1947fc1a01c46060e4071cb2 (patch) | |
tree | 08626174a34e744576fd72e0adc14d0efee51e02 /apps | |
parent | 789791e659dd1288e8d5ab9159c8d75b17c8a458 (diff) | |
download | rockbox-58af47c8f23531fe1947fc1a01c46060e4071cb2.tar.gz rockbox-58af47c8f23531fe1947fc1a01c46060e4071cb2.zip |
Seeking forwards works a little better. Playlist handling still buggy.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6702 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/playback.c | 103 |
1 files changed, 74 insertions, 29 deletions
diff --git a/apps/playback.c b/apps/playback.c index df0353b1d6..cda67acbe1 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -82,6 +82,7 @@ static volatile bool paused; | |||
82 | #define AUDIO_FF_REWIND 7 | 82 | #define AUDIO_FF_REWIND 7 |
83 | #define AUDIO_FLUSH_RELOAD 8 | 83 | #define AUDIO_FLUSH_RELOAD 8 |
84 | #define AUDIO_CODEC_DONE 9 | 84 | #define AUDIO_CODEC_DONE 9 |
85 | #define AUDIO_FLUSH 10 | ||
85 | 86 | ||
86 | #define CODEC_LOAD 1 | 87 | #define CODEC_LOAD 1 |
87 | #define CODEC_LOAD_DISK 2 | 88 | #define CODEC_LOAD_DISK 2 |
@@ -283,24 +284,30 @@ void codec_advance_buffer_callback(size_t amount) | |||
283 | { | 284 | { |
284 | if ((int)amount > cur_ti->available + cur_ti->filerem) | 285 | if ((int)amount > cur_ti->available + cur_ti->filerem) |
285 | amount = cur_ti->available + cur_ti->filerem; | 286 | amount = cur_ti->available + cur_ti->filerem; |
286 | 287 | ||
288 | try_again: | ||
287 | if ((int)amount > cur_ti->available) { | 289 | if ((int)amount > cur_ti->available) { |
290 | if (filling) { | ||
291 | while (filling) | ||
292 | yield(); | ||
293 | goto try_again; | ||
294 | } | ||
288 | codecbufused = 0; | 295 | codecbufused = 0; |
289 | buf_ridx = 0; | 296 | buf_ridx = 0; |
290 | buf_widx = 0; | 297 | buf_widx = 0; |
291 | cur_ti->start_pos += amount; | 298 | cur_ti->start_pos = ci.curpos + amount; |
292 | amount -= cur_ti->available; | 299 | amount -= cur_ti->available; |
293 | ci.curpos += cur_ti->available; | 300 | ci.curpos += cur_ti->available; |
294 | cur_ti->available = 0; | 301 | cur_ti->available = 0; |
295 | while ((int)amount < cur_ti->available && !ci.stop_codec) | 302 | while ((int)amount > cur_ti->available && !ci.stop_codec) |
296 | yield(); | 303 | yield(); |
297 | } else { | ||
298 | cur_ti->available -= amount; | ||
299 | codecbufused -= amount; | ||
300 | buf_ridx += amount; | ||
301 | if (buf_ridx >= codecbuflen) | ||
302 | buf_ridx -= codecbuflen; | ||
303 | } | 304 | } |
305 | |||
306 | buf_ridx += amount; | ||
307 | if (buf_ridx >= codecbuflen) | ||
308 | buf_ridx -= codecbuflen; | ||
309 | cur_ti->available -= amount; | ||
310 | codecbufused -= amount; | ||
304 | ci.curpos += amount; | 311 | ci.curpos += amount; |
305 | cur_ti->id3.offset = ci.curpos; | 312 | cur_ti->id3.offset = ci.curpos; |
306 | } | 313 | } |
@@ -447,6 +454,7 @@ void audio_fill_file_buffer(void) | |||
447 | size_t i; | 454 | size_t i; |
448 | int rc; | 455 | int rc; |
449 | 456 | ||
457 | tracks[track_widx].start_pos = ci.curpos; | ||
450 | logf("Filling buffer..."); | 458 | logf("Filling buffer..."); |
451 | i = 0; | 459 | i = 0; |
452 | while ((off_t)i < tracks[track_widx].filerem) { | 460 | while ((off_t)i < tracks[track_widx].filerem) { |
@@ -455,8 +463,8 @@ void audio_fill_file_buffer(void) | |||
455 | 463 | ||
456 | if (!queue_empty(&audio_queue)) { | 464 | if (!queue_empty(&audio_queue)) { |
457 | logf("Filling interrupted"); | 465 | logf("Filling interrupted"); |
458 | close(current_fd); | 466 | //close(current_fd); |
459 | current_fd = -1; | 467 | //current_fd = -1; |
460 | return ; | 468 | return ; |
461 | } | 469 | } |
462 | 470 | ||
@@ -480,13 +488,9 @@ void audio_fill_file_buffer(void) | |||
480 | 488 | ||
481 | codecbufused += i; | 489 | codecbufused += i; |
482 | tracks[track_widx].filerem -= i; | 490 | tracks[track_widx].filerem -= i; |
483 | tracks[track_widx].start_pos = tracks[track_widx].filepos; | ||
484 | tracks[track_widx].filepos += i; | 491 | tracks[track_widx].filepos += i; |
485 | logf("Done:%d", tracks[track_widx].available); | 492 | logf("Done:%d", tracks[track_widx].available); |
486 | if (tracks[track_widx].filerem == 0) { | 493 | if (tracks[track_widx].filerem == 0) { |
487 | if (++track_widx == MAX_TRACK) | ||
488 | track_widx = 0; | ||
489 | tracks[track_widx].filerem = 0; | ||
490 | close(current_fd); | 494 | close(current_fd); |
491 | current_fd = -1; | 495 | current_fd = -1; |
492 | } | 496 | } |
@@ -667,7 +671,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
667 | 671 | ||
668 | if (!queue_empty(&audio_queue)) { | 672 | if (!queue_empty(&audio_queue)) { |
669 | logf("Interrupted!"); | 673 | logf("Interrupted!"); |
670 | ci.stop_codec = true; | 674 | //ci.stop_codec = true; |
671 | close(fd); | 675 | close(fd); |
672 | return false; | 676 | return false; |
673 | } | 677 | } |
@@ -949,8 +953,11 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
949 | break; | 953 | break; |
950 | } | 954 | } |
951 | 955 | ||
952 | track_changed = true; | 956 | if (start_play) { |
953 | track_count++; | 957 | track_count++; |
958 | track_changed = true; | ||
959 | } | ||
960 | |||
954 | i = tracks[track_widx].start_pos; | 961 | i = tracks[track_widx].start_pos; |
955 | while (i < size) { | 962 | while (i < size) { |
956 | /* Give codecs some processing time to prevent glitches. */ | 963 | /* Give codecs some processing time to prevent glitches. */ |
@@ -990,6 +997,9 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
990 | fill_bytesleft -= rc; | 997 | fill_bytesleft -= rc; |
991 | } | 998 | } |
992 | 999 | ||
1000 | if (!start_play) | ||
1001 | track_count++; | ||
1002 | |||
993 | tracks[track_widx].filepos = i; | 1003 | tracks[track_widx].filepos = i; |
994 | 1004 | ||
995 | /* Leave the file handle open for faster buffer refill. */ | 1005 | /* Leave the file handle open for faster buffer refill. */ |
@@ -1042,6 +1052,19 @@ void audio_play_start(int offset) | |||
1042 | #endif | 1052 | #endif |
1043 | } | 1053 | } |
1044 | 1054 | ||
1055 | void audio_clear_track_entries(void) | ||
1056 | { | ||
1057 | int cur_idx; | ||
1058 | int i; | ||
1059 | |||
1060 | cur_idx = track_widx; | ||
1061 | for (i = 0; i < MAX_TRACK - track_count; i++) { | ||
1062 | if (++cur_idx >= MAX_TRACK) | ||
1063 | cur_idx = 0; | ||
1064 | memset(&tracks[cur_idx], 0, sizeof(struct track_info)); | ||
1065 | } | ||
1066 | } | ||
1067 | |||
1045 | void audio_check_buffer(void) | 1068 | void audio_check_buffer(void) |
1046 | { | 1069 | { |
1047 | int i; | 1070 | int i; |
@@ -1077,22 +1100,24 @@ void audio_check_buffer(void) | |||
1077 | } | 1100 | } |
1078 | 1101 | ||
1079 | track_count = i; | 1102 | track_count = i; |
1080 | if (tracks[cur_idx].filerem != 0) | 1103 | if (tracks[track_widx].filerem != 0) |
1081 | track_count++; | 1104 | track_count++; |
1082 | 1105 | ||
1083 | /* Mark all other entries null. */ | 1106 | /* Mark all other entries null. */ |
1084 | cur_idx = track_widx; | 1107 | audio_clear_track_entries(); |
1085 | for (i = 0; i < MAX_TRACK - track_count; i++) { | ||
1086 | if (++cur_idx >= MAX_TRACK) | ||
1087 | cur_idx = 0; | ||
1088 | tracks[cur_idx].filesize = 0; | ||
1089 | tracks[cur_idx].available = 0; | ||
1090 | } | ||
1091 | 1108 | ||
1092 | /* Try to load remainings of the file. */ | 1109 | /* Try to load remainings of the file. */ |
1093 | if (tracks[track_widx].filerem > 0) | 1110 | if (tracks[track_widx].filerem > 0) |
1094 | audio_fill_file_buffer(); | 1111 | audio_fill_file_buffer(); |
1095 | 1112 | ||
1113 | /* Increase track write index as necessary. */ | ||
1114 | if (tracks[track_widx].filerem == 0 && tracks[track_widx].filesize != 0) { | ||
1115 | if (++track_widx == MAX_TRACK) | ||
1116 | track_widx = 0; | ||
1117 | logf("new ti: %d", track_widx); | ||
1118 | } | ||
1119 | |||
1120 | logf("ti: %d", track_widx); | ||
1096 | /* Load new files to fill the entire buffer. */ | 1121 | /* Load new files to fill the entire buffer. */ |
1097 | if (tracks[track_widx].filerem == 0) | 1122 | if (tracks[track_widx].filerem == 0) |
1098 | audio_insert_tracks(0, false, 1); | 1123 | audio_insert_tracks(0, false, 1); |
@@ -1224,15 +1249,30 @@ bool codec_request_next_track_callback(void) | |||
1224 | return true; | 1249 | return true; |
1225 | } | 1250 | } |
1226 | 1251 | ||
1252 | /* Invalidates all but currently playing track. */ | ||
1253 | void audio_invalidate_tracks(void) | ||
1254 | { | ||
1255 | if (track_count == 0) { | ||
1256 | queue_post(&audio_queue, AUDIO_PLAY, 0); | ||
1257 | return ; | ||
1258 | } | ||
1259 | |||
1260 | track_count = 1; | ||
1261 | track_widx = track_ridx; | ||
1262 | audio_clear_track_entries(); | ||
1263 | codecbufused = cur_ti->available; | ||
1264 | buf_widx = buf_ridx + cur_ti->available; | ||
1265 | if (buf_widx >= codecbuflen) | ||
1266 | buf_widx -= codecbuflen; | ||
1267 | } | ||
1268 | |||
1227 | void audio_thread(void) | 1269 | void audio_thread(void) |
1228 | { | 1270 | { |
1229 | struct event ev; | 1271 | struct event ev; |
1230 | 1272 | ||
1231 | while (1) { | 1273 | while (1) { |
1232 | sleep(50); | ||
1233 | audio_check_buffer(); | 1274 | audio_check_buffer(); |
1234 | 1275 | queue_wait_w_tmo(&audio_queue, &ev, 100); | |
1235 | queue_wait_w_tmo(&audio_queue, &ev, 10); | ||
1236 | switch (ev.id) { | 1276 | switch (ev.id) { |
1237 | case AUDIO_PLAY: | 1277 | case AUDIO_PLAY: |
1238 | ci.stop_codec = true; | 1278 | ci.stop_codec = true; |
@@ -1261,6 +1301,10 @@ void audio_thread(void) | |||
1261 | case AUDIO_NEXT: | 1301 | case AUDIO_NEXT: |
1262 | break ; | 1302 | break ; |
1263 | 1303 | ||
1304 | case AUDIO_FLUSH: | ||
1305 | audio_invalidate_tracks(); | ||
1306 | break ; | ||
1307 | |||
1264 | case AUDIO_CODEC_DONE: | 1308 | case AUDIO_CODEC_DONE: |
1265 | //if (playing) | 1309 | //if (playing) |
1266 | // audio_change_track(); | 1310 | // audio_change_track(); |
@@ -1476,6 +1520,7 @@ void audio_ff_rewind(int newpos) | |||
1476 | void audio_flush_and_reload_tracks(void) | 1520 | void audio_flush_and_reload_tracks(void) |
1477 | { | 1521 | { |
1478 | logf("flush & reload"); | 1522 | logf("flush & reload"); |
1523 | queue_post(&audio_queue, AUDIO_FLUSH, 0); | ||
1479 | } | 1524 | } |
1480 | 1525 | ||
1481 | void audio_error_clear(void) | 1526 | void audio_error_clear(void) |