Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
coreaudio: Dispose of AudioQueue before waiting on the thread.
Otherwise the thread might block for a long time (more than 10 seconds!).
It's not clear to me why this happens, or why its safe to do this with a
resource that's still in use, but we have, until recently, always
disposed of the AudioQueue first, so changing back is probably okay.

Also changed the disposal to allow in-flight buffers to reach hardware;
otherwise you lose the last little bit of audio that's already been queued
but not played, which you can hear clearly in the loopwave test program.

Fixes #6377.
  • Loading branch information
icculus committed Oct 19, 2022
1 parent aefc6b5 commit e7ab581
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions src/audio/coreaudio/SDL_coreaudio.m
Expand Up @@ -704,6 +704,11 @@ static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrec
/* if callback fires again, feed silence; don't call into the app. */
SDL_AtomicSet(&this->paused, 1);

/* dispose of the audio queue before waiting on the thread, or it might stall for a long time! */
if (this->hidden->audioQueue) {
AudioQueueDispose(this->hidden->audioQueue, 0);
}

if (this->hidden->thread) {
SDL_assert(SDL_AtomicGet(&this->shutdown) != 0); /* should have been set by SDL_audio.c */
SDL_WaitThread(this->hidden->thread, NULL);
Expand Down Expand Up @@ -733,10 +738,6 @@ static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrec
open_devices = NULL;
}

if (this->hidden->audioQueue) {
AudioQueueDispose(this->hidden->audioQueue, 1);
}

if (this->hidden->ready_semaphore) {
SDL_DestroySemaphore(this->hidden->ready_semaphore);
}
Expand Down

0 comments on commit e7ab581

Please sign in to comment.