dotfiles/.config/scripts/rofi-menus/audio-manager.sh
2026-04-25 16:39:11 +05:30

51 lines
1.8 KiB
Bash

#!/bin/bash
# Audio Output Management (Rofi-based)
# Dependencies: libpulse (pactl), rofi
get_volume() {
pactl get-sink-volume @DEFAULT_SINK@ | grep -Po '[0-9]+(?=%)' | head -n 1
}
manage_sinks() {
# Get list of sinks and their descriptions
local sinks=$(pactl list short sinks | awk '{print $2}')
local sink_descriptions=""
while read -r line; do
local desc=$(pactl list sinks | grep -A 20 "Name: $line" | grep "Description:" | cut -d: -f2- | xargs)
sink_descriptions+="$desc|$line\n"
done <<< "$sinks"
local chosen=$(echo -e "$sink_descriptions" | column -t -s '|' | rofi -dmenu -i -p "Select Audio Output: ")
if [ -n "$chosen" ]; then
local sink_name=$(echo "$chosen" | awk '{print $NF}')
pactl set-default-sink "$sink_name"
notify-send "Audio" "Output switched to: $sink_name"
fi
}
change_volume() {
local action=$(echo -e "󰝝 Increase (+10%)\n󰝞 Decrease (-10%)\n󰝟 Mute/Unmute" | rofi -dmenu -p "Volume: $(get_volume)%")
case $action in
*"Increase"*) pactl set-sink-volume @DEFAULT_SINK@ +10% ;;
*"Decrease"*) pactl set-sink-volume @DEFAULT_SINK@ -10% ;;
*"Mute"*) pactl set-sink-mute @DEFAULT_SINK@ toggle ;;
esac
}
# Main Menu
chosen=$(echo -e "󰓃 Switch Output\n󰕾 Adjust Volume\n󰍬 Manage Inputs (Microphone)" | rofi -dmenu -p "Audio Management: ")
case $chosen in
*"Output"*) manage_sinks ;;
*"Volume"*) change_volume ;;
*"Inputs"*)
# Logic for inputs is identical to sinks, just swap 'sink' with 'source'
sources=$(pactl list short sources | awk '{print $2}')
chosen_source=$(echo -e "$sources" | rofi -dmenu -p "Select Input: ")
[ -n "$chosen_source" ] && pactl set-default-source "$chosen_source"
;;
esac