51 lines
1.8 KiB
Bash
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
|