#! /usr/bin/env python # # Test rganalysis element. seems to work... # Copyright (C) 2007 Michael Urman # # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License as # published by the Free Software Foundation. # from os.path import realpath import sys import pygst pygst.require('0.10') import gst class Analyze(object): def analyze(self, files): self.pipe = gst.Pipeline("pipe") self.filesrc = gst.element_factory_make("filesrc", "source") self.pipe.add(self.filesrc) self.decode = gst.element_factory_make("decodebin", "decode") self.decode.connect('new-decoded-pad', self.new_decoded_pad) self.decode.connect('removed-decoded-pad', self.removed_decoded_pad) self.pipe.add(self.decode) self.filesrc.link(self.decode) self.convert = gst.element_factory_make("audioconvert", "convert") self.pipe.add(self.convert) self.resample = gst.element_factory_make("audioresample", "resample") self.pipe.add(self.resample) self.convert.link(self.resample) self.analysis = gst.element_factory_make("rganalysis", "analysis") self.analysis.set_property("num-tracks", len(files)) self.pipe.add(self.analysis) self.resample.link(self.analysis) self.sink = gst.element_factory_make("fakesink", "sink") self.pipe.add(self.sink) self.analysis.link(self.sink) bus = self.pipe.get_bus() bus.add_signal_watch() bus.connect("message::tag", self.bus_message_tag) self.data = {} for file in files: self.current_song = file self.filesrc.set_property("location", realpath(file)) self.pipe.set_state(gst.STATE_PLAYING) self.analysis.set_locked_state(False) while True: message = bus.poll(-1, -1) if message.type == gst.MESSAGE_EOS: self.analysis.set_locked_state(True) self.pipe.set_state(gst.STATE_NULL) break self.analysis.set_locked_state(False) def new_decoded_pad(self, dbin, pad, islast): print 'new decoded pad', dbin, pad, islast pad.link(self.convert.get_pad("sink")) def removed_decoded_pad(self, dbin, pad): pad.unlink(self.convert.get_pad("sink")) def bus_message_tag(self, bus, message): if message.src != self.analysis: return tags = message.parse_tag() try: self.data[self.current_song] = tags[gst.TAG_TRACK_PEAK], tags[gst.TAG_TRACK_GAIN] except KeyError: pass try: self.data[None] = tags[gst.TAG_ALBUM_PEAK], tags[gst.TAG_ALBUM_GAIN] except KeyError: pass analyzer = Analyze() analyzer.analyze(sys.argv[1:]) from pprint import pprint pprint(analyzer.data)