diff --git a/.config/hypr/config/keybinds.conf b/.config/hypr/config/keybinds.conf index 7e7c97a..82a26e1 100644 --- a/.config/hypr/config/keybinds.conf +++ b/.config/hypr/config/keybinds.conf @@ -28,9 +28,9 @@ bindd = $mainMod, G, Remove gaps between window, exec, hyprctl --batch "keyword # ======= 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 = , XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5% # Lower Volume -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 = , XF86AudioRaiseVolume, exec, ~/.config/hypr/scripts/volume-helper.sh up +bindel = , XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volume-helper.sh down +bindel = , XF86AudioMute, exec, ~/.config/hypr/scripts/volume-helper.sh toggle # ======= Playback Control ======= diff --git a/.config/hypr/scripts/volume-helper.sh b/.config/hypr/scripts/volume-helper.sh new file mode 100755 index 0000000..6d7a42e --- /dev/null +++ b/.config/hypr/scripts/volume-helper.sh @@ -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