Похоже, у меня проблема с треском/глюком аудио (в основном, когда буфер не заполняется/обратный вызов не заканчивается в ситуации разрыва времени/буфера) даже после установки предпочтительной частоты дискретизации и размера буфера при использовании OpenSL ES.Недостаток аудио-буфера Android OpenSL с собственной частотой дискретизации/размером буфера (только некоторые устройства)
Я тестировал на Nexus 7 (модель 2013 года) и Moto X Pure Edition, и они оба отлично работают (с частотой дискретизации 48 кГц и размером буфера 240 и 960 соответственно). Может быть, каждый день или около того, как будто глюк, но это так мало, что я согласился с этим жить. Однако, когда я использую Samsung Galaxy S7, я получаю тонну звуковых сбоев каждую секунду (это также составляет 48 кГц и 960 кадров на буфер). Я проверил, и обратный вызов звука всегда заканчивается в течение правильного времени (20 мс); поэтому я могу сказать, что нет буфера.
Странная проблема заключается в том, что если я настрою Samsung использовать частоту дискретизации 44,1 кГц и размер буфера 128, нет никаких сбоев в звуке (за исключением небольшого прерывания, которое, как я предполагаю, связано с неправильной собственной частотой дискретизации).
Почему это происходит и как я могу исправить это, чтобы свойства родного звука работали?
Спасибо!
EDIT: Возможно, я смешиваю терминологию вверх (переполнение буфера и переполнение), поэтому, если кто-то хочет войти и исправить меня по этому поводу! обучение сила
Вы используете обратный вызов для очереди новых буферов? – WLGfx
@WLGfx Я уверен, что я это делаю (может быть, неправильно, я признаю, что мое понимание того, как все работает, нуждается в улучшении). Я использую этот класс для настройки обратного вызова и аудиопотока: https://github.com/superpoweredSDK/audioIO/blob/master/SuperpoweredAndroidAudioIO.cpp –
Обратный вызов не вызывается после завершения буферов, только перед буфер вот-вот закончит давать вам шанс поставить в очередь другой. Вам придется вручную добавить еще одну очередь, а затем снова включить обратный вызов. Возможно, несмотря на то, что обратный вызов вызывается при очереди буфера, у вас недостаточно времени для подготовки другого. В моем проекте, каждое обновление экрана, я проверяю, играют ли sles, и если нет, я вручную добавляю в буфер еще один буфер. – WLGfx