ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
options.h
Go to the documentation of this file.
1
148#pragma once
149
150#include <stdbool.h>
151#include <stdio.h>
152#include "platform/terminal.h"
153#include "video/palette.h"
154
156#define COLOR_MODE_AUTO TERM_COLOR_AUTO
157#define COLOR_MODE_NONE TERM_COLOR_NONE
158#define COLOR_MODE_16 TERM_COLOR_16
159#define COLOR_MODE_16_COLOR TERM_COLOR_16
160#define COLOR_MODE_256 TERM_COLOR_256
161#define COLOR_MODE_256_COLOR TERM_COLOR_256
162#define COLOR_MODE_TRUECOLOR TERM_COLOR_TRUECOLOR
163
176#define OPTIONS_BUFF_SIZE 256
177
187#define OPT_WIDTH_DEFAULT 110
188
198#define OPT_HEIGHT_DEFAULT 70
199
208#if defined(__APPLE__)
209// macOS webcams show pure black first then fade up into a real color image over a few seconds
210#define SNAPSHOT_DELAY_DEFAULT 4.0f
211#else
212#define SNAPSHOT_DELAY_DEFAULT 3.0f
213#endif
214
216#define OPT_PORT_DEFAULT "27224"
217
219#define OPT_ADDRESS_DEFAULT "localhost"
220
222#define OPT_ADDRESS6_DEFAULT "::1"
223
225#define OPT_MAX_CLIENTS_DEFAULT 9
226
228#define OPT_COMPRESSION_LEVEL_DEFAULT 1
229
231#define OPT_FPS_DEFAULT 60
232
234#define OPT_WEBCAM_INDEX_DEFAULT 0
235
237#define OPT_MICROPHONE_INDEX_DEFAULT (-1)
238
240#define OPT_SPEAKERS_INDEX_DEFAULT (-1)
241
243#define OPT_RECONNECT_ATTEMPTS_DEFAULT (-1)
244
246#define OPT_WEBCAM_FLIP_DEFAULT true
247
249#define OPT_COLOR_MODE_DEFAULT COLOR_MODE_AUTO
250
252#define OPT_RENDER_MODE_DEFAULT RENDER_MODE_FOREGROUND
253
255#define OPT_ENCODE_AUDIO_DEFAULT true
256
298int strtoint_safe(const char *str);
299
302// ============================================================================
303// Struct Definition Macros for Library Users
304// ============================================================================
305
311#define ASCIICHAT_BINARY_OPTIONS_STRUCT \
312 bool help; \
313 bool version; \
314 char log_file[OPTIONS_BUFF_SIZE]; \
315 log_level_t log_level; \
316 unsigned short int quiet; \
317 unsigned short int verbose_level;
318
324#define ASCIICHAT_COMMON_OPTIONS_STRUCT \
325 ASCIICHAT_BINARY_OPTIONS_STRUCT \
326 unsigned short int width; \
327 unsigned short int height; \
328 bool auto_width; \
329 bool auto_height;
330
336#define ASCIICHAT_SERVER_OPTIONS_STRUCT \
337 ASCIICHAT_COMMON_OPTIONS_STRUCT \
338 char address[OPTIONS_BUFF_SIZE]; \
339 char address6[OPTIONS_BUFF_SIZE]; \
340 char port[OPTIONS_BUFF_SIZE]; \
341 int max_clients; \
342 int compression_level; \
343 bool no_compress; \
344 bool encode_audio; \
345 unsigned short int encrypt_enabled; \
346 char encrypt_key[OPTIONS_BUFF_SIZE]; \
347 char password[OPTIONS_BUFF_SIZE]; \
348 char encrypt_keyfile[OPTIONS_BUFF_SIZE]; \
349 unsigned short int no_encrypt; \
350 char client_keys[OPTIONS_BUFF_SIZE]; \
351 unsigned short int require_server_verify; \
352 bool acds; /* Enable ACDS session registration (default: false) */ \
353 bool acds_expose_ip; /* Explicitly allow public IP disclosure in ACDS sessions (opt-in) */ \
354 bool acds_insecure; /* Skip server key verification (MITM-vulnerable, requires explicit opt-in) */ \
355 char acds_server[OPTIONS_BUFF_SIZE]; \
356 int acds_port; \
357 bool webrtc; /* Enable WebRTC mode for ACDS session (default: Direct TCP) */
358
364#define ASCIICHAT_CLIENT_OPTIONS_STRUCT \
365 ASCIICHAT_COMMON_OPTIONS_STRUCT \
366 char address[OPTIONS_BUFF_SIZE]; \
367 char port[OPTIONS_BUFF_SIZE]; \
368 int reconnect_attempts; \
369 unsigned short int webcam_index; \
370 bool webcam_flip; \
371 bool test_pattern; \
372 terminal_color_mode_t color_mode; \
373 render_mode_t render_mode; \
374 unsigned short int show_capabilities; \
375 unsigned short int force_utf8; \
376 unsigned short int audio_enabled; \
377 int microphone_index; \
378 int speakers_index; \
379 unsigned short int stretch; \
380 unsigned short int snapshot_mode; \
381 double snapshot_delay; \
382 char server_key[OPTIONS_BUFF_SIZE]; \
383 char encrypt_key[OPTIONS_BUFF_SIZE]; \
384 char password[OPTIONS_BUFF_SIZE]; \
385 unsigned short int require_client_verify;
386
392#define ASCIICHAT_MIRROR_OPTIONS_STRUCT \
393 ASCIICHAT_COMMON_OPTIONS_STRUCT \
394 unsigned short int webcam_index; \
395 bool webcam_flip; \
396 bool test_pattern; \
397 terminal_color_mode_t color_mode; \
398 render_mode_t render_mode; \
399 unsigned short int force_utf8; \
400 unsigned short int stretch;
401
407#define ASCIICHAT_ACDS_OPTIONS_STRUCT \
408 ASCIICHAT_COMMON_OPTIONS_STRUCT \
409 char address[OPTIONS_BUFF_SIZE]; \
410 char port[OPTIONS_BUFF_SIZE]; \
411 unsigned short int require_server_identity; \
412 unsigned short int require_client_identity; \
413 unsigned short int require_server_verify; \
414 unsigned short int require_client_verify; \
415 char stun_servers[OPTIONS_BUFF_SIZE]; \
416 char turn_servers[OPTIONS_BUFF_SIZE]; \
417 char turn_username[OPTIONS_BUFF_SIZE]; \
418 char turn_credential[OPTIONS_BUFF_SIZE]; \
419 char turn_secret[OPTIONS_BUFF_SIZE];
420
432
439typedef struct options_state {
440 // ============================================================================
441 // Mode Detection (auto-detected during options_init)
442 // ============================================================================
444
445 // ============================================================================
446 // Binary-Level Options (parsed first, before mode selection)
447 // ============================================================================
448 bool help;
449 bool version;
450
451 // ============================================================================
452 // Terminal Dimensions
453 // ============================================================================
454 unsigned short int width;
455 unsigned short int height;
458
459 // ============================================================================
460 // Network Options
461 // ============================================================================
466 char session_string[64];
467
468 // ============================================================================
469 // ACDS Discovery Options (server only)
470 // ============================================================================
471 bool acds;
474 bool webrtc;
477
478 // ============================================================================
479 // LAN Discovery Options
480 // ============================================================================
483
484 // ============================================================================
485 // Network Performance Options
486 // ============================================================================
490
491 // ============================================================================
492 // Client Reconnection Options
493 // ============================================================================
495
496 // ============================================================================
497 // Webcam Options
498 // ============================================================================
499 unsigned short int webcam_index;
503
504 // ============================================================================
505 // Display Options
506 // ============================================================================
509 unsigned short int show_capabilities;
510 unsigned short int force_utf8;
511 int fps;
512
513 // ============================================================================
514 // Audio Configuration
515 // ============================================================================
516 unsigned short int audio_enabled;
519 unsigned short int audio_analysis_enabled;
520 unsigned short int audio_no_playback;
521
522 // ============================================================================
523 // Image Options
524 // ============================================================================
525 unsigned short int stretch;
526
527 // ============================================================================
528 // Output Options
529 // ============================================================================
530 unsigned short int quiet;
531 unsigned short int verbose_level;
532 unsigned short int snapshot_mode;
534 unsigned short int strip_ansi;
537
538 // ============================================================================
539 // Encryption Options
540 // ============================================================================
541 unsigned short int encrypt_enabled;
545 unsigned short int no_encrypt;
548
549 // ============================================================================
550 // Identity Verification Options (ACDS + Crypto Handshake)
551 // ============================================================================
558
559 // ============================================================================
560 // WebRTC Connection Strategy Options (client-side fallback control)
561 // ============================================================================
566
567 // ============================================================================
568 // WebRTC Connectivity Options (ACDS mode only)
569 // ============================================================================
571 bool no_upnp;
577
578 // ============================================================================
579 // Palette Configuration
580 // ============================================================================
582 char palette_custom[256];
584
585 // Note: Luminance weights (weight_red, weight_green, weight_blue) and
586 // lookup tables (RED[], GREEN[], BLUE[], GRAY[]) are kept as globals
587 // since they're precomputed constants, not user-configurable options.
589
590// ============================================================================
591// RCU-based thread-safe options access
592// ============================================================================
593
604const options_t *options_get(void);
605
644#define GET_OPTION(field) \
645 ({ \
646 const options_t *_opts = options_get(); \
647 if (!_opts) { \
648 log_warn("GET_OPTION(" #field ") called but options not initialized"); \
649 } \
650 static typeof(((options_t *)0)->field) _default = {0}; \
651 (_opts ? (_opts->field) : _default); \
652 })
653
668asciichat_error_t options_update(void (*updater)(options_t *, void *), void *context);
669
679asciichat_error_t options_set_dimensions(unsigned short int width, unsigned short int height);
680
690
700
710
718static inline unsigned short int options_get_width(void) {
719 return options_get()->width;
720}
721
729static inline unsigned short int options_get_height(void) {
730 return options_get()->height;
731}
732
733extern const float weight_red;
734
743extern const float weight_green;
744
753extern const float weight_blue;
754
769extern unsigned short int RED[];
770
777extern unsigned short int GREEN[];
778
785extern unsigned short int BLUE[];
786
794extern unsigned short int GRAY[];
795
907asciichat_error_t options_init(int argc, char **argv);
908
944void usage(FILE *desc, asciichat_mode_t mode);
945
964void usage_client(FILE *desc);
965
982void usage_server(FILE *desc);
983
999void usage_mirror(FILE *desc);
1000
1017void usage_acds(FILE *desc);
1018
1053
1084
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
log_level_t
Logging levels enumeration.
Definition log/logging.h:59
void usage_mirror(FILE *desc)
Print mirror usage information.
Definition mirror.c:71
unsigned short int GRAY[]
Grayscale lookup table.
void usage_client(FILE *desc)
Print client usage information.
unsigned short int BLUE[]
Blue channel lookup table.
asciichat_mode_t
Mode type for options parsing.
Definition options.h:426
struct options_state options_t
Consolidated options structure.
void usage_server(FILE *desc)
Print server usage information.
int strtoint_safe(const char *str)
Safely parse string to integer with validation.
void update_dimensions_to_terminal_size(options_t *opts)
Update dimensions to match terminal size.
const float weight_blue
Blue weight for luminance calculation.
asciichat_error_t options_set_dimensions(unsigned short int width, unsigned short int height)
Update terminal dimensions.
Definition rcu.c:294
asciichat_error_t options_set_color_mode(terminal_color_mode_t mode)
Update color mode.
Definition rcu.c:304
const options_t * options_get(void)
Get current options (lock-free read)
Definition rcu.c:222
const float weight_red
#define OPTIONS_BUFF_SIZE
Buffer size for option string values.
Definition options.h:176
asciichat_error_t options_init(int argc, char **argv)
Initialize options by parsing command-line arguments.
Definition options.c:144
asciichat_error_t options_set_log_level(log_level_t level)
Update log level.
Definition rcu.c:322
void usage_acds(FILE *desc)
Print ACDS usage information.
Definition acds.c:109
void usage(FILE *desc, asciichat_mode_t mode)
Print usage information for client, server, or mirror mode.
asciichat_error_t options_set_render_mode(render_mode_t mode)
Update render mode.
Definition rcu.c:313
unsigned short int GREEN[]
Green channel lookup table.
const float weight_green
Green weight for luminance calculation.
asciichat_error_t options_update(void(*updater)(options_t *, void *), void *context)
Update options using copy-on-write (thread-safe)
Definition rcu.c:237
unsigned short int RED[]
Red channel lookup table.
void update_dimensions_for_full_height(options_t *opts)
Update dimensions for full height display.
@ MODE_CLIENT
Client mode - network client options.
Definition options.h:428
@ MODE_ACDS
Discovery service mode - session management and WebRTC signaling.
Definition options.h:430
@ MODE_SERVER
Server mode - network server options.
Definition options.h:427
@ MODE_MIRROR
Mirror mode - local webcam viewing (no network)
Definition options.h:429
palette_type_t
Built-in palette type enumeration.
Definition palette.h:84
render_mode_t
Render mode preferences.
Definition terminal.h:467
terminal_color_mode_t
Terminal color support levels.
Definition terminal.h:424
ASCII Palette Management for Video-to-ASCII Conversion.
Consolidated options structure.
Definition options.h:439
bool acds_insecure
ACDS: skip server key verification (MITM-vulnerable, requires explicit opt-in)
Definition options.h:557
bool webrtc
Enable WebRTC mode for ACDS session (default: false, Direct TCP)
Definition options.h:474
terminal_color_mode_t color_mode
Color mode (auto/none/16/256/truecolor)
Definition options.h:507
char turn_servers[256]
ACDS: Comma-separated list of TURN server URLs.
Definition options.h:573
char port[256]
Server port number.
Definition options.h:464
bool acds_expose_ip
ACDS: explicitly allow public IP disclosure without verification (opt-in)
Definition options.h:556
int compression_level
zstd compression level (1-9)
Definition options.h:487
char acds_key_path[256]
ACDS identity key file path (default: ~/.ascii-chat/acds_identity)
Definition options.h:475
unsigned short int no_encrypt
Disable encryption (opt-out)
Definition options.h:545
bool no_mdns_advertise
Disable mDNS service advertisement (server only)
Definition options.h:482
char password[256]
Password string.
Definition options.h:543
int microphone_index
Microphone device index (-1 = default)
Definition options.h:517
asciichat_mode_t detected_mode
Mode detected from command-line arguments.
Definition options.h:443
bool no_upnp
ACDS: Explicitly disable UPnP/NAT-PMP port mapping.
Definition options.h:571
char stun_servers[256]
ACDS: Comma-separated list of STUN server URLs.
Definition options.h:572
bool enable_upnp
ACDS: Enable UPnP/NAT-PMP port mapping for direct TCP.
Definition options.h:570
bool webrtc_skip_stun
–webrtc-skip-stun: Skip Stage 2 (STUN), go to TURN
Definition options.h:564
unsigned short int force_utf8
Force UTF-8 support.
Definition options.h:510
bool lan_discovery
Enable LAN service discovery via mDNS (client only)
Definition options.h:481
unsigned short int quiet
Quiet mode (suppress logs)
Definition options.h:530
bool no_webrtc
–no-webrtc: Disable WebRTC, use Direct TCP only
Definition options.h:563
unsigned short int encrypt_enabled
Enable encryption.
Definition options.h:541
unsigned short int webcam_index
Webcam device index (0 = first)
Definition options.h:499
bool webrtc_disable_turn
–webrtc-disable-turn: Disable Stage 3 (TURN), use STUN only
Definition options.h:565
char acds_server[256]
ACDS server address (default: 127.0.0.1)
Definition options.h:472
char session_string[64]
Session string for ACDS discovery (client only)
Definition options.h:466
unsigned short int width
Terminal width in characters.
Definition options.h:454
bool auto_height
Auto-detect height from terminal.
Definition options.h:457
log_level_t log_level
Log level threshold.
Definition options.h:536
char turn_credential[256]
ACDS: Credential/password for TURN authentication.
Definition options.h:575
bool require_server_identity
ACDS: require servers to provide signed Ed25519 identity.
Definition options.h:552
char palette_custom[256]
Custom palette characters.
Definition options.h:582
unsigned short int height
Terminal height in characters.
Definition options.h:455
char acds_database_path[256]
ACDS database file path (default: ~/.ascii-chat/acds.db)
Definition options.h:476
int max_clients
Maximum concurrent clients (server only)
Definition options.h:465
bool palette_custom_set
True if custom palette was set.
Definition options.h:583
render_mode_t render_mode
Render mode (foreground/background/half-block)
Definition options.h:508
unsigned short int audio_no_playback
Disable speaker playback (debug)
Definition options.h:520
char server_key[256]
Expected server public key (client)
Definition options.h:546
unsigned short int show_capabilities
Show terminal capabilities and exit.
Definition options.h:509
bool no_audio_mixer
Disable audio mixer (debug)
Definition options.h:502
char encrypt_keyfile[256]
Alternative key file path.
Definition options.h:544
bool version
Show version information.
Definition options.h:449
int acds_port
ACDS server port (default: 27225)
Definition options.h:473
bool no_compress
Disable compression entirely.
Definition options.h:488
char address6[256]
IPv6 bind address (server only)
Definition options.h:463
int speakers_index
Speakers device index (-1 = default)
Definition options.h:518
bool help
Show help message.
Definition options.h:448
bool prefer_webrtc
–prefer-webrtc: Try WebRTC before Direct TCP
Definition options.h:562
double snapshot_delay
Snapshot delay in seconds.
Definition options.h:533
unsigned short int strip_ansi
Strip ANSI escape sequences.
Definition options.h:534
bool acds
Enable ACDS session registration (default: false)
Definition options.h:471
unsigned short int audio_enabled
Enable audio streaming.
Definition options.h:516
int fps
Target framerate (1-144, 0=use default)
Definition options.h:511
int reconnect_attempts
Number of reconnection attempts (-1=infinite, 0=none)
Definition options.h:494
bool test_pattern
Use test pattern instead of webcam.
Definition options.h:501
bool require_client_verify
Client: only connect to servers whose identity was verified by ACDS.
Definition options.h:555
bool webcam_flip
Flip webcam image horizontally.
Definition options.h:500
unsigned short int snapshot_mode
Snapshot mode (one frame and exit)
Definition options.h:532
bool require_server_verify
Server: only accept clients who verified via ACDS.
Definition options.h:554
palette_type_t palette_type
Selected palette type.
Definition options.h:581
char turn_secret[256]
ACDS: Shared secret for dynamic TURN credential generation (HMAC-SHA1)
Definition options.h:576
unsigned short int audio_analysis_enabled
Enable audio analysis (debug)
Definition options.h:519
bool require_client_identity
ACDS: require clients to provide signed Ed25519 identity.
Definition options.h:553
unsigned short int stretch
Allow aspect ratio distortion.
Definition options.h:525
bool encode_audio
Enable Opus audio encoding.
Definition options.h:489
char encrypt_key[256]
SSH/GPG key file path.
Definition options.h:542
char turn_username[256]
ACDS: Username for TURN authentication.
Definition options.h:574
char log_file[256]
Log file path.
Definition options.h:535
unsigned short int verbose_level
Verbosity level (stackable -V)
Definition options.h:531
char address[256]
Server address (client) or bind address (server)
Definition options.h:462
bool auto_width
Auto-detect width from terminal.
Definition options.h:456
char client_keys[256]
Allowed client keys (server)
Definition options.h:547
🖥️ Cross-platform terminal interface for ascii-chat