mirror of
https://github.com/libretro/RetroArch
synced 2025-02-23 06:41:04 +00:00
Send SRAM to client.
This commit is contained in:
parent
fd1367e257
commit
9ba2d6c9fa
@ -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;
|
||||
|
33
netplay.c
33
netplay.c
@ -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
29
ssnes.c
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user