在Android/OSL中,我可以在bufferQueue中释放单个缓冲区并将其排队,而不是清除整个缓冲区吗
In Android / OpenSL, can I release and enqueue individual buffers in the bufferQueue rather than clearing the whole thing?
我在Android
中使用纯C/C++
开发一个应用程序,该应用程序需要连续录制声音并同步处理数据,所以我想知道当我在openSL中使用缓冲队列录制声音时,我是否可以释放缓冲队列中已填充的声音并排队新的空声音?
我已经考虑过在所有缓冲区都填满时清除整个缓冲区队列,并通过回调将新的缓冲区重新排队的解决方案,但我担心这个过程可能需要一些时间,在此期间我会丢失数据。
我不确定你的问题到底是什么。缓冲区队列应该被视为一个循环/环形队列,即:你将新缓冲区的内容写入下一个排队的(因此是"空闲"的)缓冲区,当当前缓冲区播放完时,排队的缓冲区变成当前缓冲区,之前的当前缓冲区变成新的排队缓冲区,基本上交换它们的状态。在录制和处理声音时,您不必担心这一点,而是将注意力集中在写入的单个临时缓冲区上,并将这些内容写入排队的缓冲区中。然后,用于输出的环形缓冲区可以继续做它的事情,在下一次回调时(即,当队列中的缓冲区交换时),您清除临时缓冲区的内容,并用您希望它保持的所有魔力填充它。它基本上可以归结为,所有的录制和渲染都将在每次回调后进行,并且您有用于输出和输入的队列,这将克服数据丢失的可能性。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 在 openGL 中多次绑定缓冲区
- 在Android/OSL中,我可以在bufferQueue中释放单个缓冲区并将其排队,而不是清除整个缓冲区吗
- 检查文件内容是否已实际写入磁盘 - 未在磁盘控制器的缓冲区中排队