summaryrefslogtreecommitdiffstats
path: root/ossmixer.py
blob: 9eb7fba3af22999af07894d8b52431a0446100c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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("")