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.
		
		
		
		
		
			
		
			
				
					
					
						
							153 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							153 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 | 
						|
		echo "Disabling PulseAudio TCP module" | 
						|
		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
 | 
						|
 |