From f6250318c6e69a657da62df19a210714428da4c7 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 14 Jul 2013 12:42:12 -0400 Subject: [PATCH] Protect SDL_PauseAudio*() with the audio callback lock. Otherwise, you can pause audio and still have the callback running, or run one more time. This makes sure the callback is definitely stopped by the time you return from SDL_PauseAudio(). --- src/audio/SDL_audio.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 29ae10044..a9c54b440 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -480,13 +480,13 @@ SDL_RunAudio(void *devicep) } } + SDL_LockMutex(device->mixer_lock); if (device->paused) { SDL_memset(stream, silence, stream_len); } else { - SDL_LockMutex(device->mixer_lock); (*fill) (udata, stream, stream_len); - SDL_UnlockMutex(device->mixer_lock); } + SDL_UnlockMutex(device->mixer_lock); /* Convert the audio if necessary */ if (device->convert.needed) { @@ -1114,7 +1114,9 @@ SDL_PauseAudioDevice(SDL_AudioDeviceID devid, int pause_on) { SDL_AudioDevice *device = get_audio_device(devid); if (device) { + current_audio.impl.LockDevice(device); device->paused = pause_on; + current_audio.impl.UnlockDevice(device); } }