diff --git a/core_impl.c b/core_impl.c index 9492dae6f3..683a821c57 100644 --- a/core_impl.c +++ b/core_impl.c @@ -283,6 +283,11 @@ bool core_unserialize(retro_ctx_serialize_info_t *info) return false; if (!core.retro_unserialize(info->data_const, info->size)) return false; + +#if HAVE_NETWORKING + netplay_driver_ctl(RARCH_NETPLAY_CTL_LOAD_SAVESTATE, info); +#endif + return true; } @@ -368,6 +373,14 @@ bool core_unload_game(void) bool core_run(void) { +#ifdef HAVE_NETWORKING + if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_PRE_FRAME, NULL)) + { + /* Paused due to Netplay */ + return true; + } +#endif + switch (core_poll_type) { case POLL_TYPE_EARLY: @@ -384,6 +397,11 @@ bool core_run(void) core.retro_run(); if (core_poll_type == POLL_TYPE_LATE && !core_input_polled) input_poll(); + +#ifdef HAVE_NETWORKING + netplay_driver_ctl(RARCH_NETPLAY_CTL_POST_FRAME, NULL); +#endif + return true; } diff --git a/network/netplay/netplay.c b/network/netplay/netplay.c index 84f1a4229a..e4f5c90f86 100644 --- a/network/netplay/netplay.c +++ b/network/netplay/netplay.c @@ -56,6 +56,9 @@ static bool netplay_is_client = false; /* Used while Netplay is running */ static netplay_t *netplay_data = NULL; +/* Used to avoid recursive netplay calls */ +static bool in_netplay = false; + static int init_tcp_connection(const struct addrinfo *res, bool server, bool spectate, struct sockaddr *other_addr, socklen_t addr_size) @@ -1373,6 +1376,12 @@ bool init_netplay(bool is_spectate, const char *server, unsigned port) bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) { + bool ret = true; + + if (in_netplay) + return true; + in_netplay = true; + if (!netplay_data) { switch (state) @@ -1380,7 +1389,7 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) case RARCH_NETPLAY_CTL_ENABLE_SERVER: netplay_enabled = true; netplay_is_client = false; - return true; + goto done; case RARCH_NETPLAY_CTL_ENABLE_CLIENT: netplay_enabled = true; @@ -1389,16 +1398,18 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) case RARCH_NETPLAY_CTL_DISABLE: netplay_enabled = false; - return true; + goto done; case RARCH_NETPLAY_CTL_IS_ENABLED: - return netplay_enabled; + ret = netplay_enabled; + goto done; case RARCH_NETPLAY_CTL_IS_DATA_INITED: - return false; + ret = false; + goto done; default: - return true; + goto done; } } @@ -1407,16 +1418,18 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) case RARCH_NETPLAY_CTL_ENABLE_SERVER: case RARCH_NETPLAY_CTL_ENABLE_CLIENT: case RARCH_NETPLAY_CTL_IS_DATA_INITED: - return true; + goto done; case RARCH_NETPLAY_CTL_DISABLE: - return false; + ret = false; + goto done; case RARCH_NETPLAY_CTL_IS_ENABLED: - return true; + goto done; case RARCH_NETPLAY_CTL_POST_FRAME: netplay_post_frame(netplay_data); break; case RARCH_NETPLAY_CTL_PRE_FRAME: - return netplay_pre_frame(netplay_data); + ret = netplay_pre_frame(netplay_data); + goto done; case RARCH_NETPLAY_CTL_FLIP_PLAYERS: { bool *state = (bool*)data; @@ -1441,11 +1454,14 @@ bool netplay_driver_ctl(enum rarch_netplay_ctl_state state, void *data) netplay_load_savestate(netplay_data, (retro_ctx_serialize_info_t*)data, true); break; case RARCH_NETPLAY_CTL_DISCONNECT: - return netplay_disconnect(netplay_data); + ret = netplay_disconnect(netplay_data); + goto done; default: case RARCH_NETPLAY_CTL_NONE: - break; + ret = false; } - return false; +done: + in_netplay = false; + return ret; } diff --git a/runloop.c b/runloop.c index 3825901c0f..a2161d523f 100644 --- a/runloop.c +++ b/runloop.c @@ -1330,16 +1330,6 @@ int runloop_iterate(unsigned *sleep_ms) autosave_lock(); -#ifdef HAVE_NETWORKING - if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_PRE_FRAME, NULL)) - { - /* Paused due to Netplay */ - core_poll(); - *sleep_ms = 10; - return 1; - } -#endif - if (bsv_movie_ctl(BSV_MOVIE_CTL_IS_INITED, NULL)) bsv_movie_ctl(BSV_MOVIE_CTL_SET_FRAME_START, NULL); @@ -1379,10 +1369,6 @@ int runloop_iterate(unsigned *sleep_ms) if (bsv_movie_ctl(BSV_MOVIE_CTL_IS_INITED, NULL)) bsv_movie_ctl(BSV_MOVIE_CTL_SET_FRAME_END, NULL); -#ifdef HAVE_NETWORKING - netplay_driver_ctl(RARCH_NETPLAY_CTL_POST_FRAME, NULL); -#endif - autosave_unlock(); if (!settings->fastforward_ratio) diff --git a/tasks/task_save.c b/tasks/task_save.c index 1fad0bc0f9..d554d04fa0 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -440,12 +440,6 @@ bool content_undo_load_state(void) ret = core_unserialize(&serial_info); -#if HAVE_NETWORKING - /* If Netplay is running, inform it */ - if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - netplay_driver_ctl(RARCH_NETPLAY_CTL_LOAD_SAVESTATE, &serial_info); -#endif - /* Clean up the temporary copy */ free(temp_data); temp_data = NULL; @@ -902,12 +896,6 @@ static void content_load_state_cb(void *task_data, ret = core_unserialize(&serial_info); -#if HAVE_NETWORKING - /* If Netplay is running, inform it */ - if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) - netplay_driver_ctl(RARCH_NETPLAY_CTL_LOAD_SAVESTATE, &serial_info); -#endif - /* Flush back. */ for (i = 0; i < num_blocks; i++) {