blob: 0e066f14b59cfe6cdbea8788d21fff6a233568fa [file] [log] [blame]
#!/bin/sh
# 20050524 Thomas Hood: Cleaned up; added --dev-dir option
DEV_DIR="/dev"
MAJOR=116
OSSMAJOR=14
DSP_MINOR=""
MAX_CARDS=4
OWNER=root.root
PERM=666
DIR_PERM=755
WIPE_OLD=yes
if [ "`grep "^audio:" /etc/group`x" != x ]; then
OWNER=root.audio
fi
echo_usage () {
echo "Usage: snddevices [-h|--help] [max] [--no-wipe] [--dev-dir=PATHNAME] [--owner=USER:GROUP]"
}
report_error () {
echo "${0}: Error: $*" >&2
}
while [ "$1" ] ; do
case "$1" in
"-?"|-h|--help) echo_usage ; exit 0 ;;
max) DSP_MINOR=19 ;;
--no-wipe) WIPE_OLD="" ;;
--dev-dir) DEV_DIR="$2" ; shift ;;
--dev-dir=*) DEV_DIR="${1#--dev-dir=}" ;;
--owner) OWNER="$2" ; shift ;;
--owner=*) OWNER="${1#--owner=}" ;;
*) echo_usage >&2 ; exit 1 ;;
esac
shift
done
if [ "$OWNER" = "root.audio" ] ; then
PERM=660
DIR_PERM=750
fi
# Meant to be called from assert_*_args only
report_args_error () {
# report_error "Incorrect call: ${FUNCNAME[2]}() takes $* arguments"
report_error "Incorrect call: needs $* arguments"
}
assert_one_arg () {
{ [ "$1" ] && [ -z "$2" ] ; } || { report_args_error "one" ; exit 99 ; }
}
assert_two_args () {
{ [ "$2" ] && [ -z "$3" ] ; } || { report_args_error "two" ; exit 99 ; }
}
assert_three_args () {
{ [ "$3" ] && [ -z "$4" ] ; } || { report_args_error "three" ; exit 99 ; }
}
assert_three_or_four_args () {
{ [ "$3" ] && [ -z "$5" ] ; } || { report_args_error "three or four" ; exit 99 ; }
}
# $1 destination-relative pathname of source
# $2 DEV_DIR-relative pathname of destination
link_file () {
assert_two_args "$@"
ln -sf "$1" "$DEV_DIR/$2"
}
# $1 DEV_DIR-relative pathname of source
# $2 DEV_DIR-relative pathname of destination
move_file () {
assert_two_args "$@"
mv -f "$DEV_DIR/$1" "$DEV_DIR/$2"
}
# $1 DEV_DIR-relative shell glob pattern of files to delete
del_file_pattern () {
assert_one_arg "$@"
eval rm -f "$DEV_DIR/$1"
}
# $1 DEV_DIR-relative pathname to make
make_dir () {
assert_one_arg "$@"
mkdir -p "$DEV_DIR/$1"
}
# $1 DEV_DIR-relative pathname to delete
del_dir () {
assert_one_arg "$@"
rmdir "$DEV_DIR/$1"
}
# $1 DEV_DIR-relative pathname to test
is_dir () {
assert_one_arg "$@"
[ -d "$DEV_DIR/$1" ]
}
# $1 owner:group
# $2 DEV_DIR-relative pathname whose owner will be changed
change_owner () {
assert_two_args "$@"
chown "$1" "$DEV_DIR/$2"
}
# $1 perms
# $2 DEV_DIR-relative pathname whose perms will be changed
change_perms () {
assert_two_args "$@"
chmod "$1" "$DEV_DIR/$2"
}
# $1 DEV_DIR-relative pathname of node to make
# $2 major
# $3 minor
make_char_node () {
assert_three_args "$@"
rm -f "$DEV_DIR/$1"
mknod "$DEV_DIR/$1" c "$2" "$3"
}
# $1 DEV_DIR-relative pathname of device to create
# $2 minor number of device to create
create_oss_dev () {
assert_two_args "$@"
del_file_pattern "$1"
echo -n "Creating $1..."
make_char_node "$1" "$OSSMAJOR" "$2"
change_owner "$OWNER" "$1"
change_perms "$PERM" "$1"
echo "done."
}
# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
create_oss_dev_range () {
assert_two_args "$@"
tmp=0
tmp1=0
del_file_pattern "$1"
del_file_pattern "${1}?"
echo -n "Creating $1?..."
while [ "$tmp1" -lt "$MAX_CARDS" ]; do
minor=`expr $2 + $tmp`
make_char_node "$1$tmp1" "$OSSMAJOR" "$minor"
change_owner "$OWNER" "$1$tmp1"
change_perms "$PERM" "$1$tmp1"
tmp=`expr $tmp + 16`
tmp1=`expr $tmp1 + 1`
done
echo "done."
}
# $1 DEV_DIR-relative pathname of device to create
# $2 minor number of device to create
create_single_dev () {
assert_two_args "$@"
del_file_pattern "$1"
echo -n "Creating $1..."
make_char_node "$1" "$MAJOR" "$2"
change_owner "$OWNER" "$1"
change_perms "$PERM" "$1"
echo "done."
}
# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
create_card_dev_range () {
assert_two_args "$@"
tmp=0
del_file_pattern "$1"
del_file_pattern "${1}?"
echo -n "Creating $1?..."
while [ "$tmp" -lt "$MAX_CARDS" ]; do
minor=`expr $tmp \* 32`
minor=`expr $2 + $minor`
make_char_node "${1}C${tmp}" "$MAJOR" "$minor"
change_owner "$OWNER" "${1}C${tmp}"
change_perms "$PERM" "${1}C${tmp}"
tmp=`expr $tmp + 1`
done
echo "done."
}
# $1 DEV_DIR-relative base pathname of devices to create
# $2 minor number offset of devices to create
# $3 number of devices to create
# [$4 device name suffix]
create_device_dev_range () {
assert_three_or_four_args "$@"
tmp=0
del_file_pattern "$1"
del_file_pattern "${1}?"
echo -n "Creating $1??$4..."
while [ "$tmp" -lt "$MAX_CARDS" ]; do
tmp1=0
while [ "$tmp1" -lt "$3" ]; do
minor=`expr $tmp \* 32`
minor=`expr $2 + $minor + $tmp1`
make_char_node "${1}C${tmp}D${tmp1}${4}" "$MAJOR" "$minor"
change_owner "$OWNER" "${1}C${tmp}D${tmp1}${4}"
change_perms "$PERM" "${1}C${tmp}D${tmp1}${4}"
tmp1=`expr $tmp1 + 1`
done
tmp=`expr $tmp + 1`
done
echo "done."
}
# OSS (Lite) compatible devices...
if test "$OSSMAJOR" -eq 14; then
create_oss_dev_range mixer 0
create_oss_dev sequencer 1
create_oss_dev_range midi0 2 # /dev/midi is for tclmidi
create_oss_dev_range dsp 3
create_oss_dev_range audio 4
create_oss_dev sndstat 6
create_oss_dev music 8
create_oss_dev_range dmmidi 9
create_oss_dev_range dmfm 10
create_oss_dev_range amixer 11 # alternate mixer
create_oss_dev_range adsp 12 # alternate dsp
create_oss_dev_range amidi 13 # alternate midi
create_oss_dev_range admmidi 14 # alternate direct midi
# create symlinks
link_file mixer0 mixer
link_file midi00 midi # /dev/midi0 is for tclmidi
link_file dsp0 dsp
link_file audio0 audio
link_file music sequencer2
link_file adsp0 adsp
link_file amidi0 amidi
fi
# Remove old devices
if [ "$WIPE_OLD" = yes ] ; then
move_file sndstat 1sndstat
del_file_pattern 'snd*'
move_file 1sndstat sndstat
if is_dir snd ; then
del_file_pattern 'snd/*'
del_dir snd
fi
fi
# Create new ones
make_dir snd
change_owner "$OWNER" snd
change_perms "$DIR_PERM" snd
create_card_dev_range snd/control 0
create_single_dev snd/seq 1
create_single_dev snd/timer 33
create_device_dev_range snd/hw 4 4
create_device_dev_range snd/midi 8 8
create_device_dev_range snd/pcm 16 8 p
create_device_dev_range snd/pcm 24 8 c
# Create loader devices
del_file_pattern 'aload*'
create_card_dev_range aload 0
create_single_dev aloadSEQ 1