OpenAL 中的循环缓冲区
Posted
技术标签:
【中文标题】OpenAL 中的循环缓冲区【英文标题】:Circular buffers in OpenAL 【发布时间】:2012-12-17 01:34:56 【问题描述】:在 DirectSound 中,有一个非常独特的概念 circular buffers
特别是当前读取位置、当前写入位置以及 GetPosition 和锁定缓冲区并开始写入的清除方法。
我正在 OpenAL 中寻找类似的概念,但我能找到的只是循环一个 AL_STREAMING
缓冲区,并使用 AL_SAMPLE_OFFSET
确定当前读取位置(然后写下说,15 个样本?)
OpenAL 文档现在已关闭,但可以访问 here。
什么是声明一个声音缓冲区的安全方法,该缓冲区由应用程序在播放时写入?我对使用循环流缓冲区是否正确?
【问题讨论】:
【参考方案1】:实际上,OpenAL 中的循环缓冲区与 DirectSound 有很大不同。
在 OpenAL 中,您必须一个接一个地排队声音缓冲区。那时你真的只需要 2 个声音缓冲区,你只需不断调用 alSourceQueueBuffers 和 alSourceUnqueueBuffers。
源上的队列缓冲区 要连续不间断地从源流式传输音频,需要缓冲区队列。到 使用缓冲区队列,缓冲区和源以正常方式生成,但 alSourcei 不是 用于将缓冲区附加到源。相反,函数 alSourceQueueBuffers 和 使用 alSourceUnqueueBuffers。该程序可以将一个缓冲区或一组缓冲区附加到一个 使用 alSourceQueueBuffers 的源,然后在该源上调用 alSourcePlay。虽然 源正在播放,可以调用 alSourceUnqueueBuffers 来移除已经存在的缓冲区 玩过。然后可以用新数据填充这些缓冲区或丢弃这些缓冲区。新的或重新填充的缓冲区可以 然后使用 alSourceQueueBuffers 附加到播放源。只要一直有 队列中要播放的新缓冲区,源将继续播放。
【讨论】:
前段时间,我发布了一些代码,演示了一些带有可选过滤的麦克风到扬声器的简单代码:***.com/questions/4087727/… 这演示了您正在寻找的实时编辑。以上是关于OpenAL 中的循环缓冲区的主要内容,如果未能解决你的问题,请参考以下文章