你的想法是正确的。您可以使用“type multi”alsa 模块向两个不同的设备播放声音。您只需要稍微扩展它即可构建完整的链。
卡名。通常最好使用卡名而不是索引:“hw:CardName,2”而不是“hw:0,2”,因为卡索引可能会在重新启动时更改,而名称通常不会更改。您可以在cat /proc/asound/cards 和aplay -l 输出中看到卡名称。对于您的卡,名称可能是“CA0106”。
混音。要允许同时播放多个应用程序,请在播放链中的“type multi”和“hw”之间放置“type dmix”。 “type dmix”模块将多个应用程序混合到同一个硬件缓冲区中。
路线。您的“type multi”模块将输入通道 0,1,2,3 映射到从属“a”的输出通道 0,1 和从属“b”的通道 0,1,这意味着您有 4 个输入通道,而您有只有 2 个通道(立体声)。要将 2 声道立体声转换为 4 声道以用于“type multi”,请在其前面加上“type route” pcm,将声道 0,1 复制到 0,1 和 2,3。
插头。不同的应用程序可能会尝试播放您的硬件不直接支持的格式/速率。因此,最好将“type plug”自动转换模块放在播放链的首位——它将任何输入格式/速率转换为支持的输出。
整个播放链如下:
default = plug -> route -> multi -> (dmix->hw:CA0106,0 + dmix->hw:CA0106,2)
Asym:但这只是播放链。如果您想将“默认” pcm 指向它是不够的,因为“默认”是默认情况下用于播放和捕获的 pcm。要允许应用程序从“默认”录制,您需要使用“type asym”模块为其定义不同的播放和捕获链。捕获链可能如下所示:
default = plug <- dsnoop <- hw
(“type dsnoop”是一个类似于 dmix 的捕获模块——它允许从同一设备捕获多个应用程序)
您可以手动定义这些 pcms,但我建议采取捷径并重用预定义的“plug”、“dmix”和“dsnoop”pcms(在/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 中。这是该文件的唯一用途。
链接: