diff options
| author | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
| commit | 19120d4f9761c67d99ed1ce3da6084b83f5a49c9 (patch) | |
| tree | f234cad1bdad88114a63c9702144da487024967a /linux/home/.config/xob/manage-volume | |
| parent | 5928998af5404ae2be84c6cecc10ebf84bd3f3ed (diff) | |
| download | dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.tar.gz dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.zip | |
Linux-specific dotfiles
Diffstat (limited to 'linux/home/.config/xob/manage-volume')
| -rwxr-xr-x | linux/home/.config/xob/manage-volume | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/linux/home/.config/xob/manage-volume b/linux/home/.config/xob/manage-volume new file mode 100755 index 0000000..d05a92f --- /dev/null +++ b/linux/home/.config/xob/manage-volume @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +from pulsectl import Pulse, PulseLoopStop +import sys + +with Pulse() as pulse: + while True: + def callback(ev): + if ev.index == sink_index: raise PulseLoopStop + + def current_status(sink): + return round(sink.volume.value_flat * 100), sink.mute == 1 + + def get_default_sink_idx(): + default_sink_name = pulse.server_info().default_sink_name + try: + sink_index = next(index for index,sink in sinks.items() if sink.name == default_sink_name) + return sink_index + except StopIteration: raise StopIteration("No default sink was found.") + + try: + sinks = {s.index:s for s in pulse.sink_list()} + if len(sys.argv) > 1: + # Sink index from command line argument if provided + sink_index = int(sys.argv[1]) + if not sink_index in sinks: + raise KeyError(f"Sink index {sink_index} not found in list of sinks.") + else: + # Automatic determination of default sink otherwise + sink_index = get_default_sink_idx() + + pulse.event_mask_set('sink') + pulse.event_callback_set(callback) + last_value, last_mute = current_status(sinks[sink_index]) + + while True: + pulse.event_listen() + sinks = {s.index:s for s in pulse.sink_list()} + value, mute = current_status(sinks[sink_index]) + if value != last_value or mute != last_mute: + print(str(value) + ('!' if mute else '')) + last_value, last_mute = value, mute + sys.stdout.flush() + + except Exception as e: + print(f"ERROR: {e}", file=sys.stderr) |
