音频子系统实现音频输出流。初始化后,支持以下操作:
- 使用SoundSource组件播放原始音频、Ogg Vorbis或WAV声音资源。这允许手动立体声平移单声道声音;立体声将以其原始立体声混合输出。
- 使用SoundSource3D组件以伪3D播放上述声音格式。它具有立体声定位和距离衰减功能,但(至少)不会根据方向过滤声音。
声源组件需要创建到节点中,才能被视为“启用”并能够播放,但该节点不需要属于场景(例如,对于无位置UI/HDD声音,这在3D场景中可能会不必要地混乱,您可以在应用程序代码中实例化一个节点,类似于场景外部存在的相机)
要听到伪3D位置声音,SoundListener组件必须同样存在于节点中,并通过调用SetListener()分配给音频子系统。节点的位置和旋转定义了收听点。如果声音侦听器的节点属于某个场景,它只会听到该特定场景内的声音,但如果它是在场景外创建的,它将听到任何声音。
输出是软件混合的,可以同时发出无限量的声音。Ogg Vorbis声音是动态解码的,解码它们可能会占用大量内存和CPU,因此当需要播放大量短音效时,建议使用WAV文件。
出于音量控制的目的,每个SoundSource可以被分类为用户定义的组,该组乘以主类别和使用SetGain()设置的单个SoundSource增益作为最终音量级别。
声音参数
标准WAV文件无法判断是否应该循环,原始音频不包含任何标题信息。声音资源的参数可以通过与声音同名但扩展名为.XML的XML文件指定。可能的元素和属性描述如下:
<sound>
<format frequency="x" sixteenbit="true|false" stereo="true|false" />
<loop enable="true|false" start="x" end="x" />
</sound>
频率以Hz为单位,循环开始和结束是从音频数据开始的字节。如果在没有指定开始和结束的情况下启用循环,则假定它是整个声音。Ogg Vorbis压缩声音不支持指定循环范围,仅支持启用或禁用整个声音循环。
声音流
除了播放现有的声音资源外,还可以在运行时使用SoundStream类及其子类生成声音。要在SoundSource上开始播放流,请调用Play(SoundStream*流)。
声音流在内部用于实现动态Ogg Vorbis解码。它只在C++代码中可用,而由于其低级性质,它不能编写脚本。有关使用BufferedSoundStream子类的示例,请参阅SoundSynthesis C++示例,该子类允许声音数据排队以从主线程播放。
音频事件
声音播放结束后,声源将通过其场景节点发送E_SOUNDFINISHED事件。例如,这可以用于知道何时删除仅为播放声音效果或将游戏事件与声音播放关联而创建的临时节点。