import gobject gobject.threads_init() import gst import pygtk pygtk.require("2.0") import gtk import sys def new_pad_cb(element, pad, target): dest_pad = target.get_compatible_pad(pad) if dest_pad: pad.link(dest_pad) # set up media pipeline src = gst.element_factory_make("filesrc") src.set_property("location", sys.argv[1]) dec = gst.element_factory_make("decodebin2") aconv = gst.element_factory_make("audioconvert") sink = gst.element_factory_make("alsasink") volume = gst.element_factory_make("volume") bin = gst.Bin() bin.add(src, dec, aconv, sink, volume) src.link(dec) dec.connect("pad-added", new_pad_cb, volume) volume.link(aconv) aconv.link(sink) def buttonCb(button): if button == playBtn: bin.set_state(gst.STATE_PLAYING) elif button == stopBtn: bin.set_state(gst.STATE_READY) def volumeCb(scale): volume.set_property("volume", scale.get_value()) # UI code window = gtk.Window() window.set_size_request(320, 240) playBtn = gtk.Button("Play") playBtn.connect("clicked", buttonCb) stopBtn = gtk.Button("Stop") stopBtn.connect("clicked", buttonCb) volumeScale = gtk.HScale() volumeScale.set_range(0, 10) volumeScale.connect("value-changed", volumeCb) volumeScale.set_value(1) volumeScale.set_update_policy(gtk.UPDATE_CONTINUOUS) box = gtk.VBox() for widget in [playBtn, stopBtn, volumeScale]: box.pack_start(widget) window.add(box) window.show_all() window.connect("destroy", gtk.main_quit) gtk.main()