]> git.parisson.com Git - timeside.git/commitdiff
timeside/decoder/sink.py: add condition values to prepare running gst mainloop in...
authorPaul Brossier <piem@piem.org>
Wed, 7 Dec 2011 00:58:30 +0000 (16:58 -0800)
committerPaul Brossier <piem@piem.org>
Wed, 7 Dec 2011 00:58:30 +0000 (16:58 -0800)
timeside/decoder/sink.py

index c91c2a080ee0ab992463d3194ee28e76c4982588..878811e1272a4ab7606817e31e185604aceaaae2 100644 (file)
@@ -22,6 +22,9 @@ class TimesideSink(gst.BaseSink):
             )
 
     def __init__(self, name):
+        import threading
+        self.cv = threading.Condition(threading.Lock())
+        self.eos = 0
         self.__gobject_init__()
         self.set_name(name)
         self.adapter = gst.Adapter()
@@ -36,19 +39,35 @@ class TimesideSink(gst.BaseSink):
             super(gst.BaseSink, self).set_property(name, value)
 
     def do_render(self, buffer):
+        self.cv.acquire()
         self.adapter.push(buffer)
+        if self.adapter.available() == 0: self.eos = 1
+        self.cv.notify()
+        self.cv.release()
         return gst.FLOW_OK
 
+    def on_eos(self):
+        self.cv.acquire()
+        self.eos = 1
+        self.cv.notify()
+        self.cv.release()
+
     def pull(self):
+        self.cv.acquire()
+        while not self.adapter.available():
+            if self.eos: break
+            self.cv.wait()
         # TODO use signals
         blocksize = self.get_property('blocksize')
         remaining = self.adapter.available()
         if remaining == 0:
-            return None
+            ret = None
         if remaining >= blocksize:
-            return self.adapter.take_buffer(blocksize)
+            ret = self.adapter.take_buffer(blocksize)
         if remaining < blocksize and remaining > 0:
-            return self.adapter.take_buffer(remaining)
+            ret = self.adapter.take_buffer(remaining)
+        self.cv.release()
+        return ret
 
 gobject.type_register(TimesideSink)