ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
settings.h File Reference

Go to the source code of this file.

Data Structures

struct  acip_render_settings_t
 acip render settings keeps the values that move through the subsystem: caps, width, height, revision. Some members are pointers into caller- or subsystem-owned memory, so lifetime follows the API that populated them rather than the struct copy itself. More...
struct  acip_settings_header_t
 acip settings header keeps the values that move through the subsystem: schema, request, expected_revision, revision. Some members are pointers into caller- or subsystem-owned memory, so lifetime follows the API that populated them rather than the struct copy itself. More...

Macros

#define NETWORK_ACIP_SETTINGS_PALETTE_BUFFER_SIZE   256
#define NETWORK_ACIP_SETTINGS_LUMINANCE_BUFFER_SIZE   256
#define ACIP_SETTINGS_SCHEMA   1
#define ACIP_SETTINGS_HEADER_SIZE   20
#define ACIP_SETTINGS_MAX_SIZE   4116

Functions

asciichat_error_t acip_render_settings_capabilities (acip_render_settings_t *state, const terminal_capabilities_packet_t *packet)
terminal_color_mode_t acip_render_settings_normalize_color_mode (terminal_color_mode_t mode)
asciichat_error_t acip_render_settings_prepare (acip_render_settings_t *candidate, const options_t *values)
void acip_render_settings_options (const acip_render_settings_t *state, options_t *values)
asciichat_error_t acip_settings_decode (const void *payload, size_t length, acip_settings_header_t *header, const char **json, size_t *json_length)
asciichat_error_t acip_settings_encode (const acip_settings_header_t *header, const char *json, uint8_t *buffer, size_t capacity, size_t *length)
asciichat_error_t acip_settings_request (acip_render_settings_t *state, const void *payload, size_t length, uint8_t *reply, size_t capacity, size_t *reply_length)
asciichat_error_t acip_settings_send (acip_transport_t *transport, const options_t *values, uint32_t request, uint32_t expected_revision)

Macro Definition Documentation

◆ ACIP_SETTINGS_HEADER_SIZE

◆ ACIP_SETTINGS_MAX_SIZE

#define ACIP_SETTINGS_MAX_SIZE   4116

◆ ACIP_SETTINGS_SCHEMA

#define ACIP_SETTINGS_SCHEMA   1

◆ NETWORK_ACIP_SETTINGS_LUMINANCE_BUFFER_SIZE

#define NETWORK_ACIP_SETTINGS_LUMINANCE_BUFFER_SIZE   256

Definition at line 5 of file include/ascii-chat/network/acip/settings.h.

◆ NETWORK_ACIP_SETTINGS_PALETTE_BUFFER_SIZE

#define NETWORK_ACIP_SETTINGS_PALETTE_BUFFER_SIZE   256

Definition at line 4 of file include/ascii-chat/network/acip/settings.h.

Function Documentation

◆ acip_render_settings_capabilities()

asciichat_error_t acip_render_settings_capabilities ( acip_render_settings_t * state,
const terminal_capabilities_packet_t * packet )

Definition at line 93 of file lib/network/acip/settings.c.

