History

python/: moved old gst hack to python.old for now

Paul Brossier committed 12 years ago

Commit 6bc52cc1 parent 2c31bb61 file · +0 −0Browse files

Showing the changes to python (1 of 1 file). Show all

Unified · Split

python/aubioinput.py+0−141
@@ -1,141 +0,0 @@
1−#! /usr/bin/python
2−
3−import pygst
4−pygst.require('0.10')
5−import gst
6−import gobject
7−gobject.threads_init ()
8−
9−def gst_buffer_to_numpy_array(buffer, chan):
10− import numpy
11− samples = numpy.frombuffer(buffer.data, dtype=numpy.float32)
12− if chan == 1:
13− return samples.T
14− else:
15− samples.resize([len(samples)/chan, chan])
16− return samples.T
17−
18−class AubioSink(gst.BaseSink):
19− _caps = gst.caps_from_string('audio/x-raw-float, \
20− rate=[ 1, 2147483647 ], \
21− channels=[ 1, 2147483647 ], \
22− endianness={ 1234, 4321 }, \
23− width=32')
24−
25− __gsttemplates__ = (
26− gst.PadTemplate ("sink",
27− gst.PAD_SINK,
28− gst.PAD_ALWAYS,
29− _caps),
30− )
31−
32− def __init__(self, name, process):
33− self.__gobject_init__()
34− self.set_name(name)
35− self.process = process
36− self.adapter = gst.Adapter()
37− self.set_property('sync', False)
38− self.pos = 0
39−
40− def set_property(self, name, value):
41− if name == 'hopsize':
42− # blocksize is in byte, convert from hopsize
43− from struct import calcsize
44− self.set_property('blocksize', value * calcsize('f'))
45− else:
46− super(gst.BaseSink, self).set_property(name, value)
47−
48− def do_render(self, buffer):
49− blocksize = self.get_property('blocksize')
50− caps = buffer.get_caps()
51− chan = caps[0]['channels']
52− self.adapter.push(buffer)
53− while self.adapter.available() >= blocksize:
54− block = self.adapter.take_buffer(blocksize)
55− v = gst_buffer_to_numpy_array(block, chan)
56− if self.process:
57− self.process(v, self.pos)
58− self.pos += 1
59− remaining = self.adapter.available()
60− if remaining < blocksize and remaining > 0:
61− block = self.adapter.take_buffer(remaining)
62− v = gst_buffer_to_numpy_array(block, chan)
63− if self.process:
64− self.process(v, self.pos)
65− self.pos += 1
66− return gst.FLOW_OK
67−
68−gobject.type_register(AubioSink)
69−
70−class aubioinput(gst.Bin):
71−
72− ret = 0
73−
74− def __init__(self, uri, process = None, hopsize = 512,
75− caps = None):
76− if uri.startswith('/'):
77− from urllib import quote
78− uri = 'file://'+quote(uri)
79− src = gst.element_factory_make('uridecodebin')
80− src.set_property('uri', uri)
81− src.connect('pad-added', self.source_pad_added_cb)
82− conv = gst.element_factory_make('audioconvert')
83− self.conv = conv
84− rsmpl = gst.element_factory_make('audioresample')
85− capsfilter = gst.element_factory_make('capsfilter')
86− if caps:
87− capsfilter.set_property('caps', gst.caps_from_string(caps))
88− sink = AubioSink("AubioSink", process = process)
89− sink.set_property('hopsize', hopsize) # * calcsize('f'))
90−
91− self.pipeline = gst.Pipeline()
92−
93− self.bus = self.pipeline.get_bus()
94− self.bus.add_signal_watch()
95− self.bus.connect('message', self.on_eos)
96−
97− self.apad = conv.get_pad('sink')
98−
99− self.pipeline.add(src, conv, rsmpl, capsfilter, sink)
100−
101− gst.element_link_many(conv, rsmpl, capsfilter, sink)
102−
103− self.mainloop = gobject.MainLoop()
104− self.pipeline.set_state(gst.STATE_PLAYING)
105−
106− def run(self):
107− self.mainloop.run()
108− return self.ret
109−
110− def source_pad_added_cb(self, src, pad):
111− name = pad.get_caps()[0].get_name()
112− if name == 'audio/x-raw-float' or name == 'audio/x-raw-int':
113− pad.link(self.conv.get_pad("sink"))
114−
115− def source_pad_removed_cb(self, src, pad):
116− pad.unlink(self.conv.get_pad("sink"))
117−
118− def on_eos(self, bus, msg):
119− if msg.type == gst.MESSAGE_EOS:
120− self.bus.remove_signal_watch()
121− self.pipeline.set_state(gst.STATE_PAUSED)
122− self.mainloop.quit()
123− elif msg.type == gst.MESSAGE_ERROR:
124− print "ERROR", msg.parse_error()
125− self.bus.remove_signal_watch()
126− self.pipeline.set_state(gst.STATE_PAUSED)
127− self.mainloop.quit()
128− self.ret = 1 # set return value to 1 in case of error
129−
130−if __name__ == '__main__':
131− import sys
132− if len(sys.argv) < 2:
133− print "Usage: %s <filename>" % sys.argv[0]
134− sys.exit(1)
135− for filename in sys.argv[1:]:
136− peak = [0.] # use a mutable
137− def process(buf, hop):
138− peak[0] = max( peak[0], abs(buf.max()) )
139− a = aubioinput(filename, process = process, hopsize = 512)
140− if a.run() == 0: # only display the results if no
141− print "Finished reading %s, peak value is %f" % (filename, max(peak))

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t