Как программно узнать возможности аудиоустройства ALSA в Linux, не открывая устройство
Вопрос
Как мне узнать возможности устройств ALSA, не открывая устройство первым?Проблема в том, что мне нужно предоставить параметры для snd_pcm_open()
функция для использования тестовых функций, что для меня глупо.Зачем спрашивать, является ли это устройством воспроизведения или записи, если я должен сначала сообщить об этом функции open?
В качестве примера я хотел бы перечислить все устройства воспроизведения, но единственный способ, который я могу придумать, - это попытаться открыть каждое устройство, которое я нахожу (с snd_device_name_hint()
) и попробуйте открыть их в режиме воспроизведения, и если мне удастся открыть, все будет в порядке.
Проблема в том, что со всеми возможными вариациями (частота дискретизации, каналы и т.д.) было бы ужасно большое количество open(), которые мне нужно выполнить, чтобы узнать параметры.
Решение
Используйте snd_ctl_next для перебора всех устройств, затем snd_ctl_open для получения информации об устройстве - это не то же самое, что snd_pcm_open, который может завершиться ошибкой, если устройство открыто другой программой или у вас неправильные настройки.
Он довольно плотный, но вот некоторый код с открытым исходным кодом, который повторяет все устройства ALSA, которые вы могли бы посмотреть: https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/alsa/pa_linux_alsa.c - найдите BuildDeviceList, чтобы начать.
Другие советы
Это были мои первые требования к проектам linux / unix, где мне нужно знать обо всех доступных возможностях аудиоустройств.Затем мне нужно использовать эти устройства для захвата и воспроизведения аудио.То, что я сделал, довольно просто.Существует команда linux / unix, которая используется для поиска устройств с помощью утилиты alsa в Linux.
Это так:
aplay -l
Теперь то, что я сделал, это просто создал программу для выдачи информации, подобной этой, от alsa.
Для всех желающих я создал библиотеку (.so) и пример приложения, демонстрирующий использование этой библиотеки в c ++.
Результат моей библиотеки выглядит следующим образом-
[root@~]# ./IdeaAudioEngineTest
HDA Intel plughw:0,0
HDA Intel plughw:0,2
Эта библиотека также может захватывать и воспроизводить аудиоданные в режиме реального времени.
Он доступен вместе с документацией в Библиотека IdeaAudio с дуплексным звуком Alsa
При условии, что вы можете выполнить команду командной строки.Тогда aplay - ваш друг.
аплей - л
список всех звуковых карт и цифрового аудио устройства