Alsa:如何在 2 个输出上复制流并保存系统配置?

Kro*_*oll 6 linux alsa

我的声卡是 Audigy SE [SB0570]。

我想不仅在扬声器上而且在耳机上同时播放相同的立体声流。

我在我的空 ~/.asoundrc 上尝试这个配置

pcm.quad {
    type multi

    slaves.a.pcm "hw:0,0" #green hole
    slaves.a.channels 2
    slaves.b.pcm "hw:0,2" #black hole
    slaves.b.channels 2

    bindings.0.slave a
    bindings.0.channel 0
    bindings.1.slave a
    bindings.1.channel 1
    bindings.2.slave b
    bindings.2.channel 0
    bindings.3.slave b
    bindings.3.channel 1
}

pcm.!default quad
Run Code Online (Sandbox Code Playgroud)

它就像我想要的那样工作。但是现在许多流之间的共享频道已损坏,我无法同时播放 2 个 mp3 文件。

顺便说一下/etc/asound.conf也是空的。我不知道真正的系统 alsa 配置在哪里,可能是这个/var/lib/alsa/asound.state fat 非常难以理解,有 4705 行和数百个control.##块。

als*_*ser 12

你的想法是正确的。您可以使用“type multi” alsa 模块向两个不同的设备播放声音。您只需要稍微扩展它即可构建完整的链。

卡名。通常最好使用卡片名称而不是索引:“hw:CardName,2”而不是“hw:0,2”,因为卡片索引可能会在重新启动时更改,而名称通常不会更改。您可以在输入cat /proc/asound/cardsaplay -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。

插头。不同的应用程序可能会尝试播放您的硬件不直接支持的格式/速率。因此,将“类型插头”自动转换模块放在播放链链中的首位是一个很好的做法——它将任何输入格式/速率转换为支持的输出。

总体而言,播放链将如下所示:

default = plug -> route -> multi -> (dmix->hw:CA0106,0 + dmix->hw:CA0106,2)
Run Code Online (Sandbox Code Playgroud)

Asym:但这只是播放链。如果您想将“默认” pcm 指向它是不够的,因为“默认”是默认情况下用于播放和捕获的 pcm 。要允许应用从“默认”录制,您需要使用“type asym”模块为其定义不同的播放和捕获链。捕获链可以如下所示:

default = plug <- dsnoop <- hw
Run Code Online (Sandbox Code Playgroud)

(“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"
}
Run Code Online (Sandbox Code Playgroud)

将其放入~/.asoundrc(仅限您的用户)或/etc/asound.conf(所有用户)。

PS:人们通常希望在重启后保留他们的卷。许多发行版alsactl store在关机时运行以保存当前的音量控制,并alsactl restore在启动时重新加载这些音量控制。默认情况下,alsactl将这些音量控制保存在/var/lib/alsa/asound.state. 这是该文件的唯一目的。

链接:

  • @Kroll,“Slave”是链中的下一个模块。Alsa-lib 是模块化的:`type dmix` 混合多个应用程序,`type route` 修改/复制频道,`type plug` 自动转换格式/速率等。因此,要执行多项操作,您可以将这些模块链接在一起。这样每个模块做它的一件事并将输出传递给它的从机,它做一些其他的事情并将输出传递给它的从机,依此类推。这就是“奴隶”的概念。 (2认同)