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

#linux #audio #sdl #portaudio #pulseaudio

#linux #Аудио #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. Я не думаю, что это возможно с PortAudio. Вы могли бы попробовать выполнить поиск (hw:X,Y) в названии устройства, но я не уверен, что это точно соответствует устройствам, которые вы хотели бы видеть.

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

3. Я обнаружил, что это возможно в PulseAudio.

Ответ №1:

Кажется, что лучше всего выполнять более сложные вещи, какие только возможны в PulseAudio. Здесь я нашел ссылку на пример программы. К сожалению, это сложный 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 для всех моих будущих аудиопроектов.

Аналогичное перечисление для PipeWire API, которое новее:https://docs.pipewire.org/page_tutorial2.html