在iOS中使用OpenAL进行混响

时间:2012-10-08 13:28:01

标签: ios openal

从iOS 5开始,我们在OpenAL中支持混响效果,但是我找不到使用此功能的任何好例子。我发现只有一些指向ObjectAL源代码的链接,但它太复杂,无法理解混响效果的用法。 那么,如何使用OpenAL为iOS应用添加混响效果?

1 个答案:

答案 0 :(得分:1)

ObjectAL代码库变得相当复杂,但在OpenAL方面,它实际上只是围绕C API的一个大包装器。混响的主要Objective-C API入口点是:

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALListener.m#L194

https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALSource.m#L808

如果你想自己实现它,你首先需要像我在[ALWrapper initialize]中那样绑定扩展函数:https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/OpenAL/ALWrapper.m#L1363

核心是,所有混响功能都是使用alcASASetListener()和alcASASetSource()调用完成的。如果你在ALWrapper中搜索这些函数,你会发现它只是将调用包装在Objective-C中(加上一些错误处理),以及ALSource& ALListener正在包装它。在最低级别,它只是一堆这样的电话:

alcASASetSource(ALC_ASA_REVERB_SEND_LEVEL, sourceID, &value, sizeof(value));

因此代码将始终遵循以下两条路径之一:

  • ALSource - > ALWrapper - >原始C调用alcASASetSource()
  • ALListener - > ALWrapper - >原始C调用alcASASetListener()

全局控件(通过侦听器控制)是:

  • 打开/关闭混响(全局)
  • 全球混响等级(混响效果有多大)
  • 房间类型(可提供各种预设,例如ALC_ASA_REVERB_ROOM_TYPE_Cathedral)
  • EQ增益,带宽,频率(基本过滤,使用与使用物理均衡器相同的方式 - 如果有的话,你可能不会使用这么多)

本地控制(通过源控制)是:

  • 混响发送电平(混响对此信号源有多大影响)
  • 混响遮挡(模拟声音可以部分穿过的听众和声源之间的物理对象,如门或薄壁)
  • 混响障碍物(模拟听者和声源之间不会传导声音的物体,这样你只能听到周围的声音,如混凝土柱子)

我还在这里写了一个小演示: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectALDemo/Demos/ReverbDemo.m

就我所知,Apple并没有提供太多文档,所以你最好的选择是克隆回购,构建演示,并使用API​​,直到你了解它是如何工作的一起。那么将你使用ObjectAL所做的事情转化为对alcASASetListener()和朋友的实际调用是一个问题,但这些应该是非常直接的翻译,因为它最终只是包装代码。