2011-09-29 90 views
4

我正在iOS中工作,并且正在运行一个简单的OpenAL项目。OpenAL缓冲区实时更新

与我见过的大多数openAL项目的不同之处在于im不会加载到声音文件中。而是将一组原始数据加载到alBufferData中。使用几个方程我可以加载数据产生白噪声,正弦波和脉冲波。而且一切都很好。

我的问题是,我需要一种方法来修改这些数据,而声音是实时播放。

有没有办法修改这些数据,而不必创建一个新的缓冲区(我试图用新数据创建一个新缓冲区,然后用它来代替,但它的地方不够快)。

任何帮助或建议的其他方式来完成这将不胜感激。

谢谢

回答

1

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%安全,您需要使用音频单元。

+0

嗯,我从来不知道这个扩展名。显然[iOS中的OpenAL有两个苹果扩展:'alBufferDataStaticProcPtr'和'alcMacOSXMixerOutputRateProcPtr'](http://developer.apple.com/library/ios/#DOCUMENTATION/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html) – bobobobo

+0

如果您可以滚动浏览版权声明,还有[.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

2

我没有在iOS上完成它,但在PC上使用openAL,你要做的是将几个缓冲区链接在一起。每个缓冲区都有一段时间的小数据。定期检查播放缓冲区是否已完成,如果有,请将其添加到空闲列表中以供重新使用当您要更改声音时,请将新波形写入空闲缓冲区并将其添加到链中。您选择缓冲区大小来平衡延迟和所需的更新速率 - 较小的缓冲区允许更快地响应更改,但需要更频繁地生成。

This page表明半秒更新率是可行的。您是否可以走得更快取决于计算的复杂程度以及操作系统的开销。