OpenAL 不支持在播放期间更改数据。
但是,您仍然可以尝试一下,看看您是否获得了可接受的默认值(尽管您将与 OpenAL 播放机制竞争,并且您的应用程序中的任何延迟都可能导致该机制失效,因此请自行承担风险)。
Apple 扩展版本的 ALBufferData 告诉 OpenAL 使用您直接提供的数据,而不是制作自己的本地副本。您可以这样设置:
typedef ALvoid AL_APIENTRY (*alBufferDataStaticProcPtr) (const ALint bid,
ALenum format,
const ALvoid* data,
ALsizei size,
ALsizei freq);
static alBufferDataStaticProcPtr alBufferDataStatic = NULL;
alBufferDataStatic = (alBufferDataStaticProcPtr) alcGetProcAddress(NULL, (const ALCchar*) "alBufferDataStatic");
像调用 alBufferData() 一样调用 alBufferDataStatic():
alBufferDataStatic(bufferId, format, data, size, frequency);
由于它现在使用的是您的声音数据缓冲区而不是它自己的,因此您可以想象修改该数据并且它不会更明智(前提是您没有修改太接近缓冲区中当前播放位置的内容) .
但是,这种方法是有风险的,因为它取决于您无法完全控制的时间。为了 100% 安全,您需要使用音频单元。