【问题标题】:OpenAL buffer update in real-timeOpenAL 缓冲区实时更新
【发布时间】:2011-09-29 15:14:09
【问题描述】:

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

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

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

有没有一种方法可以修改这些数据而不必创建新缓冲区(我尝试了用新数据创建新缓冲区然后使用它的方法,但速度还不够快)。

我们将不胜感激任何其他方式的帮助或建议。

谢谢

【问题讨论】:

    标签: buffer real-time openal


    【解决方案1】:

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

    This page 建议半秒的更新速率是可行的。能否走得更快取决于计算的复杂性以及操作系统的开销。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多