|
@@ -127,60 +127,60 @@ static StreamingVoiceContext* _voice_con
|
|
|
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;
|
|
|
|
|
@@ -213,35 +213,35 @@ const char *SoundDriver_XAudio2::Start(c
|
|
|
{
|
|
|
_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;
|