概述
X3DAudio是与XAuido2和XACT在3D空间中协作的API. 你可以用它创建出一个声音从一个点飞到摄像机处的效果. 音频不需要有3D位置, 这些都是通过X3DAudio来完成的
收听者和发射器
整合X3DAudio和XACT
XACT可以利用X3DAudio来支持3D声音输出. 下面我们来看一下怎么用X3DAudio和相关的XACT辅助函数来加入3D的声音.
简介
X3DAudio库是一个3D声音几何库, 它提供了收听者和发射器的声音位置的计算功能. XACT使用X3DAudio把3D位置信息应用到Cue和它们的相关的播放, 这样用户才能在单体声或5.1声道下听到真实的定位效果.
XACT同样也使用3D信息来设置cue的变量值, 因此声音设计师可以创建基于声音位置的效果, 例如基于距离的音量衰减等.
X3DAudio是一个严格的3D数学库, 并不包含信号处理功能. 为了把声音位置信息方便地整合X3DAudio库到XACT的cue, XACT提供了两个辅助函数:
XACT3DCalculate, 计算收听者和发射器之间的位置信息
XACT3DApply, 应用上面计算的结果到一个cue, 这样播放起来才有位置效果
要使用X3DAudio把3D声音应用到XACT的cue, 按下面的步骤来做:\
初始化X3DAudio结构
要计算3D位置信息, 必须提供给X3DAudio相关的初始化数据: 声音发射器的声道数和声音收听者的声道数. 这两个值保存在X3DAUDIO_DSP_SETTINGS结构体中的SrcChannelCount和DstChannelCount中, 它们决定了计算结果的输出格式(立体声还是5.1声道).
在数量设置后必须分配一个矩阵系数. 矩阵要足够大以保存从源声道到目标声道的映射信息. 这个矩阵是一个一维的, 并且必须包含SrcChannelCount x DstChannelCount数量的元素. 你必须手动的调用XACT3DCalculate来填充矩阵的值.
下面的代码配置了一个从单声道或立体声来源映射到立体声或5.1声道的X3DAUDIO_DSP_SETTINGS结构体:
注意这些代码只处理1或2声道的来源. 更复杂的情况就是, 源音频可能是5.1格式, 所以源声道数为6, 增加了矩阵的大小.
设置发射器/收听者
X3DAudio的功能是计算收听者跟发射器间的位置信息. X3DAudio的XACT实现在每次调用XACT3DCalculate时使用了一个发射器和收听者.
首先你要提供填充发射器和接收者的位置信息, 下面的代码设置了一个简单的发射器和接收者:
注意一些发射器的一些字段设为NULL来使用默认值, 还有一些由XACT3DCalculation来提供.
上面用到的X3DAUDIO_CONE结构体是可选的, 在一个单声道的发射器上, 设置pCone的值为NULL的话表示它是一个全方向的发射器.
调用XACT3DCalculate和XACT3DApply
最后的步骤就是调用XACT3DCalculation来计算最终的声道映射, 然后调用XACT3DApply把这个映射应用到cue, 还有复制3D信息(如距离)到cue的固有变量中.
下面的代码假设XACT已经初始化, 并且cue存在:
固有变量设置
当XACT3DApply调用成功后, XACT会更新目标cue的一些固有变量:
变量 |
意义 |
Distance | 发射器和收听者之间的距离. 相当于XACT3DCalculate返回的X3DAUDIO_DSP_SETTINGS.EmitterToListenerDistance . |
OrientationAngle | 从发射器到收听者的内角, 表示了发射器在前方多少度. 相当XACT3DCalculate返回的X3DAUDIO_DSP_SETTINGS.EmitterToListenerAngle, 转换成角度. |
DopplerPitchScalar | 发射器和收听者之间的多普勒变换因数. 相当XACT3DCalculate返回的X3DAUDIO_DSP_SETTINGS.DopplerFactor . |