Index: rockbox/apps/dsp.h =================================================================== RCS file: /cvsroot/rockbox/apps/dsp.h,v retrieving revision 1.18 diff -u -r1.18 dsp.h --- rockbox/apps/dsp.h 22 Apr 2006 14:40:12 -0000 1.18 +++ rockbox/apps/dsp.h 24 Aug 2006 20:21:21 -0000 @@ -31,6 +31,7 @@ enum { CODEC_SET_FILEBUF_WATERMARK = 1, CODEC_SET_FILEBUF_CHUNKSIZE, + CODEC_SET_FILEBUF_PRESEEK, DSP_SET_FREQUENCY, DSP_SWITCH_FREQUENCY, DSP_SET_CLIP_MIN, Index: rockbox/apps/playback.h =================================================================== RCS file: /cvsroot/rockbox/apps/playback.h,v retrieving revision 1.35 diff -u -r1.35 playback.h --- rockbox/apps/playback.h 15 Aug 2006 12:27:04 -0000 1.35 +++ rockbox/apps/playback.h 24 Aug 2006 20:21:21 -0000 @@ -47,7 +47,7 @@ size_t codecsize; /* Codec length in bytes */ bool has_codec; /* Does this track have a codec on the buffer */ - // size_t buf_idx; /* Pointer to the track's buffer */ + size_t buf_idx; /* Pointer to the track's buffer */ size_t filerem; /* Remaining bytes of file NOT in buffer */ size_t filesize; /* File total length */ size_t start_pos; /* Position to first bytes of file in buffer */ Index: rockbox/apps/playback.c =================================================================== RCS file: /cvsroot/rockbox/apps/playback.c,v retrieving revision 1.343 diff -u -r1.343 playback.c --- rockbox/apps/playback.c 23 Aug 2006 14:02:35 -0000 1.343 +++ rockbox/apps/playback.c 24 Aug 2006 20:21:21 -0000 @@ -262,6 +262,7 @@ /* Configuration */ static size_t conf_watermark; static size_t conf_filechunk; +static size_t conf_preseek; static size_t buffer_margin; static bool v1first = false; @@ -952,11 +953,12 @@ filling = false; /* Reset buffer and track pointers */ - buf_ridx = buf_widx = 0; + tracks[track_ridx].buf_idx = buf_ridx = buf_widx = 0; track_widx = track_ridx; cur_ti = &tracks[track_ridx]; audio_clear_track_entries(true, true, false); filebufused = 0; + cur_ti->available = 0; /* Fill the buffer */ last_peek_offset = -1; @@ -1133,16 +1135,16 @@ /* Clear codec buffer. */ track_widx = track_ridx; filebufused = 0; - buf_widx = buf_ridx = 0; + tracks[track_widx].buf_idx = buf_widx = buf_ridx = 0; last_peek_offset = 0; filling = false; initialize_buffer_fill(true); + filling = true; - if (newpos > AUDIO_REBUFFER_GUESS_SIZE) - { - buf_ridx += AUDIO_REBUFFER_GUESS_SIZE; - cur_ti->start_pos = newpos - AUDIO_REBUFFER_GUESS_SIZE; + if (newpos > conf_preseek) { + buf_ridx += conf_preseek; + cur_ti->start_pos = newpos - conf_preseek; } else { @@ -1341,6 +1343,10 @@ conf_filechunk = (unsigned long)value; break; + case CODEC_SET_FILEBUF_PRESEEK: + conf_preseek = (unsigned long)value; + break; + default: if (!dsp_configure(setting, value)) { logf("Illegal key:%d", setting); } } @@ -1465,8 +1471,18 @@ } buf_widx += rc; + + int overlap = buf_widx - tracks[track_ridx].buf_idx; if (buf_widx >= filebuflen) buf_widx -= filebuflen; + if (overlap >= filebuflen) + overlap -= filebuflen; + + if (overlap > 0 && overlap <= rc && tracks[track_ridx].available != 0) { + tracks[track_ridx].buf_idx = buf_widx; + tracks[track_ridx].start_pos += overlap; + } + tracks[track_widx].available += rc; tracks[track_widx].filerem -= rc; @@ -1775,6 +1791,7 @@ current_codec = CODEC_IDX_AUDIO; conf_watermark = AUDIO_DEFAULT_WATERMARK; conf_filechunk = AUDIO_DEFAULT_FILECHUNK; + conf_preseek = AUDIO_REBUFFER_GUESS_SIZE; dsp_configure(DSP_RESET, 0); current_codec = last_codec; } @@ -1886,7 +1903,7 @@ } logf("alt:%s", trackname); - // tracks[track_widx].buf_idx = buf_widx; + tracks[track_widx].buf_idx = buf_widx; audio_read_file(rebuffer);