Add dot_config/qtile/__pycache__/.keep Add dot_config/qtile/__pycache__/bars.cpython-38.pyc Add dot_config/qtile/__pycache__/bars.cpython-39.pyc Add dot_config/qtile/__pycache__/colors.cpython-38.pyc Add dot_config/qtile/__pycache__/colors.cpython-39.pyc Add dot_config/qtile/__pycache__/config-done.cpython-38.pyc Add dot_config/qtile/__pycache__/config.cpython-38.pyc Add dot_config/qtile/__pycache__/config.cpython-39.pyc Add dot_config/qtile/__pycache__/groups.cpython-38.pyc Add dot_config/qtile/__pycache__/groups.cpython-39.pyc Add dot_config/qtile/__pycache__/keys.cpython-38.pyc Add dot_config/qtile/__pycache__/keys.cpython-39.pyc Add dot_config/qtile/__pycache__/layouts.cpython-38.pyc Add dot_config/qtile/__pycache__/layouts.cpython-39.pyc Add dot_config/qtile/__pycache__/screens.cpython-38.pyc Add dot_config/qtile/__pycache__/screens.cpython-39.pyc Add dot_config/qtile/bars.py Add dot_config/qtile/colors.py Add dot_config/qtile/config.py Add dot_config/qtile/groups.py Add dot_config/qtile/keys.py Add dot_config/qtile/layouts.py Add dot_config/qtile/old_configs/.keep Add dot_config/qtile/old_configs/config.py Add dot_config/qtile/old_configs/sweenu/.keep Add dot_config/qtile/old_configs/sweenu/bars.py Add dot_config/qtile/old_configs/sweenu/colors.py Add dot_config/qtile/old_configs/sweenu/config.py Add dot_config/qtile/old_configs/sweenu/keys.py Add dot_config/qtile/old_configs/sweenu/util/.keep Add dot_config/qtile/old_configs/sweenu/util/__main__.py Add dot_config/qtile/old_configs/sweenu/util/backlight.py Add dot_config/qtile/old_configs/sweenu/util/monitor.py Add dot_config/qtile/old_configs/sweenu/util/screenshot.py Add dot_config/qtile/old_configs/sweenu/util/soundcard.py Add dot_config/qtile/old_configs/sweenu/widgets.py Add dot_config/qtile/screens.py Add dot_config/qtile/scripts/.keep Add dot_config/qtile/scripts/executable_autostart.sh Add dot_config/qtile/themes/.keep Add dot_config/qtile/themes/ayu-dark.json Add dot_config/qtile/themes/dracula.json Add dot_config/qtile/themes/hopscotch.json Add dot_config/qtile/themes/material-darker.json Add dot_config/qtile/themes/nord.json Add dot_config/qtile/themes/one-dark.json Add dot_config/qtile/themes/operator.json Add dot_config/qtile/themes/royal.json Add dot_config/qtile/themes/seashells.json Add dot_config/qtile/themes/smyck.json Add dot_config/qtile/themes/spacedust.json Add dot_config/qtile/themes/spacegray.json Add dot_config/qtile/themes/square.json Add dot_config/qtile/themes/tomorrow-nb.json
79 lines
2.7 KiB
Python
79 lines
2.7 KiB
Python
from subprocess import run, PIPE
|
|
|
|
import parse
|
|
|
|
from . import qtile_func, notify
|
|
|
|
class SoundCard():
|
|
def __init__(self, primary_card_name):
|
|
self.primary_card = primary_card_name
|
|
|
|
def get_current_sink(self):
|
|
cp = run(['pactl', 'info'], stdout=PIPE)
|
|
output = cp.stdout.decode('utf-8')
|
|
return parse.search('Default Sink: {}\n', output)[0]
|
|
|
|
def list_sinks(self):
|
|
"""Generator that yields for each sink, the sink and card name."""
|
|
cp = run(['pactl', 'list', 'sinks'], stdout=PIPE)
|
|
output = cp.stdout.decode('utf-8')
|
|
for sink in output.split('\nSink'):
|
|
sink_name = parse.search('Name: {}\n', sink)[0]
|
|
card_name = parse.search('alsa.card_name = "{}"', sink)[0]
|
|
yield sink_name, card_name
|
|
|
|
def set_new_sink(self, sink_card_tuple):
|
|
run(['pactl', 'set-default-sink', sink_card_tuple[0]])
|
|
|
|
def list_sink_inputs(self):
|
|
cp = run(['pactl', 'list', 'short', 'sink-inputs'], stdout=PIPE)
|
|
output = cp.stdout.decode('utf-8')
|
|
return {line.split()[0] for line in output.split('\n') if line}
|
|
|
|
def move_sink_input(self, name, new_sink):
|
|
run(['pactl', 'move-sink-input', name, new_sink])
|
|
|
|
def get_current_profile(self):
|
|
cp = run(['pactl', 'list', 'cards'], stdout=PIPE)
|
|
cp = run(['grep', 'Active'], stdout=PIPE, input=cp.stdout)
|
|
|
|
return 'hdmi' if b'hdmi' in cp.stdout else 'analog'
|
|
|
|
def set_profile(self, profile):
|
|
cmd = f'output:{profile}-stereo+input:analog-stereo'
|
|
run(['pactl', 'set-card-profile', self.primary_card, cmd])
|
|
|
|
@qtile_func
|
|
def change_sink(self, direction):
|
|
sinks = list(self.list_sinks())
|
|
|
|
# get the index of the tuple containing the current default sink
|
|
current_sink = self.get_current_sink()
|
|
for index, tup in enumerate(sinks):
|
|
if current_sink in tup:
|
|
default_sink_index = index
|
|
break
|
|
|
|
if direction == 'next':
|
|
new_sink = sinks[default_sink_index - 1]
|
|
elif direction == 'prev':
|
|
new_sink = sinks[(default_sink_index + 1) % len(sinks)]
|
|
|
|
self.set_new_sink(new_sink)
|
|
notify('Sound Card', new_sink[1])
|
|
|
|
# move current sink inputs, if any, to the new default sink
|
|
sink_inputs = self.list_sink_inputs()
|
|
if sink_inputs:
|
|
for sink_input in sink_inputs:
|
|
self.move_sink_input(sink_input, new_sink[0])
|
|
|
|
@qtile_func
|
|
def swap_profile(self):
|
|
profile = self.get_current_profile()
|
|
if profile == 'analog':
|
|
self.set_profile('hdmi')
|
|
notify('Sound Profile', 'HDMI')
|
|
elif profile == 'hdmi':
|
|
self.set_profile('analog')
|
|
notify('Sound Profile', 'Analog')
|