Send SRAM to client.

This commit is contained in:
Themaister 2011-02-13 17:45:14 +01:00
parent fd1367e257
commit 9ba2d6c9fa
3 changed files with 55 additions and 14 deletions

View File

@ -182,6 +182,7 @@ struct global
netplay_t *netplay; netplay_t *netplay;
char netplay_server[256]; char netplay_server[256];
bool netplay_enable; bool netplay_enable;
bool netplay_is_client;
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
ffemu_t *rec; ffemu_t *rec;

View File

@ -27,6 +27,7 @@
#include <windows.h> #include <windows.h>
#include <winsock2.h> #include <winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
// Woohoo, Winsock has headers from the STONE AGE! :D
#define close(x) closesocket(x) #define close(x) closesocket(x)
#define CONST_CAST (const char*) #define CONST_CAST (const char*)
#define NONCONST_CAST (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) 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)) if (send(handle->fd, CONST_CAST header, sizeof(header), 0) != sizeof(header))
return false; 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; return true;
} }
static bool get_info(netplay_t *handle) 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)) if (recv(handle->fd, NONCONST_CAST header, sizeof(header), 0) != sizeof(header))
return false; return false;
if (g_extern.cart_crc != ntohl(header[0])) if (g_extern.cart_crc != ntohl(header[0]))
return false; return false;
if (psnes_serialize_size() != ntohl(header[1])) if (psnes_serialize_size() != ntohl(header[1]))
return false; 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; return true;
} }

35
ssnes.c
View File

@ -765,9 +765,16 @@ static void init_netplay(void)
.poll_cb = input_poll, .poll_cb = input_poll,
.state_cb = input_state .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) if (!g_extern.netplay)
{
g_extern.netplay_is_client = false;
SSNES_WARN("Failed to init netplay...\n"); 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)) if (!init_rom_file(g_extern.game_type))
goto error; goto error;
init_movie();
if (!g_extern.bsv_movie)
{
load_save_files();
init_rewind();
}
init_drivers(); init_drivers();
init_netplay(); init_netplay();
@ -1197,19 +1212,13 @@ int main(int argc, char *argv[])
init_msg_queue(); init_msg_queue();
init_controllers(); init_controllers();
init_movie();
if (!g_extern.bsv_movie)
{
load_save_files();
init_rewind();
}
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
init_recording(); init_recording();
#endif #endif
init_autosave(); if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client)
init_autosave();
// Main loop // Main loop
for(;;) for(;;)
@ -1245,13 +1254,15 @@ int main(int argc, char *argv[])
} }
deinit_netplay(); deinit_netplay();
deinit_autosave();
if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client)
deinit_autosave();
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
deinit_recording(); deinit_recording();
#endif #endif
if (!g_extern.bsv_movie) if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client)
{ {
deinit_rewind(); deinit_rewind();
save_files(); save_files();