在Android / OpenSL中,我可以在bufferQueue中释放和排队各个缓冲区而不是清除整个东西吗?

时间:2014-02-22 09:55:44

标签: android c++ c opensl

我正在Android中使用纯C/C++的应用程序,应用程序需要连续录制声音并同步处理数据,所以我想知道何时在openSL中使用缓冲区队列记录声音,我是否可以释放已填充的并在缓冲队列中对新的空队列进行排队?

我已经考虑过在填充所有缓冲区时清除整个缓冲区队列的解决方案,并使用回调重新排队新的缓冲区队列,但我担心这个过程可能需要一些时间而且我会丢失期间的数据。

1 个答案:

答案 0 :(得分:0)

我不确定你的问题到底是什么。缓冲区队列应该被视为循环/环形队列,即:您将新缓冲区的内容写入下一个排队(因此为“空闲”)缓冲区,当前缓冲区完成播放时,排队缓冲区成为当前缓冲区,和先前当前缓冲的新排队缓冲区,基本上交换它们的状态。在录制和处理声音时,您不必担心这一点,而是专注于您编写的单个临时缓冲区,并将这些内容写入排队缓冲区。然后用于输出的环形缓冲区可以继续执行它的操作并在下一个回调中(即当队列中的缓冲区交换时),清除临时缓冲区的内容并用它想要保留的所有魔法填充它。它基本上归结为所有的记录和渲染都将在每次回调之后进行,并且您已经为输出和输入排队,这将克服数据丢失的可能性。