我正在编写一个应用程序,该应用程序应该列出所有音频输入设备及其可用通道和一个 ID,以在重新启动和主机系统中识别录音设备。
我发现 arecord -l 可以列出(一些?)音频输入设备,但似乎没有办法列出通道数,尽管您可以使用 -c 标志来记录特定数量的通道。
我什至尝试编写一个循环,尝试使用越来越多的通道进行记录,直到失败,但它总是在 65 处失败,即使只有 1 个通道。
除此之外,ID 不是唯一的,并且在不同的主机系统上使用也不安全。
有什么想法可以在 Bash 中实现这一点吗?
理想情况下,独立于主机使用的音频系统(如 ALSA、Pulseaudio、Pipewire、Jack、Wireplumber 等)?
答案1
/proc
我为此使用文件系统;它将 ALSA 声卡模型的各个方面暴露给文件系统。
例子:
通过 SoC(片上系统)I2S 接口连接的 2 通道 ADC:
$ cat /proc/asound/card0/pcm0c/sub0/hw_params
access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 192
buffer_size: 2304
8 通道 USB 音频设备:
$ cat /proc/asound/card0/pcm0c/sub0/hw_params
access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 8
rate: 48000 (48000/1)
period_size: 192
buffer_size: 2304
还有一些其他文件可能有用。/proc/asound/card0/stream0
具有 USB 音频设备上的通道数,但不具有 SoC 设备上的通道数。无论哪种方式,如果您有不止一张卡,则需要枚举所有卡才能找到您想要的卡,因为无法保证枚举顺序。
您还可以使用amixer
来检查控件计数,但我发现procfs
更sysfs
容易解析。