diff --git a/general.h b/general.h index 9f99c34440..3a3f40c666 100644 --- a/general.h +++ b/general.h @@ -183,6 +183,7 @@ struct global char netplay_server[256]; bool netplay_enable; bool netplay_is_client; + unsigned netplay_sync_frames; #ifdef HAVE_FFMPEG ffemu_t *rec; diff --git a/netplay.c b/netplay.c index f25c0aa5f4..0b7ad73de3 100644 --- a/netplay.c +++ b/netplay.c @@ -363,7 +363,6 @@ static void simulate_input(netplay_t *handle) handle->buffer[ptr].simulated_input_state = handle->buffer[prev].real_input_state; handle->buffer[ptr].is_simulated = true; - //fprintf(stderr, "Predicted output: 0x%hx\n", (unsigned short)handle->buffer[ptr].simulated_input_state); } // Poll network to see if we have anything new. If our network buffer is full, we simply have to block for new input data. @@ -416,7 +415,6 @@ bool netplay_poll(netplay_t *handle) { handle->buffer[PREV_PTR(handle->self_ptr)].is_simulated = false; handle->buffer[PREV_PTR(handle->self_ptr)].used_real = true; - //fprintf(stderr, "Used actual input: 0x%hx\n", (unsigned short)handle->buffer[PREV_PTR(handle->self_ptr)].real_input_state); } return true; @@ -494,24 +492,15 @@ void netplay_post_frame(netplay_t *handle) handle->is_replay = true; handle->tmp_ptr = handle->other_ptr; psnes_unserialize(handle->buffer[handle->other_ptr].state, handle->state_size); - int cnt = 0; while (handle->tmp_ptr != handle->self_ptr) { - cnt++; - //fprintf(stderr, "Replaying frame @ ptr: %lu\n", handle->tmp_ptr); psnes_serialize(handle->buffer[handle->tmp_ptr].state, handle->state_size); psnes_run(); handle->tmp_ptr = NEXT_PTR(handle->tmp_ptr); } - //fprintf(stderr, "Read ptr: %lu, Other ptr: %lu, Self ptr: %lu\n", handle->read_ptr, handle->other_ptr, handle->self_ptr); - //fprintf(stderr, "Replayed %d frames!\n", cnt); handle->other_ptr = handle->read_ptr; handle->is_replay = false; } - else - { - //fprintf(stderr, "Perfect prediction: Ratio: %.3f%%\n", (float)perfect_cnt * 100.0f / cnt); - } } diff --git a/ssnes.c b/ssnes.c index 2a1514741c..2665f9521b 100644 --- a/ssnes.c +++ b/ssnes.c @@ -345,6 +345,7 @@ static void print_help(void) puts("\t-P/--bsvplay: Playback a BSV movie file."); puts("\t-H/--host: Host netplay as player 1."); puts("\t-C/--connect: Connect to netplay as player 2."); + puts("\t-F/--frames: Sync frames when using netplay."); #ifdef HAVE_FFMPEG puts("\t-r/--record: Path to record video file. Settings for video/audio codecs are found in config file."); @@ -396,6 +397,7 @@ static void parse_input(int argc, char *argv[]) { "bsvplay", 1, NULL, 'P' }, { "host", 0, NULL, 'H' }, { "connect", 1, NULL, 'C' }, + { "frames", 1, NULL, 'F' }, { NULL, 0, NULL, 0 } }; @@ -413,7 +415,7 @@ static void parse_input(int argc, char *argv[]) #define CONFIG_FILE_ARG #endif - char optstring[] = "hs:vS:m:p4jJg:b:B:Y:Z:P:HC:" FFMPEG_RECORD_ARG CONFIG_FILE_ARG; + char optstring[] = "hs:vS:m:p4jJg:b:B:Y:Z:P:HC:F:" FFMPEG_RECORD_ARG CONFIG_FILE_ARG; for(;;) { int c = getopt_long(argc, argv, optstring, opts, &option_index); @@ -521,6 +523,12 @@ static void parse_input(int argc, char *argv[]) strncpy(g_extern.netplay_server, optarg, sizeof(g_extern.netplay_server) - 1); break; + case 'F': + g_extern.netplay_sync_frames = strtol(optarg, NULL, 0); + if (g_extern.netplay_sync_frames < 32) + g_extern.netplay_sync_frames = 32; + break; + case '?': print_help(); exit(1); @@ -774,7 +782,7 @@ static void init_netplay(void) else SSNES_LOG("Waiting for client...\n"); - g_extern.netplay = netplay_new(g_extern.netplay_is_client ? g_extern.netplay_server : NULL, 55435, 4, &cbs); + g_extern.netplay = netplay_new(g_extern.netplay_is_client ? g_extern.netplay_server : NULL, 55435, g_extern.netplay_sync_frames, &cbs); if (!g_extern.netplay) { g_extern.netplay_is_client = false; diff --git a/ssnes.cfg b/ssnes.cfg index 4e6de705bb..b0f80f96bc 100644 --- a/ssnes.cfg +++ b/ssnes.cfg @@ -218,3 +218,4 @@ # Autosaves the non-volatile SRAM at a regular interval. This is disabled by default unless set otherwise. # The interval is measured in seconds. A value of 0 disables autosave. # autosave_interval = +