Guest User

Juraj Kubelka

a guest
Jun 23rd, 2009
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.70 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 ; tab-width: 4 ; indent-tabs-mode: t -*-
  3.  
  4. # gobject
  5. import gobject
  6. gobject.threads_init()
  7.  
  8. # GST
  9. import pygst
  10. pygst.require("0.10")
  11. import gst
  12.  
  13. class PipelineHolder:
  14.        
  15.         def __init__(self, parent, filename):
  16.                 self.parent            = parent
  17.                 self.pipeline          = self.createPipeline(filename)
  18.                
  19.         def run(self):
  20.                 self.pipeline.set_state(gst.STATE_PLAYING)
  21.  
  22.         def stop(self):
  23.                 src = self.pipeline.get_by_name('source')
  24.                 src.send_event(gst.event_new_eos())
  25.  
  26.         def getState(self):
  27.                 return self.pipeline.get_state()
  28.  
  29.         def setNewFilename(self, filename):
  30.                 self.replaceFilebinBlocked(filename)
  31.  
  32.         def destroyBin(self):
  33.                 bin = self.pipeline.get_by_name('filebin')
  34.                 bin.set_state(gst.STATE_NULL)
  35.                 return self.pipeline.remove(bin)
  36.  
  37.         def replaceFilebinBlocked(self, filename):
  38.                 element = self.pipeline.get_by_name('converter')
  39.                 oldbin = self.pipeline.get_by_name('filebin')
  40.                 srcpad = element.get_pad('src')
  41.                 sinkpad = oldbin.get_pad('binsink')
  42.                 srcpad.unlink(sinkpad)
  43.                 oldbin.send_event(gst.event_new_eos())
  44.                 oldbin.get_state()
  45.                 self.pipeline.remove(oldbin)
  46.                 self.asyncDestroyFilebin(oldbin)
  47.                 self.attachNewFilebin(filename)
  48.                 newbin = self.pipeline.get_by_name('filebin')
  49.                 newbin.get_state()
  50.                 newbin.set_state(gst.STATE_PLAYING)
  51.                 self.pipeline.get_state()
  52.                 newbin.get_state()
  53.                 self.pipeline.get_state()
  54.  
  55.         def asyncDestroyFilebin(self, filebin):
  56.                 gobject.idle_add(self.destroyFilebin, filebin)
  57.            
  58.         def destroyFilebin(self, filebin):
  59.                 filebin.set_state(gst.STATE_NULL)
  60.                 filebin.get_state()
  61.  
  62.         def attachNewFilebin(self, filename):
  63.                 bin = self.createFilebin(filename)
  64.                 self.pipeline.add(bin)
  65.                 element = self.pipeline.get_by_name('converter')
  66.                 return element.get_pad('src').link(bin.get_pad('binsink'))
  67.  
  68.         def createPipeline(self, filename):
  69.                 pipeline = gst.Pipeline('pipeline')
  70.        
  71.                 src   = gst.element_factory_make('alsasrc', 'source')
  72.                 queue = gst.element_factory_make('queue', 'queue')
  73.                 conv  = gst.element_factory_make('audioconvert', 'converter')
  74.                 bin   = self.createFilebin(filename)
  75.                 pipeline.add(src, queue, conv, bin)
  76.                 if not gst.element_link_many(src, queue, conv, bin):
  77.                         print "Failed to link elements!"
  78.  
  79.                 bus = pipeline.get_bus()
  80.                 bus.add_signal_watch()
  81.                 bus.connect('message', self.on_message)
  82.                 bus.connect('message::eos', self.on_eos)
  83.                 bus.connect('message::tag', self.on_tag)
  84.                 bus.connect('message::error', self.on_error)
  85.                 return pipeline
  86.  
  87.         def createFilebin(self, filename):
  88.                 filebin = gst.Bin('filebin')
  89.                
  90.                 enc   = gst.element_factory_make('vorbisenc', 'encoder')
  91.                 mux   = gst.element_factory_make('oggmux', 'multiplexer')
  92.                 file  = gst.element_factory_make('filesink', 'file')
  93.                 filebin.add(enc, mux, file)
  94.                 if not gst.element_link_many(enc, mux, file):
  95.                         print "Failed to link elements!"
  96.                 pad = gst.GhostPad('binsink', enc.get_pad('sink'))
  97.                 filebin.add_pad(pad)
  98.                 file.set_property('location', filename)
  99.                 return filebin
  100.  
  101.         def on_message(self, bus, message):
  102.                 pass #print "on_message: ", message
  103.  
  104.         def on_eos(self, bus, message):
  105.                 print "on_eos: ", bus, message
  106.                 bus.remove_signal_watch()
  107.                 if self.pipeline.set_state(gst.STATE_NULL) != gst.STATE_CHANGE_SUCCESS:
  108.                         print "error: cannot close pipeline properly!!!"
  109.  
  110.         def on_tag(self, bus, message):
  111.                 print "on_tag: ", bus, message
  112.  
  113.         def on_error(self, bus, msg):
  114.                 error = msg.parse_error()
  115.                 print "on_error: ", error[1]
  116.                 bus.remove_signal_watch()
  117.                 print self.pipeline.set_state(gst.STATE_NULL)
  118.                 self.parent.on_pipeline_error(self, bus, msg)
  119.  
Advertisement
Add Comment
Please, Sign In to add comment