You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.4 KiB
94 lines
2.4 KiB
8 years ago
|
#!/usr/bin/env python3
|
||
|
import argparse
|
||
|
import time
|
||
|
import selectors
|
||
|
import enum
|
||
|
import math
|
||
|
import functions
|
||
|
import subprocess
|
||
|
parser = argparse.ArgumentParser(description='Pulseaudio volume manager for xmobar')
|
||
|
parser.add_argument('output_pipe', type=argparse.FileType('w',bufsize=1))
|
||
|
parser.add_argument('command_pipe', type=argparse.FileType('r',bufsize=1))
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
class AudioState:
|
||
|
_muted = False
|
||
|
_volume = 0
|
||
|
|
||
|
@property
|
||
|
def muted(self):
|
||
|
return self._muted
|
||
|
|
||
|
@muted.setter
|
||
|
def muted(self, muted):
|
||
|
if self._muted != muted:
|
||
|
try:
|
||
|
self._muted = muted
|
||
|
self._pactl('set-sink-mute', str(int(muted)))
|
||
|
except subprocess.CalledProcessError as e:
|
||
|
pass
|
||
|
|
||
|
@property
|
||
|
def volume(self):
|
||
|
return self._volume
|
||
|
|
||
|
@volume.setter
|
||
|
def volume(self, volume):
|
||
|
if self.muted:
|
||
|
self.muted = False
|
||
|
if self._volume != volume:
|
||
|
try:
|
||
|
self._volume = volume
|
||
|
self._pactl('set-sink-volume', str(volume))
|
||
|
except subprocess.CalledProcessError as e:
|
||
|
pass
|
||
|
|
||
|
|
||
|
def _pactl(self, command, arg):
|
||
|
for i in range(6):
|
||
|
subprocess.check_call(["pactl", command, str(i), arg])
|
||
|
|
||
|
|
||
|
|
||
|
audio_state = AudioState()
|
||
|
|
||
|
|
||
|
def output_pipe(fd):
|
||
|
bars = functions.action_bars(functions.create_bars(audio_state.volume) if not audio_state.muted else ' (mute) ', args.command_pipe.name)
|
||
|
fd.writelines(bars+"\n")
|
||
|
|
||
|
def command_pipe(fd):
|
||
|
command = str.rstrip(fd.readline())
|
||
|
if len(command) == 0:
|
||
|
return False
|
||
|
if command[0] == '=':
|
||
|
audio_state.volume = int(command[1:])*9000
|
||
|
elif command == 'm1':
|
||
|
audio_state.muted = True
|
||
|
elif command == 'm0':
|
||
|
audio_state.muted = False
|
||
|
elif command == 'mt':
|
||
|
audio_state.muted = not audio_state.muted
|
||
|
elif command == '+':
|
||
|
audio_state.volume+=3000
|
||
|
elif command == '-':
|
||
|
audio_state.volume-=3000
|
||
|
elif command == 'r':
|
||
|
audio_state.volume=30000
|
||
|
return True
|
||
|
|
||
|
|
||
|
|
||
|
#sel = selectors.DefaultSelector()
|
||
|
#sel.register(args.output_pipe, selectors.EVENT_WRITE, data=output_pipe)
|
||
|
#sel.register(args.command_pipe, selectors.EVENT_READ, data=command_pipe)
|
||
|
|
||
|
while True:
|
||
|
if command_pipe(args.command_pipe):
|
||
|
output_pipe(args.output_pipe)
|
||
|
else:
|
||
|
time.sleep(1)
|
||
|
|
||
|
#for key, events in sel.select():
|
||
|
# key.data(key.fileobj, events)
|