Skip to content

Commit

Permalink
audio: Deal with device shutdown more carefully.
Browse files Browse the repository at this point in the history
This would cause problems in various ways, but specifically triggers an
assert when you close a WASAPI capture device in an app running over RDP.

Related to (but not the actual bug) in Bugzilla #3924.
  • Loading branch information
icculus committed Aug 7, 2018
1 parent e714f65 commit 56f44cf
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions src/audio/SDL_audio.c
Expand Up @@ -451,7 +451,11 @@ void SDL_OpenedAudioDeviceDisconnected(SDL_AudioDevice *device)
SDL_assert(get_audio_device(device->id) == device);

if (!SDL_AtomicGet(&device->enabled)) {
return;
return; /* don't report disconnects more than once. */
}

if (SDL_AtomicGet(&device->shutdown)) {
return; /* don't report disconnect if we're trying to close device. */
}

/* Ends the audio callback and mark the device as STOPPED, but the
Expand Down Expand Up @@ -1056,16 +1060,14 @@ close_audio_device(SDL_AudioDevice * device)
return;
}

if (device->id > 0) {
SDL_AudioDevice *opendev = open_devices[device->id - 1];
SDL_assert((opendev == device) || (opendev == NULL));
if (opendev == device) {
open_devices[device->id - 1] = NULL;
}
}

/* make sure the device is paused before we do anything else, so the
audio callback definitely won't fire again. */
current_audio.impl.LockDevice(device);
SDL_AtomicSet(&device->paused, 1);
SDL_AtomicSet(&device->shutdown, 1);
SDL_AtomicSet(&device->enabled, 0);
current_audio.impl.UnlockDevice(device);

if (device->thread != NULL) {
SDL_WaitThread(device->thread, NULL);
}
Expand All @@ -1076,6 +1078,14 @@ close_audio_device(SDL_AudioDevice * device)
SDL_free(device->work_buffer);
SDL_FreeAudioStream(device->stream);

if (device->id > 0) {
SDL_AudioDevice *opendev = open_devices[device->id - 1];
SDL_assert((opendev == device) || (opendev == NULL));
if (opendev == device) {
open_devices[device->id - 1] = NULL;
}
}

if (device->hidden != NULL) {
current_audio.impl.CloseDevice(device);
}
Expand Down

0 comments on commit 56f44cf

Please sign in to comment.