windows: SDL_IMMDevice needed more deinit code from the Win32 path.

Fixes #5919
main
Ethan Lee 2022-07-15 09:46:53 -04:00
parent 37aecda2c1
commit fff34f6304
4 changed files with 32 additions and 31 deletions

View File

@ -45,15 +45,6 @@
#define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000
#endif #endif
/* This is a list of device id strings we have inflight, so we have consistent pointers to the same device. */
typedef struct DevIdList
{
WCHAR *str;
struct DevIdList *next;
} DevIdList;
static DevIdList *deviceid_list = NULL;
/* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */ /* Some GUIDs we need to know without linking to libraries that aren't available before Vista. */
static const IID SDL_IID_IAudioRenderClient = { 0xf294acfc, 0x3146, 0x4483,{ 0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2 } }; static const IID SDL_IID_IAudioRenderClient = { 0xf294acfc, 0x3146, 0x4483,{ 0xa7, 0xbf, 0xad, 0xdc, 0xa7, 0xc2, 0x60, 0xe2 } };
static const IID SDL_IID_IAudioCaptureClient = { 0xc8adbd64, 0xe71e, 0x48a0,{ 0xa4, 0xde, 0x18, 0x5c, 0x39, 0x5c, 0xd3, 0x17 } }; static const IID SDL_IID_IAudioCaptureClient = { 0xc8adbd64, 0xe71e, 0x48a0,{ 0xa4, 0xde, 0x18, 0x5c, 0x39, 0x5c, 0xd3, 0x17 } };
@ -602,17 +593,7 @@ WASAPI_ThreadDeinit(_THIS)
static void static void
WASAPI_Deinitialize(void) WASAPI_Deinitialize(void)
{ {
DevIdList *devidlist;
DevIdList *next;
WASAPI_PlatformDeinit(); WASAPI_PlatformDeinit();
for (devidlist = deviceid_list; devidlist; devidlist = next) {
next = devidlist->next;
SDL_free(devidlist->str);
SDL_free(devidlist);
}
deviceid_list = NULL;
} }
static SDL_bool static SDL_bool

View File

@ -68,8 +68,6 @@ WASAPI_PlatformInit(void)
void void
WASAPI_PlatformDeinit(void) WASAPI_PlatformDeinit(void)
{ {
SDL_IMMDevice_Quit();
if (libavrt) { if (libavrt) {
FreeLibrary(libavrt); FreeLibrary(libavrt);
libavrt = NULL; libavrt = NULL;
@ -78,7 +76,7 @@ WASAPI_PlatformDeinit(void)
pAvSetMmThreadCharacteristicsW = NULL; pAvSetMmThreadCharacteristicsW = NULL;
pAvRevertMmThreadCharacteristics = NULL; pAvRevertMmThreadCharacteristics = NULL;
WIN_CoUninitialize(); SDL_IMMDevice_Quit();
} }
void void

View File

@ -62,6 +62,15 @@ extern "C" {
SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration; SDL_atomic_t SDL_IMMDevice_DefaultCaptureGeneration;
} }
/* This is a list of device id strings we have inflight, so we have consistent pointers to the same device. */
typedef struct DevIdList
{
WCHAR *str;
struct DevIdList *next;
} DevIdList;
static DevIdList *deviceid_list = NULL;
class SDL_WasapiDeviceEventHandler class SDL_WasapiDeviceEventHandler
{ {
public: public:
@ -204,10 +213,20 @@ int WASAPI_PlatformInit(void)
void WASAPI_PlatformDeinit(void) void WASAPI_PlatformDeinit(void)
{ {
DevIdList *devidlist;
DevIdList *next;
delete playback_device_event_handler; delete playback_device_event_handler;
playback_device_event_handler = nullptr; playback_device_event_handler = nullptr;
delete capture_device_event_handler; delete capture_device_event_handler;
capture_device_event_handler = nullptr; capture_device_event_handler = nullptr;
for (devidlist = deviceid_list; devidlist; devidlist = next) {
next = devidlist->next;
SDL_free(devidlist->str);
SDL_free(devidlist);
}
deviceid_list = NULL;
} }
void WASAPI_EnumerateEndpoints(void) void WASAPI_EnumerateEndpoints(void)
@ -359,15 +378,6 @@ WaveFormatToSDLFormat(WAVEFORMATEX *waveformat)
return 0; return 0;
} }
/* This is a list of device id strings we have inflight, so we have consistent pointers to the same device. */
typedef struct DevIdList
{
WCHAR *str;
struct DevIdList *next;
} DevIdList;
static DevIdList *deviceid_list = NULL;
static void static void
WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid) WASAPI_RemoveDevice(const SDL_bool iscapture, LPCWSTR devid)
{ {

View File

@ -346,11 +346,23 @@ SDL_IMMDevice_Init(void)
void void
SDL_IMMDevice_Quit(void) SDL_IMMDevice_Quit(void)
{ {
DevIdList *devidlist;
DevIdList *next;
if (enumerator) { if (enumerator) {
IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(enumerator, (IMMNotificationClient *)&notification_client); IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(enumerator, (IMMNotificationClient *)&notification_client);
IMMDeviceEnumerator_Release(enumerator); IMMDeviceEnumerator_Release(enumerator);
enumerator = NULL; enumerator = NULL;
} }
WIN_CoUninitialize();
for (devidlist = deviceid_list; devidlist; devidlist = next) {
next = devidlist->next;
SDL_free(devidlist->str);
SDL_free(devidlist);
}
deviceid_list = NULL;
} }
int int