2

在 DirectSound 中,有一个非常独特的循环缓冲区概念

特别是有一个当前的读取位置、一个当前的写入位置,以及 GetPosition 和锁定缓冲区并开始写入的 clear 方法。

在此处输入图像描述

我正在 OpenAL 中寻找类似的概念,但我能找到的只是循环AL_STREAMING缓冲区,并使用AL_SAMPLE_OFFSET它来确定当前的读取位置(然后再写 15 个样本?)

OpenAL 文档现在已关闭,但可在此处访问。

声明应用程序在播放时写入的声音缓冲区的安全方法是什么?我对使用循环流缓冲区是否正确?

4

1 回答 1

3

实际上,OpenAL 中的循环缓冲区与 DirectSound 有很大不同。

在 OpenAL 中,您必须一个接一个地对声音缓冲区进行排队。那时你真的只需要 2 个声音缓冲区,你只需不断地调用 alSourceQueueBuffers 和 alSourceUnqueueBuffers。

在源上排队缓冲区 要从源连​​续流式传输音频而不会中断,需要缓冲区排队。要使用缓冲区队列,缓冲区和源以正常方式生成,但不使用 alSourcei 将缓冲区附加到源。相反,使用函数 alSourceQueueBuffers 和 alSourceUnqueueBuffers。该程序可以使用 alSourceQueueBuffers 将缓冲区或一组缓冲区附加到源,然后在该源上调用 alSourcePlay。当源正在播放时,可以调用 alSourceUnqueueBuffers 来删除已经播放的缓冲区。然后可以用新数据填充这些缓冲区或丢弃这些缓冲区。然后可以使用 alSourceQueueBuffers 将新的或重新填充的缓冲区附加到播放源。只要队列中总是有新的缓冲区要播放,源就会继续播放。

于 2012-12-17T18:40:46.630 回答