#!/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.*RUNNING/ { 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