163 lines
3.3 KiB
Bash
Executable File
163 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
get_cards() {
|
|
pacmd list-cards | awk -F '[\t ]+' '
|
|
function printcard() {
|
|
print cardindex " " cardname " " carddesc
|
|
}
|
|
|
|
$2 ~ "index:" {
|
|
if(incard) {
|
|
printcard()
|
|
}
|
|
incard=1
|
|
cardindex=$3
|
|
}
|
|
incard && $2 ~ "name:" {
|
|
cardname=substr($3, 2, length($3) - 2)
|
|
}
|
|
incard && $2 ~ "device.description" {
|
|
carddesc=substr($0, index($0, "= ") + 2)
|
|
}
|
|
END {
|
|
printcard()
|
|
}
|
|
'
|
|
}
|
|
|
|
# First line will always be the active profile
|
|
get_selected_card_profiles() {
|
|
pacmd list-cards | awk -F '[\t ]+' \
|
|
-v selected_card_index="$selected_card_index" '
|
|
BEGIN {
|
|
profile_count=0
|
|
}
|
|
function print_card() {
|
|
if(do_print) {
|
|
print profile_names[i] " " profile_descs[i]
|
|
}
|
|
}
|
|
|
|
$2 ~ "index:" && $3 == selected_card_index {
|
|
incard=1
|
|
}
|
|
incard && $2 ~ "profiles:" {
|
|
inprofiles=1
|
|
next
|
|
}
|
|
inprofiles && $2 ~ "active" {
|
|
for(i = 0; i < profile_count; i++) {
|
|
if(profile_names[i] == substr($4, 2, length($4) - 2)) {
|
|
current_card_index=i
|
|
do_print=1
|
|
}
|
|
print_card()
|
|
}
|
|
for(i = 0; i < current_card_index; i++) {
|
|
print_card()
|
|
}
|
|
exit
|
|
}
|
|
inprofiles {
|
|
profile_names[profile_count] = substr($2, 0, length($2) - 1)
|
|
profile_descs[profile_count] = substr($0, index($0, ": ") + 2)
|
|
profile_count++
|
|
}
|
|
'
|
|
}
|
|
|
|
select_default_sink_card() {
|
|
selected_card=$(pacmd list-sinks | awk -F '[\t ]+' '
|
|
$2 == "*" && $3 ~ "index:" {
|
|
incard=1
|
|
}
|
|
incard && $2 == "card:" {
|
|
print $3 " " substr($4, 2, length($4) - 2)
|
|
exit
|
|
}
|
|
')
|
|
}
|
|
|
|
select_card_manually() {
|
|
card_options=$(get_cards)
|
|
selected_option_index=$(printf %s\\n "$card_options" | rofi -dmenu -format 'i')
|
|
selected_option_index=$((selected_option_index+1))
|
|
selected_card=$(printf %s\\n "$card_options" | sed -n "${selected_option_index}p")
|
|
}
|
|
|
|
print_usage() {
|
|
printf '
|
|
Usage: le-audio [OPTIONS]
|
|
Manage audio profiles
|
|
|
|
Options
|
|
-a Auto - Auto-select the card for the default sink
|
|
-f Filter - Filter out "off" profiles
|
|
-c Cycle - Auto-select the next audio profile after the current one
|
|
|
|
Utility written by Dakedres (dakedres.sys42.net)
|
|
'
|
|
}
|
|
|
|
while getopts 'afc' args; do
|
|
case "$args" in
|
|
a)
|
|
arg_auto_select_card=true
|
|
;;
|
|
|
|
f)
|
|
arg_filter_off_profile=true
|
|
;;
|
|
|
|
c)
|
|
arg_select_next_profile=true
|
|
;;
|
|
|
|
?)
|
|
print_usage
|
|
exit
|
|
;;
|
|
|
|
*)
|
|
>&2 echo "Invalid option '${args}'"
|
|
esac
|
|
done
|
|
|
|
if [ "$arg_auto_select_card" = true ]; then
|
|
select_default_sink_card
|
|
else
|
|
select_card_manually
|
|
fi
|
|
|
|
selected_card_index=$(printf %s\\n "$selected_card" | awk '{ print $1 }')
|
|
echo "$selected_card"
|
|
|
|
if [ "$arg_filter_off_profile" = true ]; then
|
|
selected_card_profiles=$(get_selected_card_profiles | grep -v '^off')
|
|
else
|
|
selected_card_profiles=$(get_selected_card_profiles)
|
|
fi
|
|
|
|
if [ "$arg_select_next_profile" = true ]; then
|
|
selected_profile_index=1
|
|
else
|
|
selected_profile_index=$(printf %s\\n "$selected_card_profiles" | rofi -dmenu -format "i")
|
|
fi
|
|
|
|
if [ -z "$selected_profile_index" ]; then
|
|
>&2 echo "No profile selected"
|
|
exit 1
|
|
fi
|
|
|
|
printf %s\\n "$selected_card_profiles" | awk \
|
|
-v selected_profile_index="$selected_profile_index" \
|
|
-v selected_card="$selected_card" \
|
|
-v qt="'" '
|
|
NR-1 == selected_profile_index {
|
|
split(selected_card, split_card, " ")
|
|
printf "pactl set-card-profile" " " split_card[1] " " $1
|
|
$1=""
|
|
print " && notify-send " qt "Set audio profile to" $0 qt
|
|
}
|
|
' | sh
|