操作说明:使用 XAudio2 播放声音
本主题介绍在 XAudio2 中播放以前加载的音频数据所需的最低步骤。
初始化 XAudio2(请参阅操作说明:初始化 XAudio2)并加载音频数据(请参阅操作说明操作说明:在 XAudio2 中加载音频数据文件)后,可以通过创建源语音并将音频数据传递给它来播放声音。
播放声音
首先,按照操作说明:初始化 XAudio2 中所述的步骤,初始化 XAudio2 以进行音频播放。
然后,按照操作说明:在 XAudio2 中加载音频数据文件中所述的步骤填充 WAVEFORMATEX 结构和 XAUDIO2_BUFFER 结构。
注意
根据音频数据的格式,可能需要使用更大的数据结构(包含 WAVEFORMATEX 结构)来代替 WAVEFORMATEX。 有关详细信息,请参阅 WAVEFORMATEX 主题。
接下来,若要创建称为源语音的内容,请调用 IXAudio2::CreateSourceVoice 方法。 这将为你提供指向 IXAudio2SourceVoice 接口的指针。 语音的格式由在 WAVEFORMATEX 结构中设置的值指定。
IXAudio2SourceVoice* m_pXAudio2SourceVoice{}; ... winrt::check_hresult(m_xAudio2->CreateSourceVoice(&m_pXAudio2SourceVoice, (WAVEFORMATEX*)&wfx)));
通过调用 IXAudio2SourceVoice::SubmitSourceBuffer 方法,将 XAUDIO2_BUFFER 提交到源语音。
winrt::check_hresult(m_pXAudio2SourceVoice->SubmitSourceBuffer(&xAudio2Buffer));
注意
SubmitSourceBuffer 的 pBuffer 参数指向的音频示例数据仍由应用拥有,并且它必须保持分配和可访问状态,直到声音停止播放。
若要启动源语音,请调用 IXAudio2SourceVoice::Start 方法。 由于默认情况下所有 XAudio2 声音都将其输出发送到主语音,因此源语音的音频会自动传输到初始化时创建/选择的音频设备。 在更复杂的音频图中,源语音需要指定其输出应发送给哪个语音。
winrt::check_hresult(m_pXAudio2SourceVoice->Start(0));
智能指针
为了安全和方便起见,可以将智能指针用于 IXAudio2 接口。 但是语音接口(如 IXAudio2MasteringVoice)没有 Release 方法;因此,如果尝试为这些接口使用智能指针,则会出现生成错误。 在这些代码片段中,我们尽可能使用智能指针,并在必要时使用原始指针。