Skip to content

Commit 21134e1

Browse files
committed
Merge pull request #97032 from lalitshankarchowdhury/fix-audio-crash
Fix `AudioStreamMicrophone` crash on scene-reload
2 parents 2a8d30a + 0e23c5f commit 21134e1

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

drivers/wasapi/audio_driver_wasapi.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939

4040
#include <functiondiscoverykeys.h>
4141

42+
#include <wrl/client.h>
43+
using Microsoft::WRL::ComPtr;
44+
4245
// Define IAudioClient3 if not already defined by MinGW headers
4346
#if defined __MINGW32__ || defined __MINGW64__
4447

@@ -107,6 +110,12 @@ const IID IID_IAudioClient3 = __uuidof(IAudioClient3);
107110
const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient);
108111
const IID IID_IAudioCaptureClient = __uuidof(IAudioCaptureClient);
109112

113+
#define SAFE_RELEASE(memory) \
114+
if ((memory) != nullptr) { \
115+
(memory)->Release(); \
116+
(memory) = nullptr; \
117+
}
118+
110119
#define REFTIMES_PER_SEC 10000000
111120
#define REFTIMES_PER_MILLISEC 10000
112121

@@ -302,7 +311,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i
302311
audioProps.bIsOffload = FALSE;
303312
audioProps.eCategory = AudioCategory_GameEffects;
304313

305-
hr = ((IAudioClient3 *)p_device->audio_client.Get())->SetClientProperties(&audioProps);
314+
hr = ((IAudioClient3 *)p_device->audio_client)->SetClientProperties(&audioProps);
306315
ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_CANT_OPEN, "WASAPI: SetClientProperties failed with error 0x" + String::num_uint64(hr, 16) + ".");
307316
}
308317

@@ -385,7 +394,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i
385394
}
386395

387396
} else {
388-
IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client.Get();
397+
IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client;
389398

390399
// AUDCLNT_STREAMFLAGS_RATEADJUST is an invalid flag with IAudioClient3, therefore we have to use
391400
// the closest supported mix rate supported by the audio driver.
@@ -516,9 +525,9 @@ Error AudioDriverWASAPI::audio_device_finish(AudioDeviceWASAPI *p_device) {
516525
p_device->active.clear();
517526
}
518527

519-
p_device->audio_client.Reset();
520-
p_device->render_client.Reset();
521-
p_device->capture_client.Reset();
528+
SAFE_RELEASE(p_device->audio_client)
529+
SAFE_RELEASE(p_device->render_client)
530+
SAFE_RELEASE(p_device->capture_client)
522531

523532
return OK;
524533
}

drivers/wasapi/audio_driver_wasapi.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,15 @@
4040

4141
#include <audioclient.h>
4242
#include <mmdeviceapi.h>
43-
#include <wrl/client.h>
4443
#define WIN32_LEAN_AND_MEAN
4544
#include <windows.h>
4645

47-
using Microsoft::WRL::ComPtr;
48-
4946
class AudioDriverWASAPI : public AudioDriver {
5047
class AudioDeviceWASAPI {
5148
public:
52-
ComPtr<IAudioClient> audio_client = nullptr;
53-
ComPtr<IAudioRenderClient> render_client = nullptr; // Output
54-
ComPtr<IAudioCaptureClient> capture_client = nullptr; // Input
49+
IAudioClient *audio_client = nullptr;
50+
IAudioRenderClient *render_client = nullptr; // Output
51+
IAudioCaptureClient *capture_client = nullptr; // Input
5552
SafeFlag active;
5653

5754
WORD format_tag = 0;

0 commit comments

Comments
 (0)