diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 949d650f8..e2f7412c9 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -527,6 +527,7 @@ SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle) { int device_index; SDL_AudioDevice *device = NULL; + SDL_bool device_was_opened = SDL_FALSE; SDL_LockMutex(current_audio.detectionLock); if (iscapture) { @@ -539,10 +540,29 @@ SDL_RemoveAudioDevice(const SDL_bool iscapture, void *handle) device = open_devices[device_index]; if (device != NULL && device->handle == handle) { + device_was_opened = SDL_TRUE; SDL_OpenedAudioDeviceDisconnected(device); 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); current_audio.impl.FreeDeviceHandle(handle);