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().
This commit is contained in:
Ryan C. Gordon 2013-07-14 12:42:12 -04:00
parent e5c1f21fae
commit 37bb3c5354

View file

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