#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, который требует:
- Сначала инициализируйте цикл событий с помощью
pa_mainloop_new
, иpa_mainloop_get_api
. - Затем создайте новый контекст с помощью
pa_context_new
,pa_context_connect
иpa_context_set_state_callback
. - При обратном вызове контекста распознается инициализация контекста и запускается перечисление (
pa_context_get_source_info_list
илиpa_context_get_sink_info_list
). - Само перечисление также выполняется обратными вызовами.
К счастью, похоже, что это поддерживается на всех основных платформах (я использовал Linux и macOS X). Учитывая масштаб интерфейса, я, вероятно, продолжу использовать PulseAudio для всех моих будущих аудиопроектов.
Аналогичное перечисление для PipeWire API, которое новее:https://docs.pipewire.org/page_tutorial2.html