annotate event_log.c @ 2681:c4256ce2c45a

Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
author Michael Pavone <pavone@retrodev.com>
date Wed, 26 Mar 2025 01:20:55 -0700
parents a042e046f7f2
children 05915f01046d
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>
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #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
13
1986
a042e046f7f2 Fix libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1974
diff changeset
14 #include <stdlib.h>
a042e046f7f2 Fix libretro target
Michael Pavone <pavone@retrodev.com>
parents: 1974
diff changeset
15 #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
16 #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
17 #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
18 #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
19 #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
20 #include "saves.h"
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
21 #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
22
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 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
24 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
25 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
26 };
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 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
29 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
30 static serialize_buffer buffer;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
31 static uint8_t *compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
32 static size_t compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
33 static z_stream output_stream;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
34 static uint32_t last;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
35
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
36 static void event_log_common_init(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
37 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
38 init_serialize(&buffer);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
39 compressed_storage = 128*1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
40 compressed = malloc(compressed_storage);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
41 deflateInit(&output_stream, 9);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
42 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
43 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
44 output_stream.avail_in = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
45 output_stream.next_in = buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
46 last = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
47 active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
48 }
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 static uint8_t multi_count;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
51 static size_t multi_start;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
52 static void finish_multi(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
53 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
54 buffer.data[multi_start] |= multi_count - 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
55 multi_count = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
56 }
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 static void file_finish(void)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
59 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
60 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
61 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
62 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
63 int result = deflate(&output_stream, Z_FINISH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
64 if (Z_STREAM_END != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
65 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
66 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
67 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
68 fclose(event_file);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
69 }
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
70
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 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
72 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
73 {
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 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
75 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
76 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
77 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
78 }
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 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
80 event_log_common_init();
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
81 fully_active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
82 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
83 }
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
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
85 typedef struct {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
86 uint8_t *send_progress;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
87 int sock;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
88 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
89 uint8_t num_players;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
90 } remote;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
91
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
92 static int listen_sock;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
93 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
94 static int num_remotes;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
95 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
96 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
97 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
98 {
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 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
100 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
101 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
102 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
103 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
104 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
105 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
106
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 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
108 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
109 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
110 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
111 }
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
112 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
113 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
114 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
115 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
116 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
117 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
118 }
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 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
120 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
121 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
122 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
123 }
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
124 socket_blocking(listen_sock, 0);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
125 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
126 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
127 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
128 }
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 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
131 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
132 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
133 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 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
135 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
136 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 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
138 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
139 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
140 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
141 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
142 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 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
144 save_buffer8(&buffer, name, strlen(name));
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
145 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
146 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
147 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
148 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
149 } else {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
150 //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
151 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
152 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
153 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
154 }
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 //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
157 //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
158 //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
159 //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
160 #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
161 #define FORMAT_4BYTE 0xF0
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
162 static uint8_t last_event_type = 0xFF;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
163 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
164 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
165 {
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 uint32_t delta = cycle - last;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
167 if (multi_count) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
168 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
169 finish_multi();
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
170 } else {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
171 ++multi_count;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
172 if (multi_count == 17) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
173 finish_multi();
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
174 last_event_type = 0xFF;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
175 }
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
176 return;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
177 }
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
178 } 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
179 //make some room
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
180 save_int8(&buffer, 0);
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
181 //shift existing command
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
182 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
183 buffer.data[multi_start] = EVENT_MULTI << 4;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
184 multi_count = 2;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
185 return;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
186 }
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
187 multi_start = buffer.size;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
188 last_event_type = type;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
189 last_delta = delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
190
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
191 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
192 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
193 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
194 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
195 } 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
196 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
197 } 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
198 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
199 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
200 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 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
204 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 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
206 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
207 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 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
209 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
210 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
211 }
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
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
213 static uint8_t next_available_player(void)
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
214 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
215 uint8_t lowest = 0xFF;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
216 int lowest_index = -1;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
217 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
218 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
219 if (available_players[i] < lowest) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
220 lowest = available_players[i];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
221 lowest_index = i;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
222 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
223 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
224 if (lowest_index >= 0) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
225 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
226 --num_available_players;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
227 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
228 return lowest;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
229 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
230
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
231 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
232 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
233 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
234 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
235 if (num_remotes == 7) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
236 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
237 } 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
238 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
239 uint8_t player = next_available_player();
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
240 remotes[num_remotes++] = (remote){
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
241 .sock = remote_sock,
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
242 .send_progress = NULL,
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
243 .players = {player},
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
244 .num_players = player == 0xFF ? 0 : 1
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
245 };
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
246 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
247 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
249 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
250 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
251 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
252 uint8_t recv_buffer[1500];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
253 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
254 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
255 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
256 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
257 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
258 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 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
260 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
261 ++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
262 if (j < bytes) {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
263 uint8_t button = recv_buffer[j];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
264 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
265 button &= 0x1F;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
266 if (pad < remotes[i].num_players) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
267 pad = remotes[i].players[pad];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
268 if (cmd == CMD_GAMEPAD_DOWN) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
269 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
270 } else {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
271 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
272 }
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 }
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 } 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
275 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
276 }
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 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
278 }
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 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
280 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
281 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
282 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 }
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
284 int sent = 1;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
285 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
286 {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
287 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
288 if (sent >= 0) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
289 remotes[i].send_progress += sent;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
290 } else if (!socket_error_is_wouldblock()) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
291 socket_close(remotes[i].sock);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
292 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
293 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
294 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
295 remotes[i] = remotes[num_remotes-1];
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
296 num_remotes--;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
297 if (!num_remotes) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
298 //last remote disconnected, reset buffers/deflate
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
299 fully_active = 0;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
300 deflateReset(&output_stream);
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
301 output_stream.next_out = compressed;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
302 output_stream.avail_out = compressed_storage;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
303 buffer.size = 0;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
304 }
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
305 i--;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
306 break;
1973
cd163b230cf9 Fix handling of remote disconnects
Michael Pavone <pavone@retrodev.com>
parents: 1972
diff changeset
307 }
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
308 if (remotes[i].send_progress > min_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
309 min_progress = remotes[i].send_progress;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
310 }
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
311 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
314 if (min_progress == output_stream.next_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
315 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
316 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
317 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
318 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
319 remotes[i].send_progress = compressed;
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
320 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
321 }
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
322 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324
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
325 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
326 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
327 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 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
329 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
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 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
332 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
333 save_buffer8(&buffer, payload, size);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
334 if (!multi_count) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
335 last_event_type = 0xFF;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
336 output_stream.avail_in = buffer.size - (output_stream.next_in - buffer.data);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
337 int result = deflate(&output_stream, Z_NO_FLUSH);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
338 if (result != Z_OK) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
339 fatal_error("deflate returned %d\n", result);
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
340 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
341 if (listen_sock) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
342 if ((output_stream.next_out - compressed) > 1280 || !output_stream.avail_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
343 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
344 wrote_since_last_flush = 1;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
345 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
346 } else if (!output_stream.avail_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
347 fwrite(compressed, 1, compressed_storage, event_file);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
348 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
349 output_stream.avail_out = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
350 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
351 if (!output_stream.avail_in) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
352 buffer.size = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
353 output_stream.next_in = buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
354 }
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
355 }
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 }
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
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 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
359 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
360 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 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
362 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
363 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
364 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
365 } 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
366 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
367 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
368 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 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
370 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 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
373 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
374 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 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
376 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
377 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
378 } 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
379 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
380 } 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
381 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
382 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
383 } 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
384 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
385 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
386 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387 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
388 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 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
391 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 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
393 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
394 {
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 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
396 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
397 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
398 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 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
401 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
403 void deflate_flush(uint8_t full)
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
404 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
405 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
406 uint8_t force = full;
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
407 while (output_stream.avail_in || force)
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
408 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
409 if (!output_stream.avail_out) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
410 size_t old_storage = compressed_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
411 uint8_t *old_compressed = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
412 compressed_storage *= 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
413 compressed = realloc(compressed, compressed_storage);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
414 output_stream.next_out = compressed + old_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
415 output_stream.avail_out = old_storage;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
416 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
417 if (remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
418 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
419 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
420 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
421 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
422 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
423 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
424 fatal_error("deflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
425 }
1972
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
426 if (full && result == Z_STREAM_END) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
427 result = deflateReset(&output_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
428 if (result != Z_OK) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
429 fatal_error("deflateReset returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
430 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
431 }
1972
f2d37131840e Fix "full" deflate flush so multiple remotes can successfully join
Michael Pavone <pavone@retrodev.com>
parents: 1971
diff changeset
432 force = 0;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
433 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
434 output_stream.next_in = buffer.data;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
435 buffer.size = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
436 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
437
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
438 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
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 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
441 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
442 }
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 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
444 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
445 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
446 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
447 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
448 };
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
449 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
450 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
451 {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
452 if (!remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
453 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
454 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
455 } else {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
456 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
457 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
458 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
459 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
460 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
463 if (sent_system_start) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
464 if (fully_active) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
465 if (multi_count) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
466 finish_multi();
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
467 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
468 //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
469 deflate_flush(1);
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 save_buffer8(&buffer, header, sizeof(header));
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
472 save_buffer8(&buffer, state->data, state->size);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
473 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
474 deflate_flush(1);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
475 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
476 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
477 if (!remotes[i].send_progress) {
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
478 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
479 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
480 socket_blocking(remotes[i].sock, 0);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
481 int flag = 1;
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
482 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
483 fully_active = 1;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
484 } else {
1974
04b79a725b7f Better handling of pad assignment to remotes
Michael Pavone <pavone@retrodev.com>
parents: 1973
diff changeset
485 socket_close(remotes[i].sock);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
486 remotes[i] = remotes[num_remotes-1];
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
487 num_remotes--;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
488 i--;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
489 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
490 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
491 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
492 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
493 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
494 }
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
495 }
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
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 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
498 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 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
500 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
501 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
502 if (fully_active) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
503 event_header(EVENT_FLUSH, cycle);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
504 last = cycle;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
505
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
506 deflate_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
507 }
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 if (event_file) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
509 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
510 fflush(event_file);
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
511 output_stream.next_out = compressed;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
512 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
513 } 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
514 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
515 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
516 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518
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
519 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
520 {
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
521 if (!fully_active || wrote_since_last_flush || event_file) {
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
522 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
523 }
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
524 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
525 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
526
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
527 deflate_flush(0);
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
528 flush_socket();
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
529 }
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
530
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
531 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
532 {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
533 reader->last_cycle = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
534 reader->repeat_event = 0xFF;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
535 reader->storage = 512 * 1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
536 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
537 reader->buffer.size = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
538 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
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
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
542 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
543 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 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
545 reader->last_cycle = 0;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
546 reader->repeat_event = 0xFF;
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
547 init_event_reader_common(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
548 uint8_t name_len = data[1];
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
549 reader->buffer.size = name_len + 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
550 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
551 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
552 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
553
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
554 int result = inflateInit(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
555 if (Z_OK != result) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
556 fatal_error("inflateInit returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
557 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
558 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
559 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
560 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
561 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
562 fatal_error("inflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
563 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
564 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
565 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 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
568 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 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
570 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
571 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
572 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
573 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
574 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
575 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
576
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 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
578 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
579 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
580 }
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 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
582 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
583 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
584
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
585 init_event_reader_common(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
586 reader->socket_buffer_size = 256 * 1024;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
587 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
588
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
589 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
590 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591 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
592 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
593 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
594 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 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
596 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
597 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
598 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
599 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
600 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
601 reader->buffer.size = init_msg_len;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
602 int res = inflateInit(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
603 if (Z_OK != res) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
604 fatal_error("inflateInit returned %d\n", res);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
605 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
606 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
607 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
608 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
609 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
610 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
611 }
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
612 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
613 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
614 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
616 static void read_from_socket(event_reader *reader)
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
617 {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
618 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
619 reader->socket_buffer_size *= 2;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
620 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
621 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
622 free(reader->socket_buffer);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
623 reader->socket_buffer = new_buf;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
624 reader->input_stream.next_in = new_buf;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
625 } else if (
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
626 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
627 && 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
628 ) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
629 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
630 reader->input_stream.next_in = reader->socket_buffer;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
631 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
632 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
633 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
634 int bytes = recv(reader->socket, space_start, space, 0);
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
635 if (bytes >= 0) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
636 reader->input_stream.avail_in += bytes;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
637 } else if (!socket_error_is_wouldblock()) {
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
638 fatal_error("Connection closed, error = %X\n", socket_last_error());
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
639 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
640 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
641
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
642 static void inflate_flush(event_reader *reader)
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 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
645 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
646 reader->buffer.size -= reader->buffer.cur_pos;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
647 reader->buffer.cur_pos = 0;
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
648 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
649 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
650 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
651 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
652 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
653 fatal_error("inflate returned %d\n", result);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
654 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
655 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
656 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
657 inflateReset(&reader->input_stream);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
658 if (reader->input_stream.avail_in) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
659 inflate_flush(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
660 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
661 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
662
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
663 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
664
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
665 void reader_ensure_data(event_reader *reader, size_t bytes)
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
666 {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
667 if (reader->buffer.size - reader->buffer.cur_pos < bytes) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
668 if (reader->input_stream.avail_in) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
669 inflate_flush(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
670 }
1967
bd70f1e15684 Make netplay remote sync to network rather than audio or video so it doesn't drift out of sync with the host
Michael Pavone <pavone@retrodev.com>
parents: 1958
diff changeset
671 if (reader->socket) {
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
672 while (reader->buffer.size - reader->buffer.cur_pos < bytes) {
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
673 read_from_socket(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
674 inflate_flush(reader);
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
675 }
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
676 }
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
677 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
678 }
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
679
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
680 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
681 {
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
682 if (reader->repeat_remaining) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
683 reader->repeat_remaining--;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
684 *cycle_out = reader->last_cycle + reader->repeat_delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
685 reader->last_cycle = *cycle_out;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
686 return reader->repeat_event;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
687 }
1958
9c01945b5d20 Use zlib to compress event log streams
Mike Pavone <pavone@retrodev.com>
parents: 1957
diff changeset
688 reader_ensure_data(reader, 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
689 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
690 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
691 uint32_t delta;
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
692 uint8_t multi_start = 0;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
693 if ((header & 0xF0) == (EVENT_MULTI << 4)) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
694 reader->repeat_remaining = (header & 0xF) + 1;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
695 multi_start = 1;
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
696 reader_ensure_data(reader, 1);
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
697 header = load_int8(&reader->buffer);
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
698 }
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
699 if ((header & 0xF0) < FORMAT_3BYTE) {
1948
d01527615c7c Fix short event format decode bug
Michael Pavone <pavone@retrodev.com>
parents: 1947
diff changeset
700 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
701 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
702 } else if ((header & 0xF0) == FORMAT_3BYTE) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
703 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
704 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
705 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
706 } else {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
707 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
708 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
709 //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
710 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
711 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
712 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713 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
714 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
715 }
1956
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
716 if (multi_start) {
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
717 reader->repeat_event = ret;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
718 reader->repeat_delta = delta;
275f1c4bdb25 Netplay protocol size optimization
Michael Pavone <pavone@retrodev.com>
parents: 1955
diff changeset
719 }
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
720 *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
721 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
722 if (ret == EVENT_ADJUST) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
723 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
724 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
725 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
726 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
727 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
728 } else if (ret == EVENT_STATE) {
1957
ba06346611a1 Fix some netplay issues
Mike Pavone <pavone@retrodev.com>
parents: 1956
diff changeset
729 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
730 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
731 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
732 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
733 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
734 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735 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
736 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 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
739 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 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
741 }
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 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
744 {
c36102d09351 Add missing netplay files and add in support for sending gamepad commands back to host
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745 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
746 //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
747 //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
748 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
749 }