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);