# HG changeset patch # User Michael Pavone # Date 1699947449 28800 # Node ID 6bcc2ab01ac6c136d4f9b320cec221eb2691cf3b # Parent 3e064001594af219e31ffcf73edd8707589e4d6b Fix netplay crash diff -r 3e064001594a -r 6bcc2ab01ac6 render_sdl.c --- a/render_sdl.c Fri Nov 10 21:18:02 2023 -0800 +++ b/render_sdl.c Mon Nov 13 23:37:29 2023 -0800 @@ -159,6 +159,7 @@ */ } +static uint8_t audio_active; void *render_new_audio_opaque(void) { return SDL_CreateCond(); @@ -171,6 +172,7 @@ void render_audio_created(audio_source *source) { + audio_active = 1; if (sync_src == SYNC_AUDIO) { //SDL_PauseAudio acquires the audio device lock, which is held while the callback runs //since our callback can itself be stuck waiting on the audio_ready condition variable @@ -192,6 +194,7 @@ } if (!remaining_sources && render_is_audio_sync()) { SDL_PauseAudio(1); + audio_active = 0; if (sync_src == SYNC_AUDIO_THREAD) { SDL_CondSignal(frame_ready); } @@ -200,6 +203,7 @@ void render_source_resumed(audio_source *src) { + audio_active = 1; if (sync_src == SYNC_AUDIO) { //SDL_PauseAudio acquires the audio device lock, which is held while the callback runs //since our callback can itself be stuck waiting on the audio_ready condition variable @@ -1829,7 +1833,7 @@ SDL_LockMutex(frame_mutex); for(;;) { - while (!frame_queue_len && SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) + while (!frame_queue_len && audio_active) { SDL_CondWait(frame_ready, frame_mutex); } @@ -1843,7 +1847,7 @@ release_buffer(f.buffer); SDL_LockMutex(frame_mutex); } - if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING) { + if (!audio_active) { break; } }