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 10513105ac
commit f6250318c6

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