# HG changeset patch # User Michael Pavone # Date 1589091951 25200 # Node ID 81df9aa2de9b3087321d10830d8e145bc9149575 # Parent 06c25babe464e1a5eaa1f2b98675c0d8594cc36a Less hacky run on audio thread mode diff -r 06c25babe464 -r 81df9aa2de9b bindings.c --- a/bindings.c Sat May 09 21:37:35 2020 -0700 +++ b/bindings.c Sat May 09 23:25:51 2020 -0700 @@ -409,7 +409,7 @@ show_pause_menu(); } else { #endif - current_system->request_exit(current_system); + system_request_exit(current_system, 1); if (current_system->type == SYSTEM_GENESIS) { genesis_context *gen = (genesis_context *)current_system; if (gen->extra) { diff -r 06c25babe464 -r 81df9aa2de9b blastem.c --- a/blastem.c Sat May 09 21:37:35 2020 -0700 +++ b/blastem.c Sat May 09 23:25:51 2020 -0700 @@ -327,7 +327,7 @@ free(current_system->next_rom); } current_system->next_rom = strdup(filename); - current_system->request_exit(current_system); + system_request_exit(current_system, 1); if (menu_system && menu_system->type == SYSTEM_GENESIS) { genesis_context *gen = (genesis_context *)menu_system; if (gen->extra) { @@ -368,7 +368,7 @@ num_parts--; } current_system->next_rom = alloc_concat_m(num_parts, start); - current_system->request_exit(current_system); + system_request_exit(current_system, 1); } void lockon_media(char *lock_on_path) @@ -749,6 +749,7 @@ current_system->debugger_type = dtype; current_system->enter_debugger = start_in_debugger && menu == debug_target; current_system->start_context(current_system, statefile); + render_video_loop(); } else if (menu && game_system) { current_system->arena = set_current_arena(game_system->arena); current_system = game_system; @@ -766,6 +767,7 @@ } if (!current_system->next_rom) { current_system->resume_context(current_system); + render_video_loop(); } } else { break; diff -r 06c25babe464 -r 81df9aa2de9b genesis.c --- a/genesis.c Sat May 09 21:37:35 2020 -0700 +++ b/genesis.c Sat May 09 23:25:51 2020 -0700 @@ -1254,7 +1254,7 @@ resume_68k(gen->m68k); } } - if (render_should_release_on_exit()) { + if (gen->header.force_release || render_should_release_on_exit()) { bindings_release_capture(); vdp_release_framebuffer(gen->vdp); render_pause_source(gen->ym->audio); @@ -1302,7 +1302,8 @@ static void resume_genesis(system_header *system) { genesis_context *gen = (genesis_context *)system; - if (render_should_release_on_exit()) { + if (gen->header.force_release || render_should_release_on_exit()) { + gen->header.force_release = 0; render_set_video_standard((gen->version_reg & HZ50) ? VID_PAL : VID_NTSC); bindings_reacquire_capture(); vdp_reacquire_framebuffer(gen->vdp); diff -r 06c25babe464 -r 81df9aa2de9b libblastem.c --- a/libblastem.c Sat May 09 21:37:35 2020 -0700 +++ b/libblastem.c Sat May 09 23:25:51 2020 -0700 @@ -381,7 +381,7 @@ last_height = height; } retro_video_refresh(fb + overscan_left + LINEBUF_SIZE * overscan_top, width, height, LINEBUF_SIZE * sizeof(uint32_t)); - current_system->request_exit(current_system); + system_request_exit(current_system, 0); } uint8_t render_get_active_framebuffer(void) diff -r 06c25babe464 -r 81df9aa2de9b nuklear_ui/blastem_nuklear.c --- a/nuklear_ui/blastem_nuklear.c Sat May 09 21:37:35 2020 -0700 +++ b/nuklear_ui/blastem_nuklear.c Sat May 09 23:25:51 2020 -0700 @@ -2220,7 +2220,7 @@ context->style.window.fixed_background = nk_style_item_color(nk_rgba(0, 0, 0, 128)); current_view = view_pause; context->input.selected_widget = 0; - current_system->request_exit(current_system); + system_request_exit(current_system, 1); } else if (current_system && !set_binding) { clear_view_stack(); show_play_view(); diff -r 06c25babe464 -r 81df9aa2de9b render_sdl.c --- 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); diff -r 06c25babe464 -r 81df9aa2de9b sms.c --- a/sms.c Sat May 09 21:37:35 2020 -0700 +++ b/sms.c Sat May 09 23:25:51 2020 -0700 @@ -428,7 +428,7 @@ target_cycle -= adjust; } } - if (render_should_release_on_exit()) { + if (sms->header.force_release || render_should_release_on_exit()) { bindings_release_capture(); vdp_release_framebuffer(sms->vdp); render_pause_source(sms->psg->audio); @@ -439,7 +439,8 @@ static void resume_sms(system_header *system) { sms_context *sms = (sms_context *)system; - if (render_should_release_on_exit()) { + if (sms->header.force_release || render_should_release_on_exit()) { + sms->header.force_release = 0; bindings_reacquire_capture(); vdp_reacquire_framebuffer(sms->vdp); render_resume_source(sms->psg->audio); diff -r 06c25babe464 -r 81df9aa2de9b system.c --- a/system.c Sat May 09 21:37:35 2020 -0700 +++ b/system.c Sat May 09 23:25:51 2020 -0700 @@ -89,3 +89,9 @@ } return NULL; } + +void system_request_exit(system_header *system, uint8_t force_release) +{ + system->force_release = force_release; + system->request_exit(system); +} diff -r 06c25babe464 -r 81df9aa2de9b system.h --- a/system.h Sat May 09 21:37:35 2020 -0700 +++ b/system.h Sat May 09 23:25:51 2020 -0700 @@ -73,6 +73,7 @@ uint8_t delayed_load_slot; uint8_t has_keyboard; uint8_t vgm_logging; + uint8_t force_release; debugger_type debugger_type; system_type type; }; @@ -91,5 +92,6 @@ system_type detect_system_type(system_media *media); system_header *alloc_config_system(system_type stype, system_media *media, uint32_t opts, uint8_t force_region); system_header *alloc_config_player(system_type stype, event_reader *reader); +void system_request_exit(system_header *system, uint8_t force_release); #endif //SYSTEM_H_