94 {
95 if (!state || !packet || !memchr(packet->palette_custom, 0, sizeof(packet->palette_custom)))
96 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid render capabilities");
97 options_t *values = SAFE_MALLOC(sizeof(*values), options_t *);
98 acip_render_settings_options(state, values);
99 values->width = NET_TO_HOST_U16(packet->width);
100 values->height = NET_TO_HOST_U16(packet->height);
101 values->fps = packet->desired_fps;
102 values->color_mode = NET_TO_HOST_U32(packet->color_level);
103 values->color_filter = packet->color_filter;
104 values->render_mode = NET_TO_HOST_U32(packet->render_mode);
105 values->palette_type = NET_TO_HOST_U32(packet->palette_type);
106 // AUTO is a local option sentinel, but older/native/browser senders may
107 // still advertise it. Resolve it at the shared wire boundary so the peer
108 // cannot reject an otherwise valid capabilities packet.
110 if (values->palette_type == PALETTE_UNSET)
112 SAFE_STRNCPY(values->palette_custom, packet->palette_custom, sizeof(values->palette_custom));
113 values->matrix_rain = (NET_TO_HOST_U32(packet->capabilities) & TERM_CAP_MATRIX_RAIN) != 0;
114 acip_render_settings_t next = *state;
115 next.caps.capabilities = NET_TO_HOST_U32(packet->capabilities);
116 next.caps.utf8_support = NET_TO_HOST_U32(packet->utf8_support) != 0;
117 next.caps.wants_padding = packet->wants_padding != 0;
118 asciichat_error_t result = prepare_for_viewer(&next, values);
119 if (result == ASCIICHAT_OK)
120 *state = next;
121 SAFE_FREE(values);
122 return result;
123}
#define SET_ERRNO(code,...)
#define NET_TO_HOST_U16(val)
Definition endian.h:111
#define NET_TO_HOST_U32(val)
Definition endian.h:81
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:423
#define SAFE_FREE(ptr)
Definition common.h:377
#define SAFE_MALLOC(size, cast)
Definition common.h:265
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
struct options_state options_t
Immutable, RCU-published snapshot of the application's runtime configuration.
@ PALETTE_STANDARD
Standard ASCII palette: " ...',;:clodxkO0KXNWM".
Definition palette.h:94
@ PALETTE_UNSET
Unset palette type (will be resolved to default or custom).
Definition palette.h:92
terminal_color_mode_t acip_render_settings_normalize_color_mode(terminal_color_mode_t mode)
void acip_render_settings_options(const acip_render_settings_t *state, options_t *values)
acip render settings keeps the values that move through the subsystem: caps, width,...
terminal_color_mode_t color_mode
Color mode (auto/none/16/256/truecolor).
Definition options.h:1092
int height
Terminal height in characters (int for OPTION_TYPE_INT compat).
Definition options.h:997
bool matrix_rain
Matrix digital rain effect (false = disabled).
Definition options.h:1152
char palette_custom[256]
Custom palette characters.
Definition options.h:1230
terminal_render_mode_t render_mode
Render mode (foreground/background/half-block).
Definition options.h:1095
color_filter_t color_filter
Monochromatic color filter (none/black/white/green/etc).
Definition options.h:1093
int fps
Target framerate (0 = auto, 1-144).
Definition options.h:1099
int width
Terminal width in characters (int for OPTION_TYPE_INT compat).
Definition options.h:996
palette_type_t palette_type
Selected palette type.
Definition options.h:1229
uint32_t capabilities
Terminal capabilities bitmask (TERM_CAP_* flags).
Definition packet.h:1076
uint32_t color_level
Color level enum value (terminal_color_mode_t).
Definition packet.h:1078
uint16_t height
Terminal height in characters.
Definition packet.h:1086
uint8_t wants_padding
Whether client wants frame padding (1=padding enabled, 0=no padding for snapshot/piped modes).
Definition packet.h:1104
uint32_t render_mode
Render mode enum value (foreground/background/half-block).
Definition packet.h:1082
uint16_t width
Terminal width in characters.
Definition packet.h:1084
uint8_t desired_fps
Client's desired frame rate (1-144 FPS).
Definition packet.h:1100
char palette_custom[64]
Custom palette characters (if palette_type == PALETTE_CUSTOM).
Definition packet.h:1098
uint32_t palette_type
Palette type enum value (palette_type_t).
Definition packet.h:1096
uint8_t color_filter
Monochromatic color filter enum value (color_filter_t).
Definition packet.h:1102
uint32_t utf8_support
UTF-8 support flag (0=no UTF-8, 1=UTF-8 supported).
Definition packet.h:1094

References acip_render_settings_normalize_color_mode(), acip_render_settings_options(), ASCIICHAT_OK, terminal_capabilities_packet_t::capabilities, acip_render_settings_t::caps, options_state::color_filter, terminal_capabilities_packet_t::color_filter, terminal_capabilities_packet_t::color_level, options_state::color_mode, terminal_capabilities_packet_t::desired_fps, ERROR_INVALID_PARAM, options_state::fps, options_state::height, terminal_capabilities_packet_t::height, options_state::matrix_rain, NET_TO_HOST_U16, NET_TO_HOST_U32, options_state::palette_custom, terminal_capabilities_packet_t::palette_custom, PALETTE_STANDARD, options_state::palette_type, terminal_capabilities_packet_t::palette_type, PALETTE_UNSET, options_state::render_mode, terminal_capabilities_packet_t::render_mode, SAFE_FREE, SAFE_MALLOC, SAFE_STRNCPY, SET_ERRNO, terminal_capabilities_packet_t::utf8_support, terminal_capabilities_packet_t::wants_padding, options_state::width, and terminal_capabilities_packet_t::width.

