From 9ba2d6c9fa3332e1b2c5aabb6f06e7df8149fd85 Mon Sep 17 00:00:00 2001 From: Themaister Date: Sun, 13 Feb 2011 17:45:14 +0100 Subject: [PATCH] Send SRAM to client. --- general.h | 1 + netplay.c | 33 +++++++++++++++++++++++++++++++-- ssnes.c | 35 +++++++++++++++++++++++------------ 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/general.h b/general.h index c2c5d2d785..9f99c34440 100644 --- a/general.h +++ b/general.h @@ -182,6 +182,7 @@ struct global netplay_t *netplay; char netplay_server[256]; bool netplay_enable; + bool netplay_is_client; #ifdef HAVE_FFMPEG ffemu_t *rec; diff --git a/netplay.c b/netplay.c index 7a6c3f4ba0..751fae123c 100644 --- a/netplay.c +++ b/netplay.c @@ -27,6 +27,7 @@ #include #include #include +// Woohoo, Winsock has headers from the STONE AGE! :D #define close(x) closesocket(x) #define CONST_CAST (const char*) #define NONCONST_CAST (char*) @@ -150,21 +151,49 @@ static bool init_socket(netplay_t *handle, const char *server, uint16_t port) static bool send_info(netplay_t *handle) { - uint32_t header[2] = { htonl(g_extern.cart_crc), htonl(psnes_serialize_size()) }; + uint32_t header[3] = { htonl(g_extern.cart_crc), htonl(psnes_serialize_size()), htonl(psnes_get_memory_size(SNES_MEMORY_CARTRIDGE_RAM)) }; if (send(handle->fd, CONST_CAST header, sizeof(header), 0) != sizeof(header)) return false; + + // Get SRAM data from Player 1 :) + uint8_t *sram = psnes_get_memory_data(SNES_MEMORY_CARTRIDGE_RAM); + unsigned sram_size = psnes_get_memory_size(SNES_MEMORY_CARTRIDGE_RAM); + while (sram_size > 0) + { + ssize_t ret = recv(handle->fd, NONCONST_CAST sram, sram_size, 0); + if (ret <= 0) + return false; + sram += ret; + sram_size -= ret; + } + return true; } static bool get_info(netplay_t *handle) { - uint32_t header[2]; + uint32_t header[3]; if (recv(handle->fd, NONCONST_CAST header, sizeof(header), 0) != sizeof(header)) return false; if (g_extern.cart_crc != ntohl(header[0])) return false; if (psnes_serialize_size() != ntohl(header[1])) return false; + if (psnes_get_memory_size(SNES_MEMORY_CARTRIDGE_RAM) != ntohl(header[2])) + return false; + + // Send SRAM data to our Player 2 :) + const uint8_t *sram = psnes_get_memory_data(SNES_MEMORY_CARTRIDGE_RAM); + unsigned sram_size = psnes_get_memory_size(SNES_MEMORY_CARTRIDGE_RAM); + while (sram_size > 0) + { + ssize_t ret = send(handle->fd, CONST_CAST sram, sram_size, 0); + if (ret <= 0) + return false; + sram += ret; + sram_size -= ret; + } + return true; } diff --git a/ssnes.c b/ssnes.c index 383823aac2..cdc7cc69f3 100644 --- a/ssnes.c +++ b/ssnes.c @@ -765,9 +765,16 @@ static void init_netplay(void) .poll_cb = input_poll, .state_cb = input_state }; - g_extern.netplay = netplay_new(strlen(g_extern.netplay_server) > 0 ? g_extern.netplay_server : NULL, 55435, 1, &cbs); + + if (strlen(g_extern.netplay_server) > 0) + g_extern.netplay_is_client = true; + + g_extern.netplay = netplay_new(g_extern.netplay_is_client ? g_extern.netplay_server : NULL, 55435, 1, &cbs); if (!g_extern.netplay) + { + g_extern.netplay_is_client = false; SSNES_WARN("Failed to init netplay...\n"); + } } } @@ -1187,6 +1194,14 @@ int main(int argc, char *argv[]) if (!init_rom_file(g_extern.game_type)) goto error; + init_movie(); + + if (!g_extern.bsv_movie) + { + load_save_files(); + init_rewind(); + } + init_drivers(); init_netplay(); @@ -1197,19 +1212,13 @@ int main(int argc, char *argv[]) init_msg_queue(); init_controllers(); - init_movie(); - - if (!g_extern.bsv_movie) - { - load_save_files(); - init_rewind(); - } - + #ifdef HAVE_FFMPEG init_recording(); #endif - init_autosave(); + if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client) + init_autosave(); // Main loop for(;;) @@ -1245,13 +1254,15 @@ int main(int argc, char *argv[]) } deinit_netplay(); - deinit_autosave(); + + if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client) + deinit_autosave(); #ifdef HAVE_FFMPEG deinit_recording(); #endif - if (!g_extern.bsv_movie) + if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client) { deinit_rewind(); save_files();