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