diff --git a/apps/buffering.c b/apps/buffering.c index 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) {