Referenced by handle_client_capabilities_packet(), and session_host_receive_packet().

◆ acip_render_settings_normalize_color_mode()

terminal_color_mode_t acip_render_settings_normalize_color_mode ( terminal_color_mode_t mode)

Resolve local-only color sentinels before render settings cross the ACIP boundary.

Definition at line 26 of file lib/network/acip/settings.c.

26 {
27 return mode == TERM_COLOR_AUTO ? TERM_COLOR_TRUECOLOR : mode;
28}

Referenced by acip_render_settings_capabilities(), acip_settings_request(), and session_protocol_build_capabilities().

◆ acip_render_settings_options()

void acip_render_settings_options ( const acip_render_settings_t * state,
options_t * values )

Definition at line 9 of file lib/network/acip/settings.c.

9 {
10 *values = options_t_new();
11 values->width = state->width;
12 values->height = state->height;
13 values->fps = state->caps.desired_fps;
14 values->color_mode = (terminal_color_mode_t)state->caps.color_level;
15 values->color_filter = state->caps.color_filter;
16 values->render_mode = state->caps.render_mode;
17 values->renderer = state->caps.text_renderer;
18 values->stabilize = state->caps.stabilize;
19 values->palette_explicit = state->caps.palette_explicit;
20 values->palette_type = state->caps.palette_type ? state->caps.palette_type : PALETTE_STANDARD;
21 SAFE_STRNCPY(values->palette_custom, state->caps.palette_custom, sizeof(values->palette_custom));
22 values->palette_custom_set = values->palette_custom[0] != 0;
23 values->matrix_rain = (state->caps.capabilities & TERM_CAP_MATRIX_RAIN) != 0;
24}
options_t options_t_new(void)
Initialize options by parsing command-line arguments.
Definition options.c:547
bool palette_explicit
Palette explicitly selected.
Definition options.h:1232
bool palette_custom_set
True if custom palette was set.
Definition options.h:1231
bool stabilize
Reduce frame-to-frame character flicker.
Definition options.h:1138
ascii_renderer_t renderer
Character selection algorithm.
Definition options.h:1140

References options_state::color_filter, options_state::color_mode, options_state::fps, options_state::height, options_state::matrix_rain, options_t_new(), options_state::palette_custom, options_state::palette_custom_set, options_state::palette_explicit, PALETTE_STANDARD, options_state::palette_type, options_state::render_mode, options_state::renderer, SAFE_STRNCPY, options_state::stabilize, and options_state::width.

Referenced by acip_render_settings_capabilities(), acip_settings_request(), client_settings_receive(), client_settings_values(), and session_protocol_dispatch().

◆ acip_render_settings_prepare()

asciichat_error_t acip_render_settings_prepare ( acip_render_settings_t * candidate,
const options_t * values )

Definition at line 30 of file lib/network/acip/settings.c.

