From 5a8f5b833093961096c7787ed46a18b4d69b554c Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 9 May 2011 21:19:11 +0000 Subject: [PATCH] Provide a reasonable fix for FS#12093 - Playback hanging after codec/playback rework. Also, get rid of an impossible buffering case (BUF_USED is always less than buffer_len) and remove a buffering API that is not used anywhere and shouldn't be needed (plugin API has to be incompatible). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29849 a1c6a512-1295-4272-9138-f99709370657 --- apps/buffering.c | 27 ++++++++++++--------------- apps/buffering.h | 2 -- apps/plugin.c | 1 - apps/plugin.h | 5 ++--- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/apps/buffering.c b/apps/buffering.c index a130a787ff..c47564b7e1 100644 --- a/apps/buffering.c +++ b/apps/buffering.c @@ -1339,7 +1339,8 @@ static struct memory_handle *prep_bufdata(int handle_id, size_t *size, if (h->filerem > 0 && avail < realsize) { /* Data isn't ready. Request buffering */ - buf_request_buffer_handle(handle_id); + LOGFQUEUE("buffering >| Q_START_FILL %d",handle_id); + queue_send(&buffering_queue, Q_START_FILL, handle_id); /* Wait for the data to be ready */ do { @@ -1486,7 +1487,6 @@ SECONDARY EXPORTED FUNCTIONS ============================ buf_handle_offset -buf_request_buffer_handle buf_set_base_handle buf_handle_data_type buf_is_handle @@ -1510,12 +1510,6 @@ ssize_t buf_handle_offset(int handle_id) return h->offset; } -void buf_request_buffer_handle(int handle_id) -{ - LOGFQUEUE("buffering >| Q_START_FILL %d",handle_id); - queue_send(&buffering_queue, Q_START_FILL, handle_id); -} - void buf_set_base_handle(int handle_id) { mutex_lock(&llist_mutex); @@ -1642,7 +1636,15 @@ static void NORETURN_ATTR buffering_thread(void) LOGFQUEUE("buffering < Q_START_FILL %d", (int)ev.data); shrink_buffer(); queue_reply(&buffering_queue, 1); - filling |= buffer_handle((int)ev.data, 0); + if (buffer_handle((int)ev.data, 0)) { + filling = true; + } + else if (num_handles > 0 && conf_watermark > 0) { + update_data_counters(NULL); + if (data_counters.useful >= BUF_WATERMARK) { + send_event(BUFFER_EVENT_BUFFER_LOW, NULL); + } + } break; case Q_BUFFER_HANDLE: @@ -1699,12 +1701,7 @@ static void NORETURN_ATTR buffering_thread(void) #endif if (filling) { - if (data_counters.remaining > 0 && BUF_USED < buffer_len) { - filling = fill_buffer(); - } - else if (data_counters.remaining == 0) { - filling = false; - } + filling = data_counters.remaining > 0 ? fill_buffer() : false; } else if (ev.id == SYS_TIMEOUT) { if (data_counters.useful < BUF_WATERMARK) { /* The buffer is low and we're idle, just watching the levels diff --git a/apps/buffering.h b/apps/buffering.h index 2e4cfd3968..ee3e7c9053 100644 --- a/apps/buffering.h +++ b/apps/buffering.h @@ -95,7 +95,6 @@ ssize_t bufcuttail(int handle_id, size_t size); * buf_is_handle: is the handle valid? * buf_pin_handle: Disallow/allow handle movement. Handle may still be removed. * buf_handle_offset: Get the offset of the first buffered byte from the file - * buf_request_buffer_handle: Request buffering of a handle * buf_set_base_handle: Tell the buffering thread which handle is currently read * buf_length: Total size of ringbuffer * buf_used: Total amount of buffer space used (including allocated space) @@ -106,7 +105,6 @@ enum data_type buf_handle_data_type(int handle_id); ssize_t buf_handle_remaining(int handle_id); bool buf_is_handle(int handle_id); ssize_t buf_handle_offset(int handle_id); -void buf_request_buffer_handle(int handle_id); void buf_set_base_handle(int handle_id); size_t buf_length(void); size_t buf_used(void); diff --git a/apps/plugin.c b/apps/plugin.c index bb326d937b..d9f7c4e24c 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -747,7 +747,6 @@ static const struct plugin_api rockbox_api = { bufcuttail, buf_handle_offset, - buf_request_buffer_handle, buf_set_base_handle, buf_used, #endif diff --git a/apps/plugin.h b/apps/plugin.h index cdf34e28b1..f15c626667 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -145,12 +145,12 @@ void* plugin_get_buffer(size_t *buffer_size); #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 204 +#define PLUGIN_API_VERSION 205 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any new function which are "waiting" at the end of the function table) */ -#define PLUGIN_MIN_API_VERSION 204 +#define PLUGIN_MIN_API_VERSION 205 /* plugin return codes */ /* internal returns start at 0x100 to make exit(1..255) work */ @@ -873,7 +873,6 @@ struct plugin_api { ssize_t (*bufcuttail)(int handle_id, size_t size); ssize_t (*buf_handle_offset)(int handle_id); - void (*buf_request_buffer_handle)(int handle_id); void (*buf_set_base_handle)(int handle_id); size_t (*buf_used)(void); #endif