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 中的循环缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

我的 OpenAL C++ 音频流缓冲区故障

确定何时播放缓冲区而不在 OpenAL 中轮询源

openal:获取源的当前播放位置

iOS:Pitch Shifting & Piping 从 OpenAL 输出到缓冲区

OpenAL 从特定时间戳播放音频

从视频文件中提取音频并在 OpenAL 中播放