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

时间:2017-05-12 13:38:57

标签: 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

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

顺便说一句 /etc/asound.conf 也是空的。我不知道真正的系统alsa配置在哪里,可能是这个 /var/lib/alsa/asound.state 胖子用4705行和数百个控制极难理解。## 块。

1 个答案:

答案 0 :(得分:4)

你的想法是正确的。您可以使用"输入multi" alsa模块向两个不同的设备播放声音。你只需要将它扩展一点就可以构建完整的链。

卡名。使用卡名而不是索引通常更好:" hw:CardName,2"而不是" hw:0,2"因为卡片索引可能会在重启时发生变化,而名称通常不会改变。您可以在cat /proc/asound/cardsaplay -l输出中查看卡名称。对于您的卡,名称可能是" CA0106"。

<强> DMIX 即可。要允许多个应用同时播放,请输入&#34;键入dmix&#34;介于&#34;类型多&#34;和&#34; hw&#34;在你的播放链中。 &#34;类型dmix&#34;模块将多个应用程序混合到同一个硬件缓冲区中。

<强>路线即可。你的&#34;类型多&#34;模块将输入通道0,1,2,3映射到从属的输出通道0,1&#34; a&#34;和#34; b&#34;的通道0,1,这意味着你有4个输入通道,而你只有2个通道(立体声)。将2声道立体声转换为4声道,用于&#34;输入多声道&#34;在它前面加上&#34; type route&#34; pcm将通道0,1复制到0,1和2,3。

<强>插头即可。不同的应用程序可能会尝试播放格式/速率,而不是硬件直接支持。所以放入&#34;类型插件&#34;是一个很好的做法。自动转换模块首先在回放链链中 - 它将任何输入格式/速率转换为支持的输出。

总的来说,播放链就像:

default = plug -> route -> multi -> (dmix->hw:CA0106,0 + dmix->hw:CA0106,2)

Asym :但那只是回放链。如果你想指出&#34;默认&#34;它是不够的。 pcm到它,因为&#34;默认&#34;是一个pcm,默认情况下用于播放和捕获。允许从&#34;默认&#34;你需要使用&#34;类型asym&#34;为它定义不同的播放和捕获链。模块。捕获链看起来像:

default = plug <- dsnoop <- hw

(&#34;输入dsnoop&#34;是一个类似dmix的模块用于捕获 - 它允许从同一设备捕获多个应用程序)

您可以手动定义每个pcms,但我建议采用快捷方式并重复使用预定义的&#34; plug&#34;,&#34; dmix&#34;和&#34; dsnoop&#34; 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中。这是该文件的唯一目的。

链接: