From 0298adb8710ca26cf1e900b087bd53ea4075cea1 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Fri, 15 Apr 2011 09:55:58 +0000 Subject: [PATCH] timeside/decoder/sink.py: add gst sink --- timeside/decoder/sink.py | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 timeside/decoder/sink.py diff --git a/timeside/decoder/sink.py b/timeside/decoder/sink.py new file mode 100644 index 0000000..c91c2a0 --- /dev/null +++ b/timeside/decoder/sink.py @@ -0,0 +1,55 @@ +import pygst +pygst.require('0.10') +import gst +import gobject +gobject.threads_init() + +class TimesideSink(gst.BaseSink): + """ + a simple sink element with a hopsize property to adjust the size of the buffer emitted + """ + _caps = gst.caps_from_string('audio/x-raw-float, \ + rate=[ 1, 2147483647 ], \ + channels=[ 1, 2147483647 ], \ + endianness={ 1234, 4321 }, \ + width=32') + + __gsttemplates__ = ( + gst.PadTemplate ("sink", + gst.PAD_SINK, + gst.PAD_ALWAYS, + _caps), + ) + + def __init__(self, name): + self.__gobject_init__() + self.set_name(name) + self.adapter = gst.Adapter() + self.set_property('sync', False) + + def set_property(self, name, value): + if name == 'hopsize': + # blocksize is in byte, convert from hopsize + from struct import calcsize + self.set_property('blocksize', value * calcsize('f')) + else: + super(gst.BaseSink, self).set_property(name, value) + + def do_render(self, buffer): + self.adapter.push(buffer) + return gst.FLOW_OK + + def pull(self): + # TODO use signals + blocksize = self.get_property('blocksize') + remaining = self.adapter.available() + if remaining == 0: + return None + if remaining >= blocksize: + return self.adapter.take_buffer(blocksize) + if remaining < blocksize and remaining > 0: + return self.adapter.take_buffer(remaining) + +gobject.type_register(TimesideSink) + + -- 2.39.5