diff --git a/apps/buffering.c b/apps/buffering.cindex dcc753e..9573ce4 100644--- a/apps/buffering.c+++ b/apps/buffering.c@@ -514,6 +514,34 @@ These functions are used by the buffering thread to manage buffer space. */+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. */ static bool buffer_handle(int handle_id)@@ -599,17 +627,8 @@ static bool buffer_handle(int handle_id) yield(); /* If this is a large file, see if we need to breakor 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) {