ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
main.c File Reference

ascii-chat Discovery Mode Entry Point More...

Go to the source code of this file.

Functions

bool should_exit (void)
 
int discovery_main (void)
 Run discovery mode main loop.
 

Detailed Description

ascii-chat Discovery Mode Entry Point

Discovery mode enables zero-configuration video chat where participants can dynamically become hosts based on NAT quality. This implements the "one command to start, one command to join" philosophy.

Discovery Flow

  1. Parse session string (word-word-word format)
  2. Query ACDS for session information
  3. Assess NAT quality (STUN test)
  4. Either: a. Connect to existing host as participant b. Become host if no host exists or better NAT quality
  5. Handle dynamic role changes during session

Implementation Architecture

Discovery mode uses lib/session APIs for media handling:

  • session_host_t: For rendering and broadcasting when elected host
  • session_participant_t: For capture and display when not host
  • discovery_session_t: For ACDS connection and host negotiation

No network protocol code duplication - all media handling via lib/session.

Author
Zachary Fogg me@zf.nosp@m.o.gg
Date
January 2026
Version
1.0

Definition in file discovery/main.c.

Function Documentation

◆ discovery_main()

int discovery_main ( void  )

Run discovery mode main loop.

Discovery mode entry point for unified binary.

Handles session discovery, host negotiation, and media flow.

Returns
0 on success, non-zero error code on failure

Definition at line 338 of file discovery/main.c.

338 {
339 log_debug("discovery_main() starting");
340
341 // Discovery-specific setup: initialize ACDS connection and session negotiation
342 // Note: Shared setup (keepawake, splash, terminal, capture, display, audio)
343 // is handled by session_client_like_run()
344
345 // Get session string from options (command-line argument)
346 const char *session_string = GET_OPTION(session_string);
347 bool is_initiator = (session_string == NULL || session_string[0] == '\0');
348
349 int port_int = GET_OPTION(port);
350
351 log_debug("Discovery: is_initiator=%d, port=%d", is_initiator, port_int);
352
353 // Create discovery session configuration
354 discovery_config_t discovery_config = {
355 .acds_address = GET_OPTION(discovery_server),
356 .acds_port = (uint16_t)GET_OPTION(discovery_port),
357 .session_string = is_initiator ? NULL : session_string,
358 .local_port = (uint16_t)port_int,
359 .on_state_change = on_discovery_state_change,
360 .on_session_ready = on_session_ready,
361 .on_error = on_discovery_error,
362 .callback_user_data = NULL,
363 .should_exit_callback = discovery_capture_should_exit_adapter,
364 .exit_callback_data = NULL,
365 };
366
367 // Create discovery session (stored in global for discovery_run() to access)
368 g_discovery = discovery_session_create(&discovery_config);
369 if (!g_discovery) {
370 log_fatal("Failed to create discovery session");
371 return ERROR_MEMORY;
372 }
373
374 // Start discovery session (connects to ACDS, creates/joins, initiates NAT negotiation)
375 log_debug("Discovery: starting discovery session");
376 asciichat_error_t result = discovery_session_start(g_discovery);
377 if (result != ASCIICHAT_OK) {
378 log_fatal("Failed to start discovery session: %d", result);
379 discovery_session_destroy(g_discovery);
380 g_discovery = NULL;
381 return result;
382 }
383
384 // No network interrupt callback needed - discovery session handles its own shutdown
386
387 /* ========================================================================
388 * Configure and Run Shared Client-Like Session Framework
389 * ========================================================================
390 * session_client_like_run() handles all shared initialization:
391 * - Terminal output management
392 * - Keepawake system
393 * - Splash screen lifecycle
394 * - Media source selection
395 * - FPS probing
396 * - Audio initialization
397 * - Display context creation
398 * - Proper cleanup ordering
399 *
400 * Discovery mode provides:
401 * - discovery_run() callback: NAT negotiation, role determination, media handling
402 * - discovery_keyboard_handler: interactive controls for participant role
403 */
404
405 session_client_like_config_t config = {
406 .run_fn = discovery_run,
407 .run_user_data = NULL,
408 .tcp_client = NULL,
409 .websocket_client = NULL,
410 .discovery = (void *)g_discovery, // Opaque pointer to discovery session
411 .custom_should_exit = NULL,
412 .exit_user_data = NULL,
413 .keyboard_handler = discovery_keyboard_handler,
414 .max_reconnect_attempts = 0, // Discovery doesn't retry - role is determined once
415 .should_reconnect_callback = NULL,
416 .reconnect_user_data = NULL,
417 .reconnect_delay_ms = 0,
418 .print_newline_on_tty_exit = false, // Server/participant manages cursor
419 };
420
421 log_debug("Discovery: calling session_client_like_run()");
422 asciichat_error_t session_result = session_client_like_run(&config);
423 log_debug("Discovery: session_client_like_run() returned %d", session_result);
424
425 // Cleanup discovery session
426 log_debug("Discovery: cleaning up");
427
428 if (g_discovery) {
429 discovery_session_stop(g_discovery);
430 discovery_session_destroy(g_discovery);
431 g_discovery = NULL;
432 }
433
434 return (session_result == ASCIICHAT_OK) ? 0 : (int)session_result;
435}
asciichat_error_t session_client_like_run(const session_client_like_config_t *config)
Definition client_like.c:96
void set_interrupt_callback(void(*cb)(void))
Definition main.c:102
void discovery_session_stop(discovery_session_t *session)
Stop the discovery session.
discovery_session_t * discovery_session_create(const discovery_config_t *config)
Create a new discovery session.
asciichat_error_t discovery_session_start(discovery_session_t *session)
Start the discovery session.
void discovery_session_destroy(discovery_session_t *session)
Destroy discovery session and free resources.
Configuration for discovery session.
Definition session.h:211
const char * acds_address
ACDS address (default: "127.0.0.1")
Definition session.h:213

References discovery_config_t::acds_address, discovery_session_create(), discovery_session_destroy(), discovery_session_start(), discovery_session_stop(), session_client_like_run(), and set_interrupt_callback().

◆ should_exit()

bool should_exit ( void  )
extern

Definition at line 90 of file main.c.

90 {
91 return atomic_load(&g_app_should_exit);
92}