mirror of https://github.com/encounter/SDL.git
audio: Report SDL_AUDIODEVICEREMOVED for unopened devices.
Unopened devices, if removed, now send SDL_AUDIODEVICEREMOVED events with a `which` field set to zero. Apps can use this to decide if they need to refresh a list of devices being shown in an options menu, etc. It's safe to call SDL_CloseAudioDevice(0), so even if they try to clean up this bogus id, it should be safe. Fixes #5199.
This commit is contained in:
parent
5d85c7d300
commit
8ff738f234
|
@ -527,6 +527,7 @@ SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle)
|
||||||
{
|
{
|
||||||
int device_index;
|
int device_index;
|
||||||
SDL_AudioDevice *device = NULL;
|
SDL_AudioDevice *device = NULL;
|
||||||
|
SDL_bool device_was_opened = SDL_FALSE;
|
||||||
|
|
||||||
SDL_LockMutex(current_audio.detectionLock);
|
SDL_LockMutex(current_audio.detectionLock);
|
||||||
if (iscapture) {
|
if (iscapture) {
|
||||||
|
@ -539,10 +540,29 @@ SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle)
|
||||||
device = open_devices[device_index];
|
device = open_devices[device_index];
|
||||||
if (device != NULL && device->handle == handle)
|
if (device != NULL && device->handle == handle)
|
||||||
{
|
{
|
||||||
|
device_was_opened = SDL_TRUE;
|
||||||
SDL_OpenedAudioDeviceDisconnected(device);
|
SDL_OpenedAudioDeviceDisconnected(device);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Devices that aren't opened, as of 2.24.0, will post an
|
||||||
|
SDL_AUDIODEVICEREMOVED event with the `which` field set to zero.
|
||||||
|
Apps can use this to decide if they need to refresh a list of
|
||||||
|
available devices instead of closing an opened one.
|
||||||
|
Note that opened devices will send the non-zero event in
|
||||||
|
SDL_OpenedAudioDeviceDisconnected(). */
|
||||||
|
if (!device_was_opened) {
|
||||||
|
if (SDL_GetEventState(SDL_AUDIODEVICEREMOVED) == SDL_ENABLE) {
|
||||||
|
SDL_Event event;
|
||||||
|
SDL_zero(event);
|
||||||
|
event.adevice.type = SDL_AUDIODEVICEREMOVED;
|
||||||
|
event.adevice.which = 0;
|
||||||
|
event.adevice.iscapture = iscapture ? 1 : 0;
|
||||||
|
SDL_PushEvent(&event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SDL_UnlockMutex(current_audio.detectionLock);
|
SDL_UnlockMutex(current_audio.detectionLock);
|
||||||
|
|
||||||
current_audio.impl.FreeDeviceHandle(handle);
|
current_audio.impl.FreeDeviceHandle(handle);
|
||||||
|
|
Loading…
Reference in New Issue