原文地址 http://www.alsa-project.org/main/index.php/Asoundrc
Why asoundrc?
.asoundrc和asound.conf对于ALSA能供正确工作不是必需的。大部分应用都可以在没有他们的情况下正常运行。这两个文件用来提供特定的额外功能,比如在alsa-lig层进行路由和采样率转换。
The .asoundrc file
这个文件为你提供更多对card/device的高级控制。.asoundrc文件包含各种卡的定义,使得你可以在alsa-lib层访问pcm plugins。允许你做很多神奇的事情:比如把多块卡合为一块,或者访问多通道卡的多个I/Os
Where does asoundrc live?
asoundrc文件一般存放在用户home目录下
~/.asoundrc
从下面这个文件包含进来
/usr/share/alsa/alsa.conf
当然也可以使用对所有用户生效的配置文件
/etc/asound.conf
当启动一个alsa应用时,这两个配置文件都会被加载。
下面是最基本的配置定义。
The default plugin
在当前用户的home目录下创建一个.asoundrc文件
vi ~/.asoundrc
写入如下内容,并保存文件
pcm.!default {
type hw
card 0
}
ctl.!default {
type hw
card 0
}
关键词default在ALSA lib API中定义为hw:0,0(缺省声卡的缺省设备)。标识 “!default”将覆盖ALSA lib API中定义的default
现在你可以测试如下:
aplay -D default test.wav
The naming of PCM devices
一个典型的asoundrc以'PCM hw type'开始。这使得ALSA应用可以通过一个名字访问虚拟的声卡设备(plugin或者slave)。如果没有它,那么我们必须通过hw:0,0或者default这种形式来访问soundcard(s)/device(s),如下
aplay -D hw:0,0 test.wav
关键字hw后面的两个数字表示声卡号和设备号。
第一项通常从0开始。比如ALSA中pcm 设备(物理I/O channels)的表示方法,从pcm0c(capture)和pcm0p(playback)开始
The Control device
一块卡的控制设备使得我们可以编程修改卡的各种控制。对于大部分卡都包括mixer(但是有些卡没有mixer)。然而,他们仍然有其他的控制可能被像JACK这样的程序访问。比如digital I/O sync 指示器,sample clock source switch 等等。
Aliases
使用”PCM hw type“ 还可以定义设备别名。语法如下:
pcm.NAME {
type hw
card INT/STR
[device] INT
[subdevice] INT
mmap_emulation BOOL
}
例如,下面给出第一个声卡的别名
pcm.primary {
type hw
card 0
device 0
}
现在你可以通过别名primary 访问第一个声卡。
aplay -D primary test.wav
Plugins
Q: 什么是plugins
A: 在ALSA中,PCM plugins扩展了PCM设备的功能和features。plugin可以自动的不可思议的执行工作,比如命名设备,采样率转换,通道间的采样复制,写入文件,联合多个声卡/设备做多inputs/outputs。使用多通道声卡/设备以及其他功能等着你去发掘。使用这些plugins,你需要创建一个虚拟的slave设备。
plugins和选项的完整列表,参照alsa-lib documentation。下面是简单介绍。
一个非常简单的slave定义如下
pcm_slave.sltest {
pcm "hw:1,0"
}
这里定义了一个slave。这里仅仅定义了你的声音设备的一个别名。稍微难以理解的是 'pcm types'参数必须定义在slave-definition-block。让我们先设置一个rate-converter
pcm_slave.sl2 {
pcm "hw:0,0"
rate 48000
}
pcm.rate_convert {
type rate
slave sl2
}
在play时将自动的转换采样率到44.1kHz。虽然这个功能并不是很实用,因为大部分players会转换到声卡支持的采样转换率,但是有时你可能想把采样率转换为较低的静态采样率。
为了方便,我们可以重写未如下嵌套定义
pcm.rate_convert {
type rate
slave {
pcm "hw:0,0"
rate 48000
}
}
使用pcm type plug 可以生成一个更复杂的转换工具,语法如下
type plug #format adjusted PCM
slave STR #slave name
# or
slave {
pcm STR #dslave definition
#or
pcm {} #slave pcm definition
[format STR] #slave format
[channel INT]
[rate INT]
}
route policy STR
ttable {
CCHANNEL {
SCHANNEL REAL
}
}
我们可以定义一个complex_convert如下:
pcm_slave.sl3 {
pcm "hw:0,0"
format S16_LE
channels 1
rate 16000
}
pcm.complex_convert {
type plug
slave sl3
}
调用方是如下
aplay -vD complex_convert test.wav
在播放的时候你将转换为采样格式:S16_LE,1 channel和16kHz采样。使用-v选项调用aplay可以显示文件的原始设置。
Software mixing
软件混音可以在同一个设备上同时播放多个声音文件。在linux环境中有很多方法可以执行软件混音。通常需要一个server,比如ARTSD,ESD,JACK..等等,这个列表会很长因此应用经常困惑该使用哪一个
dmix
现在ALSA有了一个叫dmix(direct mixing)的本地plugin。它使得软件混音变得非常简单,不需要再为安装或者卸载新应用而烦恼。
这个plugin有个非常有意思并且可能很有用的功能,它和default plugin名结合到一块。理论上意味着所有的本地应用都共享声音设备。虽然实际上没有多少applications会利用这个功能。
pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 4096
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.dmixer {
type hw
card 0
}
试着播放如下:
aplay -f cd -D default test.
注意,dmix PCM name已经在全局配置文件/usr/share/alsa/alsa.conf中定义了
这个设备缺省的采样率是48000Hz,可以用如下方式改变:
aplay -D "plug:'dmix:RATE=44100'" test.wav
dsnoop
dmix plugin是把多个输出流混音到一起。如果你想要使用多个input,那么使用dsnoop plugin
JACK plugin
VIrtual multi channel devices