home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/env python
- # -*- Mode: Python -*-
- # vi:si:et:sw=4:sts=4:ts=4
-
- # gst-python
- # Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Library General Public
- # License as published by the Free Software Foundation; either
- # version 2 of the License, or (at your option) any later version.
- #
- # This library is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # Library General Public License for more details.
- #
- # You should have received a copy of the GNU Library General Public
- # License along with this library; if not, write to the
- # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- # Boston, MA 02111-1307, USA.
-
-
- # A test more of gst-plugins than of gst-python.
-
-
- import pygtk
- pygtk.require('2.0')
- import gtk
- import gobject
-
- import pygst
- pygst.require('0.10')
- import gst
-
- import fvumeter
-
-
- def clamp(x, min, max):
- if x < min:
- return min
- elif x > max:
- return max
- return x
-
-
- class Window(gtk.Dialog):
- def __init__(self):
- gtk.Dialog.__init__(self, 'Volume Level')
- self.prepare_ui()
-
- def prepare_ui(self):
- self.set_default_size(200,60)
- self.set_title('Volume Level')
- self.connect('delete-event', lambda *x: gtk.main_quit())
- self.vus = []
- self.vus.append(fvumeter.FVUMeter())
- self.vus.append(fvumeter.FVUMeter())
- self.vbox.add(self.vus[0])
- self.vbox.add(self.vus[1])
- self.vus[0].show()
- self.vus[1].show()
-
- def error(self, message, secondary=None):
- m = gtk.MessageDialog(self,
- gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
- gtk.MESSAGE_ERROR,
- gtk.BUTTONS_OK,
- message)
- if secondary:
- m.format_secondary_text(secondary)
- m.run()
-
- def on_message(self, bus, message):
- if message.structure.get_name() == 'level':
- s = message.structure
- for i in range(0, len(s['peak'])):
- self.vus[i].freeze_notify()
- decay = clamp(s['decay'][i], -90.0, 0.0)
- peak = clamp(s['peak'][i], -90.0, 0.0)
- if peak > decay:
- print "ERROR: peak bigger than decay!"
-
- self.vus[i].set_property('decay', decay)
- self.vus[i].set_property('peak', peak)
- return True
-
- def run(self):
- try:
- self.set_sensitive(False)
- s = 'alsasrc ! level message=true ! fakesink'
- pipeline = gst.parse_launch(s)
- self.set_sensitive(True)
- pipeline.get_bus().add_signal_watch()
- i = pipeline.get_bus().connect('message::element', self.on_message)
- pipeline.set_state(gst.STATE_PLAYING)
- gtk.Dialog.run(self)
- pipeline.get_bus().disconnect(i)
- pipeline.get_bus().remove_signal_watch()
- pipeline.set_state(gst.STATE_NULL)
- except gobject.GError, e:
- self.set_sensitive(True)
- self.error('Could not create pipeline', e.__str__)
-
- if __name__ == '__main__':
- w = Window()
- w.show_all()
- w.run()
-