changeset 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 a7b753e260a2
files bindings.c blastem.c genesis.c libblastem.c nuklear_ui/blastem_nuklear.c render_sdl.c sms.c system.c system.h
diffstat 9 files changed, 38 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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;
--- 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);
--- 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)
--- 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();
--- 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);
--- 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);
--- 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);
+}
--- 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_