summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-06-29 20:50:58 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-06-29 20:50:58 +0000
commit84d6f9e89bf1bae7e3669e487541f91f27a86b0a (patch)
tree29b26568e10f3bf57ef5f334fdfc96ef43102ab4 /apps
parentcc377d5d18534c57d091e04573956c9b747b4ab6 (diff)
downloadrockbox-84d6f9e89bf1bae7e3669e487541f91f27a86b0a.tar.gz
rockbox-84d6f9e89bf1bae7e3669e487541f91f27a86b0a.zip
Fixed slow track switching and track pre-buffering. Fixed rockboy
crash while audio is playing. Some buffering adjustments made. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6930 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/playback.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/apps/playback.c b/apps/playback.c
index e6cc68af6b..dccf632dc9 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -61,6 +61,7 @@
61#include "sound.h" 61#include "sound.h"
62#include "metadata.h" 62#include "metadata.h"
63 63
64static volatile bool codec_loaded;
64static volatile bool playing; 65static volatile bool playing;
65static volatile bool paused; 66static volatile bool paused;
66 67
@@ -213,11 +214,20 @@ bool pcm_is_playing(void)
213 return false; 214 return false;
214} 215}
215 216
217bool pcm_is_crossfade_active(void)
218{
219 return false;
220}
221
216bool pcm_is_lowdata(void) 222bool pcm_is_lowdata(void)
217{ 223{
218 return false; 224 return false;
219} 225}
220 226
227void pcm_flush_audio(void)
228{
229}
230
221bool pcm_crossfade_init(void) 231bool pcm_crossfade_init(void)
222{ 232{
223 return false; 233 return false;
@@ -487,7 +497,8 @@ bool codec_seek_buffer_callback(off_t newpos)
487 if (difference >= 0) { 497 if (difference >= 0) {
488 logf("seek: +%d", difference); 498 logf("seek: +%d", difference);
489 codec_advance_buffer_callback(difference); 499 codec_advance_buffer_callback(difference);
490 pcm_play_stop(); 500 if (!pcm_is_crossfade_active())
501 pcm_play_stop();
491 return true; 502 return true;
492 } 503 }
493 504
@@ -508,6 +519,7 @@ bool codec_seek_buffer_callback(off_t newpos)
508 if (buf_ridx < 0) 519 if (buf_ridx < 0)
509 buf_ridx = codecbuflen + buf_ridx; 520 buf_ridx = codecbuflen + buf_ridx;
510 ci.curpos -= difference; 521 ci.curpos -= difference;
522 if (!pcm_is_crossfade_active())
511 pcm_play_stop(); 523 pcm_play_stop();
512 524
513 return true; 525 return true;
@@ -554,7 +566,7 @@ void yield_codecs(void)
554 if (!pcm_is_playing()) 566 if (!pcm_is_playing())
555 sleep(5); 567 sleep(5);
556 while (pcm_is_lowdata() && !ci.stop_codec && 568 while (pcm_is_lowdata() && !ci.stop_codec &&
557 playing && queue_empty(&audio_queue)) 569 playing && queue_empty(&audio_queue) && codecbufused > (128*1024))
558 yield(); 570 yield();
559} 571}
560 572
@@ -937,8 +949,7 @@ void audio_check_buffer(void)
937 949
938 /* Limit buffering size at first run. */ 950 /* Limit buffering size at first run. */
939 if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) { 951 if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) {
940 fill_bytesleft = conf_bufferlimit; 952 fill_bytesleft = conf_bufferlimit - codecbufused;
941 conf_bufferlimit = 0;
942 } 953 }
943 954
944 /* Try to load remainings of the file. */ 955 /* Try to load remainings of the file. */
@@ -956,6 +967,7 @@ void audio_check_buffer(void)
956 last_peek_offset++; 967 last_peek_offset++;
957 } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { 968 } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) {
958 filling = false; 969 filling = false;
970 conf_bufferlimit = 0;
959 pcm_set_boost_mode(false); 971 pcm_set_boost_mode(false);
960 if (playing) 972 if (playing)
961 ata_sleep(); 973 ata_sleep();
@@ -1128,7 +1140,7 @@ void audio_thread(void)
1128 ci.stop_codec = true; 1140 ci.stop_codec = true;
1129 ci.reload_codec = false; 1141 ci.reload_codec = false;
1130 ci.seek_time = 0; 1142 ci.seek_time = 0;
1131 //pcm_play_stop(); 1143 pcm_flush_audio();
1132 audio_play_start((int)ev.data); 1144 audio_play_start((int)ev.data);
1133 break ; 1145 break ;
1134 1146
@@ -1195,6 +1207,7 @@ void codec_thread(void)
1195 switch (ev.id) { 1207 switch (ev.id) {
1196 case CODEC_LOAD_DISK: 1208 case CODEC_LOAD_DISK:
1197 ci.stop_codec = false; 1209 ci.stop_codec = false;
1210 codec_loaded = true;
1198 status = codec_load_file((char *)ev.data); 1211 status = codec_load_file((char *)ev.data);
1199 break ; 1212 break ;
1200 1213
@@ -1209,6 +1222,7 @@ void codec_thread(void)
1209 1222
1210 ci.stop_codec = false; 1223 ci.stop_codec = false;
1211 wrap = (int)&codecbuf[codecbuflen] - (int)cur_ti->codecbuf; 1224 wrap = (int)&codecbuf[codecbuflen] - (int)cur_ti->codecbuf;
1225 codec_loaded = true;
1212 status = codec_load_ram(cur_ti->codecbuf, codecsize, 1226 status = codec_load_ram(cur_ti->codecbuf, codecsize,
1213 &codecbuf[0], wrap); 1227 &codecbuf[0], wrap);
1214 break ; 1228 break ;
@@ -1220,6 +1234,8 @@ void codec_thread(void)
1220 break ; 1234 break ;
1221#endif 1235#endif
1222 } 1236 }
1237
1238 codec_loaded = false;
1223 1239
1224 switch (ev.id) { 1240 switch (ev.id) {
1225 case CODEC_LOAD_DISK: 1241 case CODEC_LOAD_DISK:
@@ -1297,6 +1313,8 @@ void audio_stop(void)
1297{ 1313{
1298 logf("audio_stop"); 1314 logf("audio_stop");
1299 queue_post(&audio_queue, AUDIO_STOP, 0); 1315 queue_post(&audio_queue, AUDIO_STOP, 0);
1316 while (playing || codec_loaded)
1317 yield();
1300} 1318}
1301 1319
1302void audio_pause(void) 1320void audio_pause(void)
@@ -1524,6 +1542,7 @@ void audio_init(void)
1524 filling = false; 1542 filling = false;
1525 codecbuf = &audiobuf[MALLOC_BUFSIZE]; 1543 codecbuf = &audiobuf[MALLOC_BUFSIZE];
1526 playing = false; 1544 playing = false;
1545 codec_loaded = false;
1527 paused = false; 1546 paused = false;
1528 track_changed = false; 1547 track_changed = false;
1529 current_fd = -1; 1548 current_fd = -1;