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