summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-11-18 20:21:13 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-11-18 20:21:13 +0000
commit9c0f1a9e395a4a680e7b2532ebdb468cbeccaca5 (patch)
tree81c2f4619b1f12503c278dd71f71af47f57f19d0 /apps
parent88a2a8a53a875f6af90fa2b479dc281e752881d2 (diff)
downloadrockbox-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.c1
-rw-r--r--apps/codecs/aac.c1
-rw-r--r--apps/codecs/alac.c1
-rw-r--r--apps/codecs/flac.c1
-rw-r--r--apps/codecs/mpa.c1
-rw-r--r--apps/codecs/mpc.c1
-rw-r--r--apps/codecs/shorten.c1
-rw-r--r--apps/codecs/vorbis.c1
-rw-r--r--apps/codecs/wav.c1
-rw-r--r--apps/codecs/wavpack.c1
-rw-r--r--apps/dsp.h1
-rw-r--r--apps/playback.c37
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
146next_track: 145next_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 @@
31enum { 31enum {
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)