summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-06-13 22:09:12 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-06-13 22:09:12 +0000
commit58af47c8f23531fe1947fc1a01c46060e4071cb2 (patch)
tree08626174a34e744576fd72e0adc14d0efee51e02 /apps/playback.c
parent789791e659dd1288e8d5ab9159c8d75b17c8a458 (diff)
downloadrockbox-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/playback.c')
-rw-r--r--apps/playback.c103
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
1055void 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
1045void audio_check_buffer(void) 1068void 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. */
1253void 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
1227void audio_thread(void) 1269void 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)
1476void audio_flush_and_reload_tracks(void) 1520void 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
1481void audio_error_clear(void) 1526void audio_error_clear(void)