slitaz-tools annotate tinyutils/soundconf @ rev 22

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