30 {
31 if (!candidate || !values || values->width < 1 || values->width > 4096 || values->height < 1 ||
32 values->height > 4096 || (uint64_t)values->width * values->height > 1048576 || values->fps < 0 ||
33 values->fps > 144 || values->color_mode < TERM_COLOR_NONE || values->color_mode > TERM_COLOR_TRUECOLOR ||
34 values->color_filter < 0 || values->color_filter >= COLOR_FILTER_COUNT || values->render_mode < 0 ||
35 values->render_mode > RENDER_MODE_HALF_BLOCK || values->palette_type < PALETTE_STANDARD ||
36 values->palette_type >= PALETTE_COUNT || strlen(values->palette_custom) >= sizeof(candidate->caps.palette_custom))
37 return SET_ERRNO(
39 "Invalid remote render settings (size=%dx%d fps=%d color=%d filter=%d mode=%d palette=%d custom=%zu)",
40 values->width, values->height, values->fps, values->color_mode, values->color_filter, values->render_mode,
41 values->palette_type, strlen(values->palette_custom));
42 acip_render_settings_t next = *candidate;
43 next.width = (uint16_t)values->width;
44 next.height = (uint16_t)values->height;
45 next.caps.desired_fps =
46 candidate->fps_limit && values->fps > candidate->fps_limit ? candidate->fps_limit : values->fps;
47 next.caps.color_level = values->color_mode;
48 next.caps.color_count = values->color_mode == TERM_COLOR_TRUECOLOR ? 16777216
49 : values->color_mode == TERM_COLOR_256 ? 256
50 : values->color_mode == TERM_COLOR_16 ? 16
51 : 2;
52 next.caps.color_filter = values->color_filter;
53 next.caps.render_mode = values->render_mode;
54 next.caps.text_renderer = values->renderer;
55 next.caps.stabilize = values->stabilize;
56 next.caps.palette_explicit = values->palette_explicit;
57 next.caps.wants_background = values->render_mode == RENDER_MODE_BACKGROUND;
58 next.caps.palette_type = values->palette_type;
59 SAFE_STRNCPY(next.caps.palette_custom, values->palette_custom, sizeof(next.caps.palette_custom));
60 if (values->matrix_rain)
61 next.caps.capabilities |= TERM_CAP_MATRIX_RAIN;
62 else
63 next.caps.capabilities &= ~(uint32_t)TERM_CAP_MATRIX_RAIN;
64 if (initialize_client_palette(next.caps.palette_type, values->palette_custom, next.palette, &next.palette_length,
65 next.luminance))
66 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid rendering palette");
67 if (values->renderer == ASCII_RENDERER_GLYPH && values->palette_explicit &&
68 !ascii_glyph_palette_supported(next.palette))
69 return SET_ERRNO(ERROR_INVALID_PARAM, "Glyph palette contains characters without glyph masks");
70 if (values->renderer == ASCII_RENDERER_GLYPH && !values->palette_explicit) {
71 SAFE_STRNCPY(next.palette,
72 " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
73 sizeof(next.palette));
74 next.palette_length = strlen(next.palette);
75 }
76 next.revision = candidate->revision + 1;
77 *candidate = next;
78 return ASCIICHAT_OK;
79}
unsigned short uint16_t
Definition common.h:61
unsigned int uint32_t
Definition common.h:62
unsigned long long uint64_t
Definition common.h:63
@ ASCII_RENDERER_GLYPH
Definition options.h:966
int initialize_client_palette(palette_type_t palette_type, const char *custom_chars, char client_palette_chars[ASCII_PALETTE_BUFFER_SIZE], size_t *client_palette_len, char client_luminance_palette[ASCII_LUMINANCE_LEVELS])
Initialize client palette with full configuration.
Definition palette.c:306
@ PALETTE_COUNT
Number of palette types (not a valid palette).
Definition palette.h:106
bool ascii_glyph_palette_supported(const char *palette)

References ascii_glyph_palette_supported(), ASCII_RENDERER_GLYPH, ASCIICHAT_OK, acip_render_settings_t::caps, options_state::color_filter, options_state::color_mode, ERROR_INVALID_PARAM, options_state::fps, acip_render_settings_t::fps_limit, acip_render_settings_t::height, options_state::height, initialize_client_palette(), acip_render_settings_t::luminance, options_state::matrix_rain, acip_render_settings_t::palette, PALETTE_COUNT, options_state::palette_custom, options_state::palette_explicit, acip_render_settings_t::palette_length, PALETTE_STANDARD, options_state::palette_type, options_state::render_mode, options_state::renderer, acip_render_settings_t::revision, SAFE_STRNCPY, SET_ERRNO, options_state::stabilize, acip_render_settings_t::width, and options_state::width.

Referenced by client_settings_receive(), session_participant_request_settings(), and session_protocol_dispatch().

◆ acip_settings_decode()

asciichat_error_t acip_settings_decode ( const void * payload,
size_t length,
acip_settings_header_t * header,
const char ** json,
size_t * json_length )

Definition at line 125 of file lib/network/acip/settings.c.

