#!/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("")