lanzinc 发表于 2011-2-22 17:57:57

https://wiki.archlinux.org/index.php/Udev_(%e7%ae%80%e4%bd%93%e4%b8%ad%e6%96%87)#.E5.A4.9A.E4.B8.AA.E5.90.8C.E7.B1.BB.E5.9E.8B.E8.AE.BE.E5.A4.87.EF.BC.88.E7.BD.91.E5.8D.A1.EF.BC.8C.E5.A3.B0.E5.8D.A1.EF.BC.89.E6.AF.8F.E6.AC.A1.E5.90.AF.E5.8A.A8.E7.9A.84.E9.83.BD.E4.B8.8D.E5.90.8C

应该能用类似于这个方法解决,这个是双网卡的

多个同类型设备(网卡,声卡)每次启动的都不同
因为udev同时加载所有模块,所以一些设备可能初始化顺序不同。例如同时有两个网卡时,它们总是在eth0和eth1之间变来变去。

常用的解决办法是在您的rc.conf文件中通过修改MODULES队列来指明顺序。这个队列里的模块将在udev自动加载之前由系统加载,因此您可以控制模块在启动时加载顺序。

# 在e100之前加载8139too
MODULES=(8139too e100)另一个解决网卡的方法是使用udev-sanctified方法为每个网卡静态命名。创建文件/etc/udev/rules.d/10-network.rules然后将不同的网卡通过MAC地址绑定到不同的名字上:

