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