|
@@ -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()
|