All pastes #762676 Raw Edit

yield_codec returns

public diff v1 · immutable
#762676 ·published 2007-11-05 20:50 UTC
rendered paste body
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) {