From 8086853a907f38d3b71de94dd0ca5adb371a015b Mon Sep 17 00:00:00 2001 From: Nicolas Pennequin Date: Thu, 18 Oct 2007 16:28:11 +0200 Subject: [PATCH] No bufclosing of handles after track change Forwards and backwards skipping are now symetrical. Skipping forwards won't result in discarding data from the buffer anymore, which makes backwards skipping to a track in the buffer very much faster. --- apps/buffering.c | 19 +++++++++++++++++++ apps/buffering.h | 3 +++ apps/debug_menu.c | 7 +++---- apps/playback.c | 7 ++++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/apps/buffering.c b/apps/buffering.c index e53fe70d0..852434cfc 100644 --- a/apps/buffering.c +++ b/apps/buffering.c @@ -654,6 +654,24 @@ static size_t buffered_data(void) return ret; } +size_t useful_data(int start_handle_id) +{ + /* use a static var to remember which handle to start with when the caller + doesn't have access to the playback data. */ + static int start_id = 0; + if (start_handle_id > 0) + start_id = start_handle_id; + + size_t ret = 0; + struct memory_handle *m = first_handle; + while (m) { + if (m->id >= start_id) + ret += m->available - RINGBUF_SUB(m->ridx, m->data); + m = m->next; + } + return ret; +} + /* BUFFERING API FUNCTIONS @@ -1080,4 +1098,5 @@ void buffering_get_debugdata(struct buffering_debug *dbgdata) dbgdata->data_rem = data_rem(); dbgdata->wasted_space = wasted_space(); dbgdata->buffered_data = buffered_data(); + dbgdata->useful_data = useful_data(0); } diff --git a/apps/buffering.h b/apps/buffering.h index f206b113c..bd8de9b3b 100644 --- a/apps/buffering.h +++ b/apps/buffering.h @@ -39,6 +39,7 @@ struct buffering_debug { size_t buffered_data; size_t wasted_space; size_t data_rem; + size_t useful_data; }; enum data_type { @@ -58,6 +59,8 @@ bool buffering_init(char *filebuf, size_t filebuflen); /* Amount of buffer space used */ size_t bufused(void); +size_t useful_data(int start_handle_id); + /* Reserve space in the buffer for a file */ int bufopen(char *file, size_t offset, enum data_type type); diff --git a/apps/debug_menu.c b/apps/debug_menu.c index e95bccd83..8107409a3 100644 --- a/apps/debug_menu.c +++ b/apps/debug_menu.c @@ -408,13 +408,12 @@ static bool dbg_buffering_thread(void) filebuflen, 0, d.buffered_data, HORIZONTAL); line++; - snprintf(buf, sizeof(buf), "usefl: %8ld/%8ld", - (long)(d.buffered_data - d.wasted_space), (long)filebuflen); + snprintf(buf, sizeof(buf), "usefl: %8ld/%8ld", (long)(d.useful_data), + (long)filebuflen); lcd_puts(0, line++, buf); gui_scrollbar_draw(&screens[SCREEN_MAIN],0, line*8, LCD_WIDTH, 6, - filebuflen, 0, d.buffered_data - d.wasted_space, - HORIZONTAL); + filebuflen, 0, d.useful_data, HORIZONTAL); line++; #ifndef SIMULATOR diff --git a/apps/playback.c b/apps/playback.c index ad4cf18f2..7256ab6fd 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -1515,7 +1515,8 @@ static void codec_advance_buffer_counters(size_t amount) /* Start buffer filling as necessary. */ if (!pcmbuf_is_lowdata() && !filling) { - if (bufused() < conf_watermark && playing && !playlist_end) + if (useful_data(CUR_TI->audio_hid) < conf_watermark && + playing && !playlist_end) { LOGFQUEUE("codec > audio Q_AUDIO_FILL_BUFFER"); queue_post(&audio_queue, Q_AUDIO_FILL_BUFFER, 0); @@ -1895,6 +1896,8 @@ static bool codec_request_next_track_callback(void) if (!codec_load_next_track()) return false; + codec_seek_buffer_callback(0); + /* Check if the next codec is the same file. */ if (prev_codectype == get_codec_base_type(curtrack_id3.codectype)) { @@ -3106,12 +3109,14 @@ static int audio_check_new_track(void) /* Save the old track */ /* prev_ti = CUR_TI; */ +#if 0 int i, idx; for (i = 0; i < ci.new_track; i++) { idx = (track_ridx + i) & MAX_TRACK_MASK; clear_track_info(&tracks[idx]); } +#endif /* Move to the new track */ track_ridx += ci.new_track; -- 2.11.4.GIT