def build_bin(self): self.input_gain = Gst.ElementFactory.make('volume', None) self.stereo_spread = Gst.ElementFactory.make( 'calf-sourceforge-net-plugins-MultiSpread', None) self.input_level = Gst.ElementFactory.make('level', 'stereo_spread_input_level') self.out_level = Gst.ElementFactory.make('level', 'stereo_spread_output_level') self.bin = GstInsertBin.InsertBin.new('stereo_spread_bin') if self.is_installed: # There is a bug in gstreaner. Booleans are inverted. For example # we have to turn on bypass in order to effects to be applied registry = Gst.Registry().get() self.use_workaround = not registry\ .check_feature_version('pulsesrc', 1, 12, 5) if self.use_workaround: self.stereo_spread.set_property('bypass', True) else: self.stereo_spread.set_property('bypass', False) self.stereo_spread.set_property('level-in', 1.0) self.bin.append(self.input_gain, self.on_filter_added, None) self.bin.append(self.input_level, self.on_filter_added, None) self.bin.append(self.stereo_spread, self.on_filter_added, None) self.bin.append(self.out_level, self.on_filter_added, None)
def build_bin(self): self.input_gain = Gst.ElementFactory.make('volume', None) self.bass_enhancer = Gst.ElementFactory.make( 'calf-sourceforge-net-plugins-BassEnhancer', None) self.input_level = Gst.ElementFactory.make( 'level', 'bass_enhancer_input_level') self.out_level = Gst.ElementFactory.make('level', 'bass_enhancer_output_level') self.bin = GstInsertBin.InsertBin.new('bass_enhancer_bin') if self.is_installed: # booleans are inverted in GStreamer versions older than 1.12.5 registry = Gst.Registry().get() use_workaround = not registry.check_feature_version( 'pulsesrc', 1, 12, 5) if use_workaround: self.bass_enhancer.set_property('bypass', True) self.bass_enhancer.set_property('listen', True) self.bass_enhancer.set_property('floor-active', False) else: self.bass_enhancer.set_property('bypass', False) self.bass_enhancer.set_property('listen', False) self.bass_enhancer.set_property('floor-active', True) self.bass_enhancer.set_property('level-in', 1.0) self.bin.append(self.input_gain, self.on_filter_added, None) self.bin.append(self.input_level, self.on_filter_added, None) self.bin.append(self.bass_enhancer, self.on_filter_added, None) self.bin.append(self.out_level, self.on_filter_added, None)
def build_bin(self): self.delay = Gst.ElementFactory.make( 'lsp-plug-in-plugins-lv2-comp-delay-x2-stereo', None) self.input_level = Gst.ElementFactory.make('level', 'delay_input_level') self.output_level = Gst.ElementFactory.make('level', 'delay_output_level') self.bin = GstInsertBin.InsertBin.new('delay_bin') if self.is_installed: # There is a bug in gstreaner. Booleans are inverted. For example # we have to turn on bypass in order to effects to be applied registry = Gst.Registry().get() use_workaround = not registry.check_feature_version( 'pulsesrc', 1, 12, 5) if use_workaround: self.delay.set_property('bypass', True) else: self.delay.set_property('bypass', False) self.delay.set_property('mode-l', 'Distance') self.delay.set_property('mode-r', 'Distance') self.delay.set_property('g-out', 1) self.delay.set_property('dry-l', 0) self.delay.set_property('wet-l', 1) self.delay.set_property('dry-r', 0) self.delay.set_property('wet-r', 1) self.bin.append(self.input_level, self.on_filter_added, None) self.bin.append(self.delay, self.on_filter_added, None) self.bin.append(self.output_level, self.on_filter_added, None)
def build_bin(self): self.gate = Gst.ElementFactory.make( 'calf-sourceforge-net-plugins-Gate', None) self.input_level = Gst.ElementFactory.make('level', 'gate_input_level') self.output_level = Gst.ElementFactory.make('level', 'gate_output_level') self.bin = GstInsertBin.InsertBin.new('gate_bin') if self.is_installed: # booleans are inverted in GStreamer versions older than 1.12.5 registry = Gst.Registry().get() self.use_workaround = not registry\ .check_feature_version('pulsesrc', 1, 12, 5) if self.use_workaround: self.gate.set_property('bypass', True) else: self.gate.set_property('bypass', False) self.bin.append(self.input_level, self.on_filter_added, None) self.bin.append(self.gate, self.on_filter_added, None) self.bin.append(self.output_level, self.on_filter_added, None)
def __init__( self, node_name='pipeline_node', param_prefix='', gst_plugin_paths=[], # list of strings gst_plugin_ros_packages=[], # list of tuples (package_name,sub_dir) gst_plugins_required=[] # list of strings ): super().__init__(node_name) self.registry = Gst.Registry() self.registry.connect('plugin-added', self.plugin_added) self.node_name = node_name # pull additional info from parameter server (paths, packages, plugins) = self.fetch_params(param_prefix) self.gst_plugin_paths = gst_plugin_paths + paths self.gst_plugin_ros_packages = gst_plugin_ros_packages + packages self.gst_plugins_required = gst_plugins_required + plugins # unpack ros packages into paths for (pack, subdir) in self.gst_plugin_ros_packages: plugin_path = os.path.join(get_package_prefix(pack), subdir) self.gst_plugin_paths.append(plugin_path) self.get_logger().debug('additional gst plugin paths are ' + str(paths)) self.get_logger().debug('required gst plugins are ' + str(plugins)) self.add_plugin_paths(self.gst_plugin_paths) self.check_plugins(self.gst_plugins_required) self.updater = diagnostic_updater.Updater(self) self.updater.setHardwareID("Gst1.0") self.updater.add("Pipe Status", self.diagnostic_task) self.pipe = Gst.Pipeline.new("rospipe") self.bus = self.pipe.get_bus() self.bus.add_signal_watch() self.bus.connect('message::error', self.on_error) self.bus.connect('message::state-changed', self.on_status_changed) self.bus.connect('message::eos', self.on_eos) self.bus.connect('message::info', self.on_info) self.updater.force_update() self.diagnostic_timer = self.create_timer(0.5, self.updater.update)
gst_extra_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'gst-1.0') gi.require_version('Gst', '1.0') gi.require_version('GstVideo', '1.0') gi.require_version('GstController', '1.0') from gi.repository import GLib, GObject from gi.repository import Gst from gi.repository import GstVideo, GstController GObject.threads_init() Gst.init(None) # add path to our own gst-1.0 plugins reg = Gst.Registry().get() res = reg.scan_path(gst_extra_path) # build a GStreamer pipeline, # basic configuration: URL, sources, ... # - attach controllers # - gain, delay, positions # - # TODO: controllers for gst-1.0 # -> http://tangopardo.com.ar/2cf7/2013/07/30/ class _dict_with_default(object): def __init__(self, data, default=None): self.data = data.copy()