From 5d059fa82855dc2896ecd670f61722a47aaa6550 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Sun, 6 Jun 2010 21:59:42 +0200 Subject: add ossmixer.py Signed-off-by: Florian Pritz --- ossmixer.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100755 ossmixer.py (limited to 'ossmixer.py') diff --git a/ossmixer.py b/ossmixer.py new file mode 100755 index 0000000..9eb7fba --- /dev/null +++ b/ossmixer.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +"A simple volume control applet." + +import gtk +import subprocess + +__author__ = "Joakim \"JockeTF\" Soderlund" +__date__ = "2008-08-22" +__license__ = "Public domain." + +# Binaries to execute. +OSSMIX = "ossmix" +OSSXMIX = "ossxmix" + +# The device to control. +DEVICE = "vmix0-outvol" + +# The maximum outvol volume in decibels. +MAX_DB = 25.0 + +# Sets an icon for different volume levels. +LEVELS = ( + (22, "audio-volume-high"), + (18, "audio-volume-medium"), + (0, "audio-volume-low"), + (-1, "audio-volume-muted"), +) + +class StatusIcon(): + "The status icon." + def __init__(self): + self.icon = gtk.StatusIcon() + + self.icon.connect("scroll-event", self.scrollEvent) + self.icon.connect("activate", self.clickEvent) + + self.set_visible = self.icon.set_visible + + self.update() + + + def scrollEvent(self, widget, event, *args): + "Changes the volume when the user scrolls on the volume applet." + if event.direction == gtk.gdk.SCROLL_UP: + subprocess.call([OSSMIX, DEVICE, "--", "+%.1f" % self.getStep()]) + + elif event.direction == gtk.gdk.SCROLL_DOWN: + subprocess.call([OSSMIX, DEVICE, "--", "-%.1f" % self.getStep()]) + + self.update() + + + def clickEvent(self, widget, *args): + "Starts or closes ossxmix when the volume applet is clicked." + if not hasattr(self, "ossxmix"): + self.ossxmix = subprocess.Popen([OSSXMIX, "-S"]) + else: + if self.ossxmix.poll() == None: + self.ossxmix.terminate() + else: + self.ossxmix = subprocess.Popen([OSSXMIX, "-S"]) + + self.update() + + + def getVolume(self): + "Returns the current volume in decibels as a float." + process = subprocess.Popen([OSSMIX, DEVICE], stdout=subprocess.PIPE) + volume = float(process.communicate()[0].split()[-2]) + process.wait() + + return volume + + + def getStep(self): + "Returns the next volume step to make in decibels as a float." + return (MAX_DB - self.getVolume() + 1) * 0.1 + + + def getIconName(self): + "Returns the icon name for the current volume level." + volume = self.getVolume() + + for level in LEVELS: + if level[0] < volume: + return level[1] + + + def update(self, *args): + "Updates the volume applet's tooltip and icon." + self.icon.set_tooltip("Volume: %.1f dB" % self.getVolume()) + self.icon.set_from_icon_name(self.getIconName()) + + +if __name__ == "__main__": + icon = StatusIcon() + icon.set_visible(True) + + try: + gtk.main() + except KeyboardInterrupt: + print("") + -- cgit v1.2.3-24-g4f1b