Mercurial > repos > blastem
diff render_sdl.c @ 1980:81df9aa2de9b
Less hacky run on audio thread mode
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 09 May 2020 23:25:51 -0700 |
parents | 06c25babe464 |
children | 3537514ea206 |
line wrap: on
line diff
--- a/render_sdl.c Sat May 09 21:37:35 2020 -0700 +++ b/render_sdl.c Sat May 09 23:25:51 2020 -0700 @@ -171,11 +171,11 @@ void render_audio_created(audio_source *source) { - if (sync_src == SYNC_AUDIO && SDL_GetAudioStatus() == SDL_AUDIO_PAUSED) { + if (render_is_audio_sync()) { SDL_PauseAudio(0); } - if (current_system) { - current_system->request_exit(current_system); + if (current_system && sync_src == SYNC_AUDIO_THREAD) { + system_request_exit(current_system, 0); } } @@ -184,16 +184,22 @@ if (sync_src == SYNC_AUDIO) { SDL_CondSignal(audio_ready); } - if (!remaining_sources) { - SDL_PauseAudio(0); + if (!remaining_sources && render_is_audio_sync()) { + SDL_PauseAudio(1); + if (sync_src == SYNC_AUDIO_THREAD) { + SDL_CondSignal(frame_ready); + } } } void render_source_resumed(audio_source *src) { - if (sync_src == SYNC_AUDIO) { + if (render_is_audio_sync()) { SDL_PauseAudio(0); } + if (current_system && sync_src == SYNC_AUDIO_THREAD) { + system_request_exit(current_system, 0); + } } void render_do_audio_ready(audio_source *src) @@ -206,7 +212,7 @@ src->buffer_pos = 0; if (all_sources_ready()) { //we've emulated far enough to fill the current buffer - current_system->request_exit(current_system); + system_request_exit(current_system, 0); } } else if (sync_src == SYNC_AUDIO) { SDL_LockMutex(audio_mutex); @@ -1700,15 +1706,13 @@ if (sync_src != SYNC_AUDIO_THREAD && sync_src != SYNC_EXTERNAL) { return; } - SDL_PauseAudio(0); SDL_LockMutex(frame_mutex); for(;;) { - while (!frame_queue_len) + while (!frame_queue_len && SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) { SDL_CondWait(frame_ready, frame_mutex); } - for (int i = 0; i < frame_queue_len; i++) while (frame_queue_len) { frame f = frame_queue[frame_queue_read++]; @@ -1719,6 +1723,9 @@ release_buffer(f.buffer); SDL_LockMutex(frame_mutex); } + if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING) { + break; + } } SDL_UnlockMutex(frame_mutex);