diff options
author | Michael Pavone <pavone@retrodev.com> | 2020-05-09 23:25:51 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2020-05-09 23:25:51 -0700 |
commit | e54367b1c456fdbafe40838c8c602cf14d1bbc1b (patch) | |
tree | fcda5ed6bb7ed5176674573a255f5019a99a4369 | |
parent | 99637c7a9ae8db68effe0667aaa9c574c9541c22 (diff) |
Less hacky run on audio thread mode
-rw-r--r-- | bindings.c | 2 | ||||
-rw-r--r-- | blastem.c | 6 | ||||
-rw-r--r-- | genesis.c | 5 | ||||
-rw-r--r-- | libblastem.c | 2 | ||||
-rw-r--r-- | nuklear_ui/blastem_nuklear.c | 2 | ||||
-rwxr-xr-x | render_sdl.c | 27 | ||||
-rw-r--r-- | sms.c | 5 | ||||
-rw-r--r-- | system.c | 6 | ||||
-rw-r--r-- | system.h | 2 |
9 files changed, 38 insertions, 19 deletions
@@ -409,7 +409,7 @@ void handle_binding_up(keybinding * binding) 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) { @@ -327,7 +327,7 @@ static void on_drag_drop(const char *filename) 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 @@ void reload_media(void) 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 @@ int main(int argc, char ** argv) 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 @@ int main(int argc, char ** argv) } if (!current_system->next_rom) { current_system->resume_context(current_system); + render_video_loop(); } } else { break; @@ -1254,7 +1254,7 @@ static void handle_reset_requests(genesis_context *gen) 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 start_genesis(system_header *system, char *statefile) 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 --git a/libblastem.c b/libblastem.c index 7a066ac..835854c 100644 --- a/libblastem.c +++ b/libblastem.c @@ -381,7 +381,7 @@ void render_framebuffer_updated(uint8_t which, int width) 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 --git a/nuklear_ui/blastem_nuklear.c b/nuklear_ui/blastem_nuklear.c index 35c49ad..99464e8 100644 --- a/nuklear_ui/blastem_nuklear.c +++ b/nuklear_ui/blastem_nuklear.c @@ -2220,7 +2220,7 @@ void show_pause_menu(void) 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 --git a/render_sdl.c b/render_sdl.c index 54fa3a5..9f76cd2 100755 --- a/render_sdl.c +++ b/render_sdl.c @@ -171,11 +171,11 @@ void render_free_audio_opaque(void *opaque) 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 @@ void render_source_paused(audio_source *src, uint8_t remaining_sources) 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 @@ void render_do_audio_ready(audio_source *src) 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 @@ void render_video_loop(void) 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 @@ void render_video_loop(void) release_buffer(f.buffer); SDL_LockMutex(frame_mutex); } + if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING) { + break; + } } SDL_UnlockMutex(frame_mutex); @@ -428,7 +428,7 @@ static void run_sms(system_header *system) 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 run_sms(system_header *system) 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); @@ -89,3 +89,9 @@ system_header *alloc_config_player(system_type stype, event_reader *reader) } return NULL; } + +void system_request_exit(system_header *system, uint8_t force_release) +{ + system->force_release = force_release; + system->request_exit(system); +} @@ -73,6 +73,7 @@ struct system_header { 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 @@ struct system_media { 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_ |