From b12435a17e770276ed47fdf791ab2d12db4eda3d Mon Sep 17 00:00:00 2001 From: "Paul W. Frields" Date: Fri, 7 Dec 2012 10:50:08 -0500 Subject: Moving toward 100% GI usage --- pulsecaster/source.py | 36 +++++++++++++++------------- pulsecaster/ui.py | 66 +++++++++++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/pulsecaster/source.py b/pulsecaster/source.py index daabff8..cc8902f 100644 --- a/pulsecaster/source.py +++ b/pulsecaster/source.py @@ -18,10 +18,7 @@ # Author: Paul W. Frields from config import * -from gi.repository import Gtk, GObject -import pygst -pygst.require('0.10') -import gst +from gi.repository import Gtk, GObject, Gst from pulseaudio.PulseObj import PulseObj class PulseCasterSource: @@ -65,21 +62,27 @@ class PulseCasterSource: def create_level_pipeline(self, *args): '''Make a GStreamer pipeline that allows level checking''' print 'in create_level_pipeline' - pl = 'pulsesrc device=%s' % (self.pulsesrc) - pl += ' ! level message=true interval=100000000 ! fakesink' - print pl - self.pipeline = gst.parse_launch(pl) - self.pipeline.get_bus().add_signal_watch() - self.conn = self.pipeline.get_bus().connect('message::element', self.update_level) - self.pipeline.set_state(gst.STATE_PLAYING) + self.pipeline = Gst.Pipeline() + self.src = Gst.ElementFactory.make('pulsesrc', None) + self.lvl = Gst.ElementFactory.make('level', None) + self.lvl.set_property('message', True) + self.snk = Gst.ElementFactory.make('fakesink', None) + for e in (self.src, self.lvl, self.snk): + self.pipeline.add(e) + #self.pipeline = Gst.parse_launch(pl) + self.bus = self.pipeline.get_bus() + self.bus.add_signal_watch() + self.conn = self.bus.connect('message::element', self.update_level) + self.pipeline.set_state(Gst.State.PLAYING) print 'out of create_level_pipeline' def remove_level_pipeline(self, *args): '''Tear down the GStreamer pipeline attached to this object''' print 'in remove_level_pipeline' - self.pipeline.set_state(gst.STATE_NULL) - self.pipeline.get_bus().remove_signal_watch() - self.pipeline.get_bus().disconnect(self.conn) + self.pipeline.set_state(Gst.State.NULL) + self.bus = self.pipeline.get_bus() + self.bus.remove_signal_watch() + self.bus.disconnect(self.conn) self.conn = None self.pipeline = None print 'out of remove_level_pipeline' @@ -98,9 +101,10 @@ class PulseCasterSource: def update_level(self, bus, message, *args): '''Update this object's GtkProgressBar to reflect current level''' - if message.structure.get_name() == 'level': + structure = message.get_structure() + if structure.get_name() == 'level': # stick with left channel in stereo setups - peak = message.structure['peak'][0] + peak = structure.get_value('peak')[0] self.pbar.set_fraction(self.iec_scale(peak)/100) self.pbar.queue_draw() return True diff --git a/pulsecaster/ui.py b/pulsecaster/ui.py index 47166fc..db65a1b 100644 --- a/pulsecaster/ui.py +++ b/pulsecaster/ui.py @@ -20,17 +20,20 @@ from config import * +import gi +gi.require_version('Gst', '0.10') +del gi + +from gi.repository import Gtk, GObject, Gst +Gst.init(None) + import gconfig from pulseaudio.PulseObj import PulseObj from listener import * from source import * -from gi.repository import Gtk, GObject import os import sys import tempfile -import pygst -pygst.require('0.10') -import gst from datetime import datetime import gettext @@ -237,13 +240,13 @@ class PulseCasterUI: self.close.set_sensitive(False) self.adv_button.set_sensitive(False) - self.combiner = gst.Pipeline('PulseCasterCombinePipe') - self.lsource = gst.element_factory_make('pulsesrc', 'lsrc') + self.combiner = Gst.Pipeline() + self.lsource = Gst.ElementFactory.make('pulsesrc', 'lsrc') self.lsource.set_property('device', self.user_vox.pulsesrc) - self.rsource = gst.element_factory_make('pulsesrc', 'rsrc') + self.rsource = Gst.ElementFactory.make('pulsesrc', 'rsrc') self.rsource.set_property('device', self.subject_vox.pulsesrc) - self.adder = gst.element_factory_make('adder', 'mix') + self.adder = Gst.ElementFactory.make('adder', 'mix') if self.gconfig.expert is not True: # Create temporary file @@ -251,29 +254,30 @@ class PulseCasterUI: % (NAME)) self.tempfile = os.fdopen(self.tempfd) _debugPrint('tempfile: %s (fd %s)' % (self.temppath, self.tempfd)) - self.encoder = gst.element_factory_make(self.gconfig.codec + + self.encoder = Gst.ElementFactory.make(self.gconfig.codec + 'enc', 'enc') if self.gconfig.codec == 'vorbis': - self.muxer = gst.element_factory_make('oggmux', 'mux') - self.filesink = gst.element_factory_make('filesink', 'fsink') + self.muxer = Gst.ElementFactory.make('oggmux', 'mux') + self.filesink = Gst.ElementFactory.make('filesink', 'fsink') self.filesink.set_property('location', self.temppath) - self.combiner.add(self.lsource, - self.rsource, - self.adder, - self.encoder, - self.filesink) + for e in (self.lsource, + self.rsource, + self.adder, + self.encoder, + self.filesink): + self.combiner.add(e) + if self.gconfig.codec == 'vorbis': self.combiner.add(self.muxer) - gst.element_link_many(self.lsource, - self.adder, - self.encoder) + self.lsource.link(self.adder) + self.adder.link(self.encoder) if self.gconfig.codec == 'vorbis': self.encoder.link(self.muxer) self.muxer.link(self.filesink) else: # flac self.encoder.link(self.filesink) - gst.element_link_many(self.rsource, self.adder) + self.rsource.link(self.adder) else: # Create temporary file (self.tempfd1, self.temppath1) = tempfile.mkstemp(prefix='%s-1-tmp.' @@ -287,11 +291,11 @@ class PulseCasterUI: self.temppath2)) # We're in expert mode # Disregard vorbis, use WAV - self.encoder1 = gst.element_factory_make('wavenc', 'enc1') - self.encoder2 = gst.element_factory_make('wavenc', 'enc2') - self.filesink1 = gst.element_factory_make('filesink', 'fsink1') + self.encoder1 = Gst.ElementFactory.make('wavenc', 'enc1') + self.encoder2 = Gst.ElementFactory.make('wavenc', 'enc2') + self.filesink1 = Gst.ElementFactory.make('filesink', 'fsink1') self.filesink1.set_property('location', self.temppath1) - self.filesink2 = gst.element_factory_make('filesink', 'fsink2') + self.filesink2 = Gst.ElementFactory.make('filesink', 'fsink2') self.filesink2.set_property('location', self.temppath2) self.combiner.add(self.lsource, self.rsource, @@ -299,15 +303,17 @@ class PulseCasterUI: self.encoder2, self.filesink1, self.filesink2) - gst.element_link_many(self.lsource, self.encoder1, self.filesink1) - gst.element_link_many(self.rsource, self.encoder2, self.filesink2) + self.lsource.link(self.encoder1) + self.encoder1.link(self.filesink1) + self.rsource.link(self.encoder2) + self.encoder2.link(self.filesink2) # FIXME: Dim elements other than the 'record' widget self.record.set_label(Gtk.STOCK_MEDIA_STOP) self.record.disconnect(self.record_id) self.stop_id = self.record.connect('clicked', self.on_stop) self.record.show() - self.combiner.set_state(gst.STATE_PLAYING) + self.combiner.set_state(Gst.State.PLAYING) # Start timer self.starttime = datetime.now() self._update_time() @@ -316,7 +322,7 @@ class PulseCasterUI: self.trayicon.set_visible(True) def on_stop(self, *args): - self.combiner.set_state(gst.STATE_NULL) + self.combiner.set_state(Gst.State.NULL) self.showFileChooser() self.record.set_label(Gtk.STOCK_MEDIA_RECORD) self.record.disconnect(self.stop_id) @@ -441,7 +447,9 @@ class PulseCasterUI: self.record.set_sensitive(True) def _update_time(self, *args): - if self.combiner.get_state()[1] == gst.STATE_NULL: + _state = Gst.State(Gst.State.NULL) + self.combiner.get_state(_state) + if _state == Gst.State.NULL: self.trayicon.set_tooltip_text('') self.trayicon.set_visible(False) return False -- cgit