Advertisement
NoxDeleo

Untitled

Mar 19th, 2013
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.08 KB | None | 0 0
  1. import os
  2. #os.putenv('GST_DEBUG', '5')
  3. os.putenv('GST_DEBUG_DUMP_DOT_DIR', '/tmp')
  4.  
  5. import gi
  6. gi.require_version('GES', '1.0')
  7. gi.require_version('GObject', '2.0')
  8. gi.require_version('Gst', '1.0')
  9. gi.require_version('GstController', '1.0')
  10. gi.require_version('GstPbutils', '1.0')
  11. from gi.repository import GES, GObject, Gst, GstApp, GstController, GstPbutils
  12.  
  13. import workarounds
  14. import logging
  15. from random import random
  16.  
  17.  
  18. GObject.threads_init()
  19. Gst.init(None)
  20. GES.init()
  21.  
  22. def debug(pipeline):
  23.     dotfile = "/tmp/debug-graph.dot"
  24.     pngfile = "/tmp/pipeline.png"
  25.    
  26.     if os.access(dotfile, os.F_OK):
  27.         os.remove(dotfile)
  28.    
  29.     if os.access(pngfile, os.F_OK):
  30.         os.remove(pngfile)
  31.    
  32.     Gst.debug_bin_to_dot_file(pipeline, Gst.DebugGraphDetails.ALL, 'debug-graph')
  33.     os.system("dot -Tpng -o " + pngfile + " " + dotfile)
  34.     os.system("xdg-open " + pngfile)
  35.  
  36.  
  37. class AudioEngine:
  38.    
  39.     def __init__(self):
  40.         self.mainloop = GObject.MainLoop()
  41.         self.pipeline = Gst.Pipeline()
  42.         self.bus = self.pipeline.get_bus()
  43.         self.bus.add_signal_watch()
  44.         self.bus.connect('message::error', self.on_error)
  45.         self.bus.connect('message::warning', self.on_warning)
  46.         self.bus.connect('message::info', self.on_info)
  47.         #self.bus.connect('message::element', self.on_element)
  48.        
  49.         self.track = TrackSrc()
  50.         """self.mic_1 = MicSrc(1)
  51.         self.mic_2 = MicSrc(2)
  52.         self.mic_3 = MicSrc(3)
  53.         self.mic_4 = MicSrc(4)
  54.         self.sync = Gst.ElementFactory.make('multiqueue', None)
  55.         self.mix = Gst.ElementFactory.make('adder', None)
  56.         self.convert = Gst.ElementFactory.make('audioconvert', None)
  57.         self.resample = Gst.ElementFactory.make('audiorate', None)
  58.         self.sink = Gst.ElementFactory.make('alsasink', None)"""
  59.        
  60.         #self.sync.set_property('sync-by-running-time', True)
  61.         self.sink.set_property('device', 'headphones')
  62.        
  63.         self.pipeline.add(self.track)
  64.         """self.pipeline.add(self.mic_1)
  65.         self.pipeline.add(self.mic_2)
  66.         self.pipeline.add(self.mic_3)
  67.         self.pipeline.add(self.mic_4)
  68.         self.pipeline.add(self.sync)
  69.         self.pipeline.add(self.mix)
  70.         self.pipeline.add(self.convert)
  71.         self.pipeline.add(self.resample)
  72.         self.pipeline.add(self.sink)"""
  73.        
  74.         self.track.link(self.sink)
  75.         """self.mic_1.link(self.sync)
  76.         self.mic_2.link(self.sync)
  77.         self.mic_3.link(self.sync)
  78.         self.mic_4.link(self.sync)
  79.         self.sync.link(self.mix)
  80.         self.sync.link(self.mix)
  81.         self.sync.link(self.mix)
  82.         self.sync.link(self.mix)
  83.         self.mix.link(self.convert)
  84.         self.convert.link(self.resample)
  85.         self.resample.link(self.sink)"""
  86.    
  87.     def on_error(self, bus, message):
  88.         logging.error(message.parse_error())
  89.         debug(self.pipeline)
  90.    
  91.     def on_info(self, bus, message):
  92.         logging.info(message.parse_info())
  93.    
  94.     def on_warning(self, bus, message):
  95.         logging.warning(message.parse_warning())
  96.    
  97.     def start(self):
  98.         self.pipeline.set_state(Gst.State.PLAYING)
  99.         self.mainloop.run()
  100.    
  101.     def stop(self):
  102.         self.pipeline.set_state(Gst.State.NULL)
  103.         self.mainloop.quit()
  104.  
  105.  
  106. class AuxSrc(Gst.Bin):
  107.    
  108.     def __init__(self):
  109.         super(Gst.Bin, self).__init__()
  110.        
  111.         self.src = Gst.ElementFactory.make('alsasrc', 'src')
  112.         self.convert = Gst.ElementFactory.make('audioconvert', 'convert')
  113.         self.resample = Gst.ElementFactory.make('audiorate', 'resample')
  114.         self.meter = Gst.ElementFactory.make('level', 'meter')
  115.         self.switch = Gst.ElementFactory.make('valve', 'switch')
  116.        
  117.         self.src.set_property('device', 'plug:aux')
  118.        
  119.         self.add(self.src)
  120.         self.add(self.convert)
  121.         self.add(self.resample)
  122.         self.add(self.meter)
  123.         self.add(self.switch)
  124.        
  125.         self.src.link(self.convert)
  126.         self.convert.link(self.resample)
  127.         self.resample.link(self.meter)
  128.         self.meter.link(self.switch)
  129.        
  130.         self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
  131.  
  132.  
  133. # TODO: Multiple prioritised timelines for live/scheduled playouts/fallback playlist?
  134. class TrackSrc(Gst.Bin):
  135.    
  136.     def __init__(self):
  137.         super(Gst.Bin, self).__init__()
  138.        
  139.         self.playlist = GES.Timeline.new()
  140.         self.live = GES.SimpleTimelineLayer.new()
  141.         self.track = GES.Track.audio_raw_new()
  142.         self.playlist.add_layer(self.live)
  143.         self.playlist.add_track(self.track)
  144.         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)
  145.         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)
  146.         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)
  147.        
  148.         self.meter = Gst.ElementFactory.make('level', 'meter')
  149.         self.switch = Gst.ElementFactory.make('valve', 'switch')
  150.        
  151.         self.add(self.playlist)
  152.         self.add(self.meter)
  153.         self.add(self.switch)
  154.        
  155.         self.meter.link(self.switch)
  156.        
  157.         self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
  158.        
  159.         self.playlist.connect('pad-added', self.on_playlist_pad)
  160.    
  161.     def on_asset_loaded(self, clip_asset, result, *user_data):
  162.         print('asset loaded')
  163.         clip = clip_asset.extract()
  164.         self.live.add_object(clip, -1)
  165.    
  166.     def on_playlist_pad(self, element, pad):
  167.         print('pad added')
  168.         pad.link(self.meter.get_static_pad('sink'))
  169.  
  170.  
  171. class MicSrc(Gst.Bin):
  172.    
  173.     def __init__(self, mic_number):
  174.         super(Gst.Bin, self).__init__()
  175.        
  176.         self.src = Gst.ElementFactory.make('alsasrc', 'src')
  177.         self.convert = Gst.ElementFactory.make('audioconvert', 'convert')
  178.         self.resample = Gst.ElementFactory.make('audiorate', 'resample')
  179.         self.meter = Gst.ElementFactory.make('level', 'meter')
  180.         self.switch = Gst.ElementFactory.make('valve', 'switch')
  181.        
  182.         self.add(self.src)
  183.         self.add(self.convert)
  184.         self.add(self.resample)
  185.         self.add(self.meter)
  186.         self.add(self.switch)
  187.        
  188.         self.src.set_property('device', 'mic_' + str(mic_number))
  189.        
  190.         self.src.link(self.convert)
  191.         self.convert.link(self.resample)
  192.         self.resample.link(self.meter)
  193.         self.meter.link(self.switch)
  194.        
  195.         self.add_pad(Gst.GhostPad.new('src', self.switch.get_static_pad('src')))
  196.  
  197.  
  198. def do_debug(*args):
  199.     debug(ae.pipeline)
  200.  
  201. if __name__ == "__main__":
  202.     ae = AudioEngine()
  203.     ae.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement