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;
char netplay_server[256];
bool netplay_enable;
bool netplay_is_client;
#ifdef HAVE_FFMPEG
ffemu_t *rec;

View File

@ -27,6 +27,7 @@
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
// 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;
}

29
ssnes.c
View File

@ -765,10 +765,17 @@ 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");
}
}
}
static void deinit_netplay(void)
@ -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,18 +1212,12 @@ 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
if (!g_extern.bsv_movie_playback && !g_extern.netplay_is_client)
init_autosave();
// Main loop
@ -1245,13 +1254,15 @@ int main(int argc, char *argv[])
}
deinit_netplay();
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();