From e8a78ed95f9f1a001bbdbb3a04a0761f251a7a29 Mon Sep 17 00:00:00 2001 From: Dentomologist Date: Fri, 13 Mar 2026 20:25:57 -0700 Subject: [PATCH] WASAPIStream: Fix crash when GetBuffer call fails Check the return value of calls to `GetBuffer` and stop the `WASAPI handler` sound thread if they fail. This prevents a crash due to a null pointer dereference if `GetBuffer` is unable to retrieve a buffer, which could be triggered during emulation by disabling the selected WASAPI output device in the Windows Sound settings. --- Source/Core/AudioCommon/WASAPIStream.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Source/Core/AudioCommon/WASAPIStream.cpp b/Source/Core/AudioCommon/WASAPIStream.cpp index 0eabb910cd..afd5531ae8 100644 --- a/Source/Core/AudioCommon/WASAPIStream.cpp +++ b/Source/Core/AudioCommon/WASAPIStream.cpp @@ -320,14 +320,24 @@ void WASAPIStream::SoundLoop() Common::SetCurrentThreadName("WASAPI Handler"); BYTE* data; - m_audio_renderer->GetBuffer(m_frames_in_buffer, &data); + HRESULT getbuffer_result = m_audio_renderer->GetBuffer(m_frames_in_buffer, &data); + if (getbuffer_result != S_OK) + { + m_running.store(false, std::memory_order_relaxed); + return; + } m_audio_renderer->ReleaseBuffer(m_frames_in_buffer, AUDCLNT_BUFFERFLAGS_SILENT); while (m_running.load(std::memory_order_relaxed)) { WaitForSingleObject(m_need_data_event.get(), 1000); - m_audio_renderer->GetBuffer(m_frames_in_buffer, &data); + getbuffer_result = m_audio_renderer->GetBuffer(m_frames_in_buffer, &data); + if (getbuffer_result != S_OK) + { + m_running.store(false, std::memory_order_relaxed); + return; + } s16* audio_data = reinterpret_cast(data); GetMixer()->Mix(audio_data, m_frames_in_buffer);