slitaz-tools annotate tinyutils/soundconf @ rev 190

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