• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3#  ALSA Configurator
4#
5#  Copyright (c) 1999-2002  SuSE GmbH
6#                           Jan ONDREJ
7#
8#  written by Takashi Iwai <tiwai@suse.de>
9#             Bernd Kaindl <bk@suse.de>
10#             Jan ONDREJ (SAL) <ondrejj@salstar.sk>
11#
12#  based on the original version of Jan ONDREJ's alsaconf for ALSA 0.4.
13#
14#  This program is free software; you can redistribute it and/or modify
15#  it under the terms of the GNU General Public License as published by
16#  the Free Software Foundation; either version 2 of the License, or
17#  (at your option) any later version.
18#
19
20export TEXTDOMAIN=alsaconf
21
22prefix=@prefix@
23exec_prefix=@exec_prefix@
24bindir=@bindir@
25sbindir=@sbindir@
26version=@VERSION@
27USE_NLS=@USE_NLS@
28
29# Useful for debugging
30PROCFS="/proc"
31SYSFS="/sys"
32
33# i18n stuff
34if test "$USE_NLS" = "yes" && type -p gettext > /dev/null; then
35  xecho() {
36    gettext -s "$*"
37  }
38else
39  xecho() {
40    echo "$*"
41  }
42  gettext() {
43    echo -n "$*"
44  }
45fi
46xmsg() {
47  msg=$(gettext "$1")
48  shift
49  printf "$msg" $*
50}
51
52# Check for GNU/Linux distributions
53if [ -f /etc/SuSE-release ]; then
54  distribution="suse"
55  suse_version=$(grep 'VERSION = ' /etc/SuSE-release | sed -e s/'VERSION = '//)
56elif [ -f /etc/UnitedLinux-release ]; then
57  distribution="suse"
58elif [ -f /etc/gentoo-release ]; then
59  distribution="gentoo"
60elif [ -f /etc/debian_version ]; then
61  distribution="debian"
62elif [ -f /etc/mandrake-release ]; then
63  distribution="mandrake"
64elif test -f /etc/redhat-release && grep -q "Red Hat" /etc/redhat-release; then
65  distribution="redhat"
66elif test -f /etc/fedora-release && grep -q "Fedora" /etc/fedora-release; then
67  distribution="fedora"
68elif [ -f /etc/slackware-version -o -f /etc/slamd64-version ]; then
69  distribution="slackware"
70else
71  distribution="unknown"
72fi
73
74for prog in lspci lsmod; do
75	for path in /sbin /usr/sbin /bin /usr/bin;do
76		test -x $path/$prog && eval $prog=$path/$prog
77	done
78done
79unset prog path
80
81usage() {
82    xecho "ALSA configurator"
83    echo "  version $version"
84    xecho "usage: alsaconf [options]
85  -l|--legacy    check only legacy non-isapnp cards
86  -m|--modinfo   read module descriptions instead of reading card db
87  -s|--sound wav-file
88                 use the specified wav file as a test sound
89  -u|--uid uid   set the uid for the ALSA devices (default = 0) [obsoleted]
90  -g|--gid gid   set the gid for the ALSA devices (default = 0) [obsoleted]
91  -d|--devmode mode
92                 set the permission for ALSA devices (default = 0666) [obs.]
93  -r|--strict    set strict device mode (equiv. with -g 17 -d 0660) [obsoleted]
94  -L|--log file  logging on the specified file (for debugging purpose only)
95  -p|--probe card-name
96                 probe a legacy non-isapnp card and print module options
97  -P|--listprobe list the supported legacy card modules
98  -c|--config file
99                 specify the module config file
100  -R|--resources list available DMA and IRQ resources with debug for legacy
101  -h|--help      what you're reading"
102}
103
104OPTS=`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
105eval set -- "$OPTS"
106
107do_legacy_only=0
108use_modinfo_db=0
109alsa_uid=0
110alsa_gid=0
111alsa_mode=0666
112legacy_probe_card=""
113LOGFILE=""
114TESTSOUND="@TESTSOUND@"
115try_all_combination=0
116resources="false"
117
118# legacy support
119LEGACY_CARDS="opl3sa2 cs4236 cs4232 cs4231 es18xx es1688 sb16 sb8"
120
121while true ; do
122    case "$1" in
123    -l|--legacy)
124	do_legacy_only=1; shift ;;
125    -m|--modinfo)
126	use_modinfo_db=1; shift ;;
127    -s|--sound)
128	TESTSOUND=$2; shift 2;;
129    -h|--help)
130	usage; exit 0 ;;
131    -L|--log)
132	LOGFILE="$2"; shift 2;;
133    -p|--probe)
134	legacy_probe_card="$2"; shift 2;;
135    -P|--listprobe)
136	echo "$LEGACY_CARDS"; exit 0;;
137    -u|--uid)
138	alsa_uid="$2"; shift 2;;
139    -g|--gid)
140	alsa_gid="$2"; shift 2;;
141    -d|--devmode)
142	alsa_mode="$2"; shift 2;;
143    -r|--strict)
144	alsa_uid=0; alsa_gid=17; alsa_mode=0660; shift;;
145    -c|--config)
146	cfgfile="$2"; shift 2;;
147    -R|--resources)
148        resources="true"; shift;;
149    --) shift ; break ;;
150    *) usage ; exit 1 ;;
151    esac
152done
153
154#
155# probe legacy ISA cards
156#
157
158check_dma_avail () {
159    list=""
160    if [ -d $SYSFS/bus/pnp/devices ]; then
161      for dma in $*; do
162        ok="true"
163        for i in $SYSFS/bus/pnp/devices/??:* ; do
164          if grep -q "state = active" $i/resources ; then
165            if grep -q '^dma '$dma'$' $i/resources; then
166              ok="false"
167            fi
168          fi
169        done
170        if [ -r $PROCFS/dma ]; then
171	  if grep -q '^ *'$dma': ' $PROCFS/dma ; then
172            ok="false"
173          fi
174	fi
175        if [ "$ok" = "true" ]; then
176          list="$list $dma"
177        fi
178      done
179    else
180      if [ -r $PROCFS/dma ]; then
181  	for dma in $*; do
182	    grep -q '^ *'$dma': ' $PROCFS/dma || list="$list $dma"
183	done
184      fi
185    fi
186    if [ ! -z "$list" ]; then
187      echo $list
188    fi
189}
190
191check_irq_avail () {
192    list=""
193    if [ -d $SYSFS/bus/pnp/devices ]; then
194      for irq in $*; do
195        ok="true"
196        for i in $SYSFS/bus/pnp/devices/??:* ; do
197          if grep -q "state = active" $i/resources ; then
198            if grep -q '^irq '$irq'$' $i/resources; then
199              ok="false"
200            fi
201          fi
202        done
203        if [ -r $PROCFS/interrupts ]; then
204	  if grep -q '^ *'$irq': ' $PROCFS/interrupts ; then
205            ok="false"
206          fi
207	fi
208        if [ "$ok" = "true" ]; then
209          list="$list $irq"
210        fi
211      done
212    else
213      if [ -r $PROCFS/interrupts ]; then
214	for irq in $*; do
215	    grep -q '^ *'$irq': ' $PROCFS/interrupts || list="$list $irq"
216	done
217      fi
218    fi
219    if [ ! -z "$list" ]; then
220      echo $list
221    fi
222}
223
224#
225#
226#
227
228if [ "$resources" = "true" ]; then
229  if [ -d $SYSFS/bus/pnp/devices ]; then
230    for i in $SYSFS/bus/pnp/devices/??:* ; do
231      if [ "$resources" = "true" ]; then
232        echo ">>>>> PnP file: $i/resources"
233        cat $i/resources
234      fi
235    done
236  fi
237  if [ -r $PROCFS/dma ]; then
238    echo ">>>>> Allocated dma channels:"
239    cat $PROCFS/dma
240  fi
241  if [ -r $PROCFS/interrupts ]; then
242    echo ">>>>> Allocated interrupt channels:"
243    cat $PROCFS/interrupts
244  fi
245  echo -n "Valid DMA channels: "
246  check_dma_avail 0 1 2 3 4 5 6 7
247  echo -n "Valid IRQ channels: "
248  check_irq_avail 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
249  exit 0
250fi
251
252# Check for root privileges
253if [ `id -u` -ne 0 ]; then
254  xecho "You must be root to use this script."
255  exit 1
256fi
257
258#
259# check the snd_ prefix for ALSA module options
260# snd_ prefix is obsoleted since 0.9.0rc4.
261#
262if /sbin/modinfo -p snd | grep -q snd_ ; then
263  mpfx="snd_"
264else
265  mpfx=""
266fi
267
268alsa_device_opts=""
269if /sbin/modinfo -p snd | grep -q uid ; then
270  if [ x"$alsa_uid" != x0 ]; then
271    alsa_device_opts="$alsa_device_opts ${mpfx}device_uid=$alsa_uid"
272  fi
273  if [ x"$alsa_gid" != x0 ]; then
274    alsa_device_opts="$alsa_device_opts ${mpfx}device_gid=$alsa_gid"
275  fi
276fi
277if /sbin/modinfo -p snd | grep -q device_mode ; then
278  if [ x"$alsa_mode" != x0 ]; then
279    alsa_device_opts="$alsa_device_opts ${mpfx}device_mode=$alsa_mode"
280  fi
281fi
282
283case `uname -r` in
2842.6.*)
285  kernel="new"
286  ;;
287*)
288  kernel="old"
289  ;;
290esac
291
292# cfgfile = base config file to remove/update the sound setting
293# cfgout = new config file to write the sound setting (if different from $cfgfile)
294cfgout=""
295cfgoldout=""
296if [ -n "$cfgfile" ]; then
297  if [ ! -r "$cfgfile" ]; then
298    xecho "ERROR: The config file doesn't exist: "
299    echo $cfgfile
300    exit 1
301  fi
302else
303if [ "$kernel" = "new" ]; then
304  cfgfile="/etc/modprobe.conf"
305  if [ -d /etc/modprobe.d ]; then
306    cfgout="/etc/modprobe.d/50-sound.conf"
307    cfgoldout="/etc/modprobe.d/sound"
308    if [ ! -f $cfgout ]; then
309	case "$(modprobe -V)" in
310	"module-init-tools version "3.[789]*|\
311	"module-init-tools version "3.1[0-9]*)
312	  ;;
313	"kmod version "*)
314	  ;;
315	*)
316	  cfgout="/etc/modprobe.d/sound"
317	  cfgoldout=""
318	  ;;
319	esac
320    fi
321  fi
322elif [ "$distribution" = "debian" ]; then
323  cfgfile="/etc/modutils/sound"
324elif [ -e /etc/modules.conf ]; then
325  cfgfile="/etc/modules.conf"
326elif [ -e /etc/conf.modules ]; then
327  cfgfile="/etc/conf.modules"
328else
329  cfgfile="/etc/modules.conf"
330  touch /etc/modules.conf
331fi
332fi
333
334# Check for dialog, whiptail, gdialog, awk, ... ?
335if type -p dialog > /dev/null; then
336    DIALOG=dialog
337else
338  if type -p whiptail > /dev/null; then
339    whiptail_wrapper() {
340      X1="$1"
341      X2="$2"
342      if [ $1 = --yesno ]; then
343        X3=`expr $3 + 2`
344      else
345        X3=$3
346      fi
347      shift 3
348      whiptail "$X1" "$X2" $X3 "$@"
349    }
350    DIALOG=whiptail_wrapper
351  else
352    xecho "Error, dialog or whiptail not found."
353    exit 1
354  fi
355fi
356if type -p awk > /dev/null; then :
357else
358  xecho "Error, awk not found. Can't continue."
359  exit 1
360fi
361
362#
363# remove entries by yast2 sound configurator
364#
365remove_y2_block() {
366    awk '
367    /^alias sound-slot-[0-9]/ { next }
368    /^alias char-major-116 / { next }
369    /^alias char-major-14 / { next }
370    /^alias snd-card-[0-9] / { next }
371    /^options snd / { next }
372    /^options snd-/ { next }
373    /^options off / { next }
374    /^alias sound-service-[0-9]/ { next }
375    /^# YaST2: sound / { next }
376   { print }'
377}
378
379#
380# remove entries by sndconfig sound configurator
381#
382# found strings to search for in WriteConfModules,
383# from sndconfig 0.68-4 (rawhide version)
384
385remove_sndconfig_block() {
386    awk '
387    /^alias sound-slot-0/ { modulename = $3 ; next }
388    /^alias sound-slot-[0-9]/ { next }
389    /^post-install sound-slot-[0-9] / { next }
390    /^pre-remove sound-slot-[0-9] / { next }
391    /^options sound / { next }
392    /^alias synth0 opl3/ { next }
393    /^options opl3 / { next }
394    /^alias midi / { mididev = $3 ; next }
395    /^options / { if ($2 == mididev) next }
396    /^pre-install / { if ($2 == mididev) next }
397    /^alias synth0 / { synth = $3 ; next }
398    /^post-install / { if ($2 == synth) next }
399    /^options sb / { next }
400    /^post-install .+ \/bin\/modprobe "aci"/ { if ($2 == modulename) next }
401    /^options adlib_card / { next }
402    /^options .+ isapnp=1/ { if ($2 == modulename) next }
403    /^options i810_audio / { next }
404    /^options / {if ($2 == modulename) next }
405   { print }'
406}
407
408#
409# remove the previous configuration by alsaconf
410#
411remove_ac_block() {
412    awk '/^'"$ACB"'$/,/^'"$ACE"'$/ { next } { print }'
413}
414
415#
416# set default mixer volumes
417#
418set_mixers() {
419    amixer -s -q <<EOF
420set Master 75% unmute
421set Master -12dB
422set 'Master Mono' 75% unmute
423set 'Master Mono' -12dB
424set Front 75% unmute
425set Front -12dB
426set PCM 90% unmute
427set PCM 0dB
428mixer Synth 90% unmute
429mixer Synth 0dB
430mixer CD 90% unmute
431mixer CD 0dB
432# mute mic
433set Mic 0% mute
434# ESS 1969 chipset has 2 PCM channels
435set PCM,1 90% unmute
436set PCM,1 0dB
437# Trident/YMFPCI/emu10k1
438set Wave 100% unmute
439set Music 100% unmute
440set AC97 100% unmute
441# CS4237B chipset:
442set 'Master Digital' 75% unmute
443# Envy24 chips with analog outs
444set DAC 90% unmute
445set DAC -12dB
446set DAC,0 90% unmute
447set DAC,0 -12dB
448set DAC,1 90% unmute
449set DAC,1 -12dB
450# some notebooks use headphone instead of master
451set Headphone 75% unmute
452set Headphone -12dB
453set Playback 100% unmute
454# turn off digital switches
455set "SB Live Analog/Digital Output Jack" off
456set "Audigy Analog/Digital Output Jack" off
457EOF
458}
459
460
461# INTRO
462intro() {
463  local msg=$(xmsg "
464                   ALSA  CONFIGURATOR
465                   version %s
466
467            This script is a configurator for
468    Advanced Linux Sound Architecture (ALSA) driver.
469
470
471  If ALSA is already running, you should close all sound
472  apps now and stop the sound driver.
473  alsaconf will try to do this, but it's not 100%% sure." $version)
474  $DIALOG --msgbox "$msg" 20 63 || acex 0
475}
476
477# FAREWELL
478farewell() {
479  local msg=$(gettext "
480
481     OK, sound driver is configured.
482
483                  ALSA  CONFIGURATOR
484
485          will prepare the card for playing now.
486
487     Now I'll run alsasound init script, then I'll use
488     amixer to raise the default volumes.
489     You can change the volume later via a mixer
490     program such as alsamixer or gamix.
491
492  ")
493  $DIALOG --msgbox "$msg" 17 60 || acex 0
494}
495
496# Exit function
497acex() {
498  cleanup
499  clear
500  exit $1
501}
502
503#
504# search for alsasound init script
505#
506
507if [ "$distribution" = "debian" ]; then
508    rcalsasound=/etc/init.d/alsa
509elif [ -x /etc/rc.d/rc.alsa ]; then
510    rcalsasound=/etc/rc.d/rc.alsa
511elif [ -x /etc/init.d/alsasound ]; then
512    rcalsasound=/etc/init.d/alsasound
513elif [ -x /usr/sbin/rcalsasound ]; then
514    rcalsasound=/usr/sbin/rcalsasound
515elif [ -x /sbin/rcalsasound ]; then
516    rcalsasound=/sbin/rcalsasound
517elif [ -x /etc/rc.d/init.d/alsasound ]; then
518    rcalsasound=/etc/rc.d/init.d/alsasound
519elif [ -x /etc/init.d/alsa ]; then
520    rcalsasound=/etc/init.d/alsa
521else
522    rcalsasound=rcalsasound
523fi
524
525
526# MAIN
527if [ -d $PROCFS/asound ]; then
528  $rcalsasound stop >/dev/null 2>&1
529  $rcalsasound unload >/dev/null 2>&1
530  /sbin/rmmod dmasound dmasound_awacs 2>/dev/null
531fi
532
533
534cleanup () {
535    killall -9 aplay arecord >/dev/null 2>&1
536    /sbin/modprobe -r isapnp >/dev/null 2>&1
537    /sbin/modprobe -r isa-pnp >/dev/null 2>&1
538    rm -f "$TMP" "$addcfg" "$FOUND" "$DUMP"
539}
540trap cleanup 0
541
542TMP=`mktemp -q /tmp/alsaconf.XXXXXX`
543if [ $? -ne 0 ]; then
544	xecho "Can't create temp file, exiting..."
545        exit 1
546fi
547addcfg=`mktemp -q /tmp/alsaconf.XXXXXX`
548if [ $? -ne 0 ]; then
549	xecho "Can't create temp file, exiting..."
550        exit 1
551fi
552FOUND=`mktemp -q /tmp/alsaconf.XXXXXX`
553if [ $? -ne 0 ]; then
554	xecho "Can't create temp file, exiting..."
555        exit 1
556fi
557DUMP=`mktemp -q /tmp/alsaconf.XXXXXX`
558if [ $? -ne 0 ]; then
559	xecho "Can't create temp file, exiting..."
560        exit 1
561fi
562
563# convert ISA PnP id number to string 'ABC'
564convert_isapnp_id () {
565    if [ -z "$1" ]; then
566	echo "XXXX"
567	return
568    fi
569    let a='('$1'>>2) & 0x3f'
570    let b='(('$1' & 0x03) << 3) | (('$1' >> 13) & 0x07)'
571    let c='('$1'>> 8) & 0x1f'
572    strs='@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
573    echo ${strs:$a:1}${strs:$b:1}${strs:$c:1}
574}
575
576# swap high & low bytes
577swap_number () {
578    if [ -z "$1" ]; then
579	echo "0000"
580	return
581    fi
582    let v='(('$1'>>8)&0xff)|(('$1'&0xff)<<8)'
583    printf "%04x" $v
584}
585
586# build card database
587# build_card_db filename
588build_card_db () {
589    MODDIR=/lib/modules/`uname -r`
590    last_driver=""
591    echo -n > $1
592
593    # list pci cards
594    while read driver vendor device dummy; do
595	if expr $driver : 'snd-.*' >/dev/null ; then
596	    if [ "$last_driver" != "$driver" ]; then
597		echo $driver.o
598		last_driver=$driver
599	    fi
600	    id1=`printf '0x%04x' $vendor`
601	    id2=`printf '0x%04x' $device`
602	    echo "PCI: $id1=$id2"
603	fi
604    done < $MODDIR/modules.pcimap >> $1
605
606    # list isapnp cards
607    while read driver cardvendor carddevice data vendor func; do
608	if expr $driver : 'snd-.*' >/dev/null ; then
609	    if [ "$last_driver" != "$driver" ]; then
610		echo $driver.o
611		last_driver=$driver
612	    fi
613	    id1=`convert_isapnp_id $cardvendor`
614	    dev1=`swap_number $carddevice`
615	    id2=`convert_isapnp_id $vendor`
616	    dev2=`swap_number $func`
617	    echo "ISAPNP: $id1$dev1=$id2$dev2"
618	fi
619    done < $MODDIR/modules.isapnpmap >> $1
620}
621
622#
623# probe cards
624#
625probe_cards () {
626    found="0"
627    test -r $PROCFS/isapnp || /sbin/modprobe isapnp >/dev/null 2>&1
628    test -r $PROCFS/isapnp || /sbin/modprobe isa-pnp >/dev/null 2>&1
629    if [ -r $PROCFS/isapnp ]; then
630	cat $PROCFS/isapnp >"$DUMP"
631	found="1"
632    elif [ -d $SYSFS/bus/pnp/devices ]; then
633	# use 2.6 kernel's sysfs output
634	# fake the isapnp dump
635	index=0
636	bindex=0
637	for d1 in $SYSFS/devices/pnp* ; do
638	  for d2 in $d1/*:* ; do
639	    if [ -r $d2/card_id ]; then
640	      id=`cat $d2/card_id`
641	      name=`cat $d2/name`
642	      echo "Card $index '$id:$name' " >> "$DUMP"
643	      index=$[$index+1]
644	      found="1"
645	    else if [ -r $d2/id ]; then
646	      # FIXME: multiple id might be present (separated with new-line)
647	      id=`head -n 1 $d2/id`
648	      echo "BIOS $bindex '$id' " >> "$DUMP"
649	      bindex=$[$bindex+1]
650	      found="1"
651	    fi
652	    fi
653	  done
654	done
655    fi
656    if [ "$found" = "0" ]; then
657      echo -n >"$DUMP"
658    fi
659    CARDID_DB=/var/tmp/alsaconf.cards
660    if [ ! -r $CARDID_DB ]; then
661        use_modinfo_db=1
662    fi
663    if [ $use_modinfo_db != 1 ]; then
664	if [ $CARDID_DB -ot /lib/modules/`uname -r`/modules.dep ]; then
665	    use_modinfo_db=1
666	fi
667    fi
668    if [ $use_modinfo_db = 1 ]; then
669	xecho "Building card database.."
670	build_card_db $CARDID_DB
671    fi
672    if [ ! -r $CARDID_DB ]; then
673	xecho "No card database is found.."
674	exit 1
675    fi
676    ncards=`grep '^snd-.*\.o$' $CARDID_DB | wc -w`
677
678    msg=$(gettext "Searching sound cards")
679    awk '
680BEGIN {
681	format="%-40s %s\n";
682	ncards='"$ncards"';
683	idx=0;
684}
685/^snd-.*\.o$/{
686	sub(/.o$/, "");
687	driver=$0;
688	perc=(idx * 100) / (ncards + 1);
689	print int(perc);
690	idx++;
691}
692/^[<literal space><literal tab>]*PCI: /{
693	gsub(/0x/, "");
694	gsub(/=/, ":");
695	x = sprintf ("'$lspci' -n 2>/dev/null| grep '"' 04..: '"' | grep %s", $2);
696	if (system (x) == 0)
697		printf "%s %s\n", $2, driver >>"'"$FOUND"'"
698}
699/^[<literal space><literal tab>]*ISAPNP: /{
700	id2 = substr($0, index($0, "=")+1);
701	gsub(/=.*/, "");
702	x = sprintf ("grep '\''^Card [0-9] .%s:'\'' '"$DUMP"'", $2);
703	if (system (x) == 0)
704		printf "%s %s\n", $2, driver >>"'"$FOUND"'"
705	else if (index($2, "ffff") > 0) {
706		x = sprintf ("grep '\''^BIOS [0-9]* .%s.'\'' '"$DUMP"'", id2);
707		if (system (x) == 0)
708			printf "%s %s\n", id2, driver >>"'"$FOUND"'"
709	}
710}' < $CARDID_DB |\
711    $DIALOG --gauge "$msg" 6 40 0
712
713    #
714    # PowerMac
715    #
716    if grep -q MacRISC $PROCFS/cpuinfo; then
717	MODDIR=/lib/modules/`uname -r`
718	find $MODDIR -name 'snd-powermac*' -print | \
719	while read i; do
720	    i=${i##*/}
721	    i=${i%%.o}
722	    i=${i%%.ko}
723	    echo "PowerMac $i" >> $FOUND
724	done
725    fi
726
727    #
728    # Sparc
729    #
730    if grep -q Sparc $PROCFS/cpuinfo; then
731	test -r $PROCFS/openprom/name || /bin/mount -t openpromfs none $PROCFS/openprom >/dev/null 2>&1
732	# Check for an "audio" device
733	audio=
734	compat=
735	if test -r $PROCFS/openprom; then
736	    audio=`find $PROCFS/openprom -follow -type d -name "audio*" -print`
737	fi
738	if test -n "$audio"; then
739	    compat=`cat $audio/compatible`
740	    compat=${compat#\'}
741	    compat=${compat%\'}
742	    compat=${compat#SUNW,}
743	fi
744	# Go through all cards we have
745	MODDIR=/lib/modules/`uname -r`
746	find $MODDIR -name 'snd-sun-*' -print | \
747	while read i; do
748	    i=${i##*/}
749	    i=${i%%.o}
750	    i=${i%%.ko}
751	    sdev=`echo ${i#snd-sun-} | tr "[a-z]" "[A-Z]"`
752
753	    if test "$sdev" = "$compat"; then
754		echo "$sdev $i" >> $FOUND
755	    elif test -r $PROCFS/openprom; then
756		find $PROCFS/openprom -follow -type d -name "SUNW,${sdev}*" \
757		    -exec echo "$sdev $i" \; 2>/dev/null >> $FOUND
758	    else
759		echo "$sdev $i" >> $FOUND
760	    fi
761	done
762    fi
763}
764
765#
766# look for a descriptive device name from the given device id
767#
768find_device_name () {
769    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
770	$lspci -d $1 2>/dev/null| sed -e 's/^.*:..\.. [^:]*: //g'
771	return
772    elif expr "$1" : '[A-Z@][A-Z@][A-Z@][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' >/dev/null; then
773	cardname=`grep '^Card [0-9]\+ .'$1':' $DUMP | head -n 1 | sed -e 's/^Card [0-9]\+ '\''.*:\(.*\)'\'' .*$/\1/'`
774	echo $cardname
775    else
776	echo $1
777    fi
778}
779
780# get hwcfg file type from the given driver name
781get_hwcfg_type () {
782    while read dev driver; do
783	if [ "$driver" = "$1" ]; then
784	    case "$dev" in
785	    *:*)
786		# FIXME: need to look around /sys/bus/pci/* (or use vpid-* ?)
787		devid=`$lspci -d "$dev" | head -n 1 | sed -e 's/ .*$//'`
788		case "$devid" in
789		*:*:*.*) ;;
790		*) devid="0000:$devid" ;;
791		esac
792		echo bus-pci-$devid
793		;;
794	    *)
795		echo $driver
796		;;
797	    esac
798	    break
799	fi
800    done
801}
802
803# clean up all hwcfg-* files containing ALSA modules
804# alsaconf sets up exclusively
805cleanup_hwcfg () {
806    for i in /etc/sysconfig/hardware/hwcfg-*; do
807	grep -q "MODULE='snd-" $i && rm -f $i
808    done
809}
810
811#
812# set up /etc/sysconfig/hardware/hwcfg-* stuff
813#
814setup_hwcfg () {
815    card=$1
816    cleanup_hwcfg
817    cfg=`echo "$devs_olist" | get_hwcfg_type $card`
818    echo "MODULE='$card'" > /etc/sysconfig/hardware/hwcfg-$cfg
819    echo "STARTMODE='auto'" >> /etc/sysconfig/hardware/hwcfg-$cfg
820}
821
822
823#
824# configure and try test sound
825#
826ac_config_card () {
827
828    CARD_DRIVER=snd-$1
829    CARD_OPTS="${*:2}"
830
831    if [ -n "$cfgout" ]; then
832	msg=$(xmsg "
833Configuring %s
834Do you want to modify %s (and %s if present)?" $CARD_DRIVER $cfgout $cfgfile)
835        $DIALOG --yesno "$msg" 10 50 || acex 0
836    else
837	msg=$(xmsg "
838Configuring %s
839Do you want to modify %s?" $CARD_DRIVER $cfgfile)
840        $DIALOG --yesno "$msg" 8 50 || acex 0
841    fi
842    clear
843
844    # Copy conf.modules and make changes.
845    ACB="# --- BEGIN: Generated by ALSACONF, do not edit. ---"
846    ACE="# --- END: Generated by ALSACONF, do not edit. ---"
847
848    # Detect 2.2.X kernel
849    KVER=`uname -r | tr ".-" "  "`
850    KVER1=`echo $KVER | cut -d" " -f1`
851    KVER2=`echo $KVER | cut -d" " -f2`
852    if [ $KVER1 -ge 2 ] && [ $KVER2 -ge 2 ]; then
853	SOUND_CORE="soundcore"
854    else
855	SOUND_CORE="snd"
856    fi
857
858    if [ -r $cfgfile ] ; then
859        if [ "$distribution" = "redhat" -o "$distribution" = "fedora" ] ; then
860            remove_ac_block < $cfgfile | remove_sndconfig_block | uniq > $TMP
861        else
862	    remove_ac_block < $cfgfile | remove_y2_block | uniq > $TMP
863        fi
864    fi
865
866    if [ -z "$have_alias" -a "$kernel" = "new" ]; then
867	if grep -q char-major-116 /lib/modules/`uname -r`/modules.alias; then
868	    have_alias="yes"
869	fi
870    fi
871    if [ -z "$have_alias" ]; then
872echo "alias char-major-116 snd
873alias char-major-14 $SOUND_CORE
874alias sound-service-0-0 snd-mixer-oss
875alias sound-service-0-1 snd-seq-oss
876alias sound-service-0-3 snd-pcm-oss
877alias sound-service-0-8 snd-seq-oss
878alias sound-service-0-12 snd-pcm-oss" >> $addcfg
879    fi
880    if [ -n "$alsa_device_opts" ]; then
881	echo "options snd $alsa_device_opts" >> $addcfg
882    fi
883echo "alias snd-card-0 $CARD_DRIVER
884alias sound-slot-0 $CARD_DRIVER" >> $addcfg
885    if [ -n "$CARD_OPTS" ]; then
886	echo "options $CARD_DRIVER $CARD_OPTS" >> $addcfg
887    fi
888
889    if [ -n "$cfgout" ]; then
890	[ ! -r "$cfgfile" ] || cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile"
891	cmp -s "$addcfg" "$cfgout" || cat "$addcfg" > "$cfgout"
892	test -n "$cfgoldout" && rm -f "$cfgoldout"
893    else
894	echo "$ACB
895# --- ALSACONF version $version ---" >> $TMP
896        cat "$addcfg" >> "$TMP"
897	echo "$ACE
898" >> $TMP
899        cmp -s "$TMP" "$cfgfile" || cat "$TMP" > "$cfgfile"
900    fi
901
902    /sbin/depmod -a 2>/dev/null
903
904    # remove yast2 entries (- only for suse distro)
905    if [ -f /var/lib/YaST/unique.inf ]; then
906	awk '
907BEGIN { in_sound=0; }
908/^\[sound\]$/ { print; in_sound=1; next; }
909/^\[.+\]$/ { print; in_sound=0; next; }
910{ if (in_sound == 0) { print; } }
911' < /var/lib/YaST/unique.inf > $TMP
912	cp -f $TMP /var/lib/YaST/unique.inf
913    fi
914
915    # set up /etc/sysconfig/hardware/*
916    if [ "$distribution" = "suse" ]; then
917	case "$suse_version" in
918	10.[012]*|10)
919	    setup_hwcfg $CARD_DRIVER
920	    ;;
921	esac
922    fi
923
924    farewell
925    clear
926    case "$distribution" in
927    gentoo | debian)
928	xecho "Running update-modules..."
929	update-modules
930	;;
931    esac
932    if [ -x $rcalsasound ] ; then
933      echo Loading driver...
934      $rcalsasound restart
935    fi
936    echo Setting default volumes...
937    if [ -x $bindir/set_default_volume ]; then
938	$bindir/set_default_volume -f
939    else
940	set_mixers
941    fi
942    if [ -f $TESTSOUND ]; then
943      msg=$(gettext "
944       The mixer is set up now for for playing.
945       Shall I try to play a sound sample now?
946
947                           NOTE:
948If you have a big amplifier, lower your volumes or say no.
949    Otherwise check that your speaker volume is open,
950          and look if you can hear test sound.
951")
952      if $DIALOG --yesno "$msg" 13 65
953      then
954          clear
955	  echo
956	  aplay -N $TESTSOUND
957      fi
958    fi
959    mkdir -p -m 0755 @ASOUND_STATE_DIR@
960    if [ ! -r @ASOUND_STATE_DIR@/asound.state ]; then
961	xecho "Saving the mixer setup used for this in @ASOUND_STATE_DIR@/asound.state."
962	$sbindir/alsactl store
963    fi
964    clear
965    xecho "
966===============================================================================
967
968 Now ALSA is ready to use.
969 For adjustment of volumes, use your favorite mixer.
970
971 Have a lot of fun!
972
973"
974}
975
976# check playback
977# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
978ac_try_load () {
979    test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE"
980    /sbin/modprobe snd-$1 ${*:2} >/dev/null 2>&1
981    if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then
982	: ;
983    else
984	/sbin/modprobe -r snd-$1 >/dev/null 2>&1
985	return 1
986    fi
987
988    # mute mixers
989    amixer set Master 0% mute >/dev/null 2>&1
990    amixer set PCM 0% mute >/dev/null 2>&1
991
992    # output 0.5 sec
993    head -c 4000 < /dev/zero | aplay -N -r8000 -fS16_LE -traw -c1 > /dev/null 2>&1 &
994    # remember pid
995    pp=$!
996    # sleep for 2 seconds (to be sure -- 1 sec would be enough)
997    sleep 2
998    # kill the child process if still exists.
999    kill -9 $pp > /dev/null 2>&1
1000    st=$?
1001    ac_cardname=`head -n 1 $PROCFS/asound/cards | sed -e 's/^[0-9].* - \(.*\)$/\1/'`
1002    /sbin/modprobe -r snd-$1 >/dev/null 2>&1
1003    if [ $st = 0 ]; then
1004	# irq problem?
1005	test -n "$LOGFILE" && echo "no playback return" >> "$LOGFILE"
1006	return 2
1007    else
1008	# seems ok!
1009	test -n "$LOGFILE" && echo "playback OK" >> "$LOGFILE"
1010	return 0
1011    fi
1012}
1013
1014# check capture
1015# return 0 - OK, 1 - NG, 2 - not working (irq/dma problem)
1016# ac_try_capture card duplex opts
1017ac_try_capture () {
1018    test -n "$LOGFILE" && echo "$1 ${*:2}" >> "$LOGFILE"
1019    /sbin/modprobe snd-$1 ${*:3} >/dev/null 2>&1
1020    if $lsmod | grep -q -E '^(snd-|snd_)'$1' '; then
1021	: ;
1022    else
1023	/sbin/modprobe -r snd-$1 >/dev/null 2>&1
1024	return 1
1025    fi
1026
1027    # mute mixers
1028    amixer set Master 0% mute >/dev/null 2>&1
1029    amixer set PCM 0% mute >/dev/null 2>&1
1030
1031    play_pid=0
1032    if [ $2 = yes ]; then
1033	# try duplex - start dummy playing
1034	aplay -N -r8000 -fS16_LE -traw -c1 < /dev/zero > /dev/null 2>&1 &
1035	play_pid=$!
1036    fi
1037    # record 1sec
1038    arecord -N -d1 > /dev/null 2>&1 &
1039    # remember pid
1040    pp=$!
1041    # sleep for 2 seconds
1042    sleep 2
1043    # kill the child process if still exists.
1044    kill -9 $pp > /dev/null 2>&1
1045    st=$?
1046    # kill playback process if any
1047    test $play_pid != 0 && kill -9 $play_pid
1048    /sbin/modprobe -r snd-$1 >/dev/null 2>&1
1049    if [ $st = 0 ]; then
1050	test -n "$LOGFILE" && echo "capture no return" >> "$LOGFILE"
1051	return 2
1052    else
1053	test -n "$LOGFILE" && echo "capture OK" >> "$LOGFILE"
1054	return 0
1055    fi
1056}
1057
1058get_dma_pair () {
1059    case $1 in
1060    0)
1061	echo 1 3 5;;
1062    1)
1063	echo 0 3 5;;
1064    3)
1065	echo 1 0 5;;
1066    5)
1067	echo 3 1 0;;
1068    esac
1069}
1070
1071#
1072# check playback on specified irqs
1073#
1074# ac_try_irq card opts irqs...
1075# return 0 - OK, 1 - NG, 2 - not working (dma problem?)
1076#
1077ac_try_irq () {
1078    card=$1
1079    opts="$2 ${mpfx}irq=$3"
1080    ac_try_load $card $opts >/dev/null 2>&1
1081    result=$?
1082    case $result in
1083    0)
1084	ac_opts="$opts"
1085	return 0
1086	;;
1087    2)
1088	for irq in ${*:4}; do
1089	    opts="$2 ${mpfx}irq=$irq"
1090	    ac_try_load $card $opts >/dev/null 2>&1
1091	    if [ $? = 0 ]; then
1092		ac_opts="$opts"
1093		return 0
1094	    fi
1095	done
1096	return 2
1097	;;
1098    esac
1099    return 1
1100}
1101
1102#
1103# check playback/capture on dma1 & dma2 & specified irqs
1104#
1105# ac_try_dmas card opts irqs...
1106# return 0 - OK, 1 - NG
1107#
1108ac_try_dmas () {
1109    dma_list=`check_dma_avail 1 0 3 5`
1110    for irq in ${*:3}; do
1111	for dma1 in $dma_list; do
1112	    for dma2 in `get_dma_pair $dma1`; do
1113		opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
1114		ac_try_load $1 $opts >/dev/null 2>&1
1115		result=$?
1116		if [ $result = 1 ]; then
1117		    if [ $try_all_combination = 1 ]; then
1118			continue
1119		    else
1120			return 1
1121		    fi
1122		elif [ $result = 0 ]; then
1123		    test -n "$LOGFILE" && echo "Now checking capture..." >> "$LOGFILE"
1124		    ac_opts="$opts"
1125		    ac_try_capture $1 yes $opts >/dev/null 2>&1 && return 0
1126		    for d in yes no; do
1127			for dma2 in $dma_list; do
1128			    if [ $dma1 != $dma2 ]; then
1129				opts="$2 ${mpfx}dma1=$dma1 ${mpfx}dma2=$dma2 ${mpfx}irq=$irq"
1130				ac_opts="$opts"
1131				ac_try_capture $1 $d $opts >/dev/null 2>&1 && return 0
1132			    fi
1133			done
1134		    done
1135		    return 0
1136		fi
1137	    done
1138	done
1139    done
1140    return 1
1141}
1142
1143# check if the option $2 exists in card $1: set value $3
1144ac_check_option () {
1145    if /sbin/modinfo -p snd-$1 | grep -q $2; then
1146      echo "$2=$3"
1147    fi
1148}
1149
1150ac_try_card_sb8 () {
1151    card=sb8
1152    irq_list=`check_irq_avail 5 3 9 10 7`
1153    for dma8 in `check_dma_avail 1 3`; do
1154	opts="${mpfx}dma8=$dma8"
1155	ac_try_irq $card "$opts" $irq_list && return 0
1156    done
1157    return 1
1158}
1159
1160ac_try_card_sb16 () {
1161    card=sb16
1162    isapnp=`ac_check_option $card ${mpfx}isapnp 0`
1163    opts="$isapnp"
1164    irq_list=`check_irq_avail 5 9 10 7 3`
1165    dma_list=`check_dma_avail 0 1 3`
1166    dma16_list=`check_dma_avail 5 6 7`
1167    # at first try auto-probing by driver itself
1168    ac_try_load $card $opts >/dev/null 2>&1
1169    result=$?
1170    case $result in
1171    0)
1172	ac_opts="$opts"
1173	ac_try_capture $card yes $opts >/dev/null 2>&1 && return 0
1174	for d in yes no; do
1175	    for dma8 in $dma_list; do
1176		for irq in $irq_list; do
1177		    opts="${mpfx}dma8=$dma8 ${mpfx}irq=$irq $isapnp"
1178		    ac_try_capture $card $d $opts >/dev/null 2>&1 && return 0
1179		done
1180	    done
1181	done
1182	return 0
1183	;;
1184    2)
1185	for dma16 in $dma16_list; do
1186	    opts="${mpfx}dma16=$dma16 $isapnp"
1187	    if ac_try_irq $card "$opts" $irq_list ; then
1188		ac_try_capture $card yes $ac_opts >/dev/null 2>&1 && return 0
1189		ac_opts_saved="$ac_opts"
1190		for d in yes no; do
1191		    for dma8 in $dma_list; do
1192			ac_opts="$ac_opts_saved ${mpfx}dma8=$dma8"
1193			ac_try_capture $card $d $ac_opts >/dev/null 2>&1 && return 0
1194		    done
1195		done
1196		# return anyway here..
1197		return 0
1198	    fi
1199	done
1200	;;
1201    esac
1202    return 1
1203}
1204
1205ac_try_card_es1688 () {
1206    card=es1688
1207    opts=""
1208    irq_list=`check_irq_avail 5 9 10 7`
1209    for dma8 in `check_dma_avail 1 3 0`; do
1210	opts="${mpfx}dma8=$dma8 ${mpfx}mpu_irq=-1"
1211	ac_try_irq $card "$opts" $irq_list && return 0
1212    done
1213    return 1
1214}
1215
1216ac_try_card_es18xx () {
1217    card=es18xx
1218    opts=`ac_check_option $card ${mpfx}isapnp 0`
1219    ac_try_dmas $card "$opts" `check_irq_avail 5 9 10 7` && return 0
1220    return 1
1221}
1222
1223ac_try_card_cs4236 () {
1224    card=cs4236
1225    irq_list=`check_irq_avail 5 7 9 11 12 15`
1226    isapnp=`ac_check_option $card ${mpfx}isapnp 0`
1227    for cport in 0x538 0x210 0xf00; do
1228	for port in 0x530 0x534; do
1229	    opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
1230	    ac_try_dmas $card "$opts" $irq_list && return 0
1231	done
1232    done
1233    return 1
1234}
1235
1236ac_try_card_cs4232 () {
1237    card=cs4232
1238    irq_list=`check_irq_avail 5 7 9 11 12 15`
1239    isapnp=`ac_check_option $card ${mpfx}isapnp 0`
1240    for cport in 0x538 0x210 0xf00; do
1241	for port in 0x530 0x534; do
1242	    opts="${mpfx}port=$port ${mpfx}cport=$cport $isapnp"
1243	    ac_try_dmas $card "$opts" $irq_list && return 0
1244	done
1245    done
1246    return 1
1247}
1248
1249ac_try_card_cs4231 () {
1250    card=cs4231
1251    irq_list=`check_irq_avail 5 7 9 11 12 15`
1252    for port in 0x530 0x534; do
1253	opts="${mpfx}port=$port"
1254	ac_try_dmas $card "$opts" $irq_list && return 0
1255    done
1256    return 1
1257}
1258
1259ac_try_card_opl3sa2 () {
1260    card=opl3sa2
1261    irq_list=`check_irq_avail 5 9 3 1 11 12 15 0`
1262    isapnp=`ac_check_option $card ${mpfx}isapnp 0`
1263    for port in 0x370 0x538 0xf86 0x100; do
1264	for wss_port in 0x530 0xe80 0xf40 0x604; do
1265	    opts="${mpfx}fm_port=-1 ${mpfx}midi_port=-1 ${mpfx}port=$port ${mpfx}wss_port=$wss_port $isapnp"
1266	    ac_try_dmas $card "$opts" $irq_list && return 0
1267	done
1268    done
1269    return 1
1270}
1271
1272ac_config_legacy () {
1273   title=$(gettext "WARNING")
1274   msg=$(gettext "
1275   Probing legacy ISA cards might make
1276   your system unstable.
1277
1278        Do you want to proceed?
1279
1280")
1281    $DIALOG --title "$title" --yesno "$msg" 10 50 || acex 0
1282
1283    if [ x"$1" = x ]; then
1284	probe_list="$LEGACY_CARDS"
1285    else
1286	probe_list=$*
1287    fi
1288    menu_args=()
1289
1290    for card in $probe_list; do
1291	cardname=`/sbin/modinfo -d snd-$card | sed -e 's/^\"\(.*\)\"$/\1/g'`
1292	if [ x"$cardname" != x ]; then
1293	    menu_args=("${menu_args[@]}" "$card" "$cardname" "on")
1294	fi
1295    done
1296    if [ x$menu_args = x ]; then
1297	msg=$(gettext "No legacy drivers are available
1298   for your machine")
1299	$DIALOG --msgbox "$msg" 5 50
1300	return 1
1301    fi
1302    title=$(gettext "Driver Selection")
1303    msg=$(gettext "           Probing legacy ISA cards
1304
1305        Please select the drivers to probe:")
1306    $DIALOG --title "$title" --checklist "$msg" \
1307	17 64 8 "${menu_args[@]}" 2> $FOUND || acex 0
1308
1309    if [ $try_all_combination != 1 ]; then
1310	msg=$(gettext "
1311 Shall I try all possible DMA and IRQ combinations?
1312 With this option, some unconventional configuration
1313 might be found, but it will take much longer time.")
1314	if $DIALOG --yesno "$msg" 10 60
1315	    then
1316	    try_all_combination=1
1317	fi
1318    fi
1319
1320    xecho "Probing legacy cards..   This may take a few minutes.."
1321    echo -n $(gettext "Probing: ")
1322    cards=`cat $FOUND | tr -d \"`
1323    for card in $cards; do
1324	echo -n " $card"
1325	ac_opts=""
1326	if eval ac_try_card_$card ; then
1327	    xecho " : FOUND!!"
1328	    ac_config_card $card $ac_opts
1329	    return 0
1330	fi
1331    done
1332    echo
1333    title=$(gettext "Result")
1334    msg=$(gettext "No legacy cards found")
1335    $DIALOG --title "$title" --msgbox "$msg" 5 50
1336    return 1
1337}
1338
1339#
1340# main part continued..
1341#
1342
1343if test -n "$LOGFILE" ; then
1344    touch "$LOGFILE"
1345    echo -n "Starting alsaconf: " >> "$LOGFILE"
1346    date >> "$LOGFILE"
1347fi
1348
1349if [ x"$legacy_probe_card" != x ]; then
1350    ac_opts=""
1351    if eval ac_try_card_$legacy_probe_card >/dev/null 2>&1; then
1352	echo "$ac_opts"
1353	echo "$ac_cardname"
1354	exit 0
1355    else
1356	echo "FAILED"
1357	exit 1
1358    fi
1359fi
1360
1361intro
1362
1363if [ $do_legacy_only = 1 ]; then
1364    ac_config_legacy
1365    exit 0
1366fi
1367
1368probe_cards
1369
1370devs_found=()
1371devs_olist=""
1372
1373if [ -s "$FOUND" ]; then
1374    while read dev card ; do
1375	MODDIR=/lib/modules/`uname -r`
1376	find $MODDIR -type f | grep -q -E $card'\.(o|ko)' || continue
1377	cardname=`find_device_name $dev | cut -c 1-64`
1378	if [ -z "$cardname" ]; then
1379	    cardname="$card"
1380	fi
1381	card=${card##snd-}
1382	devs_found=("${devs_found[@]}" "$card" "$cardname")
1383	devs_devs=("${devs_devs[@]}" "$card" "$dev")
1384    done <"$FOUND"
1385    devs_olist=`cat $FOUND`
1386fi
1387if [ x$devs_found != x ]; then
1388    #
1389    # check for TP600E
1390    #
1391    if [ ${devs_found[0]} = cs46xx ]; then
1392	if $lspci -nv 2>/dev/null| grep -q "Subsystem: 1014:1010"; then
1393	    msg=$(gettext "
1394 Looks like you having a Thinkpad 600E or 770 notebook.
1395 On this notebook, CS4236 driver should be used
1396 although CS46xx chip is detected.
1397
1398 Shall I try to snd-cs4236 driver and probe
1399 the legacy ISA configuration?")
1400	    if $DIALOG --yesno "$msg" 13 60
1401	    then
1402		try_all_combination=1
1403		ac_config_legacy cs4236
1404		exit 0
1405	    fi
1406	elif $lspci -nv 2>/dev/null| grep -q "Subsystem: 8086:8080"; then
1407	    msg=$(gettext "
1408 Looks like you having a Dell Dimension machine.
1409 On this machine, CS4232 driver should be used
1410 although CS46xx chip is detected.
1411
1412 Shall I try to snd-cs4232 driver and probe
1413 the legacy ISA configuration?")
1414	    if $DIALOG --yesno "$msg" 13 60
1415	    then
1416		try_all_combination=1
1417		ac_config_legacy cs4232
1418		exit 0
1419	    fi
1420        fi
1421    fi
1422
1423    devs_found=("${devs_found[@]}" "legacy" "Probe legacy ISA (non-PnP) chips")
1424    title=$(gettext "Soundcard Selection")
1425    msg=$(gettext "
1426         Following card(s) are found on your system.
1427         Choose a soundcard to configure:
1428")
1429    $DIALOG --title "$title" --menu "$msg" 17 76 8 "${devs_found[@]}" --output-fd 3 3> $FOUND || acex 0
1430    card=`head -n 1 $FOUND`
1431    if [ "$card" = "legacy" ]; then
1432	ac_config_legacy
1433    else
1434	ac_config_card "$card"
1435    fi
1436    exit 0
1437else
1438    msg=$(gettext "
1439        No supported PnP or PCI card found.
1440
1441 Would you like to probe legacy ISA sound cards/chips?
1442
1443")
1444    if $DIALOG --yesno "$msg" 9 60 ; then
1445	ac_config_legacy
1446	exit 0
1447    fi
1448fi
1449
1450rm -f "$FOUND" "$DUMP"
1451exit 0
1452