我正在使用 cocos2d 开发一个电影 iPad 应用程序,我想要比大多数高级音频 API 提供的更多控制。在 cocos2d 和 iOS SDK 中,我可以访问 CocosDension(实际上是三个功能略有不同的 API)和 CoreAudio(还包含多个不同级别和功能的 API)。我正在尝试找出哪些 API 将支持我需要的功能,我可以使用一些帮助。
- 我的应用需要 4 个音轨,每个音轨都有一个可由用户控制的单独播放音量:
- 背景音乐
- 环境声
- 旁白
- 声音特效
音乐和环境音轨需要从磁盘播放 1-4 分钟长的立体声循环。我需要能够预加载、开始/停止、循环、淡入/淡出以及调整这些曲目的播放音量。暂停对于这两个曲目并不重要,因为它们会在菜单启动时继续在后台播放。
旁白轨道需要一次播放一个单声道文件,长度为 30-60 秒,平移中心。效果音轨需要同时播放多个 1-5 秒的单声道文件混合成一个立体声声场。每个正在播放的剪辑都应该能够被预加载、开始/停止,并且可以调整其音高、增益和声像。这两个曲目的播放应该可以暂停/恢复。
如果我使用 CocosDension:: SimpleAudioEngine,我相信我可以做到我想要的一半。也就是说,如果我只有音乐和效果音轨,我可以单独调整它们的音量,并使用适当的方法播放背景音乐和效果,并提供我想要的所有选项。如果我只有 Ambient 和 Narration 音轨,情况也是如此,这让我想知道是否可以绕过 SimpleAudioEngine 的单例架构,这样我就可以有两个实例,即两对 BG/FX 音轨。
如果可以同时播放两个背景音轨,我可以牺牲单独调整音乐/环境音量并将旁白轨道合并到效果中的能力(在声音剪辑级别控制其音量)。我真的很想通过单独的音量旋钮让用户可以调节音乐和环境声音。有没有办法在 CocosDension 中实现这一点?
如果我使用 CoreAudio,Multichannel Mixer AudioUnit 似乎是完成我的音量控制目标的完美之选。然而,使用它似乎需要我设置大量的低级缓冲区和音频信号路径代码。除非我错了,否则为了支持我在 CocosDension 中免费获得的所有东西(32 个同时播放声像、音高和增益控制 + 背景音乐的效果),我需要构建一个音频处理图,例如:
[Custom Audio Rendering Code ] [Multichannel Mixer Unit]---->[Output Unit]
| musicRenderCallback()----|---->| bus 0: "Music" |
| ambientRenderCallback()--|---->| bus 1: "Ambient" |
| narrationRenderCallback()|---->| bus 2: "Narration" |
+~~~~~~~~~~~~~~~~~~~~~~~~~~+ | bus 3: "Effects" |<----+
| +---------------------+ |
| |
+~~~~~~~~~~~~~~~~~~~~~~~~~~+ [Multichannel Mixer Unit]----+
| effectsRenderCallback0()-|---->| bus 0: "Effects0" |
| effectsRenderCallback1()-|---->| bus 1: "Effects1" |
| ... | | ... |
| effectsRenderCallback31()|---->| bus 31: "Effects31" |
+~~~~~~~~~~~~~~~~~~~~~~~~~~+ +---------------------+
| audioQueueBuffers[35] |
+--------------------------+
从实现的角度来看,这似乎相当复杂。有没有更简单的方法,可能将 CocosDenshion 和 CoreAudio API 混合在一起?他们在同一个游泳池里玩得好吗?