ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
comprehensive.c
Go to the documentation of this file.
1
12#include <ascii-chat/util/fps.h>
16#include <stdbool.h>
17#include <stddef.h>
18#include <stdint.h>
19
20/* Forward declarations for opaque types */
21typedef void h265_encoder_t;
22typedef void video_frame_t;
24typedef void acds_client_t;
25typedef void audio_context_t;
28typedef void wav_writer_t;
30
31/* ===== Socket stubs ===== */
32
34 return sock >= 0;
35}
36
38 (void)sock;
39 return 0;
40}
41
42int socket_shutdown(socket_t sock, int how) {
43 (void)sock;
44 (void)how;
45 return 0;
46}
47
48ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags) {
49 (void)sock;
50 (void)buf;
51 (void)len;
52 (void)flags;
53 return -1;
54}
55
56ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags) {
57 (void)sock;
58 (void)buf;
59 (void)len;
60 (void)flags;
61 return -1;
62}
63
64int socket_poll(struct pollfd *fds, nfds_t nfds, int64_t timeout_ns) {
65 (void)fds;
66 (void)nfds;
67 (void)timeout_ns;
68 return 0;
69}
70
72 (void)error_code;
73 return false;
74}
75
77 (void)error_code;
78 return false;
79}
80
81const char *socket_get_error_string(void) {
82 return "Socket error";
83}
84
86 return 0;
87}
88
89/* ===== H.265 encoding stubs ===== */
90
91asciichat_error_t h265_encode(h265_encoder_t *encoder, uint16_t width, uint16_t height, const uint8_t *pixel_data,
92 uint8_t *out_data, size_t *out_len) {
93 (void)encoder;
94 (void)width;
95 (void)height;
96 (void)pixel_data;
97 (void)out_data;
98 (void)out_len;
99 return SET_ERRNO(ERROR_NOT_SUPPORTED, "H.265 encoding not supported in WASM");
100}
101
103 (void)encoder;
104}
105
106asciichat_error_t h265_encoder_flush(h265_encoder_t *encoder, uint8_t *out_data, size_t *out_len) {
107 (void)encoder;
108 (void)out_data;
109 (void)out_len;
110 return ASCIICHAT_OK;
111}
112
114 (void)encoder;
115}
116
117/* ===== Audio analysis stubs ===== */
118
120
122
124 (void)timestamp;
125}
126
128 (void)timestamp;
129}
130
132 (void)sample;
133}
134
136 (void)sample;
137}
138
139/* ===== Audio samples stubs ===== */
140
142typedef struct audio_pipeline audio_pipeline_t;
143typedef struct client_audio_pipeline client_audio_pipeline_t;
144
146 (void)rb;
147 return 0;
148}
149
150void audio_set_pipeline(audio_context_t *ctx, void *pipeline) {
151 (void)ctx;
152 (void)pipeline;
153}
154
155asciichat_error_t audio_write_samples(void *ctx, const float *samples, int count) {
156 (void)ctx;
157 (void)samples;
158 (void)count;
159 return ASCIICHAT_OK;
160}
161
162asciichat_error_t audio_read_samples(void *ctx, float *buffer, int count) {
163 (void)ctx;
164 (void)buffer;
165 (void)count;
166 return ASCIICHAT_OK;
167}
168
169/* ===== Client audio pipeline stubs ===== */
170
172 (void)config;
173 return NULL;
174}
175
177
179 (void)pipeline;
180}
181
182asciichat_error_t client_audio_pipeline_capture(client_audio_pipeline_t *pipeline, const float *samples, size_t count) {
183 (void)pipeline;
184 (void)samples;
185 (void)count;
186 return ASCIICHAT_OK;
187}
188
189void client_audio_pipeline_playback(client_audio_pipeline_t *pipeline, const float *samples, size_t count) {
190 (void)pipeline;
191 (void)samples;
192 (void)count;
193}
194
195/* ===== ACIP protocol stubs ===== */
196
197asciichat_error_t acip_send_image_frame(acip_transport_t *transport, const void *pixel_data, uint32_t width,
198 uint32_t height, uint32_t pixel_format) {
199 (void)transport;
200 (void)pixel_data;
201 (void)width;
202 (void)height;
203 (void)pixel_format;
204 return SET_ERRNO(ERROR_NOT_SUPPORTED, "ACIP not supported in WASM");
205}
206
208 const acip_client_callbacks_t *callbacks) {
209 (void)transport;
210 (void)callbacks;
211 return SET_ERRNO(ERROR_NOT_SUPPORTED, "ACIP not supported in WASM");
212}
213
215 (void)transport;
216}
217
219 (void)name;
220 (void)sockfd;
221 (void)crypto_ctx;
222 return NULL;
223}
224
225/* ===== Connection stubs ===== */
226
227typedef void tcp_client_t;
228
229asciichat_error_t connection_attempt_tcp(const char *address, int port) {
230 (void)address;
231 (void)port;
232 return SET_ERRNO(ERROR_NOT_SUPPORTED, "TCP not supported in WASM");
233}
234
235/* ===== WAV file output stubs ===== */
236
238 return false;
239}
240
241void *wav_writer_open(const char *path) {
242 (void)path;
243 return NULL;
244}
245
246int wav_writer_write(wav_writer_t *writer, const float *samples, int num_samples) {
247 (void)writer;
248 (void)samples;
249 (void)num_samples;
250 return 0;
251}
252
253void wav_writer_close(void *wav) {
254 (void)wav;
255}
256
257/* ===== WebRTC peer manager stubs ===== */
258
260
262 (void)mgr;
263 (void)sdp;
264 return SET_ERRNO(ERROR_NOT_SUPPORTED, "WebRTC not supported in WASM");
265}
266
268 (void)mgr;
269 (void)candidate;
270 return -1;
271}
272
273/* ===== Lifecycle stubs ===== */
274
276 (void)lc;
277}
278
280 (void)lc;
281 return true;
282}
283
285 (void)lc;
286 return true;
287}
288
289/* ===== ACDS discovery stubs ===== */
290
292 (void)config;
293}
294
296 (void)config;
297 (void)ctx;
298 return NULL;
299}
300
302 (void)client;
303}
304
305asciichat_error_t acds_session_lookup(acds_client_t *client, const char *session_string,
307 (void)client;
308 (void)session_string;
309 (void)result;
310 return SET_ERRNO(ERROR_NOT_SUPPORTED, "ACDS not supported in WASM");
311}
312
313/* ===== Crypto stubs ===== */
314
315asciichat_error_t parse_private_key(const char *key_data, size_t key_len) {
316 (void)key_data;
317 (void)key_len;
318 return SET_ERRNO(ERROR_CRYPTO_KEY, "Private key parsing not supported in WASM");
319}
320
321bool validate_ssh_key_file(const char *path) {
322 (void)path;
323 return false;
324}
325
326asciichat_error_t discovery_keys_verify(const char *acds_server, const char *key_spec, uint8_t pubkey_out[32]) {
327 (void)acds_server;
328 (void)key_spec;
329 (void)pubkey_out;
330 return SET_ERRNO(ERROR_CRYPTO_KEY, "discovery_keys_verify not supported in WASM");
331}
332
333void pubkey_to_hex(const uint8_t pubkey[32], char hex_out[65]) {
334 (void)pubkey;
335 if (hex_out) {
336 hex_out[0] = '\0';
337 }
338}
339
340/* ===== Thread pool stubs ===== */
341
342asciichat_error_t thread_pool_spawn(void *pool, void *(*thread_func)(void *), void *thread_arg, int stop_id,
343 const char *name) {
344 (void)pool;
345 (void)thread_func;
346 (void)thread_arg;
347 (void)stop_id;
348 (void)name;
349 return ASCIICHAT_OK; // No-op in WASM (no real threads)
350}
351
353 (void)pool;
354 return ASCIICHAT_OK; // No-op in WASM
355}
356
357/* ===== Platform stubs ===== */
358
360 return false;
361}
asciichat_error_t error_code
⚠️‼️ Comprehensive thread-local error context system for ascii-chat
buffer_pool_t * pool
client_audio_pipeline_t * client_audio_pipeline_create(const client_audio_pipeline_config_t *config)
Create a new client audio pipeline.
asciichat_error_t audio_read_samples(void *ctx, float *buffer, int count)
bool wav_dump_enabled(void)
Check if audio dumping is enabled via environment.
asciichat_error_t h265_encoder_flush(h265_encoder_t *encoder, uint8_t *out_data, size_t *out_len)
bool lifecycle_destroy_once(lifecycle_t *lc)
asciichat_error_t h265_encode(h265_encoder_t *encoder, uint16_t width, uint16_t height, const uint8_t *pixel_data, uint8_t *out_data, size_t *out_len)
void acip_client_callbacks_t
asciichat_error_t acip_send_image_frame(acip_transport_t *transport, const void *pixel_data, uint32_t width, uint32_t height, uint32_t pixel_format)
Send image frame to server (client → server)
void pubkey_to_hex(const uint8_t pubkey[32], char hex_out[65])
Convert Ed25519 public key to hex string.
void audio_analysis_track_received_sample(float sample)
Track received audio sample.
void h265_encoder_t
asciichat_error_t acds_session_lookup(acds_client_t *client, const char *session_string, acds_session_lookup_result_t *result)
Look up session by string.
void acds_session_lookup_result_t
struct audio_pipeline audio_pipeline_t
int wav_writer_write(wav_writer_t *writer, const float *samples, int num_samples)
Write audio samples to WAV file.
int webrtc_peer_manager_handle_ice(webrtc_peer_manager_t *mgr, const char *candidate)
void acds_client_t
asciichat_error_t thread_pool_stop_all(void *pool)
Stop all threads in the pool in stop_id order.
asciichat_error_t acip_client_receive_and_dispatch(acip_transport_t *transport, const acip_client_callbacks_t *callbacks)
Receive packet from server and dispatch to callbacks.
void audio_analysis_track_received_packet(uint32_t timestamp)
void acds_client_config_init_defaults(acds_client_config_t *config)
Initialize ACDS client configuration with defaults.
void * wav_writer_open(const char *path)
asciichat_error_t parse_private_key(const char *key_data, size_t key_len)
asciichat_error_t audio_write_samples(void *ctx, const float *samples, int count)
asciichat_error_t discovery_keys_verify(const char *acds_server, const char *key_spec, uint8_t pubkey_out[32])
Verify and load ACDS server public key.
void audio_analysis_track_sent_packet(uint32_t timestamp)
void lifecycle_destroy_commit(lifecycle_t *lc)
asciichat_error_t thread_pool_spawn(void *pool, void *(*thread_func)(void *), void *thread_arg, int stop_id, const char *name)
Spawn a worker thread in the pool.
acip_transport_t * acip_tcp_transport_create(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx)
Create TCP transport from existing socket.
void wav_writer_close(void *wav)
void client_audio_pipeline_destroy(client_audio_pipeline_t *pipeline)
Destroy a client audio pipeline.
void h265_encoder_destroy(h265_encoder_t *encoder)
void client_audio_pipeline_default_config(void)
Get default configuration.
void audio_context_t
void h265_encoder_request_keyframe(h265_encoder_t *encoder)
acds_client_t * acds_client_connect(const acds_client_config_t *config, void *ctx)
void client_audio_pipeline_playback(client_audio_pipeline_t *pipeline, const float *samples, size_t count)
void acds_client_disconnect(acds_client_t *client)
Disconnect from ACDS server.
void audio_analysis_track_sent_sample(float sample)
Track sent audio sample.
bool lifecycle_reset(lifecycle_t *lc)
void video_frame_t
asciichat_error_t connection_attempt_tcp(const char *address, int port)
void client_audio_pipeline_config_t
void webrtc_peer_manager_t
void acds_client_config_t
void wav_writer_t
void tcp_client_t
asciichat_error_t webrtc_peer_manager_handle_sdp(webrtc_peer_manager_t *mgr, const char *sdp)
void audio_analysis_print_report(void)
Print audio analysis report.
asciichat_error_t client_audio_pipeline_capture(client_audio_pipeline_t *pipeline, const float *samples, size_t count)
void acip_transport_destroy(acip_transport_t *transport)
Destroy transport and free all resources.
void audio_analysis_destroy(void)
Cleanup audio analysis.
Matrix-style digital rain effect for ASCII frames.
⏱️ FPS tracking utility for monitoring frame throughput across all threads
size_t audio_ring_buffer_available_read(audio_ring_buffer_t *rb)
Get number of samples available for reading.
void audio_set_pipeline(audio_context_t *ctx, void *pipeline)
Set audio pipeline for echo cancellation.
unsigned short uint16_t
Definition common.h:57
unsigned int uint32_t
Definition common.h:58
unsigned char uint8_t
Definition common.h:56
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it, returning the error code.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
@ ERROR_CRYPTO_KEY
Definition error_codes.h:97
@ ASCIICHAT_OK
Definition error_codes.h:51
@ ERROR_NOT_SUPPORTED
Definition error_codes.h:74
bool validate_ssh_key_file(const char *path)
Validate SSH key file before parsing.
int socket_shutdown(socket_t sock, int how)
Shutdown socket I/O.
ssize_t socket_recv(socket_t sock, void *buf, size_t len, int flags)
Receive data from a socket.
bool platform_is_interactive(void)
Check if interactive prompting is available.
bool socket_is_valid(socket_t sock)
Check if a socket handle is valid.
int socket_poll(struct pollfd *fds, nfds_t nfds, int64_t timeout_ns)
Poll sockets for events (multiplexed I/O)
bool socket_is_would_block_error(int error_code)
Check if error code indicates "would block" (non-blocking socket would wait)
int socket_close(socket_t sock)
Close a socket.
ssize_t socket_send(socket_t sock, const void *buf, size_t len, int flags)
Send data on a socket.
bool socket_is_invalid_socket_error(int error_code)
Check if error code indicates a closed/invalid socket.
int socket_get_last_error(void)
Get last socket error code.
const char * socket_get_error_string(void)
Get last socket error as string.
int socket_t
Lock-free module lifecycle state machine using pure stdatomic.
Cross-platform interactive prompting utilities.
Cross-platform socket interface for ascii-chat.
ClangTool/LibTooling compatibility shim for stdbool.h.
ACDS client connection configuration.
ACDS client connection handle.
Session lookup result.
Client-side packet handler callbacks.
Definition handlers.h:51
Transport instance structure.
Definition transport.h:214
Audio context for full-duplex capture and playback.
Audio ring buffer for real-time audio streaming.
Definition ringbuffer.h:205
Pipeline configuration parameters.
Client audio pipeline state.
Cryptographic context structure.
WAV file writer context.
Definition wav_writer.h:23
WebRTC peer manager structure.
Transport abstraction layer for ACIP protocol.