2012-12-19 48 views
3

如果我排队缓冲区以便记录到缓冲区队列中 - 是否有一种方法知道缓冲区何时被实际填充,所以我可以使用它?Android NDK,OpenSL ES - 知道什么时候填充缓冲区

同样,有没有办法知道何时播放缓冲区?

对于上下文: 我正在修补称为“native-audio”的NDK示例。 它使用SLAndroidSimpleBufferQueueItf进行播放,并且对于我想要做的流记录,也应该使用这样的队列。 现在我想知道,因为从我记得在某处读到的内容来看,并不能保证在录音回调的下一次呼叫时(或者在播放回放中播放),缓冲区已经填满了 - 如何知道什么时候缓冲区已被使用? 肯定有一些方法,因为否则这一切都会有点无用? ^^

回答

4

对于录制,如果您使用IBufferQueue_RegisterCallback注册slBufferQueueCallback,则应在填充缓冲区时收到回调。

另见this discussion的Android的NDK名单:

如果我没理解好,记录每个队列中的缓冲区填满的时间将打回电话,和这些缓冲区的顺序填写他们入队。但是回调看起来并没有公开指向相应已填充缓冲区的指针。那么如何回收呢? OpenSL ES规范中的示例代码显示了一个回放示例,其中包含一个作为回调的上下文传入的结构以跟踪这些结构,是否需要执行此操作?
...
没错。这是OpenSL ES 1.0.1规范中的一个已知缺陷。 OpenSL ES 1.1添加了一个显式参数来标识缓冲区,但Android目前基于1.0.1规范。解决方法是自己维护一个索引以指示正在完成哪个缓冲区。

+0

我会看看,谢谢! – user1847129