class GStreamerPlayer2(threading.Thread): def __init__(self): threading.Thread.__init__(self, name='GStreamer Sound Player 2 Thread') self.setDaemon(True) self.quit = False self.pipeline = gst.Pipeline('pipeline') self.autoaudiosink = gst.element_factory_make('autoaudiosink', 'autoaudiosink') self.pipeline.add(self.autoaudiosink) self.adder = gst.element_factory_make('adder', 'adder') self.pipeline.add(self.adder) self.adder.link(self.autoaudiosink) self.bus = self.pipeline.get_bus() self.bus.add_signal_watch() self.bus.connect('message', self.handle_message) def run(self): while not self.quit: time.sleep(1.0) self.pipeline.set_state(gst.STATE_NULL) def play_file(self, filename): sys.stderr.write('%f: playing file: %s %s\n' % (time.time(), filename, type(filename))) sys.stderr.flush() decodebin = gst.element_factory_make('decodebin') decodebin.connect('new-decoded-pad', self.new_decoded_pad) decodebin.connect('removed-decoded-pad', self.removed_decoded_pad) decodebin.connect('unknown-type', self.unknown_type) self.pipeline.add(decodebin) filesrc = gst.element_factory_make('filesrc') filesrc.set_property('location', filename) self.pipeline.add(filesrc) filesrc.link(decodebin) structure = gst.Structure('gajim') structure['filename'] = str(filename) self.bus.post(gst.message_new_application(filesrc, structure)) def new_decoded_pad(self, object, pad, b, u): sys.stderr.write('%f: new decoded pad!\n' % time.time()) caps = pad.get_caps() sys.stderr.write('%f: caps: %s\n' % (time.time(), caps)) pad.link(self.adder) def removed_decoded_pad(self, object, pad, u): sys.stderr.write('%f: removed decoded pad!\n' % time.time()) def unknown_type(self, object, pad, caps, u): pass def handle_message(self, bus, message): if message.structure.get_name() == 'gajim': message.src.set_state(gst.STATE_PLAYING) else: sys.stderr.write('%f: some other message %s\n' % (time.time(), message))