在Android/OSL中,我可以在bufferQueue中释放单个缓冲区并将其排队,而不是清除整个缓冲区吗



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

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

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

最新更新