Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- #os.putenv('GST_DEBUG', '5')
- os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp')
- import gi
- gi.require_version('GES', '1.0')
- gi.require_version('GObject', '2.0')
- gi.require_version('Gst', '1.0')
- gi.require_version('GstController', '1.0')
- gi.require_version('GstPbutils', '1.0')
- from gi.repository import GES, GObject, Gst, GstApp, GstController, GstPbutils
- import workarounds
- import logging
- from random import random
- GObject.threads_init()
- Gst.init(None)
- GES.init()
- def debug(pipeline):
- dotfile = "/tmp/debug-graph.dot"
- pngfile = "/tmp/pipeline.png"
- if os.access(dotfile, os.F_OK):
- os.remove(dotfile)
- if os.access(pngfile, os.F_OK):
- os.remove(pngfile)
- Gst.debug_bin_to_dot_file(pipeline, Gst.DebugGraphDetails.ALL, 'debug-graph')
- os.system("dot -Tpng -o " + pngfile + " " + dotfile)
- os.system("xdg-open " + pngfile)
- class AudioEngine:
- def __init__(self):
- self.mainloop = GObject.MainLoop()
- self.pipeline = Gst.Pipeline()
- self.bus = self.pipeline.get_bus()
- self.bus.add_signal_watch()
- self.bus.connect('message::error', self.on_error)
- self.bus.connect('message::warning', self.on_warning)
- self.bus.connect('message::info', self.on_info)
- #self.bus.connect('message::element', self.on_element)
- self.track = TrackSrc()
- """self.mic_1 = MicSrc(1)
- self.mic_2 = MicSrc(2)
- self.mic_3 = MicSrc(3)
- self.mic_4 = MicSrc(4)
- self.sync = Gst.ElementFactory.make('multiqueue', None)
- self.mix = Gst.ElementFactory.make('adder', None)
- self.convert = Gst.ElementFactory.make('audioconvert', None)
- self.resample = Gst.ElementFactory.make('audiorate', None)
- self.sink = Gst.ElementFactory.make('alsasink', None)"""
- #self.sync.set_property('sync-by-running-time', True)
- self.sink.set_property('device', 'headphones')
- self.pipeline.add(self.track)
- """self.pipeline.add(self.mic_1)
- self.pipeline.add(self.mic_2)
- self.pipeline.add(self.mic_3)
- self.pipeline.add(self.mic_4)
- self.pipeline.add(self.sync)
- self.pipeline.add(self.mix)
- self.pipeline.add(self.convert)
- self.pipeline.add(self.resample)
- self.pipeline.add(self.sink)"""
- self.track.link(self.sink)
- """self.mic_1.link(self.sync)
- self.mic_2.link(self.sync)
- self.mic_3.link(self.sync)
- self.mic_4.link(self.sync)
- self.sync.link(self.mix)
- self.sync.link(self.mix)
- self.sync.link(self.mix)
- self.sync.link(self.mix)
- self.mix.link(self.convert)
- self.convert.link(self.resample)
- self.resample.link(self.sink)"""
- def on_error(self, bus, message):
- logging.error(message.parse_error())
- debug(self.pipeline)
- def on_info(self, bus, message):
- logging.info(message.parse_info())
- def on_warning(self, bus, message):
- logging.warning(message.parse_warning())
- def start(self):
- self.pipeline.set_state(Gst.State.PLAYING)
- self.mainloop.run()
- def stop(self):
- self.pipeline.set_state(Gst.State.NULL)
- self.mainloop.quit()
- class AuxSrc(Gst.Bin):
- def __init__(self):
- super(Gst.Bin, self).__init__()
- self.src = Gst.ElementFactory.make('alsasrc', 'src')
- self.convert = Gst.ElementFactory.make('audioconvert', 'convert')
- self.resample = Gst.ElementFactory.make('audiorate', 'resample')
- self.meter = Gst.ElementFactory.make('level', 'meter')
- self.switch = Gst.ElementFactory.make('valve', 'switch')
- self.src.set_property('device', 'plug:aux')
- self.add(self.src)
- self.add(self.convert)
- self.add(self.resample)
- self.add(self.meter)
- self.add(self.switch)
- self.src.link(self.convert)
- self.convert.link(self.resample)
- self.resample.link(self.meter)
- self.meter.link(self.switch)
- self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
- # TODO: Multiple prioritised timelines for live/scheduled playouts/fallback playlist?
- class TrackSrc(Gst.Bin):
- def __init__(self):
- super(Gst.Bin, self).__init__()
- self.playlist = GES.Timeline.new()
- self.live = GES.SimpleTimelineLayer.new()
- self.track = GES.Track.audio_raw_new()
- self.playlist.add_layer(self.live)
- self.playlist.add_track(self.track)
- GES.UriClipAsset.new(Gst.filename_to_uri('/home/voxbox/Music/Soundtrack/Deus Ex 3 Game Rip/220 - Stinger_3.mp3'), None, self.on_asset_loaded, None)
- GES.UriClipAsset.new(Gst.filename_to_uri('/home/voxbox/Music/Soundtrack/Deus Ex Human Revolution/11. LIMB Clinic.wav'), None, self.on_asset_loaded, None)
- GES.UriClipAsset.new(Gst.filename_to_uri('/home/voxbox/Music/Soundtrack/Epic Games/21 Bonus Track- Cole Train Rap [EXPLICIT].mp3'), None, self.on_asset_loaded, None)
- self.meter = Gst.ElementFactory.make('level', 'meter')
- self.switch = Gst.ElementFactory.make('valve', 'switch')
- self.add(self.playlist)
- self.add(self.meter)
- self.add(self.switch)
- self.meter.link(self.switch)
- self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
- self.playlist.connect('pad-added', self.on_playlist_pad)
- def on_asset_loaded(self, clip_asset, result, *user_data):
- print('asset loaded')
- clip = clip_asset.extract()
- self.live.add_object(clip, -1)
- def on_playlist_pad(self, element, pad):
- print('pad added')
- pad.link(self.meter.get_static_pad('sink'))
- class MicSrc(Gst.Bin):
- def __init__(self, mic_number):
- super(Gst.Bin, self).__init__()
- self.src = Gst.ElementFactory.make('alsasrc', 'src')
- self.convert = Gst.ElementFactory.make('audioconvert', 'convert')
- self.resample = Gst.ElementFactory.make('audiorate', 'resample')
- self.meter = Gst.ElementFactory.make('level', 'meter')
- self.switch = Gst.ElementFactory.make('valve', 'switch')
- self.add(self.src)
- self.add(self.convert)
- self.add(self.resample)
- self.add(self.meter)
- self.add(self.switch)
- self.src.set_property('device', 'mic_' + str(mic_number))
- self.src.link(self.convert)
- self.convert.link(self.resample)
- self.resample.link(self.meter)
- self.meter.link(self.switch)
- self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
- def do_debug(*args):
- debug(ae.pipeline)
- if __name__ == "__main__":
- ae = AudioEngine()
- ae.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement