操作说明:使用 XAudio2 播放声音

本主题介绍在 XAudio2 中播放以前加载的音频数据所需的最低步骤。

初始化 XAudio2(请参阅操作说明:初始化 XAudio2)并加载音频数据(请参阅操作说明操作说明:在 XAudio2 中加载音频数据文件)后,可以通过创建源语音并将音频数据传递给它来播放声音。

播放声音

  1. 首先,按照操作说明:初始化 XAudio2 中所述的步骤,初始化 XAudio2 以进行音频播放。

  2. 然后,按照操作说明:在 XAudio2 中加载音频数据文件中所述的步骤填充 WAVEFORMATEX 结构和 XAUDIO2_BUFFER 结构。

    注意

    根据音频数据的格式,可能需要使用更大的数据结构(包含 WAVEFORMATEX 结构)来代替 WAVEFORMATEX。 有关详细信息,请参阅 WAVEFORMATEX 主题。

  3. 接下来,若要创建称为源语音的内容,请调用 IXAudio2::CreateSourceVoice 方法。 这将为你提供指向 IXAudio2SourceVoice 接口的指针。 语音的格式由在 WAVEFORMATEX 结构中设置的值指定。

    IXAudio2SourceVoice* m_pXAudio2SourceVoice{};
    ...
    winrt::check_hresult(m_xAudio2->CreateSourceVoice(&m_pXAudio2SourceVoice, (WAVEFORMATEX*)&wfx)));    
    
  4. 通过调用 IXAudio2SourceVoice::SubmitSourceBuffer 方法,将 XAUDIO2_BUFFER 提交到源语音。

    winrt::check_hresult(m_pXAudio2SourceVoice->SubmitSourceBuffer(&xAudio2Buffer));
    

    注意

    SubmitSourceBufferpBuffer 参数指向的音频示例数据仍由应用拥有,并且它必须保持分配和可访问状态,直到声音停止播放。

  5. 若要启动源语音,请调用 IXAudio2SourceVoice::Start 方法。 由于默认情况下所有 XAudio2 声音都将其输出发送到主语音,因此源语音的音频会自动传输到初始化时创建/选择的音频设备。 在更复杂的音频图中,源语音需要指定其输出应发送给哪个语音。

    winrt::check_hresult(m_pXAudio2SourceVoice->Start(0));
    

智能指针

为了安全和方便起见,可以将智能指针用于 IXAudio2 接口。 但是语音接口(如 IXAudio2MasteringVoice)没有 Release 方法;因此,如果尝试为这些接口使用智能指针,则会出现生成错误。 在这些代码片段中,我们尽可能使用智能指针,并在必要时使用原始指针。