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

ascii-chat Discovery Mode Entry Point Header More...

Go to the source code of this file.

Functions

int discovery_main (void)
 Discovery mode entry point for unified binary.
 

Detailed Description

ascii-chat Discovery Mode Entry Point Header

This header exposes the discovery mode entry point for the unified binary architecture. The unified binary dispatches to discovery_main() when invoked as ascii-chat discovery.

Discovery Mode Philosophy

"ascii-chat should be as simple as making a phone call."

Discovery mode enables zero-configuration video chat:

  • One command to start: ascii-chat swift-river-mountain
  • Automatic host negotiation: Best NAT quality participant becomes host
  • Dynamic role switching: Participants can become hosts mid-session
  • Seamless failover: If host disconnects, another participant takes over

Mode Entry Point Contract

Each mode entry point (server_main, client_main, discovery_main) must:

  • Accept no arguments: int mode_main(void)
  • Options are already parsed by main dispatcher (available via GET_OPTION())
  • Return 0 on success, non-zero error code on failure
  • Perform mode-specific initialization and main loop
  • Perform complete cleanup before returning

Implementation Notes

Discovery mode combines client and server capabilities:

  • Uses session library (lib/session/) for capture, display, hosting
  • Connects to ACDS for session discovery and NAT quality assessment
  • Can transition between participant and host roles dynamically
Author
Zachary Fogg me@zf.nosp@m.o.gg
Date
January 2026
Version
1.0

Definition in file discovery/main.h.

Function Documentation

◆ discovery_main()

int discovery_main ( void  )

Discovery mode entry point for unified binary.

This function implements the complete discovery mode lifecycle:

  • Session discovery via ACDS or LAN mDNS
  • NAT quality assessment for host selection
  • Dynamic role switching (participant <-> host)
  • Media streaming (video/audio capture and display)
  • Graceful shutdown and cleanup

Options are already parsed by the main dispatcher before this function is called, so they are available via GET_OPTION().

Returns
0 on success, non-zero error code on failure
Example
# Join a session (session string as positional argument):
ascii-chat discovery swift-river-mountain
# Or more concisely (session strings are auto-detected):
ascii-chat swift-river-mountain

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().