[NaLug] [mini-HOWTO] utilizzare i tasti per il controllo del volume sulle tastiere con tasti speciali
ncrfgs a tin.it
ncrfgs a tin.it
Dom 27 Lug 2008 11:07:08 CEST
#!/bin/bash
#
# ctrltgl.sh
#
# Copyright (c) 2008 Fergus Incoronato
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
#
info() {
echo "=======> $1"
}
warning() {
info "WARNING: $1" >&2
}
error() {
info "ERROR: $1" >&2
}
interrupted() {
echo ""
error "Interrupted."
exit 1
}
parse_options() {
if (($#<5)); then
echo "`basename $CTRLTGL_COMMAND`: not enough arguments"
exit 1
elif (($#>5)); then
echo "`basename $CTRLTGL_COMMAND`: too many arguments"
exit 1
fi
while [ "$1" ]; do
case $1 in
set|sset)
if [ ! "$2" ]; then
echo "`basename $CTRLTGL_COMMAND`: Specify a scontrol identifier: 'name',index"
exit 1
elif [ ! "$3" ]; then
echo "`basename $CTRLTGL_COMMAND`: Specify what you want to set..."
exit 1
fi
SCONTROL="$2"
OVFILE="$2.state"
PARAMETER="$3"
shift
shift ;;
-d|--directory)
if [ ! "$2" ]; then
echo "`basename $CTRLTGL_COMMAND`: option $1 requires an argument"
exit 1
fi
WORK_DIR="$2"
shift ;;
*)
echo "`basename $CTRLTGL_COMMAND`: invalid option $1"
exit 1 ;;
esac
shift
done
}
check_exists() {
if [ ! -e "$1" ]; then
error "'$1' does not exist."
exit 1
fi
}
check_is_directory() {
if [ ! -d "$1" ]; then
error "'$1' is not a directory."
exit 1
fi
}
check_is_regular() {
if [ ! -f "$1" ]; then
error "'$1' is not a regular file."
exit 1
fi
}
check_is_writable() {
if [ ! -w "$1" ]; then
error "'$1' is not writable."
exit 1
fi
}
check_is_readable() {
if [ ! -r "$1" ]; then
error "'$1' is not readable."
exit 1
fi
}
toggle_volume() {
if ((CUR_VOL!=MIN)) || [ ! "$OLD_VOL" ]; then
NEW_VOL="$MIN"
else
CUR_VOL=""
NEW_VOL="$OLD_VOL"
fi
}
mute_volume() {
NEW_VOL="$MIN"
if [ "$OLD_VOL" ]; then
CUR_VOL="$OLD_VOL"
fi
}
unmute_volume() {
if [ ! "$OLD_VOL" ]; then
NEW_VOL="$CUR_VOL"
else
NEW_VOL="$OLD_VOL"
fi
CUR_VOL=""
}
lower_volume() {
if [ ! "$OLD_VOL" ]; then
NEW_VOL=$((CUR_VOL-${PARAMETER%-}))
if ((NEW_VOL<MIN)); then NEW_VOL="$MIN"; fi
CUR_VOL="$OLD_VOL"
else
NEW_VOL="$CUR_VOL"
CUR_VOL=$((OLD_VOL-${PARAMETER%-}))
if ((CUR_VOL<MIN)); then CUR_VOL="$MIN"; fi
fi
}
raise_volume() {
if [ ! "$OLD_VOL" ]; then
NEW_VOL=$((CUR_VOL+${PARAMETER%+}))
if ((NEW_VOL>MAX)); then NEW_VOL="$MAX"; fi
CUR_VOL="$OLD_VOL"
else
NEW_VOL="$CUR_VOL"
CUR_VOL=$((OLD_VOL+${PARAMETER%+}))
if ((CUR_VOL>MAX)); then CUR_VOL="$MAX"; fi
fi
}
main() {
local SCONTROL OVFILE PARAMETER WORK_DIR OVFILE_SIZE NUMID MIN MAX OLD_VOL CUR_VOL NEW_VOL
parse_options "$@"
check_exists "$WORK_DIR"
check_is_directory "$WORK_DIR"
check_is_writable "$WORK_DIR"
check_is_readable "$WORK_DIR"
check_exists "$WORK_DIR/$OVFILE"
check_is_regular "$WORK_DIR/$OVFILE"
check_is_writable "$WORK_DIR/$OVFILE"
check_is_readable "$WORK_DIR/$OVFILE"
OVFILE_SIZE="`find "$WORK_DIR/$OVFILE" -printf "%s\n"`"
if ((OVFILE_SIZE<1)) || ((OVFILE_SIZE>4)); then
error "'$WORK_DIR/$OVFILE' size is incompatible with allowed values."
exit 1
fi
NUMID="`amixer controls | grep "$SCONTROL" | cut -d , -f 1 | cut -d = -f 2`"
MIN="`amixer cget numid="$NUMID" | grep ';' | cut -d , -f 4 | cut -d = -f 2`"
MAX="`amixer cget numid="$NUMID" | grep ';' | cut -d , -f 5 | cut -d = -f 2`"
OLD_VOL="`cat "$WORK_DIR/$OVFILE"`"
CUR_VOL="`amixer cget numid="$NUMID" | grep : | cut -d , -f 2`"
if [ "$OLD_VOL" ]; then
if ((CUR_VOL!=MIN)); then
sed "1s|^$OLD_VOL$||" -i "$WORK_DIR/$OVFILE"
OLD_VOL=""
elif ((OLD_VOL<MIN)); then
sed "1s|^$OLD_VOL$|$MIN|" -i "$WORK_DIR/$OVFILE"
OLD_VOL="$MIN"
elif ((OLD_VOL>MAX)); then
sed "1s|^$OLD_VOL$|$MAX|" -i "$WORK_DIR/$OVFILE"
OLD_VOL="$MAX"
fi
fi
case $PARAMETER in
toggle)
toggle_volume ;;
mute)
mute_volume ;;
unmute)
unmute_volume ;;
*[[:digit:]]-)
lower_volume ;;
*[[:digit:]]+)
raise_volume ;;
*)
echo "`basename $CTRLTGL_COMMAND`: invalid parameter $PARAMETER"
exit 1 ;;
esac
sed "1s|^$OLD_VOL$|$CUR_VOL|" -i "$WORK_DIR/$OVFILE"
amixer sset "$SCONTROL" "$NEW_VOL"
exit 0
}
trap "interrupted" SIGHUP SIGINT SIGQUIT SIGTERM
readonly CTRLTGL_VERSION="0.2.30"
readonly CTRLTGL_COMMAND="$0"
main "$@"
# End of file
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome: signature.asc
Tipo: application/pgp-signature
Dimensione: 197 bytes
Descrizione: non disponibile
Url: http://nalug.net/pipermail/ml/attachments/20080727/b3861fed/attachment.bin
Maggiori informazioni sulla lista
ml