dotfiles/script/volume (view raw)
| 1 | #!/usr/bin/env bash |
| 2 | if [[ -z "$MIXER" ]] ; then |
| 3 | MIXER="default" |
| 4 | if command -v pulseaudio >/dev/null 2>&1 && pulseaudio --check ; then |
| 5 | if amixer -D pulse info >/dev/null 2>&1 ; then |
| 6 | MIXER="pulse" |
| 7 | fi |
| 8 | fi |
| 9 | [ -n "$(lsmod | grep jack)" ] && MIXER="jackplug" |
| 10 | MIXER="${2:-$MIXER}" |
| 11 | fi |
| 12 | |
| 13 | if [[ -z "$SCONTROL" ]] ; then |
| 14 | SCONTROL="${BLOCK_INSTANCE:-$(amixer -D $MIXER scontrols | |
| 15 | sed -n "s/Simple mixer control '\([^']*\)',0/\1/p" | |
| 16 | head -n1 |
| 17 | )}" |
| 18 | fi |
| 19 | |
| 20 | if [[ -z "$STEP" ]] ; then |
| 21 | STEP="${1:-5%}" |
| 22 | fi |
| 23 | |
| 24 | NATURAL_MAPPING=${NATURAL_MAPPING:-0} |
| 25 | if [[ "$NATURAL_MAPPING" != "0" ]] ; then |
| 26 | AMIXER_PARAMS="-M" |
| 27 | fi |
| 28 | |
| 29 | capability() { |
| 30 | amixer $AMIXER_PARAMS -D $MIXER get $SCONTROL | |
| 31 | sed -n "s/ Capabilities:.*cvolume.*/Capture/p" |
| 32 | } |
| 33 | |
| 34 | volume() { |
| 35 | amixer $AMIXER_PARAMS -D $MIXER get $SCONTROL $(capability) |
| 36 | } |
| 37 | |
| 38 | format() { |
| 39 | perl_filter='if (/.*\[(\d+%)\] (\[(-?\d+.\d+dB)\] )?\[(on|off)\]/)' |
| 40 | perl_filter+='{CORE::say $4 eq "off" ? "M" : "' |
| 41 | perl_filter+=$([[ $STEP = *dB ]] && echo '$3' || echo '$1') |
| 42 | perl_filter+='"; exit}' |
| 43 | output=$(perl -ne "$perl_filter") |
| 44 | echo "$LABEL$output" |
| 45 | } |
| 46 | |
| 47 | case $BLOCK_BUTTON in |
| 48 | 3) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) toggle ;; |
| 49 | 4) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) ${STEP}+ unmute ;; |
| 50 | 5) amixer $AMIXER_PARAMS -q -D $MIXER sset $SCONTROL $(capability) ${STEP}- unmute ;; |
| 51 | esac |
| 52 | |
| 53 | volume | format |