import pygst pygst.require("0.10") import gst import gobject class Track: def __init__(self, pipeline): self.comp = gst.element_factory_make("gnlcomposition") self.comp.connect("pad-added", self.on_composition_pad_added) pipeline.add(self.comp) self.comp.set_state(gst.STATE_PLAYING) def on_composition_pad_added(self, comp, pad): caps = pad.get_caps() self.srcpad = pad if not comp.get_parent() or not convert.get_parent(): return gst.Element.link(comp, adder) def go(): global num_tracks, tracks, action if action == ACTION_ADD_TRACK: print "Add Track" tracks.append(Track(pipeline)) action = ACTION_ADD_EVENT elif action == ACTION_ADD_EVENT: print "Add Event" track = tracks[-1] silence = gst.element_factory_make("audiotestsrc") silence.set_property("wave", "silence") src = gst.element_factory_make("gnlsource") src.add(silence) src.set_property("start", 0 * gst.SECOND) src.set_property("duration", 1000 * gst.SECOND) track.comp.add(src) if len(tracks) < 3: action = ACTION_ADD_TRACK else: action = ACTION_REMOVE_TRACK else: print "Remove Track" track = tracks.pop() try: sink = track.srcpad.get_peer() gst.Element.unlink(track.comp, adder) adder.release_request_pad(sink) except: pass track.comp.set_state(gst.STATE_NULL) pipeline.remove(track.comp) if not tracks: action = ACTION_ADD_TRACK return True adder = gst.element_factory_make("adder") convert = gst.element_factory_make("audioconvert") sink = gst.element_factory_make("alsasink") pipeline = gst.element_factory_make("pipeline") pipeline.add(adder, convert, sink) gst.Element.link(adder, convert) gst.Element.link(convert, sink) ACTION_ADD_TRACK = 0 ACTION_ADD_EVENT = 1 ACTION_REMOVE_TRACK = 2 action = ACTION_ADD_TRACK tracks = [] gobject.threads_init() gobject.idle_add(go) pipeline.set_state(gst.STATE_PLAYING) gobject.MainLoop().run() pipeline.set_state(gst.STATE_NULL)