XAudio2 加载并播放 .wav 文件。
以下各节介绍如何在 XBOX One 开发工具包上使用 XAudio2 加载并播放声音。
要获取可运行的 XAudio2 示例,请从 Microsoft Game Development Kit (GDK) 示例中下载 SimplePlaySound 示例。
重要的 XAudio2 数据类型
XAudio2 提供了多种数据类型,用于帮助你在 XBOX One 上播放音效。若要播放 .wav 文件,至少需要以下数据类型。
-
IXAudio2:这是XAudio2对象的接口,负责管理音频引擎的所有状态、音频处理线程、声音图等。 -
IXAudio2SourceVoice:使用源语音向XAudio2处理管线提交音频数据。要被听到,语音数据必须被送入母带语音。 -
IXAudio2MasteringVoice:使用该数据类型代表音频输出设备。数据缓冲区不能直接提交给母带语音。但发送给其他类型语音的数据要被听到,必须被引导到母带语音。
-
PlaySoundVoiceContext:用于在处理后释放音频缓冲区。 -
IXAudio2VoiceCallback:包含一些方法,用于在某个IXAudio2SourceVoice中发生特定事件时通知客户端。
初始化 XAudio2
CoInitializeEx() 初始化组件对象模型 (COM) 供当前线程使用。将第一个参数设为 NULL;第二个参数设为 COINIT_MULTITHREADED。
XAudio2Create() 创建一个新的 XAudio2 对象,并返回指向其 IXAudio2 接口的指针。请确保 XAUDIO2_PROCESSOR 被设置为有效值。建议使用 XAUDIO2_USE_DEFAULT_PROCESSOR,让操作系统根据硬件平台选择理想的处理器。
IXAudio2::CreateMasteringVoice() 会创建并配置一个母带语音,并通过用户提供的指针指向它。
C++
加载 .wav 文件
要访问音频文件,请使用WaveFile 类的一个实例。
- 要打开 .wav 文件并读取其头部中的一些信息,请调用
WaveFile::Open(LPCWSTR strFileName)。 - 要确定 .wav 文件的格式,请调用
WaveFile::GetFormat()。 - 要确定 .wav 文件中的字节数和采样数,请调用
WaveFile::GetDuration()。 - 要将采样数据读入内存,请调用
WaveFile::ReadSample()。
C++
设置 .wav 文件的路径
若要加载并使用音频文件,请使用以下代码在本地设备上查找项目的安装位置,并将其存储到字符串中。然后将音频文件的相对位置追加到安装位置字符串末尾。C++
播放 .wav 文件
创建一个IXAudio2::CreateSourceVoice() 类,并用它向 XAudio2 处理管线提交音频数据。语音数据要被听到,必须直接或通过中间的子混音语音送入母带语音。要保存音频文件的详细信息,请创建一个 XAUDIO2_BUFFER。
在创建并初始化好 XAudio2 缓冲区和源语音之后,调用 IXAudio2SourceVoice::SubmitSourceBuffer() 将音频缓冲区加入语音输入队列。请注意,XAUDIO2_BUFFER::pAudioData 指向的音频数据必须一直保持有效,直到 XAudio2 播放完缓冲区中的内容。
在语音输入队列被填充后,调用 IXAudio2SourceVoice::Start() 播放队列中的下一个声音。
C++
结束 .wav 文件的播放
要判断某个 .wav 文件是否已播放完毕,需要获取源语音的当前状态。创建一个XAUDIO2_VOICE_STATE 结构,然后调用 IXAudio2SourceVoice::GetState()。如果音频已播放完毕,则调用 IXAudio2SourceVoice::DestroyVoice()。
