rendered paste body#!/bin/bash# 20050524 Thomas Hood: Cleaned up; added --dev-dir optionDEV_DIR="/dev"MAJOR=116OSSMAJOR=14DSP_MINOR=""MAX_CARDS=4OWNER=root.rootPERM=666DIR_PERM=755WIPE_OLD=yesif [ "`grep -w -E "^audio" /etc/group`x" != x ]; then OWNER=root.audiofifunction echo_usage () { echo "Usage: snddevices [-h|--help] [max] [--no-wipe] [--dev-dir=PATHNAME] [--owner=USER:GROUP]"}function 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 shiftdoneif [ "$OWNER" = "root.audio" ] ; then PERM=660 DIR_PERM=750fi# Meant to be called from assert_*_args onlyfunction report_args_error () { report_error "Incorrect function call: ${FUNCNAME[2]}() takes $* arguments"}function assert_one_arg () { { [ "$1" ] && [ -z "$2" ] ; } || { report_args_error "one" ; exit 99 ; }}function assert_two_args () { { [ "$2" ] && [ -z "$3" ] ; } || { report_args_error "two" ; exit 99 ; }}function assert_three_args () { { [ "$3" ] && [ -z "$4" ] ; } || { report_args_error "three" ; exit 99 ; }}function 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 destinationfunction link_file () { assert_two_args "$@" ln -svf "$1" "$DEV_DIR/$2"}# $1 DEV_DIR-relative pathname of source# $2 DEV_DIR-relative pathname of destinationfunction move_file () { assert_two_args "$@" mv -f "$DEV_DIR/$1" "$DEV_DIR/$2"}# $1 DEV_DIR-relative shell glob pattern of files to deletefunction del_file_pattern () { assert_one_arg "$@" eval rm -f "$DEV_DIR/$1"}# $1 DEV_DIR-relative pathname to makefunction make_dir () { assert_one_arg "$@" mkdir -p "$DEV_DIR/$1"}# $1 DEV_DIR-relative pathname to deletefunction del_dir () { assert_one_arg "$@" rmdir "$DEV_DIR/$1"}# $1 DEV_DIR-relative pathname to testfunction is_dir () { assert_one_arg "$@" [ -d "$DEV_DIR/$1" ]}# $1 owner:group# $2 DEV_DIR-relative pathname whose owner will be changedfunction change_owner () { assert_two_args "$@" chown "$1" "$DEV_DIR/$2"}# $1 perms# $2 DEV_DIR-relative pathname whose perms will be changedfunction change_perms () { assert_two_args "$@" chmod "$1" "$DEV_DIR/$2"}# $1 DEV_DIR-relative pathname of node to make# $2 major# $3 minorfunction 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 createfunction 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 createfunction 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=$[ $2 + $tmp ] make_char_node "$1$tmp1" "$OSSMAJOR" "$minor" change_owner "$OWNER" "$1$tmp1" change_perms "$PERM" "$1$tmp1" tmp=$[ $tmp + 16 ] tmp1=$[ $tmp1 + 1 ] done echo "done."}# $1 DEV_DIR-relative pathname of device to create# $2 minor number of device to createfunction 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 createfunction 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=$[ $tmp * 32 ] minor=$[ $2 + $minor ] make_char_node "${1}C${tmp}" "$MAJOR" "$minor" change_owner "$OWNER" "${1}C${tmp}" change_perms "$PERM" "${1}C${tmp}" tmp=$[ $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]function 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=$[ $tmp * 32 ] minor=$[ $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=$[ $tmp1 + 1 ] done tmp=$[ $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 amidifi# Remove old devicesif [ "$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 fifi# Create new onesmake_dir sndchange_owner "$OWNER" sndchange_perms "$DIR_PERM" sndcreate_card_dev_range snd/control 0create_single_dev snd/seq 1create_single_dev snd/timer 33create_device_dev_range snd/hw 4 4create_device_dev_range snd/midi 8 8create_device_dev_range snd/pcm 16 8 pcreate_device_dev_range snd/pcm 24 8 c# Create loader devicesdel_file_pattern 'aload*'create_card_dev_range aload 0create_single_dev aloadSEQ 1