Android NDK,OpenSL ES - 填充缓冲区时知道

时间:2012-12-19 15:15:35

标签: android android-ndk opensl

如果我将用于记录的缓冲区排入缓冲区队列 - 有没有办法知道该缓冲区何时被实际填充,那么我可以使用它吗?

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

上下文: 我正在修补名为“native-audio”的NDK示例。 它使用SLAndroidSimpleBufferQueueItf进行播放,并注释,对于我想要进行的流记录,也应该使用这样的队列。 现在我想知道,因为从我记得读到的某个地方来看,并不能保证在下一次录音回叫中填充缓冲区(或者在播放回调中播放,就此而言) - 怎么会知道什么时候缓冲区已被使用? 肯定必须有某种方式,否则这一切都会有点无用? ^^

1 个答案:

答案 0 :(得分:4)

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

另请参阅android-ndk列表中的this discussion

  

如果我理解的话,记录器将在每次填充队列中的缓冲区时回调,并且这些缓冲区按它们排队的顺序填充。但是回调似乎没有公开指向相应填充缓冲区的指针。那么接下来会有什么方法呢? OpenSL ES规范中的示例代码显示了一个回放示例,其中一个结构作为回调的上下文传入,以跟踪这些,是这样做的吗?
  ...
  对。这是OpenSL ES 1.0.1规范中的已知缺陷。 OpenSL ES 1.1添加了一个显式参数来识别缓冲区,但Android目前基于1.0.1规范。解决方法是自己维护索引以指示正在完成哪个缓冲区。