Browse Source

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

Ryan C. Gordon 1 year ago
parent
commit
ce3be02b48
2 changed files with 3 additions and 0 deletions
  1. 1 0
      src/audio/SDL_audio.c
  2. 2 0
      src/audio/wasapi/SDL_wasapi.c

+ 1 - 0
src/audio/SDL_audio.c

@@ -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 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) {
         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));

+ 2 - 0
src/audio/wasapi/SDL_wasapi.c

@@ -397,6 +397,8 @@ static SDL_bool RecoverWasapiIfLost(SDL_AudioDevice *device)
         WASAPI_DisconnectDevice(device);
         SDL_assert(SDL_AtomicGet(&device->shutdown));  // so we don't come back through here.
         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) {
         return SDL_TRUE; // still waiting for activation.
     }