从 iOS 5 开始,我们在 OpenAL 中支持混响效果,但我找不到任何使用此功能的好例子。我只找到了一些指向 ObjectAL 源代码的链接,但是理解混响效果的使用太复杂了。那么,如何使用 OpenAL 为 iOS 应用程序添加混响效果?
1 回答
ObjectAL 代码库已经变得相当复杂,但在 OpenAL 方面,它实际上只是大部分 C API 的一个大包装器。混响的主要 Objective-C API 入口点是:
如果你想自己实现它,你首先需要像我在 +[ALWrapper initialize] 中那样绑定扩展函数:https ://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ ObjectAL/OpenAL/ALWrapper.m#L1363
在核心,所有混响功能都是通过调用 alcASASetListener() 和 alcASASetSource() 来完成的。如果您在 ALWrapper 中搜索这些函数,您会发现它只是将调用包装在 Objective-C 中(加上一些错误处理),而 ALSource 和 ALLListener 正在包装它。在最低级别,它只是一堆这样的调用:
alcASASetSource(ALC_ASA_REVERB_SEND_LEVEL, sourceID, &value, sizeof(value));
因此代码将始终遵循以下两条路径之一:
- ALSource -> ALWrapper -> 对 alcASASetSource() 的原始 C 调用
- ALLListener -> ALWrapper -> 对 alcASASetListener() 的原始 C 调用
全局控件(通过监听器控制)是:
- 打开/关闭混响(全局)
- 全局混响电平(混响效果的响度)
- 房间类型(各种预设可用,例如 ALC_ASA_REVERB_ROOM_TYPE_Cathedral)
- 均衡器增益、带宽、频率(基本滤波,使用方式与使用物理均衡器相同 - 如果有的话,你可能不会使用这么多)
本地控制(通过源控制)是:
- 混响发送电平(多少混响影响此源)
- 混响遮挡(模拟听者和声音可以部分穿过的声源之间的物理对象,如门或薄墙)
- 混响障碍(模拟听者和不传导声音的声源之间的物理对象,这样您只能听到周围的声音,如混凝土柱子)
我还在这里写了一个小演示: https ://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectALDemo/Demos/ReverbDemo.m
据我所知,Apple 并没有发布太多文档,所以最好的办法是克隆 repo、构建演示并使用 API,直到您了解它们是如何协同工作的。然后将您使用 ObjectAL 所做的事情翻译成对 alcASASetListener() 和朋友的实际调用的问题,但这些应该是非常直接的翻译,因为它最终只是包装器代码。