summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-06-29 14:46:27 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-06-29 14:46:27 +0000
commitde3b04ee28ecf83a187abb6864387f039dfabcec (patch)
treede4fb3b8ec13e4772f0e70502c46f2e0684087d1 /apps
parentee3405390331a2c9b2db9882f9a3af5892936cb7 (diff)
downloadrockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.zip
rockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.tar.gz
rockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.tar.bz2
rockbox-de3b04ee28ecf83a187abb6864387f039dfabcec.tar.xz
Fixed buffering problems with dynamic playlist handling. Increased
codec buffer default watermark to prevent skipping. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6922 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/playback.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/apps/playback.c b/apps/playback.c
index 5721e7c..e6cc68a 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -73,7 +73,7 @@ static volatile bool paused;
#define CODEC_WAVPACK "/.rockbox/codecs/wavpack.codec";
#define AUDIO_FILL_CYCLE (1024*256)
-#define AUDIO_DEFAULT_WATERMARK (1024*256)
+#define AUDIO_DEFAULT_WATERMARK (1024*512)
#define AUDIO_DEFAULT_FILECHUNK (1024*32)
#define AUDIO_PLAY 1
@@ -724,11 +724,12 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
off_t size;
int rc, i;
int copy_n;
-
+
if (track_count >= MAX_TRACK || tracks[track_widx].filesize != 0
|| current_fd >= 0)
return false;
-
+
+ logf("Buffering track:%d/%d", track_widx, track_ridx);
trackname = playlist_peek(peek_offset);
if (!trackname) {
logf("End-of-playlist");
@@ -737,8 +738,10 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
}
fd = open(trackname, O_RDONLY);
- if (fd < 0)
+ if (fd < 0) {
+ logf("Open failed");
return false;
+ }
size = filesize(fd);
tracks[track_widx].filerem = size;
@@ -770,7 +773,6 @@ bool audio_load_track(int offset, bool start_play, int peek_offset)
tracks[track_widx].start_pos = 0;
//logf("%s", trackname);
- logf("Buffering track:%d/%d", track_widx, track_ridx);
if (!get_metadata(&tracks[track_widx],fd,trackname,v1first)) {
close(fd);
@@ -896,10 +898,15 @@ void initialize_buffer_fill(void)
{
int cur_idx, i;
- pcm_set_boost_mode(true);
fill_bytesleft = codecbuflen - codecbufused;
tracks[track_widx].start_pos = ci.curpos;
+
+ if (filling)
+ return ;
+
+ filling = true;
+ pcm_set_boost_mode(true);
/* Calculate real track count after throwing away old tracks. */
cur_idx = track_ridx;
@@ -926,10 +933,7 @@ void audio_check_buffer(void)
|| !playing || ci.stop_codec || ci.reload_codec) && !filling)
return ;
- if (!filling) {
- initialize_buffer_fill();
- filling = true;
- }
+ initialize_buffer_fill();
/* Limit buffering size at first run. */
if (conf_bufferlimit && (int)fill_bytesleft >= conf_bufferlimit) {
@@ -1097,6 +1101,11 @@ void audio_invalidate_tracks(void)
}
track_count = 1;
+ last_peek_offset = 1;
+ if (cur_ti->filerem == 0 && current_fd >= 0) {
+ close(current_fd);
+ current_fd = -1;
+ }
track_widx = track_ridx;
audio_clear_track_entries();
codecbufused = cur_ti->available;