你的想法是正确的。您可以使用“type multi”alsa 模块向两个不同的设备播放声音。您只需要稍微扩展它即可构建完整的链条。
卡名。通常最好使用卡名称而不是索引:“hw:CardName,2”而不是“hw:0,2”,因为卡索引可能会在重新启动时更改,而名称通常不会更改。您可以在其中看到卡名称cat /proc/asound/cards
and aplay -l
输出。您的卡的名称可能是“CA0106”。
Dmix。要允许多个应用程序同时播放,请将“type dmix”放在播放链中的“type multi”和“hw”之间。 “type dmix”模块将多个应用程序混合到同一个硬件缓冲区中。
Route。您的“type multi”模块将输入通道 0,1,2,3 映射到从机“a”的输出通道 0,1 和从机“b”的通道 0,1,这意味着您有 4 个输入通道,而您有只有 2 个通道(立体声)。要将 2 通道立体声转换为 4 通道“type multi”,请在其前面加上“typeroute”pcm,将通道 0,1 复制到 0,1 和 2,3。
Plug。不同的应用程序可能会尝试播放您的硬件不直接支持的格式/速率。因此,将“类型插头”自动转换模块放在播放链的第一位是一个很好的做法 - 它将把任何输入格式/速率转换为支持的输出。
总体而言,播放链如下:
default = plug -> route -> multi -> (dmix->hw:CA0106,0 + dmix->hw:CA0106,2)
Asym:但这只是播放链。如果您想将“默认”pcm 指向它,这是不够的,因为“默认”是默认用于播放和播放的 pcm。capture。要允许应用程序从“默认”录制,您需要使用“type asym”模块为其定义不同的播放和捕获链。捕获链可以如下所示:
default = plug <- dsnoop <- hw
(“type dsnoop”是一个类似 dmix 的捕获模块 - 它允许多个应用程序从同一设备捕获)
您可以手动定义每个 pcm,但我建议采取捷径并重用预定义的“plug”、“dmix”和“dsnoop”pcm(在/usr/share/alsa/alsa.conf
, /usr/share/alsa/pcm/dmix.conf
, /usr/share/alsa/pcm/dsnoop.conf
)。那么整个配置将是:
pcm.quad {
type multi
slaves.a.pcm "dmix:CA0106,0"
slaves.a.channels 2
slaves.b.pcm "dmix:CA0106,2"
slaves.b.channels 2
bindings.0 { slave a; channel 0; }
bindings.1 { slave a; channel 1; }
bindings.2 { slave b; channel 0; }
bindings.3 { slave b; channel 1; }
}
pcm.stereo2quad {
type route
slave.pcm "quad"
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
}
pcm.!default {
type asym
playback.pcm "plug:stereo2quad"
capture.pcm "plug:dsnoop:CA0106"
}
把这个放进去~/.asoundrc
(仅限您的用户)或/etc/asound.conf
(全部用户)。
PS:人们通常希望在重新启动后保留其卷。这么多发行版运行alsactl store
关机时保存当前音量控制和alsactl restore
启动时加载这些音量控制。默认情况下alsactl
将这些音量控制保存在/var/lib/alsa/asound.state
。这是该文件的唯一目的。
Links:
- .asoundrc 语法 http://www.alsa-project.org/alsa-doc/alsa-lib/conf.html
- 阿尔萨插件 http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html