Воспроизведение аудио OS X / Linux с интерфейсом на основе событий? - PullRequest
3 голосов
/ 02 апреля 2012

Я работаю над потоковым аудиоплеером для Linux / OS X с причудливым сценарием использования, который убедил меня, что ничто из того, что уже существует, не будет работать. Для первой части я просто хочу получить данные MP3 и воспроизвести их. В настоящее время я использую libmad для декодирования и libao для воспроизведения. Моя проблема с libao, и я не уверен, что это мой лучший вариант.

В частности, функция ao_play блокирует. Он не возвращается, пока не будет воспроизведен весь переданный ему буфер. Это не дает достаточно времени для декодирования блоков между вызовами ao_play, поэтому декодирование должно быть выполнено либо полностью заранее, либо одновременно. Так как это предназначено для потоковой передачи, я забочусь о досрочном декодировании. (Вполне возможно, что я мог бы отправить аудиоданные стоимостью более часа - я не хочу использовать столько памяти.) Это оставляет параллелизм. Но хотя pthreads является стандартной в Linux и OS X, многие из окружающих библиотек - нет. Я не совсем уверен, что хочу пойти на параллелизм - поэтому я пересматриваю свой выбор libao.

Для моего приложения лучшая модель, которую я могу придумать для воспроизведения звука, - это получить дескриптор файла, который я мог бы выбрать, чтобы получать уведомления, когда он будет готов к записи, а затем выдавать неблокирующие записи. (Это связано с остальными деталями варианта использования, которые в любом случае подразумевают, что я действительно хочу цикл выбора.)

Есть ли библиотека, которая работает как в Linux, так и в OS X, которая работает таким образом?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

PortAudio ваш.Он имеет простой API, управляемый обратным вызовом.Это кроссплатформенность и низкая задержка.Это лучшее решение, если вам не нужны какие-либо необычные функции (3D, аудио-графики, ...).

3 голосов
/ 02 апреля 2012

Хотя это очень ненавистно, PulseAudio в основном работает точно так же, как вы описываете (используя асинхронный API, а не простой).

Если только то, что вы хотите сделать, не связано с низкими задержкамипродвинутая работа со звуком, в этом случае вы можете обратиться к JACK Audio Connection Kit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...