126 {
127 if (!payload || !header || !json || !json_length || length < ACIP_SETTINGS_HEADER_SIZE ||
128 length > ACIP_SETTINGS_MAX_SIZE)
129 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid settings packet length");
130 uint32_t fields[5];
131 memcpy(fields, payload, sizeof(fields));
132 *header = (acip_settings_header_t){NET_TO_HOST_U32(fields[0]), NET_TO_HOST_U32(fields[1]), NET_TO_HOST_U32(fields[2]),
133 NET_TO_HOST_U32(fields[3]), NET_TO_HOST_U32(fields[4])};
134 if (header->schema != ACIP_SETTINGS_SCHEMA)
135 return SET_ERRNO(ERROR_NOT_SUPPORTED, "Unsupported settings schema");
136 *json = (const char *)payload + ACIP_SETTINGS_HEADER_SIZE;
137 *json_length = length - ACIP_SETTINGS_HEADER_SIZE;
138 return ASCIICHAT_OK;
139}
@ ERROR_NOT_SUPPORTED
Definition error_codes.h:69
acip settings header keeps the values that move through the subsystem: schema, request,...

References ACIP_SETTINGS_HEADER_SIZE, ACIP_SETTINGS_MAX_SIZE, ACIP_SETTINGS_SCHEMA, ASCIICHAT_OK, ERROR_INVALID_PARAM, ERROR_NOT_SUPPORTED, NET_TO_HOST_U32, and SET_ERRNO.

Referenced by acip_settings_request(), client_settings_receive(), session_participant_receive_settings(), and session_protocol_dispatch().

◆ acip_settings_encode()

asciichat_error_t acip_settings_encode ( const acip_settings_header_t * header,
const char * json,
uint8_t * buffer,
size_t capacity,
size_t * length )

Definition at line 141 of file lib/network/acip/settings.c.

142 {
143 if (!header || !json || !buffer || !length)
144 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing settings encoding argument");
145 size_t size = strlen(json);
146 if (size > 4096 || capacity < ACIP_SETTINGS_HEADER_SIZE + size)
147 return SET_ERRNO(ERROR_INVALID_PARAM, "Settings output too small");
148 uint32_t fields[5] = {HOST_TO_NET_U32(header->schema), HOST_TO_NET_U32(header->request),
149 HOST_TO_NET_U32(header->expected_revision), HOST_TO_NET_U32(header->revision),
150 HOST_TO_NET_U32(header->status)};
151 memcpy(buffer, fields, sizeof(fields));
152 memcpy(buffer + sizeof(fields), json, size);
153 *length = sizeof(fields) + size;
154 return ASCIICHAT_OK;
155}
#define HOST_TO_NET_U32(val)
Definition endian.h:66

References ACIP_SETTINGS_HEADER_SIZE, ASCIICHAT_OK, ERROR_INVALID_PARAM, HOST_TO_NET_U32, and SET_ERRNO.

Referenced by acip_settings_request(), acip_settings_send(), handle_client_capabilities_packet(), and session_host_receive_packet().

◆ acip_settings_request()

asciichat_error_t acip_settings_request ( acip_render_settings_t * state,
const void * payload,
size_t length,
uint8_t * reply,
size_t capacity,
size_t * reply_length )

A rejected request returns current effective values without changing state.

Definition at line 157 of file lib/network/acip/settings.c.

158 {
159 acip_settings_header_t header = {0};
160 const char *json = NULL;
161 size_t json_length = 0;
162 asciichat_error_t result = acip_settings_decode(payload, length, &header, &json, &json_length);
163 if (result != ASCIICHAT_OK)
164 return result;
166 options_t *current = SAFE_MALLOC(sizeof(*current), options_t *),
167 *candidate = SAFE_MALLOC(sizeof(*candidate), options_t *);
168 acip_render_settings_options(state, current);
169 if (header.status)
170 result = SET_ERRNO(ERROR_INVALID_PARAM, "Unexpected settings request status");
171 else if (header.expected_revision != UINT32_MAX && header.expected_revision != state->revision)
172 result = SET_ERRNO(ERROR_INVALID_STATE, "Remote settings changed; refresh and retry");
173 else if (json_length) {
174 result = options_prepare_json(current, json, json_length, candidate, true);
175 if (result == ASCIICHAT_OK) {
176 // AUTO is a local option sentinel and is not valid in the negotiated
177 // render state. Keep legacy settings updates from invalidating a live
178 // session when they serialize the raw AUTO option.
179 candidate->color_mode = acip_render_settings_normalize_color_mode(candidate->color_mode);
180 result = prepare_for_viewer(state, candidate);
181 }
182 }
183 header.status = result;
184 header.revision = state->revision;
185 // The rejection is represented by the response status, preserving older errors.
187 acip_render_settings_options(state, current);
188 char *effective = options_values_json(current, true);
189 asciichat_error_t encoded =
190 effective ? acip_settings_encode(&header, effective, reply, capacity, reply_length) : ERROR_MEMORY;
191 SAFE_FREE(effective);
192 SAFE_FREE(candidate);
193 SAFE_FREE(current);
194 return encoded;
195}
void errno_scope_end(asciichat_errno_scope_t scope, asciichat_errno_outcome_t outcome)
asciichat_errno_scope_t errno_scope_begin(void)
@ ASCIICHAT_ERRNO_HANDLED
@ ERROR_INVALID_STATE
@ ERROR_MEMORY
Definition error_codes.h:51
asciichat_error_t acip_settings_encode(const acip_settings_header_t *header, const char *json, uint8_t *buffer, size_t capacity, size_t *length)
asciichat_error_t acip_settings_decode(const void *payload, size_t length, acip_settings_header_t *header, const char **json, size_t *json_length)
char * options_values_json(const options_t *values, bool remote_only)
Definition rcu.c:1013
asciichat_error_t options_prepare_json(const options_t *current, const char *json, size_t length, options_t *candidate, bool remote_only)
Definition rcu.c:987
When code needs to work with asciichat errno snapshot, it keeps total, copied here instead of scatter...

References acip_render_settings_normalize_color_mode(), acip_render_settings_options(), acip_settings_decode(), acip_settings_encode(), ASCIICHAT_ERRNO_HANDLED, ASCIICHAT_OK, errno_scope_begin(), errno_scope_end(), ERROR_INVALID_PARAM, ERROR_INVALID_STATE, ERROR_MEMORY, options_prepare_json(), options_values_json(), SAFE_FREE, SAFE_MALLOC, and SET_ERRNO.

Referenced by handle_runtime_settings(), and session_host_receive_packet().

◆ acip_settings_send()

asciichat_error_t acip_settings_send ( acip_transport_t * transport,
const options_t * values,
uint32_t request,
uint32_t expected_revision )

Definition at line 197 of file lib/network/acip/settings.c.

198 {
199 char *json = options_values_json(values, true);
200 if (!json)
201 return SET_ERRNO(ERROR_MEMORY, "Cannot encode render preferences");
203 size_t length = 0;
204 acip_settings_header_t header = {
205 .schema = ACIP_SETTINGS_SCHEMA, .request = request, .expected_revision = expected_revision};
206 asciichat_error_t result = acip_settings_encode(&header, json, buffer, sizeof(buffer), &length);
207 if (result == ASCIICHAT_OK)
208 result = packet_send_via_transport(transport, PACKET_TYPE_ACIP_SETTINGS_SYNC, buffer, length, 0);
209 SAFE_FREE(json);
210 return result;
211}
unsigned char uint8_t
Definition common.h:60
@ PACKET_TYPE_ACIP_SETTINGS_SYNC
Settings sync (Initiator -> Host -> All Participants).
Definition packet.h:485
asciichat_error_t packet_send_via_transport(acip_transport_t *transport, packet_type_t type, const void *payload, size_t payload_len, uint32_t client_id)
Definition send.c:190

References acip_settings_encode(), ACIP_SETTINGS_MAX_SIZE, ACIP_SETTINGS_SCHEMA, ASCIICHAT_OK, ERROR_MEMORY, options_values_json(), packet_send_via_transport(), PACKET_TYPE_ACIP_SETTINGS_SYNC, SAFE_FREE, and SET_ERRNO.

Referenced by client_protocol_start(), and session_participant_request_settings().