bumblebee-status/bumblebee/modules/pulseaudio.py

101 lines
3.3 KiB
Python
Raw Normal View History

import re
import shlex
import subprocess
import bumblebee.module
import bumblebee.util
def usage():
module = __name__.split(".")[-1]
if module == "pasource":
return "pasource"
if module == "pasink":
return "pasink"
return "pulseaudio"
def notes():
return "Invokes 'pactl' to retrieve information."
pass
def description():
module = __name__.split(".")[-1]
if module == "pasink":
return "Shows volume and mute status of the default PulseAudio Sink."
if module == "pasource":
return "Shows volume and mute status of the default PulseAudio Source."
return "See 'pasource'."
class Module(bumblebee.module.Module):
def __init__(self, output, args):
super(Module, self).__init__(args)
self._module = self.__module__.split(".")[-1]
self._left = 0
self._right = 0
self._mono = 0
self._mute = False
channel = "sink" if self._module == "pasink" else "source"
output.add_callback(module=self.__module__, button=3,
cmd="pavucontrol")
output.add_callback(module=self.__module__, button=1,
cmd="pactl set-{}-mute @DEFAULT_{}@ toggle".format(channel, channel.upper()))
output.add_callback(module=self.__module__, button=4,
cmd="pactl set-{}-volume @DEFAULT_{}@ +2%".format(channel, channel.upper()))
output.add_callback(module=self.__module__, button=5,
cmd="pactl set-{}-volume @DEFAULT_{}@ -2%".format(channel, channel.upper()))
def data(self):
res = subprocess.check_output(shlex.split("pactl info"))
channel = "sinks" if self._module == "pasink" else "sources"
name = None
for line in res.split("\n"):
if line.startswith("Default Sink: ") and channel == "sinks":
name = line[14:]
if line.startswith("Default Source: ") and channel == "sources":
name = line[16:]
res = subprocess.check_output(shlex.split("pactl list {}".format(channel)))
found = False
for line in res.split("\n"):
if "Name:" in line and found == True:
break
if name in line:
found = True
if "Mute:" in line and found == True:
self._mute = False if " no" in line.lower() else True
if "Volume:" in line and found == True:
m = None
if "mono" in line:
m = re.search(r'mono:.*\s*\/\s*(\d+)%', line)
else:
m = re.search(r'left:.*\s*\/\s*(\d+)%.*right:.*\s*\/\s*(\d+)%', line)
if not m: continue
if "mono" in line:
self._mono = m.group(1)
else:
self._left = m.group(1)
self._right = m.group(2)
result = ""
if self._mono > 0:
result = "{}%".format(self._mono)
elif self._left == self._right:
result = "{}%".format(self._left)
else:
result="{}%/{}%".format(self._left, self._right)
return result
def state(self):
return "muted" if self._mute is True else "unmuted"
def warning(self):
return self._mute
def critical(self):
return False
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4