OpenAL缓冲区实时更新

时间:2011-09-29 15:14:09

标签: buffer real-time openal

我在iOS上工作并运行一个简单的OpenAL项目。

我见过的大多数openAL项目的不同之处在于我没有加载到声音文件中。相反,我将一组原始数据加载到alBufferData中。使用几个方程式,我可以加载数据以产生白噪声,正弦和脉冲波。一切都运作良好。

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

有没有办法在不必创建新缓冲区的情况下修改这些数据(我尝试使用新数据创建一个新缓冲区,然后使用它,但它远远不够快)。

非常感谢任何其他方法的帮助或建议。

由于

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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%安全,您需要使用音频单元。