adds multi device support for volume keybinds

This commit is contained in:
2025-06-18 14:02:41 +02:00
parent fbf475fa82
commit 07f6759d0d
2 changed files with 83 additions and 3 deletions

View File

@ -28,9 +28,9 @@ bindd = $mainMod, G, Remove gaps between window, exec, hyprctl --batch "keyword
# ======= Volume Control ======= # ======= Volume Control =======
bindel = , XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5% && pactl get-sink-volume @DEFAULT_SINK@ | grep -oP '\d+(?=%)' | awk '{if($1>100) system("pactl set-sink-volume @DEFAULT_SINK@ 100%")}' # Raise Volume bindel = , XF86AudioRaiseVolume, exec, ~/.config/hypr/scripts/volume-helper.sh up
bindel = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% # Lower Volume bindel = , XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volume-helper.sh down
bindel = , XF86AudioMute, exec, amixer sset Master toggle | sed -En '/\[on\]/ s/.*\[([0-9]+)%\].*/\1/ p; /\[off\]/ s/.*/0/p' | head -1 > /tmp/$HYPRLAND_INSTANCE_SIGNATURE.wob #Mutes player audio bindel = , XF86AudioMute, exec, ~/.config/hypr/scripts/volume-helper.sh toggle
# ======= Playback Control ======= # ======= Playback Control =======

View File

@ -0,0 +1,80 @@
#!/bin/bash
#
# volume-helper.sh — Unified volume control script for Hyprland using pactl
#
# Purpose:
# Many systems have multiple audio output devices (sinks), such as onboard
# audio and an external device (e.g. M-Audio M-Track). This script adjusts the
# volume of both:
#
# - The default sink (`@DEFAULT_SINK@`)
# - A second sink (identified by partial name, e.g., "M-Track")
#
# Supports:
# - up → Increase volume by 5% (defined by STEP, capped at MAX_VOLUME)
# - down → Decrease volume by 5%
# - mute → Mute all sinks
# - unmute → Unmute all sinks
# - toggle → Toggle mute state of all sinks
#
# Do NOT run this with sudo! pactl must run in your user session.
#
MAX_VOLUME=140
STEP=5
# Secondary sink (e.g. M-Track 2X2)
SECOND_SINK=$(pactl list short sinks | grep "M-Track" | awk '{print $1}')
DEFAULT_SINK="@DEFAULT_SINK@"
adjust_volume() {
local sink=$1
local direction=$2
if [[ "$direction" == "up" ]]; then
pactl set-sink-volume "$sink" +${STEP}%
VOL=$(pactl get-sink-volume "$sink" | grep -oP '\d+(?=%)' | sort -nr | head -1)
if [ "$VOL" -gt "$MAX_VOLUME" ]; then
pactl set-sink-volume "$sink" "$MAX_VOLUME"%
fi
elif [[ "$direction" == "down" ]]; then
pactl set-sink-volume "$sink" -${STEP}%
fi
}
toggle_mute() {
local sink=$1
pactl set-sink-mute "$sink" "$2"
}
# Process action
case "$1" in
up)
adjust_volume "$DEFAULT_SINK" up
[[ -n "$SECOND_SINK" ]] && adjust_volume "$SECOND_SINK" up
;;
down)
adjust_volume "$DEFAULT_SINK" down
[[ -n "$SECOND_SINK" ]] && adjust_volume "$SECOND_SINK" down
;;
mute)
toggle_mute "$DEFAULT_SINK" 1
[[ -n "$SECOND_SINK" ]] && toggle_mute "$SECOND_SINK" 1
;;
unmute)
toggle_mute "$DEFAULT_SINK" 0
[[ -n "$SECOND_SINK" ]] && toggle_mute "$SECOND_SINK" 0
;;
toggle)
CURRENT_STATE=$(pactl get-sink-mute "$DEFAULT_SINK" | grep -oE "yes|no")
if [[ "$CURRENT_STATE" == "yes" ]]; then
"$0" unmute
else
"$0" mute
fi
;;
*)
echo "Usage: $0 up|down|mute|unmute|toggle"
exit 1
;;
esac