How to: Play a Sound with XAudio2
This topic describes the minimum steps required to play previously-loaded audio data in XAudio2. After you initialize XAudio2 (see How to: Initialize XAudio2) and load the audio data (see How to: How to: Load Audio Data Files in XAudio2), you can play a sound by creating a source voice and passing audio data to it.
To play a sound
Initialize the XAudio2 engine by following the steps described in How to: Initialize XAudio2.
Populate a WAVEFORMATEX and XAUDIO2_BUFFER structure by following the steps described in How to: Load Audio Data Files in XAudio2.
Note
Depending on the format of the audio data, you may need to use a larger data structure containing a WAVEFORMATEX structure in place of a WAVEFORMATEX. See the WAVEFORMATEX reference page for more information.
Create a source voice by calling the IXAudio2::CreateSourceVoice method on an instance of the XAudio2 engine. The format of the voice is specified by the values set in a WAVEFORMATEX structure.
IXAudio2SourceVoice* pSourceVoice; if( FAILED(hr = pXAudio2->CreateSourceVoice( &pSourceVoice, (WAVEFORMATEX*)&wfx ) ) ) return hr;
Submit an XAUDIO2_BUFFER to the source voice using the function SubmitSourceBuffer.
if( FAILED(hr = pSourceVoice->SubmitSourceBuffer( &buffer ) ) ) return hr;
Note
The audio sample data to which buffer points is still 'owned' by the app and must remain allocated and accessible until the sound stops playing.
Use the Start function to start the source voice. Since all XAudio2 voices send their output to the mastering voice by default, audio from the source voice automatically makes its way to the audio device selected at initialization. In a more complicated audio graph, the source voice would have to specify the voice to which its output should be sent.
if ( FAILED(hr = pSourceVoice->Start( 0 ) ) ) return hr;
Notes for Windows Store apps
We recommend that you make use of a smart pointer to manage the lifetime of XAUDIO2 objects in an exception safe manner. For Windows Store apps, you can use the ComPtr smart pointer template from the Windows Runtime C++ Template Library (WRL).
Microsoft::WRL::ComPtr<IXAudio2SourceVoice> SourceVoice;
HRESULT hr;
if( FAILED(hr = pXAudio2->CreateSourceVoice( &SourceVoice, (WAVEFORMATEX*)&wfx ) ) )
throw Platform::Exception::CreateException(hr);
if( FAILED(hr = SourceVoice->SubmitSourceBuffer( &buffer ) ) )
throw Platform::Exception::CreateException(hr);
if ( FAILED(hr = SourceVoice->Start( 0 ) ) )
throw Platform::Exception::CreateException(hr);
Note
Ensure that all smart pointers to XAUDIO2 objects are fully released before you release the IXAudio2 object.
Related topics
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for