首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alsa:如何在两个输出上复制一个流并保存系统信任?

Alsa:如何在两个输出上复制一个流并保存系统信任?
EN

Stack Overflow用户
提问于 2017-05-12 13:38:56
回答 1查看 9.1K关注 0票数 7

我的声卡是Audigy SE SB0570。

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

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

代码语言:javascript
复制
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

就像我想要的那样。但是现在很多流之间的共享通道被打破了,我不能同时播放两个mp3文件。

顺便说一下,/etc/asound.conf也是空的。我不知道真实的系统在哪里,阿尔萨吐露,可能是这种/var/lib/alsa/asound.state脂肪非常难以理解的4705行和数百个control.##块。

EN

回答 1

Stack Overflow用户

发布于 2017-05-27 14:18:16

你的想法是正确的。您可以使用“类型多”阿尔萨模块来播放声音到两个不同的设备。你只需要稍微扩展一下就可以构建完整的链了。

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

Dmix.为了允许多个应用同时播放,在你的回放链中放置“类型多”和"hw“之间的”类型dmix“。“类型dmix”模块将多个应用程序混合到同一个硬件缓冲区中。

。您的“类型多”模块将输入通道0、1、2、3映射到输出通道0,1从"a“和通道0,1从"b",这意味着您有4个输入通道,而您只有2个通道(立体声)。要将2声道立体声转换为4声道,在其前面加上“类型路由”pcm,将0、1和2、3两个频道复制。

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

总的来说,回放链将类似于:

代码语言:javascript
复制
default = plug -> route -> multi -> (dmix->hw:CA0106,0 + dmix->hw:CA0106,2)

Asym:但那只是回放链。如果要将“默认”pcm指向它,这是不够的,因为“默认”是默认情况下用于播放和捕获的pcm。要允许应用程序从“默认”记录,您需要定义不同的回放和捕获链,为它使用“类型的异步”模块。捕获链看起来可以是:

代码语言:javascript
复制
default = plug <- dsnoop <- hw

("type dsnoop“是一个用于捕获的类似dmix的模块,它允许从同一设备捕获多个应用程序)

您可以手动定义每个pcms,但我建议您采取捷径,重用预定义的“插件”、"dmix“和"dsnoop”pcms (在/usr/share/alsa/alsa.conf/usr/share/alsa/pcm/dmix.conf/usr/share/alsa/pcm/dsnoop.conf中定义)。那么整个配置将是:

代码语言:javascript
复制
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中。那是那个文件的唯一目的。

链接:

  • .asoundrc语法
  • alsa插件
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43939191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档