XAudio2 加载并播放 .wav 文件。
以下各节介绍如何在 XBOX One 开发工具包上使用 XAudio2 加载并播放声音。
要获取可运行的 XAudio2 示例,请从 Microsoft Game Development Kit (GDK) 示例中下载 SimplePlaySound 示例。
重要的 XAudio2 数据类型
XAudio2 提供了多种数据类型,用于帮助你在 XBOX Series X|S 上播放音效。若要播放 .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()。
