|
39 | 39 |
|
40 | 40 | #include <functiondiscoverykeys.h> |
41 | 41 |
|
| 42 | +#include <wrl/client.h> |
| 43 | +using Microsoft::WRL::ComPtr; |
| 44 | + |
42 | 45 | // Define IAudioClient3 if not already defined by MinGW headers |
43 | 46 | #if defined __MINGW32__ || defined __MINGW64__ |
44 | 47 |
|
@@ -107,6 +110,12 @@ const IID IID_IAudioClient3 = __uuidof(IAudioClient3); |
107 | 110 | const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient); |
108 | 111 | const IID IID_IAudioCaptureClient = __uuidof(IAudioCaptureClient); |
109 | 112 |
|
| 113 | +#define SAFE_RELEASE(memory) \ |
| 114 | + if ((memory) != nullptr) { \ |
| 115 | + (memory)->Release(); \ |
| 116 | + (memory) = nullptr; \ |
| 117 | + } |
| 118 | + |
110 | 119 | #define REFTIMES_PER_SEC 10000000 |
111 | 120 | #define REFTIMES_PER_MILLISEC 10000 |
112 | 121 |
|
@@ -302,7 +311,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i |
302 | 311 | audioProps.bIsOffload = FALSE; |
303 | 312 | audioProps.eCategory = AudioCategory_GameEffects; |
304 | 313 |
|
305 | | - hr = ((IAudioClient3 *)p_device->audio_client.Get())->SetClientProperties(&audioProps); |
| 314 | + hr = ((IAudioClient3 *)p_device->audio_client)->SetClientProperties(&audioProps); |
306 | 315 | ERR_FAIL_COND_V_MSG(hr != S_OK, ERR_CANT_OPEN, "WASAPI: SetClientProperties failed with error 0x" + String::num_uint64(hr, 16) + "."); |
307 | 316 | } |
308 | 317 |
|
@@ -385,7 +394,7 @@ Error AudioDriverWASAPI::audio_device_init(AudioDeviceWASAPI *p_device, bool p_i |
385 | 394 | } |
386 | 395 |
|
387 | 396 | } else { |
388 | | - IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client.Get(); |
| 397 | + IAudioClient3 *device_audio_client_3 = (IAudioClient3 *)p_device->audio_client; |
389 | 398 |
|
390 | 399 | // AUDCLNT_STREAMFLAGS_RATEADJUST is an invalid flag with IAudioClient3, therefore we have to use |
391 | 400 | // the closest supported mix rate supported by the audio driver. |
@@ -516,9 +525,9 @@ Error AudioDriverWASAPI::audio_device_finish(AudioDeviceWASAPI *p_device) { |
516 | 525 | p_device->active.clear(); |
517 | 526 | } |
518 | 527 |
|
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) |
522 | 531 |
|
523 | 532 | return OK; |
524 | 533 | } |
|
0 commit comments