Android NDK, OpenSL ES — определение заполнения буфера

Если я помещаю буфер для записи в очередь буферов - есть ли способ узнать, когда этот буфер был фактически заполнен, чтобы я мог его использовать?

Аналогичным образом, есть ли способ узнать, когда был воспроизведен буфер?

Для контекста: я работаю с примером NDK под названием «native-audio». Он использует SLAndroidSimpleBufferQueueItf для воспроизведения, и комментирует, что для записи потока, который я хочу сделать, должна использоваться и такая очередь. Теперь мне интересно, поскольку, насколько я помню, где-то читал, не гарантируется, что буфер был заполнен при следующем вызове обратного вызова записи (или воспроизведен в обратном вызове воспроизведения, если на то пошло) - как узнать, когда буфер был использован? Наверняка должен быть какой-то способ, иначе все это было бы немного бесполезно? ^^


person user1847129    schedule 19.12.2012    source источник


Ответы (1)


Для записи, если вы зарегистрируете slBufferQueueCallback с IBufferQueue_RegisterCallback, вы должны получить обратные вызовы, когда буфер будет заполнен.

См. также это обсуждение в списке android-ndk. :

Если я правильно понимаю, рекордер будет возвращаться каждый раз, когда заполняется буфер в очереди, и эти буферы заполняются в том порядке, в котором они поставлены в очередь. Но обратный вызов, похоже, не предоставляет указатель на соответствующий заполненный буфер. Итак, как бы это восстановить? Образец кода в спецификациях OpenSL ES показывает пример воспроизведения со структурой, переданной в качестве контекста обратного вызова, чтобы отслеживать их, так ли это?
...
Верно. Это известный недостаток спецификации OpenSL ES 1.0.1. OpenSL ES 1.1 добавляет явный параметр для идентификации буфера, но в настоящее время Android основан на спецификации 1.0.1. Обходной путь состоит в том, чтобы самостоятельно поддерживать индекс, чтобы указать, какой буфер заполняется.

person Michael    schedule 19.12.2012