mirror of
https://github.com/Ryujinx/SDL.git
synced 2024-12-23 13:35:40 +00:00
wasapi: Force WIN_CoInitialize duing device open.
Otherwise this won't work if you open a device on a background thread. Fixes #7478.
This commit is contained in:
parent
23bce27b26
commit
446e0943da
|
@ -371,6 +371,11 @@ void WASAPI_UnrefDevice(_THIS)
|
||||||
our callback thread. We do that in WASAPI_ThreadDeinit().
|
our callback thread. We do that in WASAPI_ThreadDeinit().
|
||||||
(likewise for this->hidden->coinitialized). */
|
(likewise for this->hidden->coinitialized). */
|
||||||
ReleaseWasapiDevice(this);
|
ReleaseWasapiDevice(this);
|
||||||
|
|
||||||
|
if (SDL_ThreadID() == this->hidden->open_threadid) {
|
||||||
|
WIN_CoUninitialize(); /* if you closed from a different thread than you opened, sorry, it's a leak. We can't help you. */
|
||||||
|
}
|
||||||
|
|
||||||
SDL_free(this->hidden->devid);
|
SDL_free(this->hidden->devid);
|
||||||
SDL_free(this->hidden);
|
SDL_free(this->hidden);
|
||||||
}
|
}
|
||||||
|
@ -539,6 +544,11 @@ static int WASAPI_OpenDevice(_THIS, const char *devname)
|
||||||
|
|
||||||
WASAPI_RefDevice(this); /* so CloseDevice() will unref to zero. */
|
WASAPI_RefDevice(this); /* so CloseDevice() will unref to zero. */
|
||||||
|
|
||||||
|
if (FAILED(WIN_CoInitialize())) { /* WASAPI uses COM, we need to make sure it's initialized. You have to close the device from the same thread!! */
|
||||||
|
return SDL_SetError("WIN_CoInitialize failed during WASAPI device open");
|
||||||
|
}
|
||||||
|
this->hidden->open_threadid = SDL_ThreadID(); /* set this _after_ coinitialize so we don't uninit if device fails at the wrong moment. */
|
||||||
|
|
||||||
if (!devid) { /* is default device? */
|
if (!devid) { /* is default device? */
|
||||||
this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration);
|
this->hidden->default_device_generation = SDL_AtomicGet(this->iscapture ? &SDL_IMMDevice_DefaultCaptureGeneration : &SDL_IMMDevice_DefaultPlaybackGeneration);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -47,6 +47,7 @@ struct SDL_PrivateAudioData
|
||||||
SDL_AudioStream *capturestream;
|
SDL_AudioStream *capturestream;
|
||||||
HANDLE event;
|
HANDLE event;
|
||||||
HANDLE task;
|
HANDLE task;
|
||||||
|
SDL_threadID open_threadid;
|
||||||
SDL_bool coinitialized;
|
SDL_bool coinitialized;
|
||||||
int framesize;
|
int framesize;
|
||||||
int default_device_generation;
|
int default_device_generation;
|
||||||
|
|
Loading…
Reference in a new issue