diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2005-11-18 20:21:13 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-11-18 20:21:13 +0000 |
commit | 9c0f1a9e395a4a680e7b2532ebdb468cbeccaca5 (patch) | |
tree | 81c2f4619b1f12503c278dd71f71af47f57f19d0 /apps | |
parent | 88a2a8a53a875f6af90fa2b479dc281e752881d2 (diff) | |
download | rockbox-9c0f1a9e395a4a680e7b2532ebdb468cbeccaca5.tar.gz rockbox-9c0f1a9e395a4a680e7b2532ebdb468cbeccaca5.zip |
More stable playback with reduced stuttering when skipping tracks.
Removed CODEC_SET_FILEBUF_LIMIT setting; now playback.c determines how
to buffer the files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7970 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/codecs/a52.c | 1 | ||||
-rw-r--r-- | apps/codecs/aac.c | 1 | ||||
-rw-r--r-- | apps/codecs/alac.c | 1 | ||||
-rw-r--r-- | apps/codecs/flac.c | 1 | ||||
-rw-r--r-- | apps/codecs/mpa.c | 1 | ||||
-rw-r--r-- | apps/codecs/mpc.c | 1 | ||||
-rw-r--r-- | apps/codecs/shorten.c | 1 | ||||
-rw-r--r-- | apps/codecs/vorbis.c | 1 | ||||
-rw-r--r-- | apps/codecs/wav.c | 1 | ||||
-rw-r--r-- | apps/codecs/wavpack.c | 1 | ||||
-rw-r--r-- | apps/dsp.h | 1 | ||||
-rw-r--r-- | apps/playback.c | 37 |
12 files changed, 22 insertions, 26 deletions
diff --git a/apps/codecs/a52.c b/apps/codecs/a52.c index 050bfff25d..ee80f66892 100644 --- a/apps/codecs/a52.c +++ b/apps/codecs/a52.c | |||
@@ -140,7 +140,6 @@ enum codec_status codec_start(struct codec_api *api) | |||
140 | ci->configure(DSP_SET_SAMPLE_DEPTH, (long *)30); | 140 | ci->configure(DSP_SET_SAMPLE_DEPTH, (long *)30); |
141 | ci->configure(DSP_SET_CLIP_MAX, (long *)((1 << 30) - 1)); | 141 | ci->configure(DSP_SET_CLIP_MAX, (long *)((1 << 30) - 1)); |
142 | ci->configure(DSP_SET_CLIP_MIN, (long *)-(1 << 30)); | 142 | ci->configure(DSP_SET_CLIP_MIN, (long *)-(1 << 30)); |
143 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (long *)(1024*1024*2)); | ||
144 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*128)); | 143 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*128)); |
145 | 144 | ||
146 | next_track: | 145 | next_track: |
diff --git a/apps/codecs/aac.c b/apps/codecs/aac.c index f6a6de53da..c62fb2d007 100644 --- a/apps/codecs/aac.c +++ b/apps/codecs/aac.c | |||
@@ -60,7 +60,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
60 | rb->memcpy(iramstart, iramcopy, iramend-iramstart); | 60 | rb->memcpy(iramstart, iramcopy, iramend-iramstart); |
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2)); | ||
64 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); | 63 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); |
65 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 64 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
66 | 65 | ||
diff --git a/apps/codecs/alac.c b/apps/codecs/alac.c index 1ecaab6b85..deb1e289a7 100644 --- a/apps/codecs/alac.c +++ b/apps/codecs/alac.c | |||
@@ -57,7 +57,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
57 | rb->memcpy(iramstart, iramcopy, iramend-iramstart); | 57 | rb->memcpy(iramstart, iramcopy, iramend-iramstart); |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*10)); | ||
61 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 60 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
62 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); | 61 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); |
63 | 62 | ||
diff --git a/apps/codecs/flac.c b/apps/codecs/flac.c index b94152dec5..7639b9a352 100644 --- a/apps/codecs/flac.c +++ b/apps/codecs/flac.c | |||
@@ -233,7 +233,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
233 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); | 233 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); |
234 | #endif | 234 | #endif |
235 | 235 | ||
236 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*10)); | ||
237 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 236 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
238 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); | 237 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); |
239 | 238 | ||
diff --git a/apps/codecs/mpa.c b/apps/codecs/mpa.c index c6342df262..0f575924d0 100644 --- a/apps/codecs/mpa.c +++ b/apps/codecs/mpa.c | |||
@@ -95,7 +95,6 @@ enum codec_status codec_start(struct codec_api *api) | |||
95 | ci->configure(DSP_SET_SAMPLE_DEPTH, (int *)(MAD_F_FRACBITS)); | 95 | ci->configure(DSP_SET_SAMPLE_DEPTH, (int *)(MAD_F_FRACBITS)); |
96 | ci->configure(DSP_SET_CLIP_MIN, (int *)-MAD_F_ONE); | 96 | ci->configure(DSP_SET_CLIP_MIN, (int *)-MAD_F_ONE); |
97 | ci->configure(DSP_SET_CLIP_MAX, (int *)(MAD_F_ONE - 1)); | 97 | ci->configure(DSP_SET_CLIP_MAX, (int *)(MAD_F_ONE - 1)); |
98 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*2)); | ||
99 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); | 98 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*16)); |
100 | 99 | ||
101 | ci->memset(&stream, 0, sizeof(struct mad_stream)); | 100 | ci->memset(&stream, 0, sizeof(struct mad_stream)); |
diff --git a/apps/codecs/mpc.c b/apps/codecs/mpc.c index 0f113c7bdc..db2501525e 100644 --- a/apps/codecs/mpc.c +++ b/apps/codecs/mpc.c | |||
@@ -96,7 +96,6 @@ enum codec_status codec_start(struct codec_api *api) | |||
96 | /* disable these until we can figure out what's going on. | 96 | /* disable these until we can figure out what's going on. |
97 | ci->configure(DSP_SET_CLIP_MAX, (long *)MPC_FIXED_POINT_SCALE); | 97 | ci->configure(DSP_SET_CLIP_MAX, (long *)MPC_FIXED_POINT_SCALE); |
98 | ci->configure(DSP_SET_CLIP_MIN, (long *)-MPC_FIXED_POINT_SCALE);*/ | 98 | ci->configure(DSP_SET_CLIP_MIN, (long *)-MPC_FIXED_POINT_SCALE);*/ |
99 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (long *)(1024*1024*2)); | ||
100 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*16)); | 99 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (long *)(1024*16)); |
101 | 100 | ||
102 | /* Create a decoder instance */ | 101 | /* Create a decoder instance */ |
diff --git a/apps/codecs/shorten.c b/apps/codecs/shorten.c index 50d72997ce..26b5e09d6c 100644 --- a/apps/codecs/shorten.c +++ b/apps/codecs/shorten.c | |||
@@ -56,7 +56,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
56 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); | 56 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); |
57 | #endif | 57 | #endif |
58 | 58 | ||
59 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*10)); | ||
60 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 59 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
61 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); | 60 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); |
62 | 61 | ||
diff --git a/apps/codecs/vorbis.c b/apps/codecs/vorbis.c index 1fbe131e10..69eba24bb8 100644 --- a/apps/codecs/vorbis.c +++ b/apps/codecs/vorbis.c | |||
@@ -135,7 +135,6 @@ enum codec_status codec_start(struct codec_api *api) | |||
135 | /* Note: These are sane defaults for these values. Perhaps | 135 | /* Note: These are sane defaults for these values. Perhaps |
136 | * they should be set differently based on quality setting | 136 | * they should be set differently based on quality setting |
137 | */ | 137 | */ |
138 | rb->configure(CODEC_SET_FILEBUF_LIMIT, (long *)(1024*1024*2)); | ||
139 | 138 | ||
140 | /* The chunk size below is magic. If set any lower, resume | 139 | /* The chunk size below is magic. If set any lower, resume |
141 | * doesn't work properly (ov_raw_seek() does the wrong thing). | 140 | * doesn't work properly (ov_raw_seek() does the wrong thing). |
diff --git a/apps/codecs/wav.c b/apps/codecs/wav.c index 6bf7bcd408..85e24124ab 100644 --- a/apps/codecs/wav.c +++ b/apps/codecs/wav.c | |||
@@ -237,7 +237,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
237 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); | 237 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*10)); | ||
241 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 240 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
242 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*256)); | 241 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*256)); |
243 | 242 | ||
diff --git a/apps/codecs/wavpack.c b/apps/codecs/wavpack.c index 93f5002538..21c194773b 100644 --- a/apps/codecs/wavpack.c +++ b/apps/codecs/wavpack.c | |||
@@ -58,7 +58,6 @@ enum codec_status codec_start(struct codec_api* api) | |||
58 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); | 58 | ci->memcpy(iramstart, iramcopy, iramend-iramstart); |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | ci->configure(CODEC_SET_FILEBUF_LIMIT, (int *)(1024*1024*10)); | ||
62 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); | 61 | ci->configure(CODEC_SET_FILEBUF_WATERMARK, (int *)(1024*512)); |
63 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); | 62 | ci->configure(CODEC_SET_FILEBUF_CHUNKSIZE, (int *)(1024*128)); |
64 | 63 | ||
diff --git a/apps/dsp.h b/apps/dsp.h index 19ba6db980..f250d89708 100644 --- a/apps/dsp.h +++ b/apps/dsp.h | |||
@@ -31,7 +31,6 @@ | |||
31 | enum { | 31 | enum { |
32 | CODEC_SET_FILEBUF_WATERMARK = 1, | 32 | CODEC_SET_FILEBUF_WATERMARK = 1, |
33 | CODEC_SET_FILEBUF_CHUNKSIZE, | 33 | CODEC_SET_FILEBUF_CHUNKSIZE, |
34 | CODEC_SET_FILEBUF_LIMIT, | ||
35 | CODEC_DSP_ENABLE, | 34 | CODEC_DSP_ENABLE, |
36 | DSP_SET_FREQUENCY, | 35 | DSP_SET_FREQUENCY, |
37 | DSP_SWITCH_FREQUENCY, | 36 | DSP_SWITCH_FREQUENCY, |
diff --git a/apps/playback.c b/apps/playback.c index 6a944c9dc8..2418eba367 100644 --- a/apps/playback.c +++ b/apps/playback.c | |||
@@ -81,6 +81,7 @@ static volatile bool paused; | |||
81 | #define CODEC_AAC "/.rockbox/codecs/aac.codec" | 81 | #define CODEC_AAC "/.rockbox/codecs/aac.codec" |
82 | #define CODEC_SHN "/.rockbox/codecs/shorten.codec" | 82 | #define CODEC_SHN "/.rockbox/codecs/shorten.codec" |
83 | 83 | ||
84 | #define AUDIO_DEFAULT_FIRST_LIMIT (1024*1024*10) | ||
84 | #define AUDIO_FILL_CYCLE (1024*256) | 85 | #define AUDIO_FILL_CYCLE (1024*256) |
85 | #define AUDIO_DEFAULT_WATERMARK (1024*512) | 86 | #define AUDIO_DEFAULT_WATERMARK (1024*512) |
86 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) | 87 | #define AUDIO_DEFAULT_FILECHUNK (1024*32) |
@@ -717,10 +718,6 @@ void codec_configure_callback(int setting, void *value) | |||
717 | conf_filechunk = (unsigned int)value; | 718 | conf_filechunk = (unsigned int)value; |
718 | break; | 719 | break; |
719 | 720 | ||
720 | case CODEC_SET_FILEBUF_LIMIT: | ||
721 | conf_bufferlimit = (unsigned int)value; | ||
722 | break; | ||
723 | |||
724 | case CODEC_DSP_ENABLE: | 721 | case CODEC_DSP_ENABLE: |
725 | if ((bool)value) | 722 | if ((bool)value) |
726 | ci.pcmbuf_insert = codec_pcmbuf_insert_callback; | 723 | ci.pcmbuf_insert = codec_pcmbuf_insert_callback; |
@@ -1009,9 +1006,11 @@ bool read_next_metadata(void) | |||
1009 | fd = open(trackname, O_RDONLY); | 1006 | fd = open(trackname, O_RDONLY); |
1010 | if (fd < 0) | 1007 | if (fd < 0) |
1011 | return false; | 1008 | return false; |
1012 | 1009 | ||
1013 | /* Start buffer refilling also because we need to spin-up the disk. */ | 1010 | /** Start buffer refilling also because we need to spin-up the disk. |
1014 | filling = true; | 1011 | * In fact, it might be better not to start filling here, because if user |
1012 | * is manipulating the playlist a lot, we will just lose battery. */ | ||
1013 | // filling = true; | ||
1015 | tracks[next_track].id3.codectype = probe_file_format(trackname); | 1014 | tracks[next_track].id3.codectype = probe_file_format(trackname); |
1016 | status = get_metadata(&tracks[next_track],fd,trackname,v1first); | 1015 | status = get_metadata(&tracks[next_track],fd,trackname,v1first); |
1017 | tracks[next_track].id3.codectype = 0; | 1016 | tracks[next_track].id3.codectype = 0; |
@@ -1081,7 +1080,7 @@ bool audio_load_track(int offset, bool start_play, int peek_offset) | |||
1081 | if (start_play) { | 1080 | if (start_play) { |
1082 | int last_codec = current_codec; | 1081 | int last_codec = current_codec; |
1083 | current_codec = CODEC_IDX_AUDIO; | 1082 | current_codec = CODEC_IDX_AUDIO; |
1084 | conf_bufferlimit = 0; | 1083 | conf_bufferlimit = AUDIO_DEFAULT_FIRST_LIMIT; |
1085 | conf_watermark = AUDIO_DEFAULT_WATERMARK; | 1084 | conf_watermark = AUDIO_DEFAULT_WATERMARK; |
1086 | conf_filechunk = AUDIO_DEFAULT_FILECHUNK; | 1085 | conf_filechunk = AUDIO_DEFAULT_FILECHUNK; |
1087 | dsp_configure(DSP_RESET, 0); | 1086 | dsp_configure(DSP_RESET, 0); |
@@ -1329,13 +1328,13 @@ void initialize_buffer_fill(void) | |||
1329 | { | 1328 | { |
1330 | int cur_idx, i; | 1329 | int cur_idx, i; |
1331 | 1330 | ||
1332 | 1331 | /* Initialize only once; do not truncate the tracks. */ | |
1333 | fill_bytesleft = filebuflen - filebufused; | ||
1334 | cur_ti->start_pos = ci.curpos; | ||
1335 | |||
1336 | if (filling) | 1332 | if (filling) |
1337 | return ; | 1333 | return ; |
1338 | 1334 | ||
1335 | fill_bytesleft = filebuflen - filebufused; | ||
1336 | cur_ti->start_pos = ci.curpos; | ||
1337 | |||
1339 | pcmbuf_set_boost_mode(true); | 1338 | pcmbuf_set_boost_mode(true); |
1340 | 1339 | ||
1341 | filling = true; | 1340 | filling = true; |
@@ -1392,8 +1391,14 @@ void audio_check_buffer(void) | |||
1392 | 1391 | ||
1393 | /* Load new files to fill the entire buffer. */ | 1392 | /* Load new files to fill the entire buffer. */ |
1394 | if (audio_load_track(0, false, last_peek_offset + 1)) { | 1393 | if (audio_load_track(0, false, last_peek_offset + 1)) { |
1395 | 1394 | if (conf_bufferlimit) | |
1396 | } else if (tracks[track_widx].filerem == 0 || fill_bytesleft == 0) { | 1395 | fill_bytesleft = 0; |
1396 | } | ||
1397 | else if (tracks[track_widx].filerem == 0) | ||
1398 | fill_bytesleft = 0; | ||
1399 | |||
1400 | if (fill_bytesleft <= 0) | ||
1401 | { | ||
1397 | /* Read next unbuffered track's metadata as necessary. */ | 1402 | /* Read next unbuffered track's metadata as necessary. */ |
1398 | read_next_metadata(); | 1403 | read_next_metadata(); |
1399 | 1404 | ||
@@ -1659,7 +1664,7 @@ void audio_thread(void) | |||
1659 | bool play_pending = false; | 1664 | bool play_pending = false; |
1660 | 1665 | ||
1661 | while (1) { | 1666 | while (1) { |
1662 | if (!play_pending) | 1667 | if (!play_pending && queue_empty(&audio_queue)) |
1663 | { | 1668 | { |
1664 | yield_codecs(); | 1669 | yield_codecs(); |
1665 | audio_check_buffer(); | 1670 | audio_check_buffer(); |
@@ -1683,12 +1688,14 @@ void audio_thread(void) | |||
1683 | * fast to prevent UI lag. */ | 1688 | * fast to prevent UI lag. */ |
1684 | track_count = 0; | 1689 | track_count = 0; |
1685 | last_peek_offset = 0; | 1690 | last_peek_offset = 0; |
1691 | track_changed = true; | ||
1686 | if (current_tick - last_tick < HZ/2) | 1692 | if (current_tick - last_tick < HZ/2) |
1687 | { | 1693 | { |
1688 | play_pending = true; | 1694 | play_pending = true; |
1689 | break ; | 1695 | break ; |
1690 | } | 1696 | } |
1691 | play_pending = false; | 1697 | play_pending = false; |
1698 | last_tick = current_tick; | ||
1692 | 1699 | ||
1693 | /* Do not start crossfading if audio is paused. */ | 1700 | /* Do not start crossfading if audio is paused. */ |
1694 | if (paused) | 1701 | if (paused) |