You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.2 KiB
152 lines
3.2 KiB
#!/bin/sh |
|
|
|
# Control the volume |
|
# Depends: pamixer |
|
|
|
help() { |
|
B=$(tput bold) |
|
U=$(tput smul) |
|
N=$(tput sgr0) |
|
|
|
cat << EOF |
|
${B}NAME${N} |
|
volctl - control the volume |
|
|
|
${B}SYNOPSIS${N} |
|
${B}volctl${N} [${U}OPTION${N}] [${U}COMMAND${N}] [<${U}ARG${N}>] |
|
|
|
${B}DESCRIPTION${N} |
|
${B}volctl${N} uses pamixer to change the volume of the system. |
|
|
|
Commands can be truncated, i.e. "${B}volctl t${N}" for "${B}volctl toggle${N}" |
|
Arguments need to be of numeric value. |
|
|
|
${B}OPTIONS${N} |
|
${B}-h${N} Display usage message and exit. |
|
|
|
${B}COMMANDS${N} |
|
${B}i${N} <${U}AMOUNT${N}>, ${B}inc${N} <${U}AMOUNT${N}> |
|
Increase volume by ${U}AMOUNT${N}, default of 2. |
|
|
|
${B}d${N} <${U}AMOUNT${N}>, ${B}dec${N} <${U}AMOUNT${N}> |
|
Decrease volume by ${U}AMOUNT${N}, default of 2. |
|
|
|
${B}s${N} <${U}LEVEL${N}>, ${B}set${N} <${U}LEVEL${N}> |
|
Set volume to ${U}LEVEL${N}, default of 0. |
|
|
|
${B}t${N}, ${B}toggle${N} |
|
Toggle mute. |
|
|
|
${B}m${N}, ${B}mute${N} |
|
Mute volume. |
|
|
|
${B}u${N}, ${B}unmute${N} |
|
Unmute volume. |
|
|
|
${B}p${N} <${U}STATE${N}> <${U}DEVICE${N}>, ${B}pulsetcp${N} <${U}STATE${N}> <${U}DEVICE${N}> |
|
Set PulseAudio TCP module, possible values: on/off, 1/0, default enable. |
|
|
|
${B}getv${N}, ${B}getvolume${N} |
|
Get volume level. |
|
|
|
${B}getm${N}, ${B}getmute${N} |
|
Get mute status. |
|
EOF |
|
} |
|
|
|
# Exit if no option is provided |
|
[ "$#" -eq 0 ] && help && exit 1 |
|
|
|
SCRIPT="$(basename "$0")" |
|
|
|
# Option handling |
|
while getopts ':h?' opt; do |
|
case $opt in |
|
h) |
|
help |
|
exit 0 |
|
;; |
|
\?) |
|
echo "$SCRIPT: invalid option '$OPTARG'" |
|
echo "Try '$SCRIPT -h' for more information." |
|
exit 1 |
|
;; |
|
esac |
|
done |
|
|
|
pulseTcp() |
|
{ |
|
if test "$2" = "off" || test "$2" = "0"; then |
|
if pactl list modules short | grep -q module-simple-protocol-tcp; then |
|
pactl unload-module module-simple-protocol-tcp |
|
fi |
|
exit 0 |
|
fi |
|
|
|
"$0" p off |
|
|
|
# Select audio output device |
|
devices="$(pactl list sources short | awk '/alsa_output.*/ { print }' | sort -k 2)" |
|
select="$3" |
|
if [ -z "$select" ]; then |
|
echo "$devices" | sed -nE '=;s/.*alsa_output\.(.*)\.monitor.*/\1/p;' | sed 'N;s/\n/) /' |
|
printf "Enter device to stream: " |
|
read -r select |
|
fi |
|
|
|
device="$(echo "$devices" | sed -n "${select}p")" |
|
source="$(echo "$device" | awk '{ print $1; }')" |
|
format="$(echo "$device" | awk '{ print $4; }')" |
|
channels="$(echo "$device" | awk '{ print $5 + 0; }')" |
|
rate="$(echo "$device" | awk '{ print $6 + 0; }')" |
|
|
|
# Load PulseAudio TCP module |
|
pactl load-module module-simple-protocol-tcp \ |
|
rate="$rate" format="$format" channels="$channels" source="$source" \ |
|
record=true port=8000 listen=0.0.0.0 > /dev/null |
|
|
|
# Echo connection info |
|
ip="$(ip a show eth0 | awk '/inet / { print substr($2, 0, length($2) - 3) }')" |
|
echo "server: $ip:8000" |
|
echo "audio: ${rate}Hz ${channels}ch" |
|
} |
|
|
|
# Command handling |
|
shift $((OPTIND - 1)) |
|
case "$1" in |
|
i*) |
|
NUM=${2:-2} |
|
pamixer --increase "$NUM" |
|
;; |
|
d*) |
|
NUM=${2:-2} |
|
pamixer --decrease "$NUM" |
|
;; |
|
s*) |
|
NUM=${2:-0} |
|
pamixer --set-volume "$NUM" |
|
;; |
|
t*) |
|
pamixer --toggle-mute |
|
;; |
|
m*) |
|
pamixer --mute |
|
;; |
|
n*) |
|
pamixer --unmute |
|
;; |
|
p*) |
|
pulseTcp "$@" |
|
;; |
|
getv*) |
|
pamixer --get-volume |
|
;; |
|
getm*) |
|
pamixer --get-mute |
|
;; |
|
*) |
|
echo "$SCRIPT: invalid command '$1'" |
|
echo "Try '$SCRIPT -h' for more information." |
|
exit 1 |
|
;; |
|
esac
|
|
|