#!/bin/bash
# Skrypt do kontrolowania głośności urządzenia
# Poniższe zmienne dopasuj do własnych wymagań
DEFAULT_INTERVAL=5
DEFAULT_MIXER=Master
VIEWER='qiv -p'
IMAGE_ON="$HOME/skrypty/.glosniki/glosnik.png"
IMAGE_OFF="$HOME/skrypty/.glosniki/glosnik-wyl.png"
# polecenie nie zawiera argumentu opcji -P, ponieważ
# zostanie on obliczony w trakcie działania skryptu i wpisany tak,
# aby odpowiadał stanowi aktualnemu
OSD="osd_cat -p middle -A center -b percentage -T Głośność -d 1 -f '-*-helvetica-*-r-*-*-34-*-*-*-*-*-*-*' -O 1 -c '#fff' -P"
# nie modyfikuj nic poniżej chyba że wiesz co robisz
function help_msg {
echo "$0 [rise|lower|toggle]"
echo "If you need more advanced options, use amixer."
}
function get_volume {
amixer get $DEFAULT_MIXER |tail -1 |perl -pe 's:.*?\[([0-9]+)%.*:$1:gi'
}
function set_state {
amixer -q set $DEFAULT_MIXER "$1"
}
function display_image {
case $(amixer get $DEFAULT_MIXER |tail -1 |cut -d'[' -f 4) in
"on]") IMAGE=$IMAGE_ON ;;
"off]") IMAGE=$IMAGE_OFF ;;
esac
$VIEWER $IMAGE &
local PID=$!
sleep 1
kill $PID
}
# taka proteza troche utrudniająca przypadkowe zamknięcie qiv lub osd_cat
# jeśli ktoś ich używa poza skryptem. Jeśli któreś z nich zostało uruchomione
# na trzy sekundy lub mniej przed chwilą obecną, zamyka je.
# Zapobiega to nachodzeniu obrazów lub OSD na siebie w przypadku szybkiego
# wywoływania skryptu
function kill_process {
pgrep "$1" | while read PID; do
NOW=$(date +%s)
PID_C_TIME=$(stat --printf "%Y\n" /proc/$PID)
if [ $PID_C_TIME -gt $((NOW-3)) ]; then
kill $PID
fi
done
}
function cleanup {
kill_process osd_cat
kill_process qiv
}
if [ x$1 == 'x-h' ] || [ x$1 == 'x--help' ] || [ -z $1 ]; then
help_msg
exit 0
fi
if [ ! -z "$2" ]; then
DEFAULT_INTERVAL=$2
fi
case $1 in
'rise')
cleanup
set_state $DEFAULT_INTERVAL+
eval $OSD $(get_volume)
;;
'lower')
cleanup
set_state $DEFAULT_INTERVAL-
eval $OSD $(get_volume)
;;
'toggle')
cleanup
set_state toggle
display_image
;;
*)
help_msg
exit 1
;;
esac
Źródło: