81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |