Практическое руководство. Инициализация XAudio2
Вы инициализируете XAudio2 для воспроизведения звука, создав экземпляр подсистемы XAudio2, а затем создайте образец голоса.
Сначала необходимо инициализировать COM. Если вы используете C++/WinRT, это необходимо. Если вы не уверены, что среда уже инициализирована COM, можно вызвать CoInitializeEx до тех пор, пока вы проверяете возвращаемое значение.
HRESULT hr = ::CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hr)) return hr;
Чтобы создать экземпляр ядра XAudio2, вызовите функцию XAudio2Create . Это даст вам указатель на интерфейс IXAudio2 , и рекомендуется сохранить его в члене данных класса. В этом фрагменте мы используем смарт-указатель C++/WinRT, но при необходимости можно использовать необработанный указатель.
winrt::com_ptr<IXAudio2> m_xAudio2{}; ... winrt::check_hresult(::XAudio2Create(m_xAudio2.put(), 0, XAUDIO2_DEFAULT_PROCESSOR));
Затем, чтобы создать главный голос, вызовите метод IXAudio2::CreateMasteringVoice . Это даст вам указатель на интерфейс IXAudio2MasteringVoice. Образец голоса инкапсулирует звуковое устройство. Это конечное назначение для всего звука, который проходит через аудиограф.
IXAudio2MasteringVoice* m_pXAudio2MasteringVoice{}; ... winrt::check_hresult(xAudio2->CreateMasteringVoice(&m_pXAudio2MasteringVoice));
Смарт-указатели
Для безопасности и удобства можно использовать смарт-указатель для интерфейса IXAudio2 . Но у голосовых интерфейсов (таких как IXAudio2MasteringVoice) нет метода release , поэтому при попытке использовать смарт-указатель для них появится ошибка сборки. В этих фрагментах кода мы используем умный указатель, где это возможно, и необработанный указатель, где это необходимо.