如何:初始化 XAudio2

通过创建 XAudio2 引擎的实例,然后创建主语音,可以初始化 XAudio2 以进行音频播放。

  1. 首先,需要初始化 COM。 如果使用的是 C++/WinRT,那么它就已经解决了。 如果你不确定环境是否已经初始化了 COM,那么只要检查返回值,就可以调用 CoInitializeEx

    HRESULT hr = ::CoInitializeEx(nullptr, COINIT_MULTITHREADED);
    if (FAILED(hr)) return hr;
    
  2. 若要创建 XAudio2 引擎的实例,请调用 XAudio2Create 函数。 这将为你提供一个指向 IXAudio2 接口的指针,最好将其存储在类数据成员中。 在此代码片段中,我们使用 C++/WinRT 智能指针;但如有必要,也可以使用原始指针。

    winrt::com_ptr<IXAudio2> m_xAudio2{};
    ...
    winrt::check_hresult(::XAudio2Create(m_xAudio2.put(), 0, XAUDIO2_DEFAULT_PROCESSOR));
    
  3. 接下来,若要创建称为主语音的内容,请调用 IXAudio2::CreateMasteringVoice 方法。 这将为你提供指向 IXAudio2MasteringVoice 接口的指针。 主语音封装音频设备。 它是通过音频图的所有音频的最终目的地。

    IXAudio2MasteringVoice* m_pXAudio2MasteringVoice{};
    ...
    winrt::check_hresult(xAudio2->CreateMasteringVoice(&m_pXAudio2MasteringVoice));
    

智能指针

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