diff options
| author | Dentomologist <dentomologist@gmail.com> | 2026-03-13 20:25:57 -0700 |
|---|---|---|
| committer | Dentomologist <dentomologist@gmail.com> | 2026-03-13 20:29:58 -0700 |
| commit | e8a78ed95f9f1a001bbdbb3a04a0761f251a7a29 (patch) | |
| tree | 67f66f0ff1d6b2458c28e3fd2232546641cbcea2 /Source/Core/AudioCommon/WASAPIStream.cpp | |
| parent | 7a45ede688d28debef23030d5e8449a800770539 (diff) | |
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.
Diffstat (limited to 'Source/Core/AudioCommon/WASAPIStream.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/WASAPIStream.cpp | 14 |
1 files 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<s16*>(data); GetMixer()->Mix(audio_data, m_frames_in_buffer); |
