PCM 通道映射到物理扬声器/麦克风ALSA 库

问题描述

我的要求是:

  • 在播放界面读取通道数
  • 读取每个采集接口的通道数
  • 将 WAV 通道映射到特定的扬声器输入/输出

说到扬声器,可以通过检查 alsa-info 命令的输出来实现:

[    2.254295] input: HDA Intel PCH Front Mic as /devices/pci0000:00/0000:00:1b.0/sound/card2/input10
[    2.254441] input: HDA Intel PCH Rear Mic as /devices/pci0000:00/0000:00:1b.0/sound/card2/input11
[    2.254543] input: HDA Intel PCH Line as /devices/pci0000:00/0000:00:1b.0/sound/card2/input12
[    2.254726] input: HDA Intel PCH Line Out Front as /devices/pci0000:00/0000:00:1b.0/sound/card2/input13
[    2.254789] input: HDA Intel PCH Line Out Surround as /devices/pci0000:00/0000:00:1b.0/sound/card2/input14
[    2.254845] input: HDA Intel PCH Line Out CLFE as /devices/pci0000:00/0000:00:1b.0/sound/card2/input15
[    2.254904] input: HDA Intel PCH Line Out Side as /devices/pci0000:00/0000:00:1b.0/sound/card2/input16
[    2.254966] input: HDA Intel PCH Front Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card2/input17

我不明白这是 PCI Express 之间的映射,它的名称由声卡驱动程序提供商提供。以下输出可以说明:

有什么办法可以参考:

/devices/pci0000:00/0000:00:1b.0/sound/card2/input13

...直接播放单声道WAV进去?

通常,我希望能够列出所有声音接口并收集参数,以便我可以通过 SDL 播放到任何物理扬声器并从任何物理麦克风在特定 WAV 通道上录音。我设法通过以下方式部分实现了这一目标:

  1. 确定 aplay -l 将使用的设备。在我的例子中:
card 0: Device [USB Sound Device],device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
  1. 确定播放捕获通道的数量(目前通过检查物理设备 - 有一个 Line-In 和一个 MIC)但是 cat /proc/asound/card0/stream0输出给了我:

捕获:状态:停止接口 2 Altset 1 格式:S16_LE 通道:2 端点:5 IN(异步)速率:44100、48000 位:16

所以它告诉我我有一个带有 2 个通道的捕获接口(但我希望有 2 个捕获 - 一个用于线路输入,第二个用于立体声麦克风)

  1. 所以我知道如果麦克风连接到接口,那么我应该期待 2 通道 WAV,每个通道将对应一个麦克风通​​道

非常相似的故事是播放界面。这是用于播放的 cat /proc/asound/card0/stream0

Playback:
  Status: Running
    Interface = 1
    Altset = 2
    Packet Size = 196
    Momentary freq = 48000 Hz (0x30.0000)
  Interface 1
    Altset 1
    Format: S16_LE
    Channels: 8
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 44100,48000
    Bits: 16
  Interface 1
    Altset 2
    Format: S16_LE
    Channels: 2
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 44100,48000
    Bits: 16
  Interface 1
    Altset 3
    Format: S16_LE
    Channels: 4
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 44100,48000
    Bits: 16
  Interface 1
    Altset 4
    Format: S16_LE
    Channels: 6
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 44100,48000
    Bits: 16
  Interface 1
    Altset 5
    Format: S16_LE
    Channels: 2
    Endpoint: 6 OUT (ADAPTIVE)
    Rates: 96000
    Bits: 16

在那种情况下,我有用于 7.1 扬声器设置 + 耳机的物理连接器输入。所以我希望能控制 10 个频道,但我有超过 8 个(耳机总是重复的,好像有 2.1)有什么办法可以单独访问这些频道? 还有一个 SPDIF 输入/输出物理接口。我应该期望在每个物理接口上总是有重复的 PCM 还是有任何方法可以分离这些流?我想尽可能多地从这辆有声汽车中挤出 I/O :)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...