Files
sxmo-utils/scripts/core/sxmo_audio.sh
ArenM 7ea019e402 Manual fixups for nerd fonts 3.0
* Make icon_prn a nerd-font icons. It was using a font awesome code
  point, which we don't install with sxmo.
* Fix phone locked and laptop icons that weren't automatically updated
* Fix brightness icon in legacy nerd-fonts range and move it to
  sxmo_hook_icons from sxmo_brightness
* Use standard Unicode arrows instead of nerd-fonts ones
* Use icon variables for arrows in sxmo_wmmenu.sh
* Add variable for audio icon & use in sxmo_audio.sh
* Remove no stray break space from sxmo_contactmenu
* Remove up arrow character from reddit script
* use only icon variables in modemtext
* Update icons breakpoints

Signed-off-by: Willow Barraco <contact@willowbarraco.fr>
2023-05-29 19:58:29 +02:00

363 lines
9.4 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors
# shellcheck source=configs/default_hooks/sxmo_hook_icons.sh
. sxmo_hook_icons.sh
. sxmo_common.sh
set -e
notifyvol() {
vol="$1"
if [ "-" = "$vol" ]; then
vol="$(cat)"
fi
if [ "muted" = "$vol" ]; then
vol=0
fi
if [ "$SXMO_WM" = "sway" ] && [ -z "$SXMO_WOB_DISABLE" ]; then
printf "%s\n" "$vol" > "$XDG_RUNTIME_DIR"/sxmo.wobsock
else
dunstify -r 999 "$icon_audio Volume $vol"
fi
}
# adjust *output* vol/mute
pulsevolup() {
pactl set-sink-volume @DEFAULT_SINK@ +"${1:-5}%"
}
pulsevoldown() {
pactl set-sink-volume @DEFAULT_SINK@ -"${1:-5}%"
}
pulsevoltogglemute() {
pactl set-sink-mute @DEFAULT_SINK@ toggle
}
pulsevolismuted() {
pactl get-sink-mute @DEFAULT_SINK@ | grep -q "Mute: yes"
}
pulsevolget() {
if pulsevolismuted; then
printf "muted"
else
pactl get-sink-volume @DEFAULT_SINK@ | head -n1 | cut -d'/' -f2 | sed 's/ //g' | sed 's/\%//'
fi
}
pulsevolset() {
pactl set-sink-volume @DEFAULT_SINK@ "$1"%
}
# adjust *input* vol/mute
pulsemicvolup() {
pactl set-source-volume @DEFAULT_SOURCE@ +"${1:-5}%"
}
pulsemicvoldown() {
pactl set-source-volume @DEFAULT_SOURCE@ -"${1:-5}%"
}
pulsemictogglemute() {
pactl set-source-mute @DEFAULT_SOURCE@ toggle
}
pulsemicismuted() {
pactl get-source-mute @DEFAULT_SOURCE@ | grep -q "Mute: yes"
}
pulsemicvolget() {
if pulsemicismuted; then
printf "muted"
else
pactl get-source-volume @DEFAULT_SOURCE@ | head -n1 | cut -d'/' -f2 | sed 's/ //g' | sed 's/\%//'
fi
}
pulsemicvolset() {
pactl set-source-volume @DEFAULT_SOURCE@ "$1"%
}
# set the *active port* for output
pulsedeviceset() {
pactl set-sink-port @DEFAULT_SINK@ "[Out] $1"
}
# set the *active port* for input
pulsedevicesetinput() {
pactl set-source-port @DEFAULT_SOURCE@ "[In] $1"
}
# get the *active port* for input
pulsedevicegetinput() {
[ -z "$1" ] && default_source="$(pactl get-default-source)" || default_source="$1"
pactl --format=json list sources | jq -r ".[] | select(.name == \"$default_source\") | .active_port" | sed 's/\[In] //'
}
# get the *active port* for output
pulsedeviceget() {
[ -z "$1" ] && default_sink="$(pactl get-default-sink)" || default_sink="$1"
pactl --format=json list sinks | jq -r ".[] | select(.name == \"$default_sink\") | .active_port" | sed 's/\[Out] //'
}
# get the default sink
pulsedevicegetdefaultsink() {
pactl get-default-sink
}
# get the default source
pulsedevicegetdefaultsource() {
pactl get-default-source
}
pulsesourceset() {
pactl set-default-source "$1"
}
pulsesinkset() {
pactl set-default-sink "$1"
}
# get a list of sinks
_pulsesinkssubmenu() {
[ -z "$1" ] && default_sink="$(pactl get-default-sink)" || default_sink="$1"
pactl --format=json list sinks | jq -r '.[] | .name, .description' | while read -r line; do
name="$line"
read -r description
if [ "$default_sink" = "$name" ]; then
printf "%s %s %s ^ pulsesinkset %s\n" "$icon_chk" "$icon_spk" "$description" "$name"
else
printf " %s %s ^ pulsesinkset %s\n" "$icon_spk" "$description" "$name"
fi
done
}
# get a list of output ports
_pulseoutportssubmenu() {
[ -z "$1" ] && default_sink="$(pactl get-default-sink)" || default_sink="$1"
active_out_port="$(pulsedeviceget "$default_sink")"
pactl --format=json list sinks | jq -r ".[] | select(.name == \"$default_sink\" ) | .ports[] | select(.availability != \"not available\" ) | .name" | sed 's/\[Out] //' | while read -r line; do
[ "$active_out_port" = "$line" ] && icon="$icon_ton" || icon="$icon_tof"
printf " %s %s ^ pulsedeviceset %s\n" "$icon" "$line" "$line"
done
}
# get a list of input sources
_pulsesourcessubmenu() {
[ -z "$1" ] && default_source="$(pactl get-default-source)" || default_source="$1"
pactl --format=json list sources | jq -r '.[] | select (.monitor_source == "") | .name, .description' | while read -r line; do
name="$line"
read -r description
if [ "$default_source" = "$name" ]; then
printf "%s %s %s ^ pulsesourceset %s\n" "$icon_chk" "$icon_mic" "$description" "$name"
else
printf " %s %s ^ pulsesourceset %s\n" "$icon_mic" "$description" "$name"
fi
done
}
# get a list of input ports
_pulseinportssubmenu() {
# if the Headset is NOT plugged in, then do not display Headset
# as a option, as clicking on it causes pulse to unset the source!!
[ -z "$1" ] && default_source="$(pactl get-default-source)" || default_source="$1"
active_in_port="$(pulsedevicegetinput "$default_source")"
pactl --format=json list sources | jq -r ".[] | select(.name == \"$default_source\" ) | .ports[] | select(.availability != \"not available\" ) | .name" | sed 's/\[In] //' | while read -r line; do
[ "$active_in_port" = "$line" ] && icon="$icon_ton" || icon="$icon_tof"
printf " %s %s ^ pulsedevicesetinput %s\n" "$icon" "$line" "$line"
done
}
_callaudiodsubmenu() {
if ! command -v callaudiocli > /dev/null; then
return
fi
if sxmo_modemaudio.sh is_call_audio_mode; then
printf " %s callaudiod 'Call Mode' profile ^ sxmo_modemaudio.sh disable_call_audio_mode\n" "$icon_ton"
else
printf " %s callaudiod 'Call Mode' profile ^ sxmo_modemaudio.sh enable_call_audio_mode\n" "$icon_tof"
fi
}
_ringmodesubmenu() {
if [ -f "$XDG_CONFIG_HOME"/sxmo/.noring ]; then
printf " %s Ring ^ rm -f \"$XDG_CONFIG_HOME\"/sxmo/.noring\n" "$icon_tof"
else
printf " %s Ring ^ touch \"$XDG_CONFIG_HOME\"/sxmo/.noring\n" "$icon_ton"
fi
if [ -f "$XDG_CONFIG_HOME"/sxmo/.novibrate ]; then
printf " %s Vibrate ^ rm -f \"$XDG_CONFIG_HOME\"/sxmo/.novibrate\n" "$icon_tof"
else
printf " %s Vibrate ^ touch \"$XDG_CONFIG_HOME\"/sxmo/.novibrate\n" "$icon_ton"
fi
}
pulsemenuchoices() {
cur_vol="$(pulsevolget)"
cur_mic_vol="$(pulsemicvolget)"
default_sink_name="$(pulsedevicegetdefaultsink)"
default_source_name="$(pulsedevicegetdefaultsource)"
grep . <<EOF
$icon_cls Close Menu ^ exit
Output:
$(_pulsesinkssubmenu "$default_sink_name")
$(
if [ "$cur_vol" != "muted" ]; then
printf " %s Volume (%s%%) ^ pulsevolup\n" "$icon_aru" "$cur_vol"
printf " %s Volume (%s%%) ^ pulsevoldown\n" "$icon_ard" "$cur_vol"
printf " %s Output Mute ^ pulsevoltogglemute\n" "$icon_tof"
else
printf " %s Output Mute ^ pulsevoltogglemute\n" "$icon_ton"
fi
)
$(_pulseoutportssubmenu "$default_sink_name")
Input:
$(_pulsesourcessubmenu "$default_source_name")
$(
if [ "$cur_mic_vol" != "muted" ]; then
printf " %s Volume (%s%%) ^ pulsemicvolup\n" "$icon_aru" "$cur_mic_vol"
printf " %s Volume (%s%%) ^ pulsemicvoldown\n" "$icon_ard" "$cur_mic_vol"
printf " %s Input Mute ^ pulsemictogglemute\n" "$icon_tof"
else
printf " %s Input Mute ^ pulsemictogglemute\n" "$icon_ton"
fi
)
$(_pulseinportssubmenu "$default_source_name")
Call Options:
$(_callaudiodsubmenu)
$(_ringmodesubmenu)
EOF
}
alsacurrentdevice() {
if ! [ -f "$XDG_RUNTIME_DIR"/sxmo.audiocurrentdevice ]; then
alsadeviceset "$SPEAKER"
printf %s "$SPEAKER" > "$XDG_RUNTIME_DIR"/sxmo.audiocurrentdevice
fi
cat "$XDG_RUNTIME_DIR"/sxmo.audiocurrentdevice
}
amixerextractvol() {
grep -oE '([0-9]+)%' |
tr -d ' %' |
awk '{ s += $1; c++ } END { print s/c }' |
xargs printf %.0f
}
alsavolup() {
amixer -c "${SXMO_ALSA_CONTROL_NAME:-0}" set "$(alsacurrentdevice)" "${1:-5}%+" | amixerextractvol | notifyvol -
}
alsavoldown() {
amixer -c "${SXMO_ALSA_CONTROL_NAME:-0}" set "$(alsacurrentdevice)" "${1:-5}%-" | amixerextractvol | notifyvol -
}
alsavolget() {
if [ -n "$(alsacurrentdevice)" ]; then
amixer -c "${SXMO_ALSA_CONTROL_NAME:-0}" get "$(alsacurrentdevice)" | amixerextractvol
fi
}
alsamicismuted() {
echo "alsamicismuted: Not implemented">&2
}
alsadeviceget() {
case "$(alsacurrentdevice)" in
"$SPEAKER")
printf "Speaker"
;;
"$HEADPHONE")
printf "Headphone"
;;
"$EARPIECE")
printf "Earpiece"
;;
esac
}
alsamenuchoices() {
CURRENTDEV="$(alsacurrentdevice)"
cat <<EOF
$icon_cls Close Menu ^ exit
$icon_hdp Headphones $([ "$CURRENTDEV" = "Headphone" ] && echo "$icon_chk") ^ alsadeviceset Headphones
$icon_spk Speaker $([ "$CURRENTDEV" = "Line Out" ] && echo "$icon_chk") ^ alsadeviceset Speaker
$icon_phn Earpiece $([ "$CURRENTDEV" = "Earpiece" ] && echo "$icon_chk") ^ alsadeviceset Earpiece
$icon_mut None $([ -z "$CURRENTDEV" ] && echo "$icon_chk") ^ alsadeviceset
$icon_aru Volume up ^ alsavolup
$icon_ard Volume down ^ alsavoldown
$(_ringmodesubmenu)
EOF
}
ispulse() {
command -v pactl > /dev/null 2>&1 || return 1
pactl info > /dev/null 2>&1 || return 1
}
if [ -z "$*" ]; then
set -- menu
fi
backend="$AUDIO_BACKEND"
if [ -z "$backend" ]; then
if ispulse; then
backend=pulse
else
backend=alsa
fi
fi
if [ "$backend" = "alsa" ]; then
# set some alsa specific things
SPEAKER="${SXMO_SPEAKER:-"Line Out"}"
HEADPHONE="${SXMO_HEADPHONE:-"Headphone"}"
EARPIECE="${SXMO_EARPIECE:-"Earpiece"}"
fi
cmd="$1"
shift
case "$cmd" in
menu)
while : ; do
CHOICES="$("$backend"menuchoices)"
PICKED="$(
printf "%s\n" "$CHOICES" |
cut -d'^' -f1 |
sxmo_dmenu.sh -i -p "Audio"
)"
CMD="$(printf "%s\n" "$CHOICES" | grep -m1 -F "$PICKED" | cut -d '^' -f2)"
eval "$CMD"
done
;;
vol)
verb="$1"
shift
"$backend"vol"$verb" "$@"
;;
mic)
verb="$1"
shift
"$backend"mic"$verb" "$@"
;;
device)
verb="$1"
shift
"$backend"device"$verb" "$1"
;;
notify)
notifyvol "$("${backend}volget")"
;;
micnotify)
notifyvol "$("${backend}micvolget")"
;;
esac