annotate event_log.c @ 2688:b42f00a3a937 default tip

Fix default target. Ensure m68k.h and z80.h are built before anything else when no dep info is available
author Michael Pavone <pavone@retrodev.com>
date Mon, 31 Mar 2025 21:06:18 -0700
parents 05915f01046d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #ifdef _WIN32
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #define WINVER 0x501
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <winsock2.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <ws2tcpip.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #else
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include <sys/types.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <sys/socket.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <unistd.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include <netdb.h>
2681
c4256ce2c45a Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents: 1986
diff changeset
10 #include <netinet/in.h>
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include <netinet/tcp.h>
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
12 #include <pthread.h>
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #endif
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14
1986
a042e046f7f2 Fix libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1974
diff changeset
15 #include <stdlib.h>
a042e046f7f2 Fix libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1974
diff changeset
16 #include <string.h>
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 #include <errno.h>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18 #include "event_log.h"
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 #include "util.h"
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 #include "blastem.h"
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 #include "saves.h"
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
22 #include "zlib/zlib.h"
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 enum {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 CMD_GAMEPAD_DOWN,
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 CMD_GAMEPAD_UP,
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 };
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 static uint8_t active, fully_active;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 static FILE *event_file;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 static serialize_buffer buffer;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
32 static uint8_t *compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
33 static size_t compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
34 static z_stream output_stream;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
35 static uint32_t last;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
36
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
37 static void event_log_common_init(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
38 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
39 init_serialize(&buffer);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
40 compressed_storage = 128*1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
41 compressed = malloc(compressed_storage);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
42 deflateInit(&output_stream, 9);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
43 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
44 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
45 output_stream.avail_in = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
46 output_stream.next_in = buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
47 last = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
48 active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
49 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
50
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
51 static uint8_t multi_count;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
52 static size_t multi_start;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
53 static void finish_multi(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
54 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
55 buffer.data[multi_start] |= multi_count - 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
56 multi_count = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
57 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
58
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
59 static void file_finish(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
60 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
61 fwrite(compressed, 1, output_stream.next_out - compressed, event_file);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
62 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
63 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
64 int result = deflate(&output_stream, Z_FINISH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
65 if (Z_STREAM_END != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
66 fatal_error("Final deflate call returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
67 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
68 fwrite(compressed, 1, output_stream.next_out - compressed, event_file);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
69 fclose(event_file);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
70 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 static const char el_ident[] = "BLSTEL\x02\x00";
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 void event_log_file(char *fname)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 event_file = fopen(fname, "wb");
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 if (!event_file) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 warning("Failed to open event file %s for writing\n", fname);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 return;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 fwrite(el_ident, 1, sizeof(el_ident) - 1, event_file);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
81 event_log_common_init();
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
82 fully_active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
83 atexit(file_finish);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
86 typedef struct {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
87 uint8_t *send_progress;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
88 int sock;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
89 uint8_t players[1]; //TODO: Expand when support for multiple players per remote is added
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
90 uint8_t num_players;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
91 } remote;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
92
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
93 static int listen_sock;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
94 static remote remotes[7];
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 static int num_remotes;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
96 static uint8_t available_players[7] = {2,3,4,5,6,7,8};
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
97 static int num_available_players = 7;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 void event_log_tcp(char *address, char *port)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 struct addrinfo request, *result;
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
101 socket_init();
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 memset(&request, 0, sizeof(request));
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 request.ai_family = AF_INET;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 request.ai_socktype = SOCK_STREAM;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 request.ai_flags = AI_PASSIVE;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 getaddrinfo(address, port, &request, &result);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 listen_sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 if (listen_sock < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 warning("Failed to open event log listen socket on %s:%s\n", address, port);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 goto cleanup_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 }
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
113 int param = 1;
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
114 setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&param, sizeof(param));
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 if (bind(listen_sock, result->ai_addr, result->ai_addrlen) < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 warning("Failed to bind event log listen socket on %s:%s\n", address, port);
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
117 socket_close(listen_sock);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 goto cleanup_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 if (listen(listen_sock, 3) < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 warning("Failed to listen for event log remotes on %s:%s\n", address, port);
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
122 socket_close(listen_sock);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 goto cleanup_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 }
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
125 socket_blocking(listen_sock, 0);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
126 event_log_common_init();
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 cleanup_address:
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 freeaddrinfo(result);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
131 static event_reader *mem_reader;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
132 static uint8_t mem_reader_quit = 1;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
133 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
134 void event_log_mem(void)
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
135 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
136 event_log_common_init();
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
137 free(buffer.data);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
138 buffer.storage = 1024 * 1024;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
139 buffer.data = malloc(buffer.storage);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
140 mem_reader = calloc(1, sizeof(event_reader));
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
141 mem_reader->last_cycle = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
142 mem_reader->repeat_event = 0xFF;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
143 mem_reader->storage = buffer.storage;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
144 init_deserialize(&mem_reader->buffer, buffer.data, 0);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
145 mem_reader_quit = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
146 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
147 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
148
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 static uint8_t *system_start;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 static size_t system_start_size;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 void event_system_start(system_type stype, vid_std video_std, char *name)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 {
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
153 if (!active || mem_reader) {
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 return;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 save_int8(&buffer, stype);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 save_int8(&buffer, video_std);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 size_t name_len = strlen(name);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 if (name_len > 255) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 name_len = 255;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 save_int8(&buffer, name_len);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 save_buffer8(&buffer, name, strlen(name));
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
164 if (listen_sock) {
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 system_start = malloc(buffer.size);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 system_start_size = buffer.size;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 memcpy(system_start, buffer.data, buffer.size);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
168 } else {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
169 //system start header is never compressed, so write to file immediately
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
170 fwrite(buffer.data, 1, buffer.size, event_file);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
172 buffer.size = 0;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 //header formats
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 //Single byte: 4 bit type, 4 bit delta (16-31)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 //Three Byte: 8 bit type, 16-bit delta
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 //Four byte: 8-bit type, 24-bit signed delta
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 #define FORMAT_3BYTE 0xE0
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 #define FORMAT_4BYTE 0xF0
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
181 static uint8_t last_event_type = 0xFF;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
182 static uint32_t last_delta;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 static void event_header(uint8_t type, uint32_t cycle)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 uint32_t delta = cycle - last;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
186 if (multi_count) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
187 if (type != last_event_type || delta != last_delta) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
188 finish_multi();
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
189 } else {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
190 ++multi_count;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
191 if (multi_count == 17) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
192 finish_multi();
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
193 last_event_type = 0xFF;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
194 }
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
195 return;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
196 }
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
197 } else if (type == last_event_type && delta == last_delta && type != EVENT_FLUSH) {
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
198 //make some room
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
199 save_int8(&buffer, 0);
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
200 //shift existing command
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
201 memmove(buffer.data + multi_start + 1, buffer.data + multi_start, buffer.size - multi_start - 1);
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
202 buffer.data[multi_start] = EVENT_MULTI << 4;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
203 multi_count = 2;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
204 return;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
205 }
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
206 multi_start = buffer.size;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
207 last_event_type = type;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
208 last_delta = delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
209
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 if (delta > 65535) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 save_int8(&buffer, FORMAT_4BYTE | type);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 save_int8(&buffer, delta >> 16);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 save_int16(&buffer, delta);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 } else if (delta >= 16 && delta < 32) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 save_int8(&buffer, type << 4 | (delta - 16));
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 } else {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 save_int8(&buffer, FORMAT_3BYTE | type);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 save_int16(&buffer, delta);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 void event_cycle_adjust(uint32_t cycle, uint32_t deduction)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 {
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
224 if (!fully_active && !mem_reader) {
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 return;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 event_header(EVENT_ADJUST, cycle);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 last = cycle - deduction;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 save_int32(&buffer, deduction);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
232 static uint8_t next_available_player(void)
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
233 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
234 uint8_t lowest = 0xFF;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
235 int lowest_index = -1;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
236 for (int i = 0; i < num_available_players; i++)
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
237 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
238 if (available_players[i] < lowest) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
239 lowest = available_players[i];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
240 lowest_index = i;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
241 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
242 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
243 if (lowest_index >= 0) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
244 available_players[lowest_index] = available_players[num_available_players - 1];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
245 --num_available_players;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
246 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
247 return lowest;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
248 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
249
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 static void flush_socket(void)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
252 int remote_sock = accept(listen_sock, NULL, NULL);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
253 if (remote_sock != -1) {
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 if (num_remotes == 7) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
255 socket_close(remote_sock);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 } else {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 printf("remote %d connected\n", num_remotes);
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
258 uint8_t player = next_available_player();
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
259 remotes[num_remotes++] = (remote){
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
260 .sock = remote_sock,
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
261 .send_progress = NULL,
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
262 .players = {player},
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
263 .num_players = player == 0xFF ? 0 : 1
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
264 };
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 current_system->save_state = EVENTLOG_SLOT + 1;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
268 uint8_t *min_progress = compressed;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 for (int i = 0; i < num_remotes; i++) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
270 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
271 uint8_t recv_buffer[1500];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
272 int bytes = recv(remotes[i].sock, recv_buffer, sizeof(recv_buffer), 0);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 for (int j = 0; j < bytes; j++)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
275 uint8_t cmd = recv_buffer[j];
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 switch(cmd)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 case CMD_GAMEPAD_DOWN:
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 case CMD_GAMEPAD_UP: {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 ++j;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 if (j < bytes) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
282 uint8_t button = recv_buffer[j];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
283 uint8_t pad = (button >> 5) - 1;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 button &= 0x1F;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
285 if (pad < remotes[i].num_players) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
286 pad = remotes[i].players[pad];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
287 if (cmd == CMD_GAMEPAD_DOWN) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
288 current_system->gamepad_down(current_system, pad, button);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
289 } else {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
290 current_system->gamepad_up(current_system, pad, button);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
291 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 } else {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 warning("Received incomplete command %X\n", cmd);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 break;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 default:
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 warning("Unrecognized remote command %X\n", cmd);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 j = bytes;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 }
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
303 int sent = 1;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
304 while (sent && output_stream.next_out > remotes[i].send_progress)
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
305 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
306 sent = send(remotes[i].sock, remotes[i].send_progress, output_stream.next_out - remotes[i].send_progress, 0);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
307 if (sent >= 0) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
308 remotes[i].send_progress += sent;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
309 } else if (!socket_error_is_wouldblock()) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
310 socket_close(remotes[i].sock);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
311 for (int j = 0; j < remotes[i].num_players; j++) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
312 available_players[num_available_players++] = remotes[i].players[j];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
313 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
314 remotes[i] = remotes[num_remotes-1];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
315 num_remotes--;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
316 if (!num_remotes) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
317 //last remote disconnected, reset buffers/deflate
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
318 fully_active = 0;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
319 deflateReset(&output_stream);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
320 output_stream.next_out = compressed;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
321 output_stream.avail_out = compressed_storage;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
322 buffer.size = 0;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
323 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
324 i--;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
325 break;
1973
cd163b230cf9 Fix handling of remote disconnects
Michael Pavone <pavone@retrodev.com>
parents: 1972
diff changeset
326 }
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
327 if (remotes[i].send_progress > min_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
328 min_progress = remotes[i].send_progress;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
329 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
333 if (min_progress == output_stream.next_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
334 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
335 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
336 for (int i = 0; i < num_remotes; i++) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
337 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
338 remotes[i].send_progress = compressed;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
339 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
340 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
344 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
345 static pthread_mutex_t event_log_lock = PTHREAD_MUTEX_INITIALIZER;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
346 static pthread_cond_t event_cond = PTHREAD_COND_INITIALIZER;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
347 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
348 static event_reader *mem_reader;
1971
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
349 uint8_t wrote_since_last_flush;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 void event_log(uint8_t type, uint32_t cycle, uint8_t size, uint8_t *payload)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 {
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
352 if (!fully_active && (!mem_reader || type == EVENT_PSG_REG || type == EVENT_YM_REG)) {
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 return;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 }
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
355
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 event_header(type, cycle);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 last = cycle;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358 save_buffer8(&buffer, payload, size);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
359 if (!multi_count) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
360 last_event_type = 0xFF;
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
361 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
362 if (mem_reader) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
363 pthread_mutex_lock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
364 if (mem_reader->buffer.cur_pos) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
365 memmove(buffer.data, buffer.data + mem_reader->buffer.cur_pos, buffer.size - mem_reader->buffer.cur_pos);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
366 buffer.size -= mem_reader->buffer.cur_pos;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
367 mem_reader->buffer.cur_pos = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
368 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
369 mem_reader->buffer.size = buffer.size;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
370 pthread_cond_signal(&event_cond);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
371 pthread_mutex_unlock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
372 } else
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
373 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
374 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
375 output_stream.avail_in = buffer.size - (output_stream.next_in - buffer.data);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
376 int result = deflate(&output_stream, Z_NO_FLUSH);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
377 if (result != Z_OK) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
378 fatal_error("deflate returned %d\n", result);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
379 }
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
380 if (listen_sock) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
381 if ((output_stream.next_out - compressed) > 1280 || !output_stream.avail_out) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
382 flush_socket();
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
383 wrote_since_last_flush = 1;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
384 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
385 } else if (!output_stream.avail_out) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
386 fwrite(compressed, 1, compressed_storage, event_file);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
387 output_stream.next_out = compressed;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
388 output_stream.avail_out = compressed_storage;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
389 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
390 if (!output_stream.avail_in) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
391 buffer.size = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
392 output_stream.next_in = buffer.data;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
393 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
394 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
398 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
399 void event_log_mem_stop(void)
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
400 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
401 pthread_mutex_lock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
402 mem_reader_quit = 1;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
403 pthread_cond_signal(&event_cond);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
404 pthread_mutex_unlock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
405 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
406 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
407
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
408 static uint32_t last_word_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 void event_vram_word(uint32_t cycle, uint32_t address, uint16_t value)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 uint32_t delta = address - last_word_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 if (delta < 256) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 uint8_t buffer[3] = {delta, value >> 8, value};
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 event_log(EVENT_VRAM_WORD_DELTA, cycle, sizeof(buffer), buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 } else {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 uint8_t buffer[5] = {address >> 16, address >> 8, address, value >> 8, value};
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 event_log(EVENT_VRAM_WORD, cycle, sizeof(buffer), buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 last_word_address = address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 static uint32_t last_byte_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 void event_vram_byte(uint32_t cycle, uint16_t address, uint8_t byte, uint8_t auto_inc)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
425 uint32_t delta = address - last_byte_address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 if (delta == 1) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 event_log(EVENT_VRAM_BYTE_ONE, cycle, sizeof(byte), &byte);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 } else if (delta == auto_inc) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 event_log(EVENT_VRAM_BYTE_AUTO, cycle, sizeof(byte), &byte);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 } else if (delta < 256) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 uint8_t buffer[2] = {delta, byte};
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 event_log(EVENT_VRAM_BYTE_DELTA, cycle, sizeof(buffer), buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 } else {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 uint8_t buffer[3] = {address >> 8, address, byte};
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 event_log(EVENT_VRAM_BYTE, cycle, sizeof(buffer), buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 last_byte_address = address;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 static size_t send_all(int sock, uint8_t *data, size_t size, int flags)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 size_t total = 0, sent = 1;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 while(sent > 0 && total < size)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
444 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 sent = send(sock, data + total, size - total, flags);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 if (sent > 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 total += sent;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 return total;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
453 void deflate_flush(uint8_t full)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
454 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
455 output_stream.avail_in = buffer.size - (output_stream.next_in - buffer.data);
1972
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
456 uint8_t force = full;
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
457 while (output_stream.avail_in || force)
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
458 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
459 if (!output_stream.avail_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
460 size_t old_storage = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
461 uint8_t *old_compressed = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
462 compressed_storage *= 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
463 compressed = realloc(compressed, compressed_storage);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
464 output_stream.next_out = compressed + old_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
465 output_stream.avail_out = old_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
466 for (int i = 0; i < num_remotes; i++) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
467 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
468 remotes[i].send_progress = compressed + (remotes[i].send_progress - old_compressed);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
469 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
470 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
471 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
472 int result = deflate(&output_stream, full ? Z_FINISH : Z_SYNC_FLUSH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
473 if (result != (full ? Z_STREAM_END : Z_OK)) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
474 fatal_error("deflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
475 }
1972
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
476 if (full && result == Z_STREAM_END) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
477 result = deflateReset(&output_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
478 if (result != Z_OK) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
479 fatal_error("deflateReset returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
480 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
481 }
1972
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
482 force = 0;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
483 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
484 output_stream.next_in = buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
485 buffer.size = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
486 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
487
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 void event_state(uint32_t cycle, serialize_buffer *state)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 if (!fully_active) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 last = cycle;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 uint8_t header[] = {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 EVENT_STATE << 4, last >> 24, last >> 16, last >> 8, last,
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 last_word_address >> 16, last_word_address >> 8, last_word_address,
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 last_byte_address >> 8, last_byte_address,
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 state->size >> 16, state->size >> 8, state->size
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 };
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
499 uint8_t sent_system_start = 0;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 for (int i = 0; i < num_remotes; i++)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
502 if (!remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
503 if (send_all(remotes[i].sock, system_start, system_start_size, 0) == system_start_size) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
504 sent_system_start = 1;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 } else {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
506 socket_close(remotes[i].sock);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 remotes[i] = remotes[num_remotes-1];
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 num_remotes--;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 i--;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
513 if (sent_system_start) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
514 if (fully_active) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
515 if (multi_count) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
516 finish_multi();
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
517 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
518 //full flush is needed so new and old clients can share a stream
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
519 deflate_flush(1);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
520 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
521 save_buffer8(&buffer, header, sizeof(header));
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
522 save_buffer8(&buffer, state->data, state->size);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
523 size_t old_compressed_size = output_stream.next_out - compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
524 deflate_flush(1);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
525 size_t state_size = output_stream.next_out - compressed - old_compressed_size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
526 for (int i = 0; i < num_remotes; i++) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
527 if (!remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
528 if (send_all(remotes[i].sock, compressed + old_compressed_size, state_size, 0) == state_size) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
529 remotes[i].send_progress = compressed + old_compressed_size;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
530 socket_blocking(remotes[i].sock, 0);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
531 int flag = 1;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
532 setsockopt(remotes[i].sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&flag, sizeof(flag));
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
533 fully_active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
534 } else {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
535 socket_close(remotes[i].sock);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
536 remotes[i] = remotes[num_remotes-1];
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
537 num_remotes--;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
538 i--;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
539 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
540 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
541 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
542 output_stream.next_out = compressed + old_compressed_size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
543 output_stream.avail_out = compressed_storage - old_compressed_size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
544 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 void event_flush(uint32_t cycle)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 if (!active) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 return;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 }
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
552 if (fully_active || mem_reader) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
553 event_header(EVENT_FLUSH, cycle);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
554 last = cycle;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
555
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
556 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
557 if (mem_reader) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
558 pthread_mutex_lock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
559 if (mem_reader->buffer.cur_pos) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
560 memmove(buffer.data, buffer.data + mem_reader->buffer.cur_pos, buffer.size - mem_reader->buffer.cur_pos);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
561 buffer.size -= mem_reader->buffer.cur_pos;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
562 mem_reader->buffer.cur_pos = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
563 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
564 mem_reader->buffer.size = buffer.size;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
565 pthread_cond_signal(&event_cond);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
566 pthread_mutex_unlock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
567 } else
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
568 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
569 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
570 deflate_flush(0);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
571 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 if (event_file) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
574 fwrite(compressed, 1, output_stream.next_out - compressed, event_file);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575 fflush(event_file);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
576 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
577 output_stream.avail_out = compressed_storage;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 } else if (listen_sock) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
579 flush_socket();
1971
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
580 wrote_since_last_flush = 0;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583
1971
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
584 void event_soft_flush(uint32_t cycle)
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
585 {
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
586 if ((!fully_active && !mem_reader) || wrote_since_last_flush || event_file) {
1971
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
587 return;
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
588 }
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
589 event_header(EVENT_FLUSH, cycle);
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
590 last = cycle;
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
591
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
592 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
593 if (mem_reader) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
594 pthread_mutex_lock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
595 if (mem_reader->buffer.cur_pos) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
596 memmove(buffer.data, buffer.data + mem_reader->buffer.cur_pos, buffer.size - mem_reader->buffer.cur_pos);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
597 buffer.size -= mem_reader->buffer.cur_pos;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
598 mem_reader->buffer.cur_pos = 0;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
599 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
600 mem_reader->buffer.size = buffer.size;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
601 pthread_cond_signal(&event_cond);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
602 pthread_mutex_unlock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
603 } else
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
604 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
605 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
606 deflate_flush(0);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
607 flush_socket();
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
608 }
1971
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
609 }
80920c21bb52 Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
Michael Pavone <pavone@retrodev.com>
parents: 1967
diff changeset
610
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
611 static void init_event_reader_common(event_reader *reader)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
612 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
613 reader->last_cycle = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
614 reader->repeat_event = 0xFF;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
615 reader->storage = 512 * 1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
616 init_deserialize(&reader->buffer, malloc(reader->storage), reader->storage);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
617 reader->buffer.size = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
618 memset(&reader->input_stream, 0, sizeof(reader->input_stream));
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
619
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
620 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
621
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
622 void init_event_reader(event_reader *reader, uint8_t *data, size_t size)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
623 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 reader->socket = 0;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 reader->last_cycle = 0;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
626 reader->repeat_event = 0xFF;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
627 init_event_reader_common(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
628 uint8_t name_len = data[1];
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
629 reader->buffer.size = name_len + 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
630 memcpy(reader->buffer.data, data, reader->buffer.size);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
631 reader->input_stream.next_in = data + reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
632 reader->input_stream.avail_in = size - reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
633
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
634 int result = inflateInit(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
635 if (Z_OK != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
636 fatal_error("inflateInit returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
637 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
638 reader->input_stream.next_out = reader->buffer.data + reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
639 reader->input_stream.avail_out = reader->storage - reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
640 result = inflate(&reader->input_stream, Z_NO_FLUSH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
641 if (Z_OK != result && Z_STREAM_END != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
642 fatal_error("inflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
643 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
644 reader->buffer.size = reader->input_stream.next_out - reader->buffer.data;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
645 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
646
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
647 void init_event_reader_tcp(event_reader *reader, char *address, char *port)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
648 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
649 struct addrinfo request, *result;
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
650 socket_init();
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
651 memset(&request, 0, sizeof(request));
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
652 request.ai_family = AF_INET;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
653 request.ai_socktype = SOCK_STREAM;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
654 request.ai_flags = AI_PASSIVE;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
655 getaddrinfo(address, port, &request, &result);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
656
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
657 reader->socket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
658 if (reader->socket < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
659 fatal_error("Failed to create socket for event log connection to %s:%s\n", address, port);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
660 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
661 if (connect(reader->socket, result->ai_addr, result->ai_addrlen) < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
662 fatal_error("Failed to connect to %s:%s for event log stream\n", address, port);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
663 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
664
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
665 init_event_reader_common(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
666 reader->socket_buffer_size = 256 * 1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
667 reader->socket_buffer = malloc(reader->socket_buffer_size);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
668
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
669 while(reader->buffer.size < 3 || reader->buffer.size < 3 + reader->buffer.data[2])
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
670 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
671 int bytes = recv(reader->socket, reader->buffer.data + reader->buffer.size, reader->storage - reader->buffer.size, 0);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 if (bytes < 0) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 fatal_error("Failed to receive system init from %s:%s\n", address, port);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
674 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
675 reader->buffer.size += bytes;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
676 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
677 size_t init_msg_len = 3 + reader->buffer.data[2];
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
678 memcpy(reader->socket_buffer, reader->buffer.data + init_msg_len, reader->buffer.size - init_msg_len);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
679 reader->input_stream.next_in = reader->socket_buffer;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
680 reader->input_stream.avail_in = reader->buffer.size - init_msg_len;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
681 reader->buffer.size = init_msg_len;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
682 int res = inflateInit(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
683 if (Z_OK != res) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
684 fatal_error("inflateInit returned %d\n", res);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
685 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
686 reader->input_stream.next_out = reader->buffer.data + init_msg_len;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
687 reader->input_stream.avail_out = reader->storage - init_msg_len;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
688 res = inflate(&reader->input_stream, Z_NO_FLUSH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
689 if (Z_OK != res && Z_BUF_ERROR != res) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
690 fatal_error("inflate returned %d in init_event_reader_tcp\n", res);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
691 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
692 int flag = 1;
1949
5a76a7373823 Get WIP net play code compiling on Windows and cleanup some unistd.h includes
Michael Pavone <pavone@retrodev.com>
parents: 1948
diff changeset
693 setsockopt(reader->socket, IPPROTO_TCP, TCP_NODELAY, (const char *)&flag, sizeof(flag));
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
695
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
696 static void read_from_socket(event_reader *reader)
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
697 {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
698 if (reader->socket_buffer_size - reader->input_stream.avail_in < 128 * 1024) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
699 reader->socket_buffer_size *= 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
700 uint8_t *new_buf = malloc(reader->socket_buffer_size);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
701 memcpy(new_buf, reader->input_stream.next_in, reader->input_stream.avail_in);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
702 free(reader->socket_buffer);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
703 reader->socket_buffer = new_buf;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
704 reader->input_stream.next_in = new_buf;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
705 } else if (
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
706 reader->input_stream.next_in - reader->socket_buffer >= reader->input_stream.avail_in
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
707 && reader->input_stream.next_in - reader->socket_buffer + reader->input_stream.avail_in >= reader->socket_buffer_size/2
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
708 ) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
709 memmove(reader->socket_buffer, reader->input_stream.next_in, reader->input_stream.avail_in);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
710 reader->input_stream.next_in = reader->socket_buffer;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
711 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
712 uint8_t *space_start = reader->input_stream.next_in + reader->input_stream.avail_in;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
713 size_t space = (reader->socket_buffer + reader->socket_buffer_size) - space_start;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
714 int bytes = recv(reader->socket, space_start, space, 0);
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
715 if (bytes >= 0) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
716 reader->input_stream.avail_in += bytes;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
717 } else if (!socket_error_is_wouldblock()) {
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
718 fatal_error("Connection closed, error = %X\n", socket_last_error());
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
719 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
720 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
721
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
722 static void inflate_flush(event_reader *reader)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
723 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
724 if (reader->buffer.cur_pos > reader->storage / 2) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
725 memmove(reader->buffer.data, reader->buffer.data + reader->buffer.cur_pos, reader->buffer.size - reader->buffer.cur_pos);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
726 reader->buffer.size -= reader->buffer.cur_pos;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
727 reader->buffer.cur_pos = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
728 reader->input_stream.next_out = reader->buffer.data + reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
729 reader->input_stream.avail_out = reader->storage - reader->buffer.size;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
730 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
731 int result = inflate(&reader->input_stream, Z_SYNC_FLUSH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
732 if (Z_OK != result && Z_STREAM_END != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
733 fatal_error("inflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
734 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
735 reader->buffer.size = reader->input_stream.next_out - reader->buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
736 if (result == Z_STREAM_END && (reader->socket || reader->input_stream.avail_in)) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
737 inflateReset(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
738 if (reader->input_stream.avail_in) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
739 inflate_flush(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
740 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
741 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
742
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
743 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
744
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
745 void reader_ensure_data(event_reader *reader, size_t bytes)
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
746 {
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
747 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
748 if (reader == mem_reader) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
749 while (!mem_reader_quit && reader->buffer.size - reader->buffer.cur_pos < bytes) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
750 pthread_cond_wait(&event_cond, &event_log_lock);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
751 }
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
752 } else
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
753 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
754 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
755 if (reader->buffer.size - reader->buffer.cur_pos < bytes) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
756 if (reader->input_stream.avail_in) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
757 inflate_flush(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
758 }
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
759 if (reader->socket) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
760 while (reader->buffer.size - reader->buffer.cur_pos < bytes) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
761 read_from_socket(reader);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
762 inflate_flush(reader);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
763 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
764 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
765 }
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
766 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
767 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
768
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
769 uint8_t reader_next_event(event_reader *reader, uint32_t *cycle_out)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
770 {
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
771 if (reader->repeat_remaining) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
772 reader->repeat_remaining--;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
773 *cycle_out = reader->last_cycle + reader->repeat_delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
774 reader->last_cycle = *cycle_out;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
775 return reader->repeat_event;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
776 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
777 reader_ensure_data(reader, 1);
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
778 if (reader == mem_reader && mem_reader_quit) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
779 return EVENT_EOF;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
780 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
781 uint8_t header = load_int8(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
782 uint8_t ret;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
783 uint32_t delta;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
784 uint8_t multi_start = 0;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
785 if ((header & 0xF0) == (EVENT_MULTI << 4)) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
786 reader->repeat_remaining = (header & 0xF) + 1;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
787 multi_start = 1;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
788 reader_ensure_data(reader, 1);
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
789 header = load_int8(&reader->buffer);
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
790 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
791 if ((header & 0xF0) < FORMAT_3BYTE) {
1948
d01527615c7c Fix short event format decode bug
Michael Pavone <pavone@retrodev.com>
parents: 1947
diff changeset
792 delta = (header & 0xF) + 16;
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
793 ret = header >> 4;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
794 } else if ((header & 0xF0) == FORMAT_3BYTE) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
795 reader_ensure_data(reader, 2);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
796 delta = load_int16(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
797 ret = header & 0xF;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
798 } else {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
799 reader_ensure_data(reader, 3);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
800 delta = load_int8(&reader->buffer) << 16;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
801 //sign extend 24-bit delta to 32-bit
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
802 if (delta & 0x800000) {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
803 delta |= 0xFF000000;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
804 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
805 delta |= load_int16(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
806 ret = header & 0xF;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
807 }
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
808 if (multi_start) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
809 reader->repeat_event = ret;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
810 reader->repeat_delta = delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
811 }
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
812 *cycle_out = reader->last_cycle + delta;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
813 reader->last_cycle = *cycle_out;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
814 if (ret == EVENT_ADJUST) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
815 reader_ensure_data(reader, 4);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
816 size_t old_pos = reader->buffer.cur_pos;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
817 uint32_t adjust = load_int32(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
818 reader->buffer.cur_pos = old_pos;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
819 reader->last_cycle -= adjust;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
820 } else if (ret == EVENT_STATE) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
821 reader_ensure_data(reader, 8);
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
822 reader->last_cycle = load_int32(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
823 reader->last_word_address = load_int8(&reader->buffer) << 16;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
824 reader->last_word_address |= load_int16(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
825 reader->last_byte_address = load_int16(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
826 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
827 return ret;
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
828 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
829
2686
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
830 #ifndef _WIN32
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
831 uint8_t mem_reader_next_event(event_out *out)
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
832 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
833 uint8_t ret = EVENT_EOF;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
834 if (mem_reader->repeat_remaining) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
835 mem_reader->repeat_remaining--;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
836 mem_reader->last_cycle += mem_reader->repeat_delta;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
837 out->cycle = mem_reader->last_cycle;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
838 ret = mem_reader->repeat_event;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
839 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
840 if (ret < EVENT_PSG_REG) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
841 return ret;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
842 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
843 pthread_mutex_lock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
844 if (ret == EVENT_EOF) {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
845 ret = reader_next_event(mem_reader, &out->cycle);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
846 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
847 switch (ret)
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
848 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
849 case EVENT_ADJUST:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
850 out->address = load_int32(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
851 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
852 case EVENT_VRAM_BYTE:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
853 out->address = load_int16(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
854 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
855 case EVENT_VRAM_BYTE_DELTA:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
856 out->address = mem_reader->last_byte_address + load_int8(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
857 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
858 case EVENT_VRAM_BYTE_ONE:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
859 out->address = mem_reader->last_byte_address + 1;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
860 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
861 case EVENT_VRAM_BYTE_AUTO:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
862 out->address = mem_reader->last_byte_address + out->autoinc;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
863 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
864 case EVENT_VRAM_WORD:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
865 out->address = load_int8(&mem_reader->buffer) << 16;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
866 out->address |= load_int16(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
867 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
868 case EVENT_VRAM_WORD_DELTA:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
869 out->address = mem_reader->last_word_address + load_int8(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
870 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
871 case EVENT_VDP_REG:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
872 case EVENT_VDP_INTRAM:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
873 out->address = load_int8(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
874 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
875 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
876 switch (ret)
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
877 {
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
878 case EVENT_VRAM_BYTE:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
879 case EVENT_VRAM_BYTE_DELTA:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
880 case EVENT_VRAM_BYTE_ONE:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
881 case EVENT_VRAM_BYTE_AUTO:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
882 mem_reader->last_byte_address = out->address;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
883 case EVENT_VDP_REG:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
884 out->value = load_int8(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
885 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
886 case EVENT_VRAM_WORD:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
887 case EVENT_VRAM_WORD_DELTA:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
888 mem_reader->last_word_address = out->address;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
889 case EVENT_VDP_INTRAM:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
890 out->value = load_int16(&mem_reader->buffer);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
891 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
892 case EVENT_EOF:
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
893 free(mem_reader);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
894 mem_reader = NULL;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
895 break;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
896 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
897 pthread_mutex_unlock(&event_log_lock);
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
898 return ret;
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
899 }
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
900 #endif
05915f01046d WIP attempt to move VDP rendering to a separate thread
Michael Pavone <pavone@retrodev.com>
parents: 2681
diff changeset
901
1947
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
902 uint8_t reader_system_type(event_reader *reader)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
903 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
904 return load_int8(&reader->buffer);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
905 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
906
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
907 void reader_send_gamepad_event(event_reader *reader, uint8_t pad, uint8_t button, uint8_t down)
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
908 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
909 uint8_t buffer[] = {down ? CMD_GAMEPAD_DOWN : CMD_GAMEPAD_UP, pad << 5 | button};
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
910 //TODO: Deal with the fact that we're not in blocking mode so this may not actually send all
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
911 //if the buffer is full
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
912 send_all(reader->socket, buffer, sizeof(buffer), 0);
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
913 }