我的要求是:
- 在播放界面读取通道数
- 读取每个捕获接口中的通道数
- 将 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 之间的映射,它的名称由声卡驱动程序提供商提供。以下输出可以说明:
- 声卡中的 IO 数量
- 播放 IO 的数量(这是通过检查其名称以搜索“麦克风”)
有什么办法可以参考:
/devices/pci0000:00/0000:00:1b.0/sound/card2/input13
...直接通过播放一个单声道WAV进去吗?
一般来说,我希望能够列出所有声音接口并收集允许我通过 SDL 播放到任何物理扬声器并从任何物理麦克风在特定 WAV 通道上录制的参数。我设法通过以下方式部分实现了这一目标:
- 确定 aplay -l 将使用的设备。在我的例子中:
card 0: Device [USB Sound Device], device 0: USB Audio [USB Audio] Subdevices: 0/1 Subdevice #0: subdevice #0
- 确定回放捕获通道的数量(到目前为止,通过检查物理设备 - 有一个 Line-In 和一个 MIC)但是输出
cat /proc/asound/card0/stream0
给了我:
捕获:状态:停止接口 2 Altset 1 格式:S16_LE 通道:2 端点:5 IN (ASYNC) 速率:44100、48000 位:16
所以它告诉我我有一个带有 2 个通道的捕获接口(但我希望有 2 个捕获 - 一个用于线路输入,第二个用于立体声麦克风)
- 所以我知道如果麦克风连接到接口,那么我应该期待 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 :)