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");
呼叫alBufferDataStatic()它就像你调用alBufferData():因为它现在使用的声音数据缓冲区,而不是自己的
alBufferDataStatic(bufferId, format, data, size, frequency);
,你可以想见,修改这些数据并且它不会更聪明(假设你没有修改那些距离缓冲区当前播放位置太近的东西)。
但是,这种方法是有风险的,因为它取决于你没有完全控制的时间。为了100%安全,您需要使用音频单元。
嗯,我从来不知道这个扩展名。显然[iOS中的OpenAL有两个苹果扩展:'alBufferDataStaticProcPtr'和'alcMacOSXMixerOutputRateProcPtr'](http://developer.apple.com/library/ios/#DOCUMENTATION/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html) – bobobobo
如果您可以滚动浏览版权声明,还有[.h](http://developer.apple.com/library/ios/#samplecode/oalTouch/Listings/Classes_MyOpenALSupport_h.html)和[.c](http:/。 /developer.apple.com/library/ios/#samplecode/oalTouch/Listings/Classes_MyOpenALSupport_c.html)文件作为“oalTouch”项目的一部分,显示如何使用这些文件。 – bobobobo