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
176#define OPTIONS_BUFF_SIZE 256
187#define OPT_WIDTH_DEFAULT 110
198#define OPT_HEIGHT_DEFAULT 70
208#if defined(__APPLE__)
210#define SNAPSHOT_DELAY_DEFAULT 4.0f
212#define SNAPSHOT_DELAY_DEFAULT 3.0f
216#define OPT_PORT_DEFAULT "27224"
219#define OPT_ADDRESS_DEFAULT "localhost"
222#define OPT_ADDRESS6_DEFAULT "::1"
225#define OPT_MAX_CLIENTS_DEFAULT 9
228#define OPT_COMPRESSION_LEVEL_DEFAULT 1
231#define OPT_FPS_DEFAULT 60
234#define OPT_WEBCAM_INDEX_DEFAULT 0
237#define OPT_MICROPHONE_INDEX_DEFAULT (-1)
240#define OPT_SPEAKERS_INDEX_DEFAULT (-1)
243#define OPT_RECONNECT_ATTEMPTS_DEFAULT (-1)
246#define OPT_WEBCAM_FLIP_DEFAULT true
249#define OPT_COLOR_MODE_DEFAULT COLOR_MODE_AUTO
252#define OPT_RENDER_MODE_DEFAULT RENDER_MODE_FOREGROUND
255#define OPT_ENCODE_AUDIO_DEFAULT true
311#define ASCIICHAT_BINARY_OPTIONS_STRUCT \
314 char log_file[OPTIONS_BUFF_SIZE]; \
315 log_level_t log_level; \
316 unsigned short int quiet; \
317 unsigned short int verbose_level;
324#define ASCIICHAT_COMMON_OPTIONS_STRUCT \
325 ASCIICHAT_BINARY_OPTIONS_STRUCT \
326 unsigned short int width; \
327 unsigned short int height; \
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]; \
342 int compression_level; \
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; \
353 bool acds_expose_ip; \
354 bool acds_insecure; \
355 char acds_server[OPTIONS_BUFF_SIZE]; \
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; \
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;
392#define ASCIICHAT_MIRROR_OPTIONS_STRUCT \
393 ASCIICHAT_COMMON_OPTIONS_STRUCT \
394 unsigned short int webcam_index; \
397 terminal_color_mode_t color_mode; \
398 render_mode_t render_mode; \
399 unsigned short int force_utf8; \
400 unsigned short int stretch;
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];
644#define GET_OPTION(field) \
646 const options_t *_opts = options_get(); \
648 log_warn("GET_OPTION(" #field ") called but options not initialized"); \
650 static typeof(((options_t *)0)->field) _default = {0}; \
651 (_opts ? (_opts->field) : _default); \
718static inline unsigned short int options_get_width(
void) {
729static inline unsigned short int options_get_height(
void) {
769extern unsigned short int RED[];
777extern unsigned short int GREEN[];
785extern unsigned short int BLUE[];
794extern unsigned short int GRAY[];
asciichat_error_t
Error and exit codes - unified status values (0-255)
log_level_t
Logging levels enumeration.
void usage_mirror(FILE *desc)
Print mirror usage information.
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.
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.
asciichat_error_t options_set_color_mode(terminal_color_mode_t mode)
Update color mode.
const options_t * options_get(void)
Get current options (lock-free read)
#define OPTIONS_BUFF_SIZE
Buffer size for option string values.
asciichat_error_t options_init(int argc, char **argv)
Initialize options by parsing command-line arguments.
asciichat_error_t options_set_log_level(log_level_t level)
Update log level.
void usage_acds(FILE *desc)
Print ACDS usage information.
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.
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)
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.
@ MODE_ACDS
Discovery service mode - session management and WebRTC signaling.
@ MODE_SERVER
Server mode - network server options.
@ MODE_MIRROR
Mirror mode - local webcam viewing (no network)
palette_type_t
Built-in palette type enumeration.
ASCII Palette Management for Video-to-ASCII Conversion.
Consolidated options structure.
bool acds_insecure
ACDS: skip server key verification (MITM-vulnerable, requires explicit opt-in)
bool webrtc
Enable WebRTC mode for ACDS session (default: false, Direct TCP)
terminal_color_mode_t color_mode
Color mode (auto/none/16/256/truecolor)
char turn_servers[256]
ACDS: Comma-separated list of TURN server URLs.
char port[256]
Server port number.
bool acds_expose_ip
ACDS: explicitly allow public IP disclosure without verification (opt-in)
int compression_level
zstd compression level (1-9)
char acds_key_path[256]
ACDS identity key file path (default: ~/.ascii-chat/acds_identity)
unsigned short int no_encrypt
Disable encryption (opt-out)
bool no_mdns_advertise
Disable mDNS service advertisement (server only)
char password[256]
Password string.
int microphone_index
Microphone device index (-1 = default)
asciichat_mode_t detected_mode
Mode detected from command-line arguments.
bool no_upnp
ACDS: Explicitly disable UPnP/NAT-PMP port mapping.
char stun_servers[256]
ACDS: Comma-separated list of STUN server URLs.
bool enable_upnp
ACDS: Enable UPnP/NAT-PMP port mapping for direct TCP.
bool webrtc_skip_stun
–webrtc-skip-stun: Skip Stage 2 (STUN), go to TURN
unsigned short int force_utf8
Force UTF-8 support.
bool lan_discovery
Enable LAN service discovery via mDNS (client only)
unsigned short int quiet
Quiet mode (suppress logs)
bool no_webrtc
–no-webrtc: Disable WebRTC, use Direct TCP only
unsigned short int encrypt_enabled
Enable encryption.
unsigned short int webcam_index
Webcam device index (0 = first)
bool webrtc_disable_turn
–webrtc-disable-turn: Disable Stage 3 (TURN), use STUN only
char acds_server[256]
ACDS server address (default: 127.0.0.1)
char session_string[64]
Session string for ACDS discovery (client only)
unsigned short int width
Terminal width in characters.
bool auto_height
Auto-detect height from terminal.
log_level_t log_level
Log level threshold.
char turn_credential[256]
ACDS: Credential/password for TURN authentication.
bool require_server_identity
ACDS: require servers to provide signed Ed25519 identity.
char palette_custom[256]
Custom palette characters.
unsigned short int height
Terminal height in characters.
char acds_database_path[256]
ACDS database file path (default: ~/.ascii-chat/acds.db)
int max_clients
Maximum concurrent clients (server only)
bool palette_custom_set
True if custom palette was set.
render_mode_t render_mode
Render mode (foreground/background/half-block)
unsigned short int audio_no_playback
Disable speaker playback (debug)
char server_key[256]
Expected server public key (client)
unsigned short int show_capabilities
Show terminal capabilities and exit.
bool no_audio_mixer
Disable audio mixer (debug)
char encrypt_keyfile[256]
Alternative key file path.
bool version
Show version information.
int acds_port
ACDS server port (default: 27225)
bool no_compress
Disable compression entirely.
char address6[256]
IPv6 bind address (server only)
int speakers_index
Speakers device index (-1 = default)
bool help
Show help message.
bool prefer_webrtc
–prefer-webrtc: Try WebRTC before Direct TCP
double snapshot_delay
Snapshot delay in seconds.
unsigned short int strip_ansi
Strip ANSI escape sequences.
bool acds
Enable ACDS session registration (default: false)
unsigned short int audio_enabled
Enable audio streaming.
int fps
Target framerate (1-144, 0=use default)
int reconnect_attempts
Number of reconnection attempts (-1=infinite, 0=none)
bool test_pattern
Use test pattern instead of webcam.
bool require_client_verify
Client: only connect to servers whose identity was verified by ACDS.
bool webcam_flip
Flip webcam image horizontally.
unsigned short int snapshot_mode
Snapshot mode (one frame and exit)
bool require_server_verify
Server: only accept clients who verified via ACDS.
palette_type_t palette_type
Selected palette type.
char turn_secret[256]
ACDS: Shared secret for dynamic TURN credential generation (HMAC-SHA1)
unsigned short int audio_analysis_enabled
Enable audio analysis (debug)
bool require_client_identity
ACDS: require clients to provide signed Ed25519 identity.
unsigned short int stretch
Allow aspect ratio distortion.
bool encode_audio
Enable Opus audio encoding.
char encrypt_key[256]
SSH/GPG key file path.
char turn_username[256]
ACDS: Username for TURN authentication.
char log_file[256]
Log file path.
unsigned short int verbose_level
Verbosity level (stackable -V)
char address[256]
Server address (client) or bind address (server)
bool auto_width
Auto-detect width from terminal.
char client_keys[256]
Allowed client keys (server)
🖥️ Cross-platform terminal interface for ascii-chat