sndiomenu (2508B)
1 #!/bin/sh 2 DMENU_CMD="dmenu -i -l 20 -fn mono-12" 3 4 audio_record_on() { 5 [ "$(sysctl -n kern.audio.record)" = "1" ] 6 } 7 8 sndio_server_dev() { 9 printf "audio%d" "$(sndioctl -n server.device)" 10 } 11 12 sndio_server_dev_check() { 13 [ "$1" = "$(sndio_server_dev)" ] 14 } 15 16 sndio_output_mute_check() { 17 [ "$(sndioctl -n output.mute)" = "1" ] 18 } 19 20 sndio_output_level() { 21 level="$(sndioctl -n output.level)" 22 printf "%.f" "$(echo "$level * 100" | bc)" 23 } 24 25 sndio_input_mute_check() { 26 [ "$(sndioctl -n input.mute)" = "1" ] 27 } 28 29 sndio_input_level() { 30 level="$(sndioctl -n input.level)" 31 printf "%.f" "$(echo "$level * 100" | bc)" 32 } 33 34 audio_devs() { 35 sndioctl -in server.device | tr ',' '\n' | while read -r num ; do 36 printf "audio%d\n" "$num" 37 done 38 } 39 40 dev_for_audio_dev() { 41 dmesg | grep "^${1} at" | tail -n 1 | sed -E "s/${1} at //" 42 } 43 44 audio_dev_desc() { 45 desc="$(dmesg | grep "^$(dev_for_audio_dev "$1") at" | tail -n 1 | sed -E "s/^.*\"(.+)\".*$/\1/")" 46 [ -z "$desc" ] && desc="$1" 47 printf "%s" "$desc" 48 } 49 50 sndio_devs() { 51 audio_devs | while read -r dev ; do 52 desc="$(audio_dev_desc "$dev")" 53 num="$(echo "$dev" | sed -E "s/audio//")" 54 server_tag="" 55 if sndio_server_dev_check "$dev"; then 56 server_tag=" (SERVER)" 57 fi 58 printf "%d %s%s\n" "$num" "$desc" "$server_tag" 59 done 60 } 61 62 set_sndio_dev() { 63 num="$(sndio_devs | eval $DMENU_CMD | cut -d ' ' -f1)" 64 sndioctl -q server.device="$num" 65 } 66 67 toggle_sndio_output_mute() { 68 sndio_output_mute_check && sndioctl -q output.mute=0 || sndioctl -q output.mute=1 69 } 70 71 toggle_sndio_input_mute() { 72 sndio_input_mute_check && sndioctl -q input.mute=0 || sndioctl -q input.mute=1 73 } 74 75 sndio_status() { 76 output_level="$(sndio_output_level)" 77 record_status=$(audio_record_on && echo "ENABLED" || echo "DISABLED") 78 79 input_message="No Input (${record_status})" 80 if sndioctl | grep 'input' > /dev/null 2>&1; then 81 input_level="$(sndio_input_level)" 82 input_message="Input: ${input_level}% (${record_status})" 83 fi 84 85 notify-send "Audio Status" "Output: ${output_level}%\n${input_message}" -h string:x-dunst-stack-tag:sndio_status 86 } 87 88 OPTIONS="server 89 mute-output 90 mute-input 91 status" 92 93 selector=$(echo "$OPTIONS" | eval $DMENU_CMD) 94 95 case "$selector" in 96 server) 97 set_sndio_dev 98 ;; 99 mute-output) 100 toggle_sndio_output_mute 101 ;; 102 mute-input) 103 toggle_sndio_input_mute 104 ;; 105 *) 106 sndio_status 107 ;; 108 esac