# HG changeset patch # User Michael Lutz # Date 2021-09-11 13:09:12 # Node ID 4738613420a3cf55da1138a8a2ad3f430168248a # Parent 50ad36e37113f5eee150a4662c1ee53f9458002f Fix #9463: [Win32] Try to work around XAudio2 crashes by catching SEH exceptions. If an exceptions is thrown during context creation, just declare the XAudio driver as unusable. The driver logic will try to find an alternative for us. diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp --- a/src/sound/xaudio2_s.cpp +++ b/src/sound/xaudio2_s.cpp @@ -117,6 +117,20 @@ static IXAudio2MasteringVoice* _masterin static ComPtr _xaudio2; static StreamingVoiceContext* _voice_context = nullptr; +/** Create XAudio2 context with SEH exception checking. */ +static HRESULT CreateXAudio(API_XAudio2Create xAudio2Create) +{ + HRESULT hr; + __try { + UINT32 flags = 0; + hr = xAudio2Create(_xaudio2.GetAddressOf(), flags, XAUDIO2_DEFAULT_PROCESSOR); + } __except (EXCEPTION_EXECUTE_HANDLER) { + hr = GetExceptionCode(); + } + + return hr; +} + /** * Initialises the XAudio2 driver. * @@ -156,8 +170,7 @@ const char *SoundDriver_XAudio2::Start(c } // Create the XAudio engine - UINT32 flags = 0; - hr = xAudio2Create(_xaudio2.GetAddressOf(), flags, XAUDIO2_DEFAULT_PROCESSOR); + hr = CreateXAudio(xAudio2Create); if (FAILED(hr)) {