changeset 1955:1c7af12efe8b

Fix awful playback latencin in new netplay implementation
author Michael Pavone <pavone@retrodev.com>
date Fri, 01 May 2020 21:17:21 -0700
parents 2fd0a8cb1c80
children 275f1c4bdb25
files blastem.c event_log.c
diffstat 2 files changed, 27 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Fri May 01 00:54:15 2020 -0700
+++ b/blastem.c	Fri May 01 21:17:21 2020 -0700
@@ -460,6 +460,7 @@
 	system_type stype = SYSTEM_UNKNOWN, force_stype = SYSTEM_UNKNOWN;
 	char * romfname = NULL;
 	char * statefile = NULL;
+	char *reader_addr = NULL, *reader_port = NULL;
 	event_reader reader = {0};
 	debugger_type dtype = DEBUGGER_NATIVE;
 	uint8_t start_in_debugger = 0;
@@ -595,9 +596,10 @@
 				fatal_error("Unrecognized switch %s\n", argv[i]);
 			}
 		} else if (!loaded) {
-			char *port = parse_addr_port(argv[i]);
-			if (port) {
-				init_event_reader_tcp(&reader, argv[i], port);
+			reader_port = parse_addr_port(argv[i]);
+			if (reader_port) {
+				//init_event_reader_tcp(&reader, argv[i], port);
+				reader_addr = argv[i];
 			} else {
 				if (!(cart.size = load_rom(argv[i], &cart.buffer, stype == SYSTEM_UNKNOWN ? &stype : NULL))) {
 					fatal_error("Failed to open %s for reading\n", argv[i]);
@@ -683,23 +685,15 @@
 		warning("%s is not a valid value for the ui.state_format setting. Valid values are gst and native\n", state_format);
 	}
 
-	if (loaded) {
-		if (stype == SYSTEM_UNKNOWN || reader.socket) {
-			if (reader.socket) {
-				stype = reader_system_type(&reader);
-			} else {
-				stype = detect_system_type(&cart);
-			}
+	if (loaded && !reader_addr) {
+		if (stype == SYSTEM_UNKNOWN) {
+			stype = detect_system_type(&cart);
 		}
 		if (stype == SYSTEM_UNKNOWN) {
 			fatal_error("Failed to detect system type for %s\n", romfname);
 		}
 		
-		if (reader.socket) {
-			current_system = alloc_config_player(stype, &reader);
-		} else {
-			current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region);
-		}
+		current_system = alloc_config_system(stype, &cart, menu ? 0 : opts, force_region);
 		if (!current_system) {
 			fatal_error("Failed to configure emulated machine for %s\n", romfname);
 		}
@@ -720,6 +714,17 @@
 		menu = 0;
 	}
 #endif
+
+	if (reader_addr) {
+		init_event_reader_tcp(&reader, reader_addr, reader_port);
+		stype = reader_system_type(&reader);
+		if (stype == SYSTEM_UNKNOWN) {
+			fatal_error("Failed to detect system type for %s\n", romfname);
+		}
+		game_system = current_system = alloc_config_player(stype, &reader);
+		setup_saves(&cart, current_system);
+		update_title(current_system->info.name);
+	}
 	
 	current_system->debugger_type = dtype;
 	current_system->enter_debugger = start_in_debugger && menu == debug_target;
--- a/event_log.c	Fri May 01 00:54:15 2020 -0700
+++ b/event_log.c	Fri May 01 21:17:21 2020 -0700
@@ -381,18 +381,14 @@
 			reader->buffer.size -= reader->buffer.cur_pos;
 			reader->buffer.cur_pos = 0;
 		}
-		int bytes = 128;
-		while (bytes > 127 && reader->buffer.size < reader->storage)
-		{
-			bytes = recv(reader->socket, reader->buffer.data + reader->buffer.size, reader->storage - reader->buffer.size, 0);
-			if (bytes >= 0) {
-				reader->buffer.size += bytes;
-				if (blocking && reader->buffer.size - reader->buffer.cur_pos >= 9) {
-					socket_blocking(reader->socket, 0);
-				}
-			} else if (!socket_error_is_wouldblock()) {
-				printf("Connection closed, error = %X\n", socket_last_error());
+		int bytes = recv(reader->socket, reader->buffer.data + reader->buffer.size, reader->storage - reader->buffer.size, 0);
+		if (bytes >= 0) {
+			reader->buffer.size += bytes;
+			if (blocking && reader->buffer.size - reader->buffer.cur_pos >= 9) {
+				socket_blocking(reader->socket, 0);
 			}
+		} else if (!socket_error_is_wouldblock()) {
+			printf("Connection closed, error = %X\n", socket_last_error());
 		}
 	}
 	uint8_t header = load_int8(&reader->buffer);