File diff r25654:e264fd698eb2 → r25655:1030dcb7eb52
src/sound/xaudio2_s.cpp
Show inline comments
 
@@ -121,72 +121,72 @@ static StreamingVoiceContext* _voice_con
 
* Initialises the XAudio2 driver.
 
*
 
* @param parm Driver parameters.
 
* @return An error message if unsuccessful, or nullptr otherwise.
 
*
 
*/
 
const char *SoundDriver_XAudio2::Start(const StringList &parm)
 
{
 
	HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
 

	
 
	if (FAILED(hr))
 
	{
 
		DEBUG(driver, 0, "xaudio2_s: CoInitializeEx failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: CoInitializeEx failed ({:08x})", (uint)hr);
 
		return "Failed to initialise COM";
 
	}
 

	
 
	_xaudio_dll_handle = LoadLibraryA(XAUDIO2_DLL_A);
 

	
 
	if (_xaudio_dll_handle == nullptr)
 
	{
 
		CoUninitialize();
 

	
 
		DEBUG(driver, 0, "xaudio2_s: Unable to load " XAUDIO2_DLL_A);
 
		Debug(driver, 0, "xaudio2_s: Unable to load " XAUDIO2_DLL_A);
 
		return "Failed to load XAudio2 DLL";
 
	}
 

	
 
	API_XAudio2Create xAudio2Create = (API_XAudio2Create) GetProcAddress(_xaudio_dll_handle, "XAudio2Create");
 

	
 
	if (xAudio2Create == nullptr)
 
	{
 
		FreeLibrary(_xaudio_dll_handle);
 
		CoUninitialize();
 

	
 
		DEBUG(driver, 0, "xaudio2_s: Unable to find XAudio2Create function in DLL");
 
		Debug(driver, 0, "xaudio2_s: Unable to find XAudio2Create function in DLL");
 
		return "Failed to load XAudio2 DLL";
 
	}
 

	
 
	// Create the XAudio engine
 
	UINT32 flags = 0;
 
	hr = xAudio2Create(_xaudio2.GetAddressOf(), flags, XAUDIO2_DEFAULT_PROCESSOR);
 

	
 
	if (FAILED(hr))
 
	{
 
		FreeLibrary(_xaudio_dll_handle);
 
		CoUninitialize();
 

	
 
		DEBUG(driver, 0, "xaudio2_s: XAudio2Create failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: XAudio2Create failed ({:08x})", (uint)hr);
 
		return "Failed to inititialise the XAudio2 engine";
 
	}
 

	
 
	// Create a mastering voice
 
	hr = _xaudio2->CreateMasteringVoice(&_mastering_voice);
 

	
 
	if (FAILED(hr))
 
	{
 
		_xaudio2.Reset();
 
		FreeLibrary(_xaudio_dll_handle);
 
		CoUninitialize();
 

	
 
		DEBUG(driver, 0, "xaudio2_s: CreateMasteringVoice failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: CreateMasteringVoice failed ({:08x})", (uint)hr);
 
		return "Failed to create a mastering voice";
 
	}
 

	
 
	// Create a source voice to stream our audio
 
	WAVEFORMATEX wfex;
 

	
 
	wfex.wFormatTag = WAVE_FORMAT_PCM;
 
	wfex.nChannels = 2;
 
	wfex.wBitsPerSample = 16;
 
	wfex.nSamplesPerSec = GetDriverParamInt(parm, "hz", 44100);
 
	wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / 8;
 
	wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign;
 
@@ -207,47 +207,47 @@ const char *SoundDriver_XAudio2::Start(c
 
		return "Failed to create streaming voice context";
 
	}
 

	
 
	hr = _xaudio2->CreateSourceVoice(&_source_voice, &wfex, 0, 1.0f, _voice_context);
 

	
 
	if (FAILED(hr))
 
	{
 
		_mastering_voice->DestroyVoice();
 
		_xaudio2.Reset();
 
		FreeLibrary(_xaudio_dll_handle);
 
		CoUninitialize();
 

	
 
		DEBUG(driver, 0, "xaudio2_s: CreateSourceVoice failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: CreateSourceVoice failed ({:08x})", (uint)hr);
 
		return "Failed to create a source voice";
 
	}
 

	
 
	_voice_context->SourceVoice = _source_voice;
 
	hr = _source_voice->Start(0, 0);
 

	
 
	if (FAILED(hr))
 
	{
 
		DEBUG(driver, 0, "xaudio2_s: _source_voice->Start failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: _source_voice->Start failed ({:08x})", (uint)hr);
 

	
 
		Stop();
 
		return "Failed to start the source voice";
 
	}
 

	
 
	MxInitialize(wfex.nSamplesPerSec);
 

	
 
	// Submit the first buffer
 
	hr = _voice_context->SubmitBuffer();
 

	
 
	if (FAILED(hr))
 
	{
 
		DEBUG(driver, 0, "xaudio2_s: _voice_context->SubmitBuffer failed (%08x)", (uint)hr);
 
		Debug(driver, 0, "xaudio2_s: _voice_context->SubmitBuffer failed ({:08x})", (uint)hr);
 

	
 
		Stop();
 
		return "Failed to submit the first audio buffer";
 
	}
 

	
 
	return nullptr;
 
}
 

	
 
/**
 
* Terminates the XAudio2 driver.
 
*/
 
void SoundDriver_XAudio2::Stop()