openbsd-dotfiles

Base configurations for my Openbsd desktop
git clone https://git.kausban.com/openbsd-dotfiles/raw/.git
Log | Files | Refs

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