diff options
Diffstat (limited to 'alsa-utils/alsaconf/alsaconf.in')
-rw-r--r-- | alsa-utils/alsaconf/alsaconf.in | 1435 |
1 files changed, 0 insertions, 1435 deletions
diff --git a/alsa-utils/alsaconf/alsaconf.in b/alsa-utils/alsaconf/alsaconf.in deleted file mode 100644 index 6e9ff75..0000000 --- a/alsa-utils/alsaconf/alsaconf.in +++ /dev/null @@ -1,1435 +0,0 @@ -#!/bin/bash -# -# ALSA Configurator -# -# Copyright (c) 1999-2002 SuSE GmbH -# Jan ONDREJ -# -# written by Takashi Iwai <tiwai@suse.de> -# Bernd Kaindl <bk@suse.de> -# Jan ONDREJ (SAL) <ondrejj@salstar.sk> -# -# based on the original version of Jan ONDREJ's alsaconf for ALSA 0.4. -# -# 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. -# - -export TEXTDOMAIN=alsaconf - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ -sbindir=@sbindir@ -version=@VERSION@ -USE_NLS=@USE_NLS@ - -# Useful for debugging -PROCFS="/proc" -SYSFS="/sys" - -# i18n stuff -if test "$USE_NLS" = "yes" && type -p gettext > /dev/null; then - xecho() { - gettext -s "$*" - } -else - xecho() { - echo "$*" - } - gettext() { - echo -n "$*" - } -fi -xmsg() { - msg=$(gettext "$1") - shift - printf "$msg" $* -} - -# Check for GNU/Linux distributions -if [ -f /etc/SuSE-release ]; then - distribution="suse" - suse_version=$(grep 'VERSION = ' /etc/SuSE-release | sed -e s/'VERSION = '//) -elif [ -f /etc/UnitedLinux-release ]; then - distribution="suse" -elif [ -f /etc/gentoo-release ]; then - distribution="gentoo" -elif [ -f /etc/debian_version ]; then - distribution="debian" -elif [ -f /etc/mandrake-release ]; then - distribution="mandrake" -elif test -f /etc/redhat-release && grep -q "Red Hat" /etc/redhat-release; then - distribution="redhat" -elif test -f /etc/fedora-release && grep -q "Fedora" /etc/fedora-release; then - distribution="fedora" -elif [ -f /etc/slackware-version -o -f /etc/slamd64-version ]; then - distribution="slackware" -else - distribution="unknown" -fi - -for prog in lspci lsmod; do - for path in /sbin /usr/sbin /bin /usr/bin;do - test -x $path/$prog && eval $prog=$path/$prog - done -done -unset prog path - -usage() { - xecho "ALSA configurator" - echo " version $version" - xecho "usage: alsaconf [options] - -l|--legacy check only legacy non-isapnp cards - -m|--modinfo read module descriptions instead of reading card db - -s|--sound wav-file - use the specified wav file as a test sound - -u|--uid uid set the uid for the ALSA devices (default = 0) [obsoleted] - -g|--gid gid set the gid for the ALSA devices (default = 0) [obsoleted] - -d|--devmode mode - set the permission for ALSA devices (default = 0666) [obs.] - -r|--strict set strict device mode (equiv. with -g 17 -d 0660) [obsoleted] - -L|--log file logging on the specified file (for debugging purpose only) - -p|--probe card-name - probe a legacy non-isapnp card and print module options - -P|--listprobe list the supported legacy card modules - -c|--config file - specify the module config file - -R|--resources list available DMA and IRQ resources with debug for legacy - -h|--help what you're reading" -} - -OPTS=`getopt -o lmL:hp:Pu:g:d:rs:c:R --long legacy,modinfo,log:,help,probe:,listprobe,uid:,gid:,devmode:,strict,sound:,config:,resources -n alsaconf -- "$@"` || exit 1 -eval set -- "$OPTS" - -do_legacy_only=0 -use_modinfo_db=0 -alsa_uid=0 -alsa_gid=0 -alsa_mode=0666 -legacy_probe_card="" -LOGFILE="" -TESTSOUND="@TESTSOUND@" -try_all_combination=0 -resources="false" - -# legacy support -LEGACY_CARDS="opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8" - -while true ; do - case "$1" in - -l|--legacy) - do_legacy_only=1; shift ;; - -m|--modinfo) - use_modinfo_db=1; shift ;; - -s|--sound) - TESTSOUND=$2; shift 2;; - -h|--help) - usage; exit 0 ;; - -L|--log) - LOGFILE="$2"; shift 2;; - -p|--probe) - legacy_probe_card="$2"; shift 2;; - -P|--listprobe) - echo "$LEGACY_CARDS"; exit 0;; - -u|--uid) - alsa_uid="$2"; shift 2;; - -g|--gid) - alsa_gid="$2"; shift 2;; - -d|--devmode) - alsa_mode="$2"; shift 2;; - -r|--strict) - alsa_uid=0; alsa_gid=17; alsa_mode=0660; shift;; - -c|--config) - cfgfile="$2"; shift 2;; - -R|--resources) - resources="true"; shift;; - --) shift ; break ;; - *) usage ; exit 1 ;; - esac -done - -# -# probe legacy ISA cards -# - -check_dma_avail () { - list="" - if [ -d $SYSFS/bus/pnp/devices ]; then - for dma in $*; do - ok="true" - for i in $SYSFS/bus/pnp/devices/??:* ; do - if grep -q "state = active" $i/resources ; then - if grep -q '^dma '$dma'$' $i/resources; then - ok="false" - fi - fi - done - if [ -r $PROCFS/dma ]; then - if grep -q '^ *'$dma': ' $PROCFS/dma ; then - ok="false" - fi - fi - if [ "$ok" = "true" ]; then - list="$list $dma" - fi - done - else - if [ -r $PROCFS/dma ]; then - for dma in $*; do - grep -q '^ *'$dma': ' $PROCFS/dma || list="$list $dma" - done - fi - fi - if [ ! -z "$list" ]; then - echo $list - fi -} - -check_irq_avail () { - list="" - if [ -d $SYSFS/bus/pnp/devices ]; then - for irq in $*; do - ok="true" - for i in $SYSFS/bus/pnp/devices/??:* ; do - if grep -q "state = active" $i/resources ; then - if grep -q '^irq '$irq'$' $i/resources; then - ok="false" - fi - fi - done - if [ -r $PROCFS/interrupts ]; then - if grep -q '^ *'$irq': ' $PROCFS/interrupts ; then - ok="false" - fi - fi - if [ "$ok" = "true" ]; then - list="$list $irq" - fi - done - else - if [ -r $PROCFS/interrupts ]; then - for irq in $*; do - grep -q '^ *'$irq': ' $PROCFS/interrupts || list="$list $irq" - done - fi - fi - if [ ! -z "$list" ]; then - echo $list - fi -} - -# -# -# - -if [ "$resources" = "true" ]; then - if [ -d $SYSFS/bus/pnp/devices ]; then - for i in $SYSFS/bus/pnp/devices/??:* ; do - if [ "$resources" = "true" ]; then - echo ">>>>> PnP file: $i/resources" - cat $i/resources - fi - done - fi - if [ -r $PROCFS/dma ]; then - echo ">>>>> Allocated dma channels:" - cat $PROCFS/dma - fi - if [ -r $PROCFS/interrupts ]; then - echo ">>>>> Allocated interrupt channels:" - cat $PROCFS/interrupts - fi - echo -n "Valid DMA channels: " - check_dma_avail 0 1 2 3 4 5 6 7 - echo -n "Valid IRQ channels: " - check_irq_avail 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - exit 0 -fi - -# Check for root privileges -if [ `id -u` -ne 0 ]; then - xecho "You must be root to use this script." - exit 1 -fi - -# -# check the snd_ prefix for ALSA module options -# snd_ prefix is obsoleted since 0.9.0rc4. -# -if /sbin/modinfo -p snd | grep -q snd_ ; then - mpfx="snd_" -else - mpfx="" -fi - -alsa_device_opts="" -if /sbin/modinfo -p snd | grep -q uid ; then - if [ x"$alsa_uid" != x0 ]; then - alsa_device_opts="$alsa_device_opts ${mpfx}device_uid=$alsa_uid" - fi - if [ x"$alsa_gid" != x0 ]; then - alsa_device_opts="$alsa_device_opts ${mpfx}device_gid=$alsa_gid" - fi -fi -if /sbin/modinfo -p snd | grep -q device_mode ; then - if [ x"$alsa_mode" != x0 ]; then - alsa_device_opts="$alsa_device_opts ${mpfx}device_mode=$alsa_mode" - fi -fi - -case `uname -r` in -2.6.*) - kernel="new" - ;; -*) - kernel="old" - ;; -esac - -# cfgfile = base config file to remove/update the sound setting -# cfgout = new config file to write the sound setting (if different from $cfgfile) -if [ -n "$cfgfile" ]; then - if [ ! -r "$cfgfile" ]; then - xecho "ERROR: The config file doesn't exist: " - echo $cfgfile - exit 1 - fi -else -if [ "$distribution" = "gentoo" ]; then - cfgfile="/etc/modules.d/alsa" -elif [ "$kernel" = "new" ]; then - if [ -d /etc/modprobe.d ]; then - cfgout="/etc/modprobe.d/sound" - fi - cfgfile="/etc/modprobe.conf" -elif [ "$distribution" = "debian" ]; then - cfgfile="/etc/modutils/sound" -elif [ -e /etc/modules.conf ]; then - cfgfile="/etc/modules.conf" -elif [ -e /etc/conf.modules ]; then - cfgfile="/etc/conf.modules" -else - cfgfile="/etc/modules.conf" - touch /etc/modules.conf -fi -fi - -# Check for dialog, whiptail, gdialog, awk, ... ? -if type -p dialog > /dev/null; then - DIALOG=dialog -else - if type -p whiptail > /dev/null; then - whiptail_wrapper() { - X1="$1" - X2="$2" - if [ $1 = --yesno ]; then - X3=`expr $3 + 2` - else - X3=$3 - fi - shift 3 - whiptail "$X1" "$X2" $X3 "$@" - } - DIALOG=whiptail_wrapper - else - xecho "Error, dialog or whiptail not found." - exit 1 - fi -fi -if type -p awk > /dev/null; then : -else - xecho "Error, awk not found. Can't continue." - exit 1 -fi - -# -# remove entries by yast2 sound configurator -# -remove_y2_block() { - awk ' - /^alias sound-slot-[0-9]/ { next } - /^alias char-major-116 / { next } - /^alias char-major-14 / { next } - /^alias snd-card-[0-9] / { next } - /^options snd / { next } - /^options snd-/ { next } - /^options off / { next } - /^alias sound-service-[0-9]/ { next } - /^# YaST2: sound / { next } - { print }' -} - -# -# remove entries by sndconfig sound configurator -# -# found strings to search for in WriteConfModules, -# from sndconfig 0.68-4 (rawhide version) - -remove_sndconfig_block() { - awk ' - /^alias sound-slot-0/ { modulename = $3 ; next } - /^alias sound-slot-[0-9]/ { next } - /^post-install sound-slot-[0-9] / { next } - /^pre-remove sound-slot-[0-9] / { next } - /^options sound / { next } - /^alias synth0 opl3/ { next } - /^options opl3 / { next } - /^alias midi / { mididev = $3 ; next } - /^options / { if ($2 == mididev) next } - /^pre-install / { if ($2 == mididev) next } - /^alias synth0 / { synth = $3 ; next } - /^post-install / { if ($2 == synth) next } - /^options sb / { next } - /^post-install .+ \/bin\/modprobe "aci"/ { if ($2 == modulename) next } - /^options adlib_card / { next } - /^options .+ isapnp=1/ { if ($2 == modulename) next } - /^options i810_audio / { next } - /^options / {if ($2 == modulename) next } - { print }' -} - -# -# remove the previous configuration by alsaconf -# -remove_ac_block() { - awk '/^'"$ACB"'$/,/^'"$ACE"'$/ { next } { print }' -} - -# -# set default mixer volumes -# -set_mixers() { - amixer -s -q <<EOF -set Master 75% unmute -set Master -12dB -set 'Master Mono' 75% unmute -set 'Master Mono' -12dB -set Front 75% unmute -set Front -12dB -set PCM 90% unmute -set PCM 0dB -mixer Synth 90% unmute -mixer Synth 0dB -mixer CD 90% unmute -mixer CD 0dB -# mute mic -set Mic 0% mute -# ESS 1969 chipset has 2 PCM channels -set PCM,1 90% unmute -set PCM,1 0dB -# Trident/YMFPCI/emu10k1 -set Wave 100% unmute -set Music 100% unmute -set AC97 100% unmute -# CS4237B chipset: -set 'Master Digital' 75% unmute -# Envy24 chips with analog outs -set DAC 90% unmute -set DAC -12dB -set DAC,0 90% unmute -set DAC,0 -12dB -set DAC,1 90% unmute -set DAC,1 -12dB -# some notebooks use headphone instead of master -set Headphone 75% unmute -set Headphone -12dB -set Playback 100% unmute -# turn off digital switches -set "SB Live Analog/Digital Output Jack" off -set "Audigy Analog/Digital Output Jack" off -EOF -} - - -# INTRO -intro() { - local msg=$(xmsg " - ALSA CONFIGURATOR - version %s - - This script is a configurator for - Advanced Linux Sound Architecture (ALSA) driver. - - - If ALSA is already running, you should close all sound - apps now and stop the sound driver. - alsaconf will try to do this, but it's not 100%% sure." $version) - $DIALOG --msgbox "$msg" 20 63 || acex 0 -} - -# FAREWELL -farewell() { - local msg=$(gettext " - - OK, sound driver is configured. - - ALSA CONFIGURATOR - - will prepare the card for playing now. - - Now I'll run alsasound init script, then I'll use - amixer to raise the default volumes. - You can change the volume later via a mixer - program such as alsamixer or gamix. - - ") - $DIALOG --msgbox "$msg" 17 60 || acex 0 -} - -# Exit function -acex() { - cleanup - clear - exit $1 -} - -# -# search for alsasound init script -# - -if [ "$distribution" = "debian" ]; then - rcalsasound=/etc/init.d/alsa -elif [ -x /etc/rc.d/rc.alsa ]; then - rcalsasound=/etc/rc.d/rc.alsa -elif [ -x /etc/init.d/alsasound ]; then - rcalsasound=/etc/init.d/alsasound -elif [ -x /usr/sbin/rcalsasound ]; then - rcalsasound=/usr/sbin/rcalsasound -elif [ -x /sbin/rcalsasound ]; then - rcalsasound=/sbin/rcalsasound -elif [ -x /etc/rc.d/init.d/alsasound ]; then - rcalsasound=/etc/rc.d/init.d/alsasound -elif [ -x /etc/init.d/alsa ]; then - rcalsasound=/etc/init.d/alsa -else - rcalsasound=rcalsasound -fi - - -# MAIN -if [ -d $PROCFS/asound ]; then - $rcalsasound stop >/dev/null 2>&1 - $rcalsasound unload >/dev/null 2>&1 - /sbin/rmmod dmasound dmasound_awacs 2>/dev/null -fi - - -cleanup () { - killall -9 aplay arecord >/dev/null 2>&1 - /sbin/modprobe -r isapnp >/dev/null 2>&1 - /sbin/modprobe -r isa-pnp >/dev/null 2>&1 - rm -f "$TMP" "$addcfg" "$FOUND" "$DUMP" -} -trap cleanup 0 - -TMP=`mktemp -q /tmp/alsaconf.XXXXXX` -if [ $? -ne 0 ]; then - xecho "Can't create temp file, exiting..." - exit 1 -fi -addcfg=`mktemp -q /tmp/alsaconf.XXXXXX` -if [ $? -ne 0 ]; then - xecho "Can't create temp file, exiting..." - exit 1 -fi -FOUND=`mktemp -q /tmp/alsaconf.XXXXXX` -if [ $? -ne 0 ]; then - xecho "Can't create temp file, exiting..." - exit 1 -fi -DUMP=`mktemp -q /tmp/alsaconf.XXXXXX` -if [ $? -ne 0 ]; then - xecho "Can't create temp file, exiting..." - exit 1 -fi - -# convert ISA PnP id number to string 'ABC' -convert_isapnp_id () { - if [ -z "$1" ]; then - echo "XXXX" - return - fi - let a='('$1'>>2) & 0x3f' - let b='(('$1' & 0x03) << 3) | (('$1' >> 13) & 0x07)' - let c='('$1'>> 8) & 0x1f' - strs='@ABCDEFGHIJKLMNOPQRSTUVWXYZ' - echo ${strs:$a:1}${strs:$b:1}${strs:$c:1} -} - -# swap high & low bytes -swap_number () { - if [ -z "$1" ]; then - echo "0000" - return - fi - let v='(('$1'>>8)&0xff)|(('$1'&0xff)<<8)' - printf "%04x" $v -} - -# build card database -# build_card_db filename -build_card_db () { - MODDIR=/lib/modules/`uname -r` - last_driver="" - echo -n > $1 - - # list pci cards - while read driver vendor device dummy; do - if expr $driver : 'snd-.*' >/dev/null ; then - if [ "$last_driver" != "$driver" ]; then - echo $driver.o - last_driver=$driver - fi - id1=`printf '0x%04x' $vendor` - id2=`printf '0x%04x' $device` - echo "PCI: $id1=$id2" - fi - done < $MODDIR/modules.pcimap >> $1 - - # list isapnp cards - while read driver cardvendor carddevice data vendor func; do - if expr $driver : 'snd-.*' >/dev/null ; then - if [ "$last_driver" != "$driver" ]; then - echo $driver.o - last_driver=$driver - fi - id1=`convert_isapnp_id $cardvendor` - dev1=`swap_number $carddevice` - id2=`convert_isapnp_id $vendor` - dev2=`swap_number $func` - echo "ISAPNP: $id1$dev1=$id2$dev2" - fi - done < $MODDIR/modules.isapnpmap >> $1 -} - -# -# probe cards -# -probe_cards () { - found="0" - test -r $PROCFS/isapnp || /sbin/modprobe isapnp >/dev/null 2>&1 - test -r $PROCFS/isapnp || /sbin/modprobe isa-pnp >/dev/null 2>&1 - if [ -r $PROCFS/isapnp ]; then - cat $PROCFS/isapnp >"$DUMP" - found="1" - elif [ -d $SYSFS/bus/pnp/devices ]; then - # use 2.6 kernel's sysfs output - # fake the isapnp dump - index=0 - bindex=0 - for d1 in $SYSFS/devices/pnp* ; do - for d2 in $d1/*:* ; do - if [ -r $d2/card_id ]; then - id=`cat $d2/card_id` - name=`cat $d2/name` - echo "Card $index '$id:$name' " >> "$DUMP" - index=$[$index+1] - found="1" - else if [ -r $d2/id ]; then - # FIXME: multiple id might be present (separated with new-line) - id=`head -n 1 $d2/id` - echo "BIOS $bindex '$id' " >> "$DUMP" - bindex=$[$bindex+1] - found="1" - fi - fi - done - done - fi - if [ "$found" = "0" ]; then - echo -n >"$DUMP" - fi - CARDID_DB=/var/tmp/alsaconf.cards - if [ ! -r $CARDID_DB ]; then - use_modinfo_db=1 - fi - if [ $use_modinfo_db != 1 ]; then - if [ $CARDID_DB -ot /lib/modules/`uname -r`/modules.dep ]; then - use_modinfo_db=1 - fi - fi - if [ $use_modinfo_db = 1 ]; then - xecho "Building card database.." - build_card_db $CARDID_DB - fi - if [ ! -r $CARDID_DB ]; then - xecho "No card database is found.." - exit 1 - fi - ncards=`grep '^snd-.*\.o$' $CARDID_DB | wc -w` - - msg=$(gettext "Searching sound cards") - awk ' -BEGIN { - format="%-40s %s\n"; - ncards='"$ncards"'; - idx=0; -} -/^snd-.*\.o$/{ - sub(/.o$/, ""); - driver=$0; - perc=(idx * 100) / (ncards + 1); - print int(perc); - idx++; -} -/^[<literal space><literal tab>]*PCI: /{ - gsub(/0x/, ""); - gsub(/=/, ":"); - x = sprintf ("'$lspci' -n 2>/dev/null| grep '"' 04..: '"' | grep %s", $2); - if (system (x) == 0) - printf "%s %s\n", $2, driver >>"'"$FOUND"'" -} -/^[<literal space><literal tab>]*ISAPNP: /{ - id2 = substr($0, index($0, "=")+1); - gsub(/=.*/, ""); - x = sprintf ("grep '\''^Card [0-9] .%s:'\'' '"$DUMP"'", $2); - if (system (x) == 0) - printf "%s %s\n", $2, driver >>"'"$FOUND"'" - else if (index($2, "ffff") > 0) { - x = sprintf ("grep '\''^BIOS [0-9]* .%s.'\'' '"$DUMP"'", id2); - if (system (x) == 0) - printf "%s %s\n", id2, driver >>"'"$FOUND"'" - } -}' < $CARDID_DB |\ - $DIALOG --gauge "$msg" 6 40 0 - - # - # PowerMac - # - if grep -q MacRISC $PROCFS/cpuinfo; then - MODDIR=/lib/modules/`uname -r` - find $MODDIR -name 'snd-powermac*' -print | \ - while read i; do - i=${i##*/} - i=${i%%.o} - i=${i%%.ko} - echo "PowerMac $i" >> $FOUND - done - fi - - # - # Sparc - # - if grep -q Sparc $PROCFS/cpuinfo; then - test -r $PROCFS/openprom/name || /bin/mount -t openpromfs none $PROCFS/openprom >/dev/null 2>&1 - # Check for an "audio" device - audio= - compat= - if test -r $PROCFS/openprom; then - audio=`find $PROCFS/openprom -follow -type d -name "audio*" -print` - fi - if test -n "$audio"; then - compat=`cat $audio/compatible` - compat=${compat#\'} - compat=${compat%\'} - compat=${compat#SUNW,} - fi - # Go through all cards we have - MODDIR=/lib/modules/`uname -r` - find $MODDIR -name 'snd-sun-*' -print | \ - while read i; do - i=${i##*/} - i=${i%%.o} - i=${i%%.ko} - sdev=`echo ${i#snd-sun-} | tr "[a-z]" "[A-Z]"` - - if test "$sdev" = "$compat"; then - echo "$sdev $i" >> $FOUND - elif test -r $PROCFS/openprom; then - find $PROCFS/openprom -follow -type d -name "SUNW,${sdev}*" \ - -exec echo "$sdev $i" \; 2>/dev/null >> $FOUND - else - echo "$sdev $i" >> $FOUND - fi - done - fi -} - -# -# look for a descriptive device name from the given device id -# -find_device_name () { - if expr "$1" : '[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then - $lspci -d $1 2>/dev/null| sed -e 's/^.*:..\.. [^:]*: //g' - return - elif expr "$1" : '[A-Z@][A-Z@][A-Z@][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then - cardname=`grep '^Card [0-9]\+ .'$1':' $DUMP | head -n 1 | sed -e 's/^Card [0-9]\+ '\''.*:\(.*\)'\'' .*$/\1/'` - echo $cardname - else - echo $1 - fi -} - -# get hwcfg file type from the given driver name -get_hwcfg_type () { - while read dev driver; do - if [ "$driver" = "$1" ]; then - case "$dev" in - *:*) - # FIXME: need to look around /sys/bus/pci/* (or use vpid-* ?) - devid=`$lspci -d "$dev" | head -n 1 | sed -e 's/ .*$//'` - case "$devid" in - *:*:*.*) ;; - *) devid="0000:$devid" ;; - esac - echo bus-pci-$devid - ;; - *) - echo $driver - ;; - esac - break - fi - done -} - -# clean up all hwcfg-* files containing ALSA modules -# alsaconf sets up exclusively -cleanup_hwcfg () { - for i in /etc/sysconfig/hardware/hwcfg-*; do - grep -q "MODULE='snd-" $i && rm -f $i - done -} - -# -# set up /etc/sysconfig/hardware/hwcfg-* stuff -# -setup_hwcfg () { - card=$1 - cleanup_hwcfg - cfg=`echo "$devs_olist" | get_hwcfg_type $card` - echo "MODULE='$card'" > /etc/sysconfig/hardware/hwcfg-$cfg - echo "STARTMODE='auto'" >> /etc/sysconfig/hardware/hwcfg-$cfg -} - - -# -# configure and try test sound -# -ac_config_card () { - - CARD_DRIVER=snd-$1 - CARD_OPTS="${*:2}" - - if [ -n "$cfgout" ]; then - msg=$(xmsg " -Configuring %s -Do you want to modify %s (and %s if present)?" $CARD_DRIVER $cfgout $cfgfile) - $DIALOG --yesno "$msg" 8 50 || acex 0 - else - msg=$(xmsg " -Configuring %s -Do you want to modify %s?" $CARD_DRIVER $cfgfile) - $DIALOG --yesno "$msg" 8 50 || acex 0 - fi - clear - - # Copy conf.modules and make changes. - ACB="# --- BEGIN: Generated by ALSACONF, do not edit. ---" - ACE="# --- END: Generated by ALSACONF, do not edit. ---" - - # Detect 2.2.X kernel - KVER=`uname -r | tr ".-" " "` - KVER1=`echo $KVER | cut -d" " -f1` - KVER2=`echo $KVER | cut -d" " -f2` - if [ $KVER1 -ge 2 ] && [ $KVER2 -ge 2 ]; then - SOUND_CORE="soundcore" - else - SOUND_CORE="snd" - fi - - if [ -r $cfgfile ] ; then - if [ "$distribution" = "redhat" -o "$distribution" = "fedora" ] ; then - remove_ac_block < $cfgfile | remove_sndconfig_block | uniq > $TMP - else - remove_ac_block < $cfgfile | remove_y2_block | uniq > $TMP - fi - fi - - if [ -z "$have_alias" -a "$kernel" = "new" ]; then - if grep -q char-major-116 /lib/modules/`uname -r`/modules.alias; then - have_alias="yes" - fi - fi - if [ -z "$have_alias" ]; then -echo "alias char-major-116 snd -alias char-major-14 $SOUND_CORE -alias sound-service-0-0 snd-mixer-oss -alias sound-service-0-1 snd-seq-oss -alias sound-service-0-3 snd-pcm-oss -alias sound-service-0-8 snd-seq-oss -alias sound-service-0-12 snd-pcm-oss" >> $addcfg - fi - if [ -n "$alsa_device_opts" ]; then - echo "options snd $alsa_device_opts" >> $addcfg - fi -echo "alias snd-card-0 $CARD_DRIVER -alias sound-slot-0 $CARD_DRIVER" >> $addcfg - if [ -n "$CARD_OPTS" ]; then - echo "options $CARD_DRIVER $CARD_OPTS" >> $addcfg - fi - - if [ -n "$cfgout" ]; then - [ ! -r "$cfgfile" ] || cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile" - cmp -s "$addcfg" "$cfgout" || cat "$addcfg" > "$cfgout" - else - echo "$ACB -# --- ALSACONF version $version ---" >> $TMP - cat "$addcfg" >> "$TMP" - echo "$ACE -" >> $TMP - cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile" - fi - - /sbin/depmod -a 2>/dev/null - - # remove yast2 entries (- only for suse distro) - if [ -f /var/lib/YaST/unique.inf ]; then - awk ' -BEGIN { in_sound=0; } -/^\[sound\]$/ { print; in_sound=1; next; } -/^\[.+\]$/ { print; in_sound=0; next; } -{ if (in_sound == 0) { print; } } -' < /var/lib/YaST/unique.inf > $TMP - cp -f $TMP /var/lib/YaST/unique.inf - fi - - # set up /etc/sysconfig/hardware/* - if [ "$distribution" = "suse" ]; then - case "$suse_version" in - 10.[012]*|10) - setup_hwcfg $CARD_DRIVER - ;; - esac - fi - - farewell - clear - case "$distribution" in - gentoo | debian) - xecho "Running update-modules..." - update-modules - ;; - esac - if [ -x $rcalsasound ] ; then - echo Loading driver... - $rcalsasound restart - fi - echo Setting default volumes... - if [ -x $bindir/set_default_volume ]; then - $bindir/set_default_volume -f - else - set_mixers - fi - if [ -f $TESTSOUND ]; then - msg=$(gettext " - The mixer is set up now for for playing. - Shall I try to play a sound sample now? - - NOTE: -If you have a big amplifier, lower your volumes or say no. - Otherwise check that your speaker volume is open, - and look if you can hear test sound. -") - if $DIALOG --yesno "$msg" 13 65 - then - clear - echo - aplay -N $TESTSOUND - fi - fi - if [ ! -r /etc/asound.state ]; then - xecho "Saving the mixer setup used for this in /etc/asound.state." - $sbindir/alsactl store - fi - clear - xecho " -=============================================================================== - - Now ALSA is ready to use. - For adjustment of volumes, use your favorite mixer. - - Have a lot of fun! - -" -} - -# check playback -# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem) -ac_try_load () { - test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE" - /sbin/modprobe snd-$1 ${*:2} >/dev/null 2>&1 - if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then - : ; - else - /sbin/modprobe -r snd-$1 >/dev/null 2>&1 - return 1 - fi - - # mute mixers - amixer set Master 0% mute >/dev/null 2>&1 - amixer set PCM 0% mute >/dev/null 2>&1 - - # output 0.5 sec - head -c 4000 < /dev/zero | aplay -N -r8000 -fS16_LE -traw -c1 > /dev/null 2>&1 & - # remember pid - pp=$! - # sleep for 2 seconds (to be sure -- 1 sec would be enough) - sleep 2 - # kill the child process if still exists. - kill -9 $pp > /dev/null 2>&1 - st=$? - ac_cardname=`head -n 1 $PROCFS/asound/cards | sed -e 's/^[0-9].* - \(.*\)$/\1/'` - /sbin/modprobe -r snd-$1 >/dev/null 2>&1 - if [ $st = 0 ]; then - # irq problem? - test -n "$LOGFILE" && echo "no playback return" >> "$LOGFILE" - return 2 - else - # seems ok! - test -n "$LOGFILE" && echo "playback OK" >> "$LOGFILE" - return 0 - fi -} - -# check capture -# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem) -# ac_try_capture card duplex opts -ac_try_capture () { - test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE" - /sbin/modprobe snd-$1 ${*:3} >/dev/null 2>&1 - if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then - : ; - else - /sbin/modprobe -r snd-$1 >/dev/null 2>&1 - return 1 - fi - - # mute mixers - amixer set Master 0% mute >/dev/null 2>&1 - amixer set PCM 0% mute >/dev/null 2>&1 - - play_pid=0 - if [ $2 = yes ]; then - # try duplex - start dummy playing - aplay -N -r8000 -fS16_LE -traw -c1 < /dev/zero > /dev/null 2>&1 & - play_pid=$! - fi - # record 1sec - arecord -N -d1 > /dev/null 2>&1 & - # remember pid - pp=$! - # sleep for 2 seconds - sleep 2 - # kill the child process if still exists. - kill -9 $pp > /dev/null 2>&1 - st=$? - # kill playback process if any - test $play_pid != 0 && kill -9 $play_pid - /sbin/modprobe -r snd-$1 >/dev/null 2>&1 - if [ $st = 0 ]; then - test -n "$LOGFILE" && echo "capture no return" >> "$LOGFILE" - return 2 - else - test -n "$LOGFILE" && echo "capture OK" >> "$LOGFILE" - return 0 - fi -} - -get_dma_pair () { - case $1 in - 0) - echo 1 3 5;; - 1) - echo 0 3 5;; - 3) - echo 1 0 5;; - 5) - echo 3 1 0;; - esac -} - -# -# check playback on specified irqs -# -# ac_try_irq card opts irqs... -# return 0 - OK, 1 - NG, 2 - not working (dma problem?) -# -ac_try_irq () { - card=$1 - opts="$2 ${mpfx}irq=$3" - ac_try_load $card $opts >/dev/null 2>&1 - result=$? - case $result in - 0) - ac_opts="$opts" - return 0 - ;; - 2) - for irq in ${*:4}; do - opts="$2 ${mpfx}irq=$irq" - ac_try_load $card $opts >/dev/null 2>&1 - if [ $? = 0 ]; then - ac_opts="$opts" - return 0 - fi - done - return 2 - ;; - esac - return 1 -} - -# -# check playback/capture on dma1 & dma2 & specified irqs -# -# ac_try_dmas card opts irqs... -# return 0 - OK, 1 - NG -# -ac_try_dmas () { - dma_list=`check_dma_avail 1 0 3 5` - for irq in ${*:3}; do - for dma1 in $dma_list; do - for dma2 in `get_dma_pair $dma1`; do - opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq" - ac_try_load $1 $opts >/dev/null 2>&1 - result=$? - if [ $result = 1 ]; then - if [ $try_all_combination = 1 ]; then - continue - else - return 1 - fi - elif [ $result = 0 ]; then - test -n "$LOGFILE" && echo "Now checking capture..." >> "$LOGFILE" - ac_opts="$opts" - ac_try_capture $1 yes $opts >/dev/null 2>&1 && return 0 - for d in yes no; do - for dma2 in $dma_list; do - if [ $dma1 != $dma2 ]; then - opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq" - ac_opts="$opts" - ac_try_capture $1 $d $opts >/dev/null 2>&1 && return 0 - fi - done - done - return 0 - fi - done - done - done - return 1 -} - -# check if the option $2 exists in card $1: set value $3 -ac_check_option () { - if /sbin/modinfo -p snd-$1 | grep -q $2; then - echo "$2=$3" - fi -} - -ac_try_card_sb8 () { - card=sb8 - irq_list=`check_irq_avail 5 3 9 10 7` - for dma8 in `check_dma_avail 1 3`; do - opts="${mpfx}dma8=$dma8" - ac_try_irq $card "$opts" $irq_list && return 0 - done - return 1 -} - -ac_try_card_sb16 () { - card=sb16 - isapnp=`ac_check_option $card ${mpfx}isapnp 0` - opts="$isapnp" - irq_list=`check_irq_avail 5 9 10 7 3` - dma_list=`check_dma_avail 0 1 3` - dma16_list=`check_dma_avail 5 6 7` - # at first try auto-probing by driver itself - ac_try_load $card $opts >/dev/null 2>&1 - result=$? - case $result in - 0) - ac_opts="$opts" - ac_try_capture $card yes $opts >/dev/null 2>&1 && return 0 - for d in yes no; do - for dma8 in $dma_list; do - for irq in $irq_list; do - opts="${mpfx}dma8=$dma8 ${mpfx}irq=$irq $isapnp" - ac_try_capture $card $d $opts >/dev/null 2>&1 && return 0 - done - done - done - return 0 - ;; - 2) - for dma16 in $dma16_list; do - opts="${mpfx}dma16=$dma16 $isapnp" - if ac_try_irq $card "$opts" $irq_list ; then - ac_try_capture $card yes $ac_opts >/dev/null 2>&1 && return 0 - ac_opts_saved="$ac_opts" - for d in yes no; do - for dma8 in $dma_list; do - ac_opts="$ac_opts_saved ${mpfx}dma8=$dma8" - ac_try_capture $card $d $ac_opts >/dev/null 2>&1 && return 0 - done - done - # return anyway here.. - return 0 - fi - done - ;; - esac - return 1 -} - -ac_try_card_es1688 () { - card=es1688 - opts="" - irq_list=`check_irq_avail 5 9 10 7` - for dma8 in `check_dma_avail 1 3 0`; do - opts="${mpfx}dma8=$dma8 ${mpfx}mpu_irq=-1" - ac_try_irq $card "$opts" $irq_list && return 0 - done - return 1 -} - -ac_try_card_es18xx () { - card=es18xx - opts=`ac_check_option $card ${mpfx}isapnp 0` - ac_try_dmas $card "$opts" `check_irq_avail 5 9 10 7` && return 0 - return 1 -} - -ac_try_card_cs4236 () { - card=cs4236 - irq_list=`check_irq_avail 5 7 9 11 12 15` - isapnp=`ac_check_option $card ${mpfx}isapnp 0` - for cport in 0x538 0x210 0xf00; do - for port in 0x530 0x534; do - opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp" - ac_try_dmas $card "$opts" $irq_list && return 0 - done - done - return 1 -} - -ac_try_card_cs4232 () { - card=cs4232 - irq_list=`check_irq_avail 5 7 9 11 12 15` - isapnp=`ac_check_option $card ${mpfx}isapnp 0` - for cport in 0x538 0x210 0xf00; do - for port in 0x530 0x534; do - opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp" - ac_try_dmas $card "$opts" $irq_list && return 0 - done - done - return 1 -} - -ac_try_card_cs4231 () { - card=cs4231 - irq_list=`check_irq_avail 5 7 9 11 12 15` - for port in 0x530 0x534; do - opts="${mpfx}port=$port" - ac_try_dmas $card "$opts" $irq_list && return 0 - done - return 1 -} - -ac_try_card_opl3sa2 () { - card=opl3sa2 - irq_list=`check_irq_avail 5 9 3 1 11 12 15 0` - isapnp=`ac_check_option $card ${mpfx}isapnp 0` - for port in 0x370 0x538 0xf86 0x100; do - for wss_port in 0x530 0xe80 0xf40 0x604; do - opts="${mpfx}fm_port=-1 ${mpfx}midi_port=-1 ${mpfx}port=$port ${mpfx}wss_port=$wss_port $isapnp" - ac_try_dmas $card "$opts" $irq_list && return 0 - done - done - return 1 -} - -ac_config_legacy () { - title=$(gettext "WARNING") - msg=$(gettext " - Probing legacy ISA cards might make - your system unstable. - - Do you want to proceed? - -") - $DIALOG --title "$title" --yesno "$msg" 10 50 || acex 0 - - if [ x"$1" = x ]; then - probe_list="$LEGACY_CARDS" - else - probe_list=$* - fi - menu_args=() - - for card in $probe_list; do - cardname=`/sbin/modinfo -d snd-$card | sed -e 's/^\"\(.*\)\"$/\1/g'` - if [ x"$cardname" != x ]; then - menu_args=("${menu_args[@]}" "$card" "$cardname" "on") - fi - done - if [ x$menu_args = x ]; then - msg=$(gettext "No legacy drivers are available - for your machine") - $DIALOG --msgbox "$msg" 5 50 - return 1 - fi - title=$(gettext "Driver Selection") - msg=$(gettext " Probing legacy ISA cards - - Please select the drivers to probe:") - $DIALOG --title "$title" --checklist "$msg" \ - 17 64 8 "${menu_args[@]}" 2> $FOUND || acex 0 - - if [ $try_all_combination != 1 ]; then - msg=$(gettext " - Shall I try all possible DMA and IRQ combinations? - With this option, some unconventional configuration - might be found, but it will take much longer time.") - if $DIALOG --yesno "$msg" 10 60 - then - try_all_combination=1 - fi - fi - - xecho "Probing legacy cards.. This may take a few minutes.." - echo -n $(gettext "Probing: ") - cards=`cat $FOUND | tr -d \"` - for card in $cards; do - echo -n " $card" - ac_opts="" - if eval ac_try_card_$card ; then - xecho " : FOUND!!" - ac_config_card $card $ac_opts - return 0 - fi - done - echo - title=$(gettext "Result") - msg=$(gettext "No legacy cards found") - $DIALOG --title "$title" --msgbox "$msg" 5 50 - return 1 -} - -# -# main part continued.. -# - -if test -n "$LOGFILE" ; then - touch "$LOGFILE" - echo -n "Starting alsaconf: " >> "$LOGFILE" - date >> "$LOGFILE" -fi - -if [ x"$legacy_probe_card" != x ]; then - ac_opts="" - if eval ac_try_card_$legacy_probe_card >/dev/null 2>&1; then - echo "$ac_opts" - echo "$ac_cardname" - exit 0 - else - echo "FAILED" - exit 1 - fi -fi - -intro - -if [ $do_legacy_only = 1 ]; then - ac_config_legacy - exit 0 -fi - -probe_cards - -devs_found=() -devs_olist="" - -if [ -s "$FOUND" ]; then - while read dev card ; do - MODDIR=/lib/modules/`uname -r` - find $MODDIR -type f | grep -q -E $card'\.(o|ko)' || continue - cardname=`find_device_name $dev | cut -c 1-64` - if [ -z "$cardname" ]; then - cardname="$card" - fi - card=${card##snd-} - devs_found=("${devs_found[@]}" "$card" "$cardname") - devs_devs=("${devs_devs[@]}" "$card" "$dev") - done <"$FOUND" - devs_olist=`cat $FOUND` -fi -if [ x$devs_found != x ]; then - # - # check for TP600E - # - if [ ${devs_found[0]} = cs46xx ]; then - if $lspci -nv 2>/dev/null| grep -q "Subsystem: 1014:1010"; then - msg=$(gettext " - Looks like you having a Thinkpad 600E or 770 notebook. - On this notebook, CS4236 driver should be used - although CS46xx chip is detected. - - Shall I try to snd-cs4236 driver and probe - the legacy ISA configuration?") - if $DIALOG --yesno "$msg" 13 60 - then - try_all_combination=1 - ac_config_legacy cs4236 - exit 0 - fi - elif $lspci -nv 2>/dev/null| grep -q "Subsystem: 8086:8080"; then - msg=$(gettext " - Looks like you having a Dell Dimension machine. - On this machine, CS4232 driver should be used - although CS46xx chip is detected. - - Shall I try to snd-cs4232 driver and probe - the legacy ISA configuration?") - if $DIALOG --yesno "$msg" 13 60 - then - try_all_combination=1 - ac_config_legacy cs4232 - exit 0 - fi - fi - fi - - devs_found=("${devs_found[@]}" "legacy" "Probe legacy ISA (non-PnP) chips") - title=$(gettext "Soundcard Selection") - msg=$(gettext " - Following card(s) are found on your system. - Choose a soundcard to configure: -") - $DIALOG --title "$title" --menu "$msg" 17 76 8 "${devs_found[@]}" --output-fd 3 3> $FOUND || acex 0 - card=`head -n 1 $FOUND` - if [ "$card" = "legacy" ]; then - ac_config_legacy - else - ac_config_card "$card" - fi - exit 0 -else - msg=$(gettext " - No supported PnP or PCI card found. - - Would you like to probe legacy ISA sound cards/chips? - -") - if $DIALOG --yesno "$msg" 9 60 ; then - ac_config_legacy - exit 0 - fi -fi - -rm -f "$FOUND" "$DUMP" -exit 0 |