在DirectSound中,有一个非常独特的概念circular buffers
特别是当前读取位置,当前写入位置以及GetPosition的清除方法并锁定缓冲区并开始写入。
我在OpenAL中寻找类似的概念,但我能找到的只是循环AL_STREAMING
缓冲区,并使用AL_SAMPLE_OFFSET
来确定当前的读取位置(并写下15个样本后)吗?)
OpenAL文档现在已关闭,但可访问here。
声明应用程序在播放时写入声音缓冲区的安全方法是什么?我是否正确使用循环流缓冲区?
答案 0 :(得分:3)
实际上,OpenAL中的循环缓冲区与DirectSound有很大不同。
在OpenAL中,您必须一个接一个地排队声音缓冲区。那么你真的只需要2个声音缓冲区,你只需要连续调用alSourceQueueBuffers和alSourceUnqueueBuffers。
在源上排队缓冲区 要不间断地从源连续流式传输音频,需要缓冲区排队。至 使用缓冲区排队,缓冲区和源是以正常方式生成的,但alSourcei不是 用于将缓冲区附加到源。相反,函数alSourceQueueBuffers和 使用alSourceUnqueueBuffers。程序可以将缓冲区或一组缓冲区附加到a source使用alSourceQueueBuffers,然后在该源上调用alSourcePlay。虽然 源正在播放,可以调用alSourceUnqueueBuffers来删除已经存在的缓冲区 播放。然后可以用新数据填充或丢弃这些缓冲区。新的或重新填充的缓冲区可以 然后使用alSourceQueueBuffers附加到播放源。只要有永远 要在队列中播放的新缓冲区,源将继续播放。