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

2024-04-27

我的声卡是 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 行和数百行控制。## blocks.


你的想法是正确的。您可以使用“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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 内核如何区分线程和进程

    Linux 中的线程被称为轻量级进程 无论是进程还是线程 它们的实现都是通过task struct数据结构 1 gt 那么 从这个意义上说 内核如何区分线程和进程 2 gt 当发生上下文切换时 线程如何在上下文切换中获得更少的开销 因为在此
  • 配置错误:无法链接到 boost_system

    我正在尝试在 Debian 上安装一个软件包 足球模拟器 2d 当我进入目录并运行时 configure 我得到以下信息 reza debian soccer rcssserver 15 0 1 configure checking for
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • 在 Ubuntu 上运行独立的 ASP.NET Core 应用程序

    我已经发布了一个 ASP NET Core 应用程序作为针对 Ubuntu 的独立应用程序 发布似乎工作正常 我已将这些文件复制到一台漂亮的 Ubuntu 机器上 现在 我如何运行我的应用程序 我的理解是 因为它是一个独立的 NET Cor
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • GCC 4.7 字符串文字的源字符编码和执行字符编码?

    Linux x86 64 上的 GCC 4 7 是否具有默认字符编码 用于验证和解码 C 源文件中字符串文字的内容 这是可配置的吗 此外 当将字符串数据从字符串文字链接到输出的数据部分时 它是否具有默认的执行字符编码 这是可配置的吗 在任何
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • 无法在 R 中安装插入符号包(在我的 Linux 机器中)

    我在尝试在 R 中安装插入符号包时遇到以下错误 g error tmp Rtmp2Tos7n R INSTALL2e6e30153a74 nloptr nlopt 2 4 2 lib libnlopt cxx a No such file
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 从 Java 读取 /dev/input/js0

    我正在尝试阅读 dev input js0来自Java 但我不断得到 java io IOException Invalid argument at java io FileInputStream read0 Native Method a
  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf

随机推荐