wasapi: If device is marked as a zombie, don't try to resuscitate it.

main
Ryan C. Gordon 2023-10-27 01:27:22 -04:00
parent 85923049a6
commit ce3be02b48
No known key found for this signature in database
GPG Key ID: 3C62BA43B5CCC412
2 changed files with 3 additions and 0 deletions

View File

@ -514,6 +514,7 @@ void SDL_AudioDeviceDisconnected(SDL_AudioDevice *device)
// on default devices, dump any logical devices that explicitly opened this device. Things that opened the system default can stay. // on default devices, dump any logical devices that explicitly opened this device. Things that opened the system default can stay.
// on non-default devices, dump everything. // on non-default devices, dump everything.
// (by "dump" we mean send a REMOVED event; the zombie will keep consuming audio data for these logical devices until explicitly closed.)
for (SDL_LogicalAudioDevice *logdev = device->logical_devices; logdev != NULL; logdev = logdev->next) { for (SDL_LogicalAudioDevice *logdev = device->logical_devices; logdev != NULL; logdev = logdev->next) {
if (!is_default_device || !logdev->opened_as_default) { // if opened as a default, leave it on the zombie device for later migration. if (!is_default_device || !logdev->opened_as_default) { // if opened as a default, leave it on the zombie device for later migration.
SDL_PendingAudioDeviceEvent *p = (SDL_PendingAudioDeviceEvent *) SDL_malloc(sizeof (SDL_PendingAudioDeviceEvent)); SDL_PendingAudioDeviceEvent *p = (SDL_PendingAudioDeviceEvent *) SDL_malloc(sizeof (SDL_PendingAudioDeviceEvent));

View File

@ -397,6 +397,8 @@ static SDL_bool RecoverWasapiIfLost(SDL_AudioDevice *device)
WASAPI_DisconnectDevice(device); WASAPI_DisconnectDevice(device);
SDL_assert(SDL_AtomicGet(&device->shutdown)); // so we don't come back through here. SDL_assert(SDL_AtomicGet(&device->shutdown)); // so we don't come back through here.
return SDL_FALSE; // already failed. return SDL_FALSE; // already failed.
} else if (SDL_AtomicGet(&device->zombie)) {
return SDL_FALSE; // we're already dead, so just leave and let the Zombie implementations take over.
} else if (!device->hidden->client) { } else if (!device->hidden->client) {
return SDL_TRUE; // still waiting for activation. return SDL_TRUE; // still waiting for activation.
} }