SUBSYSTEM=="net", SYSFS{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"
SUBSYSTEM=="net", SYSFS{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"同时,您需要注意以下内容:

■您可以通过下面的命令获得网卡的MAC地址:: udevinfo -a -p /sys/class/net/<你的网卡>
■注意在udev规则文件中使用小写的16进制MAC地址,因为udev无法识别大写的MAC地址。
■一些用户在使用旧的命名方式时出现问题,例如: eth0, eth1, 等等. 如果出现这个问题,试试使用 "lan"或者"wlan"之类的名字.
注意不要忘记修改您的/dec/rc.conf和其它使用ethX命名的配置文件。

sejishikong 发表于 2011-2-22 20:57:09

我原来用kde3的时候的机器是双声卡的,kmix可以指定用那个声卡。

jiangtao9999 发表于 2011-2-22 21:43:44

现在问题是貌似没有一个程序可以同时设置所有的输出吧?
alsa 有东西可以设置么,他要是直接能设置,那就是全局的。

zy_sunshine 发表于 2011-2-22 21:53:12

双声卡问题应该就是配置文件的问题吧, 既然 kmix 可以设置,直接hack它的源码看看就知道啦:mrgreen:

lanzinc 发表于 2011-2-25 12:54:46

http://www.linuxsir.org/bbs/thread375112.html
这篇文章,是用重新按特定顺序加载内核模块来实现着的

代码:
----------------------------------------------------
#!/bin/bash

# 26/01/2011

# - adjust priorities of modules to set the default sound card
# - need root or sudo to run 'modprobe'

CONFIG="/tmp/asound.conf"
CARDS="/proc/asound/cards"
MODS="/proc/asound/modules"

function usage {
    echo "Usage: `basename $0` "
    exit 1
}

[ $# \> 1 ] && usage

N_CARDS=`sed -ne '/^ \+\+/p' $CARDS | wc -l`

# drivers not ready
[ $N_CARDS == 0 ] && echo "No sound cards found." && exit 0

# info of sound cards
if [ $# == 0 ]
then
    # detect sound cards
    echo "$N_CARDS card(s) detected:"
    sed -ne '/^ \+\+/s/\[.*\]//p' $CARDS

    echo "Current mixer:" `head -1 $CARDS | cut -d':' -f2`
    if [ $N_CARDS \> 1 ]
    then
      echo ""
      echo "To change default card:" "`basename $0` "
    fi
    exit 0
fi

# NAN
[[ $# == 1 ]] && [[ ! ($1 =~ ) ]] && usage

# id 0
[ x"$1" == x"0" ] && echo "ID 0 is the default device, so nothing changed." && exit 0

if [ $1 \> $((N_CARDS-1)) ] || [ $1 \< 0 ]
then
    echo "device with ID $1 not found."
    exit 1
fi

# clean config file
:>$CONFIG

for ((i=0;i<$N_CARDS;i++))
do
    # disabled by default
    inx=-2
    # request
    [ $i == $1 ] && inx=0
   
    awk '{if($1=="'$i'") printf("options %s index=%d\n", $2, "'$inx'")}' $MODS \
    >> $CONFIG
done

MODULES=(`awk '{print $2}' $MODS`)

# if busy
if grep "running" /proc/asound/timers &> /dev/null
then
    echo "modules are busy, exit..."
    exit 1
fi

# unload modules
sudo modprobe -q -r ${MODULES[@]}

# wait
sleep 1

# isolate unload and reload stmts to keep the index as it was

# reload modules
for mod in ${MODULES[@]}
do
    sudo modprobe -q $mod -C $CONFIG
done
echo "all done!"

exit 0

lanzinc 发表于 2011-2-25 13:05:53

看看这篇,是用UDEV在声卡接入和离开系统的时候,来更换ALSA的设置的
http://blog.sina.com.cn/s/blog_4888f8810100cgca.html

——————————————————

摘自:http://www.linuxsir.org/bbs/thread346605.html
前几日淘了块创新的Audigy2 ZS Notebook声卡,声卡的驱动还算不错,只要内核中开启pcmcia声卡支持为加上emu10k1的模块就好了。但之后设置的问题也来了,目标非常简单,希望声卡插进、拔出的时候,alsa的设置能相应自动变化。
我们可以利用udev来帮我们实现这个目标。
我们需要两个脚本和两个内容略为不同的asound.conf。

先看看两个声卡是啥名字:
代码:
ls -l /proc/asound/

我的机子上是:
代码:
lrwxrwxrwx 1 root root 5 2009-03-16 17:27 Audigy2 -> card2
dr-xr-xr-x 9 root root 0 2009-03-16 17:27 card0
dr-xr-xr-x 5 root root 0 2009-03-16 17:27 card1
dr-xr-xr-x 8 root root 0 2009-03-16 17:27 card2
-r--r--r-- 1 root root 0 2009-03-16 17:27 cards
-r--r--r-- 1 root root 0 2009-03-16 17:27 devices
-r--r--r-- 1 root root 0 2009-03-16 17:27 hwdep
lrwxrwxrwx 1 root root 5 2009-03-16 17:27 I82801DBICH4 -> card0
lrwxrwxrwx 1 root root 5 2009-03-16 17:27 Modem -> card1
dr-xr-xr-x 2 root root 0 2009-03-16 17:27 oss
-r--r--r-- 1 root root 0 2009-03-16 17:27 pcm
dr-xr-xr-x 2 root root 0 2009-03-16 17:27 seq
-r--r--r-- 1 root root 0 2009-03-16 17:27 timers
-r--r--r-- 1 root root 0 2009-03-16 17:27 version

其中板载声卡是 I82801DBICH4,外置的pcmcia声卡是Audigy2。要把名字记下,待会我们需要它们。

接下来要写两个asound.conf来指定外置声卡插拔情况下的alsa设置。先
代码:
mkdir /etc/alsa
cp /etc/asound.conf   /etc/alsa/asound.ac97
mv /etc/asound.conf/etc/alsa/asound.audigy2

,asound.ac97是没有插外置声卡时用的,asound.audigy2就是外置声卡插上时用的。
然后在asound.ac97中加入:
代码:
# onboard
pcm.ac97 {
    type plug
    slave.pcm "dmix"
}
ctl.ac97 {
    type hw
    card I82801DBICH4
}

pcm.!default pcm.ac97
ctl.!default ctl.ac97

在asound.audigy2中加入
代码:
# pcmcia
pcm.audigy2hw {
    type hw
    card Audigy2
}

pcm.audigy2 {
    type plug
    slave.pcm "audigy2hw"
}

ctl.audigy2 {
    type hw
    card Audigy2
}

# onboard

pcm.ac97 {
    type plug
    slave.pcm "dmix"
}

ctl.ac97 {
    type hw
    card I82801DBICH4
}

pcm.!default pcm.audigy2
ctl.!default ctl.audigy2

要注意的是,xxx.ac97中声卡名是我板载声卡的名字,xxx.audigy2则是我外置声卡的名字,你需要替换成你自己的声卡。
这样在不同情况下,我们只要 ln -sf /etc/alsa/asound.xxx /etc/asound.conf就OK了。
接下来我们需要一个脚本在适当的时候改变上面的链接,脚本是从ALSA Wiki上处理usb外接声卡转换的脚本改写而来的,脚本switch_default_sound:
代码:
#!/bin/bash
# Name: switch_default_sound
# Last modified: 2009.03.16
# use to switch the asound.conf file
#
# because we hope to restore the sound card levels as well, but udev
# will hang when waiting for this script to finish,
# so we call restore_alsa_sound as daemon, which wait and try to restore
# sound level after udev finish, and alsa make the card ready.

usage(){
    echo usage: `basename $0` [`ls /etc/alsa/ -1 | sed -e 's:/etc/alsa/::g' -e 's/asound.//g'`]
}

if [ -n $1 ] && [ -e /etc/alsa/asound."$1" ];
then
    ln -sf /etc/alsa/asound."$1" /etc/asound.conf
    # we need to call restore_alsa_sound as daemon, so that, we can
    # return to udev, and leave rest to restore_alsa_sound
      restore_alsa_sound "$1" &
else
    usage
fi

这个脚本除了完成asound.conf的链接工作外,还将调用restore_alsa_sound完成音量重置的工作(我还用它重启mpd)。因为 udev在调用switch_default_sound的时候是停在那里等它返回的,而在udev完成设备添加前alsa是得不到声卡信息的,音量恢复就无法完成,而我们在switch_default_sound中用while来等,这样udev就死等在那里了。为了避免这样的问题,我们需要用 daemon的形式调用restore_alsa_sound,把剩下的工作交给它。

代码:
#!/usr/bin/env python
# Name: restore_alsa_sound
# Last Modified: 2009.03.16
# use to retore the alsa sound level
from sys import argv
from os import system as os_system
from time import sleep

if argv == "audigy2":
    retry = 0
    while ( retry <= 10):
      if os_system ("alsactl restore Audigy2") == 0:
            break
      sleep(0.5)

os_system ("/etc/init.d/mpd restart")
注意, alsactl restore
Audigy2中的Audigy2是我外置声卡的名字,你得换成你自己的。另外,如果你没有用mpd的话,就把最后一行去掉。

接着,把switch_default_sound和restore_alsa_sound放到 /usr/local/sbin下,并chmod 755 它。

最后,我们需要让udev在插入和拔出声卡的时候调用switch_default_sound,就大功告成了。所以,我们要写一个udev的rule为我们服务。

先用lspci找到声卡的PCI_ID
代码:
lspci -nn

比如我的是
代码:
02:00.0 Multimedia audio controller : Creative Labs SB0400 Audigy2 Value
,其中1102:0008就是了。
接着,我们需要找出相应的udev信息。先把udev的信息导到文件udev.txt中
代码:
udevadm info --export-db > udev.txt

然后找出1102:0008
代码:
grep -C10 1102:0008 udev.txt

在我的电脑上结果是:
代码:
E: PCI_SLOT_NAME=0000:01:0a.0
E: MODALIAS=pci:v00001180d00000476sv000010CFsd00001254bc06sc07i00

P: /devices/pci0000:00/0000:00:1e.0/0000:01:0a.0/0000:02:00.0
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:01:0a.0/0000:02:00.0
E: DRIVER=EMU10K1_Audigy
E: PHYSDEVBUS=pci
E: PHYSDEVDRIVER=EMU10K1_Audigy
E: PCI_CLASS=40100
E: PCI_ID=1102:0008
E: PCI_SUBSYS_ID=1102:2001
E: PCI_SLOT_NAME=0000:02:00.0
E: MODALIAS=pci:v00001102d00000008sv00001102sd00002001bc04sc01i00

P: /devices/pci0000:00/0000:00:1e.0/0000:01:0a.1
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:01:0a.1
E: DRIVER=yenta_cardbus
E: PHYSDEVBUS=pci
E: PHYSDEVDRIVER=yenta_cardbus

从中可以看到声卡的PCI_SUBSYS_ID是1102:2001。现在我们就有了足够的信息来写udev的rules了。

在/etc/udev/rules.d下建立一个文件75-alsa_conf.rules
代码:
# udev rules file for my Audigy2 ZS Notebook devices (for udev 0.98 version)
# call /usr/local/sbin/switch_default_sound to change the link
# of /etc/asound.conf
#
#

ENV{PCI_ID}=="1102:0008", ENV{PCI_SUBSYS_ID}=="1102:2001",ACTION=="add", RUN+="/usr/local/sbin/switch_default_sound audigy2"

ENV{PCI_ID}=="1102:0008", ENV{PCI_SUBSYS_ID}=="1102:2001",ACTION=="remove", RUN+="/usr/local/sbin/switch_default_sound ac97"

在这个rules中,我们要求udev在PCI_ID为1102:0008且PCI_SUBSYS_ID为1102:2001的设备(就是处置的那块声卡)要被插入时,即ACTION为add时,调用"/usr/local/sbin/switch_default_sound audigy2",在声卡被移除时,即ACTION为remove时调用"/usr/local/sbin/switch_default_sound ac97"。

但为了能有效地restore声音,你需要在第一次插入声卡并设置好音量后手动运行一下alsactl store Audigy2。
另外,插拔声卡的时候要确认你没有在放音乐哦

PS:
1.PCI_SUBSYS_ID查不到也不要紧,只要把75-alsa_conf.rules改为:
....................
ENV{PCI_ID}=="1102:0008",ACTION=="add", RUN+="/usr/local/sbin/switch_default_sound audigy2"

ENV{PCI_ID}=="1102:0008",ACTION=="remove", RUN+="/usr/local/sbin/switch_default_sound ac97"
.....................

2.Ubuntu 系统 -》首选项-》音效-》把设备页所以默认的设备全部改为外置声卡
3./etc/asound.conf不存在,自己创建一个即可。

lanzinc 发表于 2011-2-25 13:15:22

看来,关键的是,

/etc/asound.conf
的这两行:

pcm.!default pcm.audigy2
ctl.!default ctl.audigy2

jiangtao9999 发表于 2011-2-25 13:28:36

貌似我键盘的声卡也能完美支持了。
不过这个实现最好还是弄个图形界面程序提供功能为好吧?

lanzinc 发表于 2011-2-25 14:24:55

alsa有一个命令,

asoundconf set-default-card PARAMETER
好像是干这个的

现在声音芯片是不是太泛滥了,键盘上也能装一个,呵呵
----------下面是网上的一段--------http://www.rosoo.net/a/201006/9630.html-------
alsa配置文件的位置是由Configure阶段的选项来决定的,不过多数时候,Alsa的配置文件位于:/usr/share/alsa目录下,主要配置文件为/usr/share/alsa/alsa.conf 其它文件是否需要,位置在哪,都是由alsa.conf来决定的。
通常会有/usr/share/alsa/card 和/usr/share/alsa/pcm两个子目录,用于设置Card相关的参数,别名以及一些PCM默认设置。
此外,在alsa.conf中,通常还会引用 /etc/asound.conf 和 ~/.asoundrc这两个配置文件,这两个文件通常是放置你个人需要特殊设置的相关参数。按照Alsa官方文档的说法,1.0.9版本以后,这两个文件就不再是必要的,甚至是不应该需要的。至少是不推荐使用吧。不过,对于我来说,在嵌入式系统中使用,为了简单和方便测试,恰恰是需要修改这两个文件 8 )

[ 本帖最后由 lanzinc 于 2011-2-25 14:37 编辑 ]

lanzinc 发表于 2011-2-25 15:11:39

现在
全局的默认声卡在/usr/share/alsa/alsa.conf 里设

使用的时候要临时切换,到kmixer里切换

不知道kmixer切换声音设备的时候干了些什么??

Kmixer是对Arts做了些什么,然后由库Arts选择将声音送到哪个声音设备文件,
还是直接对 ALSA(or 内核)做了些什么

我觉得前一种可能比较大??

[ 本帖最后由 lanzinc 于 2011-2-25 16:08 编辑 ]

lanzinc 发表于 2011-2-25 16:23:41

真是麻烦,ALSA除了驱动(内核模块)还包括一些库文件
而有些声音库/软件,不使用这些库文件,而直接使用 dev 下的 声音设备文件

看来还是控制内核模块的加载顺序来得彻底。。。。。。。。。。

[ 本帖最后由 lanzinc 于 2011-2-25 16:45 编辑 ]

jiangtao9999 发表于 2011-2-25 17:13:57

原帖由 lanzinc 于 2011-2-25 02:24 PM 发表 http://www.linuxfans.org/bbs/images/common/back.gif
alsa有一个命令,

asoundconf set-default-card PARAMETER
好像是干这个的

现在声音芯片是不是太泛滥了,键盘上也能装一个,呵呵
----------下面是网上的一段--------http://www.rosoo.net/a/201006/9630.html-------
alsa配置文件的位置是由Confi ...
作为一个罗技 G110 键盘用户,你这个“太泛滥”词语让我压力很大……

jiangtao9999 发表于 2011-2-25 17:14:53

原帖由 lanzinc 于 2011-2-25 04:23 PM 发表 http://www.linuxfans.org/bbs/images/common/back.gif
真是麻烦,ALSA除了驱动(内核模块)还包括一些库文件
而有些声音库/软件,不使用这些库文件,而直接使用 dev 下的 声音设备文件

看来还是控制内核模块的加载顺序来得彻底。。。。。。。。。。 ...
最彻底的应该是直接把这个设备接管过来……
比如把所有的声卡设备全都放到某个目录里,这个默认位置的设备名用某个程序维护为链接或者一个转发驱动把受到的数据转发给设定的声卡什么的。

lanzinc 发表于 2011-2-26 14:04:49

狂晕,电脑的主人,跟我说,不要那么麻烦,用哪个软件就到哪个软件的设置界面里去设置,选择想要的声卡。声音大小用硬件调(直接调音箱音量旋钮)。这样,两个声卡能同时用,而且能各干各的。。。。。。。。。
他一直是这么来着的。。。。。
内核也不用重新编译了
改一下menu.lst用另外一个内核就可以了

无语。。。。。。。

[ 本帖最后由 lanzinc 于 2011-2-26 14:11 编辑 ]

jiangtao9999 发表于 2011-2-26 14:11:05

原帖由 lanzinc 于 2011-2-26 02:04 PM 发表 http://www.linuxfans.org/bbs/images/common/back.gif
狂晕,电脑的主人,跟我说,不要那么麻烦,用哪个软件就到哪个软件的设置界面里去设置,选择想要的声卡。声音大小用硬件调(直接调音箱音量旋钮)。这样,两个声卡能同时用,而且能各干各的。。。。。。。。。
他一直是这么来着的。。 ...
高手或者个人自己折腾的系统可以这样。但对于发行版的制作者来说,必须提供一个有效的统一设置办法啊……
页: 1 [2]
查看完整版本: 声卡如何驱动起来 ATI RV710/730/740 ATI Radem HDMI