Я должен создать приложение C++ с простой аудиозаписью от функциональности микрофона.
Я не могу сказать, что нет достаточного количества аудио API, чтобы сделать это! Импульс, ALSA,/dev/dsp, OpenAL, и т.д. Мой вопрос - то, что текущая "Лучшая практика" API?
Импульс кажется поддерживаемым большинством современных дистрибутивов, но кажется почти лишенным документации. OpenAL будет поддерживаться через различные дистрибутивы, или это слишком неясно? Я скучал по кому-либо?
Разве нет ли простого ответа?
GStreamer предоставит вам и конечному пользователю максимальную гибкость в отношении захвата звука, но его кроссплатформенная жизнеспособность не так уж велика, особенно в OS X.
У Леннарта Поттеринга есть руководство здесь:
http://0pointer.de/blog/projects/guide-to-sound-apis
в основном используйте "безопасное" подмножество alsa, тогда все остальные важные подмножества тоже будут работать.
За исключением того, что OpenAL работает в Linux
EDIT: Также pulseaudio имеет достаточно хорошую документацию, сгенерированную doxygen здесь и некоторые другие материалы здесь и некоторые утилиты являются хорошими примерами, вы можете увидеть их в gitweb здесь
Также я написал некоторый код, который использует pulse для ввода звука, вы можете посмотреть на него здесь, однако я не уверен, что я обрабатываю все полностью правильно, и я знаю, что мне не хватает кода для обработки некоторых ситуаций. ... но это должно помочь вам начать, если вы выберете pulse.
простого ответа не существует; наилучшая практика зависит от контекста и конкретных случаев использования, с которыми будет сталкиваться ваше приложение.
для наибольшей простоты программирования и широчайшей аудитории я бы выбрал gstreamer, поскольку он быстр и прост, хорошо интегрирован в gnome и ubuntu и поддерживает широкий спектр аудиоподсистем и конфигураций. он очень гибкий.
например, команда:
gst-launch autoaudiosrc ! audioconvert ! flacenc ! filesink location="foo.flac"
создаст файл .flac с микрофонного входа, независимо от аудиосистемы (Pulse, ALSA, ESD ...). эквивалентный конвейер можно написать с помощью связки c / gobject, как описано здесь.
p.s для выполнения вышеуказанной команды требуется пакет gstreamer-tools