2016-10-21 3 views
1

Я пытаюсь сделать простое приложение для записи студии. У меня есть несколько устройств ввода звука, и я хотел бы записать их все одновременно.Как узнать список физических каналов аудиовхода?

Как узнать все физические аудиовходы?

Когда я использую 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 к get физический входные каналы? И их параметры (чтобы я мог выбирать частоту дискретизации и т. Д.)

+0

Я не думаю, что это возможно с PortAudio. Вы можете попробовать сканировать для '(hw: X, Y)' в названии устройства, но я не уверен, соответствует ли это именно тем устройствам, которые вы хотели бы видеть. – Matthias

+0

Спасибо! Интересно, есть ли какой-нибудь другой API, который упростит его? –

+0

Я нашел это в PulseAudio. –

ответ

1

Лучше всего сделать более сложные вещи в PulseAudio. Здесь я нашел ссылку на example program. К сожалению, это сложный API, который требует, чтобы:

  1. Сначала инициализировать цикл событий с pa_mainloop_new и pa_mainloop_get_api.
  2. Затем создайте новый контекст с pa_context_new, pa_context_connect и pa_context_set_state_callback.
  3. В контексте обратного вызова распознается инициализация контекста и начинается перечисление (pa_context_get_source_info_list или pa_context_get_sink_info_list).
  4. Само перечисление выполняется также обратными вызовами.

К счастью, это поддерживается на всех основных платформах (я использовал Linux и MacOS X). Учитывая объем интерфейса, я, вероятно, продолжу использовать PulseAudio для всех моих будущих аудиопроектов.