如何发现物理音频输入通道列表?

时间:2016-10-21 12:24:31

标签: linux audio sdl portaudio pulseaudio

我正在尝试制作一个简单的录音室录音应用程序。 我有多个声音输入设备,并希望同时录制它们。

如何发现所有物理音频输入?

当我使用sounddevice.query_devices()时,我会收到很多虚拟设备和许多虚拟输入通道,其中不包含任何数据:

>>> sd.query_devices()

  0 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)
  1 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)
  2 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)
  3 hdmi, ALSA (0 in, 8 out)
  4 pulse, ALSA (32 in, 32 out)
* 5 default, ALSA (32 in, 32 out)
  6 /dev/dsp, OSS (16 in, 16 out)

我只对真实设备和真实输入频道感兴趣。

当我使用pacmd然后list-sources查询麦克风设备时,即使设备是单声道,我也会获得两个提供立体声的声道:

$ pacmd
>>> list-sources
...
    channel map: front-left,front-right
                 Stereo

有没有办法查询PulseAudio或PortAudio来获取物理输入通道?和他们的参数(这样我可以选择采样率等)。

1 个答案:

答案 0 :(得分:1)

最好在PulseAudio中做更复杂的事情。在这里,我找到了example program的链接。 不幸的是,复杂的API需要一个:

  1. 首先使用pa_mainloop_newpa_mainloop_get_api初始化事件循环。
  2. 然后使用pa_context_newpa_context_connectpa_context_set_state_callback创建新的上下文。
  3. 在上下文回调中,可以识别上下文初始化并开始枚举(pa_context_get_source_info_listpa_context_get_sink_info_list)。
  4. 枚举本身也是由回调执行的。
  5. 幸运的是,它似乎支持所有主要平台(我使用的是Linux和MacOS X)。鉴于界面的范围,我可能会继续将PulseAudio用于我未来的所有音频项目。