ref: 6bc52ccb94437b5b0f1e5eb450d56aa1b23aa9b3
parent: 2c31bb6b028f50b06ec6743e13a93cba6e68cc66
author: Paul Brossier <piem@piem.org>
date: Sun Dec 8 06:49:46 EST 2013
python/: moved old gst hack to python.old for now
--- /dev/null
+++ b/python.old/aubioinput.py
@@ -1,0 +1,141 @@
+#! /usr/bin/python
+
+import pygst
+pygst.require('0.10')
+import gst
+import gobject
+gobject.threads_init ()
+
+def gst_buffer_to_numpy_array(buffer, chan):
+ import numpy
+ samples = numpy.frombuffer(buffer.data, dtype=numpy.float32)
+ if chan == 1:
+ return samples.T
+ else:
+ samples.resize([len(samples)/chan, chan])
+ return samples.T
+
+class AubioSink(gst.BaseSink):
+ _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, process):
+ self.__gobject_init__()
+ self.set_name(name)
+ self.process = process
+ self.adapter = gst.Adapter()
+ self.set_property('sync', False)
+ self.pos = 0
+
+ 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):
+ blocksize = self.get_property('blocksize')
+ caps = buffer.get_caps()
+ chan = caps[0]['channels']
+ self.adapter.push(buffer)
+ while self.adapter.available() >= blocksize:
+ block = self.adapter.take_buffer(blocksize)
+ v = gst_buffer_to_numpy_array(block, chan)
+ if self.process:
+ self.process(v, self.pos)
+ self.pos += 1
+ remaining = self.adapter.available()
+ if remaining < blocksize and remaining > 0:
+ block = self.adapter.take_buffer(remaining)
+ v = gst_buffer_to_numpy_array(block, chan)
+ if self.process:
+ self.process(v, self.pos)
+ self.pos += 1
+ return gst.FLOW_OK
+
+gobject.type_register(AubioSink)
+
+class aubioinput(gst.Bin):
+
+ ret = 0
+
+ def __init__(self, uri, process = None, hopsize = 512,
+ caps = None):
+ if uri.startswith('/'):
+ from urllib import quote
+ uri = 'file://'+quote(uri)
+ src = gst.element_factory_make('uridecodebin')
+ src.set_property('uri', uri)
+ src.connect('pad-added', self.source_pad_added_cb)
+ conv = gst.element_factory_make('audioconvert')
+ self.conv = conv
+ rsmpl = gst.element_factory_make('audioresample')
+ capsfilter = gst.element_factory_make('capsfilter')
+ if caps:
+ capsfilter.set_property('caps', gst.caps_from_string(caps))
+ sink = AubioSink("AubioSink", process = process)
+ sink.set_property('hopsize', hopsize) # * calcsize('f'))
+
+ self.pipeline = gst.Pipeline()
+
+ self.bus = self.pipeline.get_bus()
+ self.bus.add_signal_watch()
+ self.bus.connect('message', self.on_eos)
+
+ self.apad = conv.get_pad('sink')
+
+ self.pipeline.add(src, conv, rsmpl, capsfilter, sink)
+
+ gst.element_link_many(conv, rsmpl, capsfilter, sink)
+
+ self.mainloop = gobject.MainLoop()
+ self.pipeline.set_state(gst.STATE_PLAYING)
+
+ def run(self):
+ self.mainloop.run()
+ return self.ret
+
+ def source_pad_added_cb(self, src, pad):
+ name = pad.get_caps()[0].get_name()
+ if name == 'audio/x-raw-float' or name == 'audio/x-raw-int':
+ pad.link(self.conv.get_pad("sink"))
+
+ def source_pad_removed_cb(self, src, pad):
+ pad.unlink(self.conv.get_pad("sink"))
+
+ def on_eos(self, bus, msg):
+ if msg.type == gst.MESSAGE_EOS:
+ self.bus.remove_signal_watch()
+ self.pipeline.set_state(gst.STATE_PAUSED)
+ self.mainloop.quit()
+ elif msg.type == gst.MESSAGE_ERROR:
+ print "ERROR", msg.parse_error()
+ self.bus.remove_signal_watch()
+ self.pipeline.set_state(gst.STATE_PAUSED)
+ self.mainloop.quit()
+ self.ret = 1 # set return value to 1 in case of error
+
+if __name__ == '__main__':
+ import sys
+ if len(sys.argv) < 2:
+ print "Usage: %s <filename>" % sys.argv[0]
+ sys.exit(1)
+ for filename in sys.argv[1:]:
+ peak = [0.] # use a mutable
+ def process(buf, hop):
+ peak[0] = max( peak[0], abs(buf.max()) )
+ a = aubioinput(filename, process = process, hopsize = 512)
+ if a.run() == 0: # only display the results if no
+ print "Finished reading %s, peak value is %f" % (filename, max(peak))
--- a/python/aubioinput.py
+++ /dev/null
@@ -1,141 +1,0 @@
-#! /usr/bin/python
-
-import pygst
-pygst.require('0.10')
-import gst
-import gobject
-gobject.threads_init ()
-
-def gst_buffer_to_numpy_array(buffer, chan):
- import numpy
- samples = numpy.frombuffer(buffer.data, dtype=numpy.float32)
- if chan == 1:
- return samples.T
- else:
- samples.resize([len(samples)/chan, chan])
- return samples.T
-
-class AubioSink(gst.BaseSink):
- _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, process):
- self.__gobject_init__()
- self.set_name(name)
- self.process = process
- self.adapter = gst.Adapter()
- self.set_property('sync', False)
- self.pos = 0
-
- 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):
- blocksize = self.get_property('blocksize')
- caps = buffer.get_caps()
- chan = caps[0]['channels']
- self.adapter.push(buffer)
- while self.adapter.available() >= blocksize:
- block = self.adapter.take_buffer(blocksize)
- v = gst_buffer_to_numpy_array(block, chan)
- if self.process:
- self.process(v, self.pos)
- self.pos += 1
- remaining = self.adapter.available()
- if remaining < blocksize and remaining > 0:
- block = self.adapter.take_buffer(remaining)
- v = gst_buffer_to_numpy_array(block, chan)
- if self.process:
- self.process(v, self.pos)
- self.pos += 1
- return gst.FLOW_OK
-
-gobject.type_register(AubioSink)
-
-class aubioinput(gst.Bin):
-
- ret = 0
-
- def __init__(self, uri, process = None, hopsize = 512,
- caps = None):
- if uri.startswith('/'):
- from urllib import quote
- uri = 'file://'+quote(uri)
- src = gst.element_factory_make('uridecodebin')
- src.set_property('uri', uri)
- src.connect('pad-added', self.source_pad_added_cb)
- conv = gst.element_factory_make('audioconvert')
- self.conv = conv
- rsmpl = gst.element_factory_make('audioresample')
- capsfilter = gst.element_factory_make('capsfilter')
- if caps:
- capsfilter.set_property('caps', gst.caps_from_string(caps))
- sink = AubioSink("AubioSink", process = process)
- sink.set_property('hopsize', hopsize) # * calcsize('f'))
-
- self.pipeline = gst.Pipeline()
-
- self.bus = self.pipeline.get_bus()
- self.bus.add_signal_watch()
- self.bus.connect('message', self.on_eos)
-
- self.apad = conv.get_pad('sink')
-
- self.pipeline.add(src, conv, rsmpl, capsfilter, sink)
-
- gst.element_link_many(conv, rsmpl, capsfilter, sink)
-
- self.mainloop = gobject.MainLoop()
- self.pipeline.set_state(gst.STATE_PLAYING)
-
- def run(self):
- self.mainloop.run()
- return self.ret
-
- def source_pad_added_cb(self, src, pad):
- name = pad.get_caps()[0].get_name()
- if name == 'audio/x-raw-float' or name == 'audio/x-raw-int':
- pad.link(self.conv.get_pad("sink"))
-
- def source_pad_removed_cb(self, src, pad):
- pad.unlink(self.conv.get_pad("sink"))
-
- def on_eos(self, bus, msg):
- if msg.type == gst.MESSAGE_EOS:
- self.bus.remove_signal_watch()
- self.pipeline.set_state(gst.STATE_PAUSED)
- self.mainloop.quit()
- elif msg.type == gst.MESSAGE_ERROR:
- print "ERROR", msg.parse_error()
- self.bus.remove_signal_watch()
- self.pipeline.set_state(gst.STATE_PAUSED)
- self.mainloop.quit()
- self.ret = 1 # set return value to 1 in case of error
-
-if __name__ == '__main__':
- import sys
- if len(sys.argv) < 2:
- print "Usage: %s <filename>" % sys.argv[0]
- sys.exit(1)
- for filename in sys.argv[1:]:
- peak = [0.] # use a mutable
- def process(buf, hop):
- peak[0] = max( peak[0], abs(buf.max()) )
- a = aubioinput(filename, process = process, hopsize = 512)
- if a.run() == 0: # only display the results if no
- print "Finished reading %s, peak value is %f" % (filename, max(peak))
--
⑨