diff --git a/apps/buffering.c b/apps/buffering.cindex dcc753e..0fe6e5e 100644--- a/apps/buffering.c+++ b/apps/buffering.c@@ -513,6 +513,35 @@ fill_buffer : Call buffer_handle for all handles that have data to buffer These functions are used by the buffering thread to manage buffer space. */+void update_data_counters(void);++static inline bool buffer_is_low(void)+{+ update_data_counters();+ return data_counters.useful < BUFFERING_CRITICAL_LEVEL;+}++/* Yield to the codec thread for as long as possible if it is in need of data.+ Return true if the caller should break to let the buffering thread process+ new queue events */+static bool yield_codec(void)+{+ yield();++ if (!queue_empty(&buffering_queue))+ return true;++ while (pcmbuf_is_lowdata() && !buffer_is_low())+ {+ sleep(2);+ trigger_cpu_boost();++ if (!queue_empty(&buffering_queue))+ return true;+ }++ return false;+} /* Buffer data for the given handle. Return whether or not the buffering should continue explicitly. */@@ -596,20 +625,10 @@ static bool buffer_handle(int handle_id) h->available += rc; h->filerem -= rc;- yield();- /* If this is a large file, see if we need to breakor give the codec+ /* If this is a large file, see if we need to break or give the codec * more time */- if (h->type==TYPE_PACKET_AUDIO) {- if (!queue_empty(&buffering_queue))- break;- if (pcmbuf_is_lowdata())- {- sleep(2);- trigger_cpu_boost();- if (!queue_empty(&buffering_queue))- break;- }- }+ if (h->type==TYPE_PACKET_AUDIO && yield_codec())+ break; } if (h->filerem == 0) {