def test_gstreamer(): try: gst.Bin() except AttributeError: return False for element in "capsfilter tee appsink autoaudiosink".split(): try: gst.element_factory_make(element) except gst.ElementNotFoundError: return False return True
def __init_pipeline(self): if not gstreamer_is_working: self.stop() from blaplay.blagui import blaguiutils blaguiutils.error_dialog( "Error", "Failed to construct GStreamer pipeline. Make sure " "GStreamer 0.10, its Python bindings, and gst-plugins-base " "and gst-plugins-good are installed.") return False audio_sink = gst.Bin() filt = gst.element_factory_make("capsfilter") filt.set_property( "caps", gst.caps_from_string("audio/x-raw-float," "rate=(int)44100," "channels=(int)2," "width=(int)32," "depth=(int)32," "endianness=(int)1234")) self.__equalizer = gst.element_factory_make("equalizer-10bands") tee = gst.element_factory_make("tee") queue = gst.element_factory_make("queue") queue.set_property("silent", True) def new_buffer(sink): self.emit("new_buffer", sink.emit("pull_buffer")) appsink = gst.element_factory_make("appsink") appsink.set_property("drop", True) appsink.set_property("sync", True) appsink.set_property("emit_signals", True) appsink.connect("new_buffer", new_buffer) sink = gst.element_factory_make("autoaudiosink") self.__volume = gst.element_factory_make("volume") elements = [filt, self.__equalizer, tee, queue, appsink, self.__volume, sink] map(audio_sink.add, elements) pad = elements[0].get_static_pad("sink") audio_sink.add_pad(gst.GhostPad("sink", pad)) gst.element_link_many(filt, self.__equalizer, tee) gst.element_link_many(tee, self.__volume, sink) gst.element_link_many(tee, queue, appsink) video_sink = gst.element_factory_make("xvimagesink") video_sink.set_property("force_aspect_ratio", True) self.__bin = gst.element_factory_make("playbin2") self.__bin.set_property("audio_sink", audio_sink) self.__bin.set_property("buffer_duration", 500 * gst.MSECOND) self.__bin.set_property("video_sink", video_sink) self.__bin.connect("about_to_finish", self.__about_to_finish) self.__bin.set_state(gst.STATE_READY) bus = self.__bin.get_bus() bus.add_signal_watch() bus.enable_sync_message_emission() self.__message_id = bus.connect("message", self.__message) self.__sync_message_id = bus.connect( "sync-message::element", self.__sync_message) if blacfg.getboolean("player", "muted"): volume = 0 else: volume = blacfg.getfloat("player", "volume") * 100 self.set_volume(volume) self.enable_equalizer(blacfg.getboolean("player", "use.equalizer")) return True