ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
participant.h File Reference

👤 Client-side session participation abstraction More...

Go to the source code of this file.

Data Structures

struct  session_participant_callbacks_t
 Client-side event hooks for connection, media, settings, and errors. More...
struct  session_participant_config_t
 Client-side event hooks for connection, media, settings, and errors. More...

Typedefs

typedef struct acip_transport acip_transport_t
 Forward declaration of ACIP transport.

Functions

session_participant_t * session_participant_create (const session_participant_config_t *config)
 Server address, security, media, transport, and callback settings for a participant.
void session_participant_destroy (session_participant_t *p)
 Destroy session participant and free resources.
asciichat_error_t session_participant_connect (session_participant_t *p)
 Connect to session server.
void session_participant_disconnect (session_participant_t *p)
 Disconnect from session server.
bool session_participant_is_connected (session_participant_t *p)
 Check if participant is connected.
uint32_t session_participant_get_client_id (session_participant_t *p)
 Get assigned client ID.
asciichat_error_t session_participant_start_video (session_participant_t *p)
 Start video capture and streaming.
void session_participant_stop_video (session_participant_t *p)
 Stop and join video capture, then release its resources Also stops audio when it may borrow the video media source.
bool session_participant_is_video_active (session_participant_t *p)
 Check if video is streaming.
asciichat_error_t session_participant_start_audio (session_participant_t *p)
 Start audio capture and streaming.
void session_participant_stop_audio (session_participant_t *p)
 Stop audio capture and streaming.
bool session_participant_is_audio_active (session_participant_t *p)
 Check if audio is streaming.
asciichat_error_t session_participant_get_settings (session_participant_t *p, session_settings_t *settings)
 Get current session settings.
asciichat_error_t session_participant_request_settings (session_participant_t *p, const session_settings_t *settings)
 Request this participant's remote rendering update.
asciichat_error_t session_participant_set_transport (session_participant_t *p, acip_transport_t *transport, acip_transport_ownership_t ownership)
 Select a transport and its ownership mode for the participant.
asciichat_error_t session_participant_set_connection (session_participant_t *p, network_connection_t **owner)
 Detach the selected transport and transfer its ownership responsibility.
asciichat_error_t session_participant_take_connection (session_participant_t *, network_connection_t **)
acip_transport_t * session_participant_get_transport (session_participant_t *p)
 Get the current transport for the participant.
bool session_participant_has_transport (session_participant_t *p)
 Check if participant has a selected transport.
network_connection_t * session_participant_connection (session_participant_t *p)
asciichat_error_t session_participant_receive_settings (session_participant_t *p, const void *payload, size_t length)

Detailed Description

👤 Client-side session participation abstraction

Definition in file participant.h.

Function Documentation

◆ session_participant_connection()

network_connection_t * session_participant_connection ( session_participant_t * p)

Borrow the connection until the participant stops or transfers ownership.

Definition at line 815 of file participant.c.

815 {
816 return p ? p->network : NULL;
817}
network_connection_t * network
Definition participant.c:92

References session_participant::network.

◆ session_participant_receive_settings()

asciichat_error_t session_participant_receive_settings ( session_participant_t * p,
const void * payload,
size_t length )

Dispatch SETTINGS_ACK on the connection owner thread; callbacks run outside locks.

Definition at line 819 of file participant.c.

819 {
820 if (!p || !p->initialized)
821 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid participant");
823 const char *json;
824 size_t json_length;
825 asciichat_error_t result = acip_settings_decode(payload, length, &header, &json, &json_length);
826 if (result != ASCIICHAT_OK)
827 return result;
828 mutex_lock(&p->settings_mutex);
829 if ((header.request && (header.request > p->settings_request || header.request < p->settings_applied_request)) ||
830 header.revision < p->settings.version) {
831 mutex_unlock(&p->settings_mutex);
832 return ASCIICHAT_OK;
833 }
834 options_t *current = SAFE_MALLOC(sizeof(*current), options_t *),
835 *candidate = SAFE_MALLOC(sizeof(*candidate), options_t *);
837 result = options_prepare_json(current, json, json_length, candidate, true);
838 if (result == ASCIICHAT_OK) {
840 p->settings.version = header.revision;
841 if (header.request)
842 p->settings_applied_request = header.request;
843 }
844 session_settings_t effective = p->settings;
845 SAFE_FREE(current);
846 SAFE_FREE(candidate);
847 mutex_unlock(&p->settings_mutex);
848 if (result != ASCIICHAT_OK)
849 return result;
850 if (header.status && p->callbacks.on_error)
851 p->callbacks.on_error(p, (asciichat_error_t)header.status, "Remote rendering update rejected", p->user_data);
853 p->callbacks.on_settings_changed(p, &effective, p->user_data);
854 return ASCIICHAT_OK;
855}
#define SET_ERRNO(code,...)
#define SAFE_FREE(ptr)
Definition common.h:377
#define SAFE_MALLOC(size, cast)
Definition common.h:265
asciichat_error_t
Error and exit codes - unified status values (0-255).
Definition error_codes.h:44
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
struct options_state options_t
Immutable, RCU-published snapshot of the application's runtime configuration.
asciichat_error_t acip_settings_decode(const void *payload, size_t length, acip_settings_header_t *header, const char **json, size_t *json_length)
asciichat_error_t options_prepare_json(const options_t *current, const char *json, size_t length, options_t *candidate, bool remote_only)
Definition rcu.c:987
void session_settings_to_options(const session_settings_t *settings, options_t *values)
void session_settings_from_values(const options_t *values, session_settings_t *settings)
acip settings header keeps the values that move through the subsystem: schema, request,...
void(* on_settings_changed)(session_participant_t *p, const session_settings_t *settings, void *user_data)
Called when session settings change.
void(* on_error)(session_participant_t *p, asciichat_error_t error, const char *message, void *user_data)
Called when an error occurs.
session_settings_t settings
Current session settings.
uint32_t settings_applied_request
bool initialized
Context is initialized.
session_participant_callbacks_t callbacks
Event callbacks.
Definition participant.c:85
void * user_data
User data for callbacks.
Definition participant.c:88
uint32_t settings_request
When code needs to work with session settings, it keeps version, width, height, color_mode here inste...

References acip_settings_decode(), ASCIICHAT_OK, session_participant::callbacks, ERROR_INVALID_PARAM, session_participant::initialized, session_participant_callbacks_t::on_error, session_participant_callbacks_t::on_settings_changed, options_prepare_json(), SAFE_FREE, SAFE_MALLOC, session_settings_from_values(), session_settings_to_options(), SET_ERRNO, session_participant::settings, session_participant::settings_applied_request, session_participant::settings_mutex, session_participant::settings_request, session_participant::user_data, and session_settings_t::version.

◆ session_participant_set_connection()

asciichat_error_t session_participant_set_connection ( session_participant_t * p,
network_connection_t ** owner )

Detach the selected transport and transfer its ownership responsibility.

Parameters
pParticipant whose media workers have been stopped
transportReceives the detached transport, or NULL if none
ownershipReceives the detached transport's ownership mode
Returns
ASCIICHAT_OK on success; outputs are unchanged on failure

Definition at line 784 of file participant.c.

784 {
785 if (!owner || !*owner)
786 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing participant connection");
788 if (result != ASCIICHAT_OK)
789 return result;
790 p->network = *owner;
791 *owner = NULL;
795 p->connected = result == ASCIICHAT_OK && acip_transport_is_connected(p->transport);
796 return result;
797}
asciichat_error_t session_participant_set_transport(session_participant_t *p, acip_transport_t *transport, acip_transport_ownership_t ownership)
Select a transport and its ownership mode for the participant.
acip_transport_t * network_connection_transport(network_connection_t *c)
asciichat_error_t session_connection_start(session_connection_t *connection)
bool connected
Currently connected.
Definition participant.c:98
struct acip_transport * transport
Selected transport used by all media workers.
Definition participant.c:91
session_connection_t connection
Definition participant.c:59
acip_transport_ownership_t transport_ownership
Responsibility for releasing the selected transport.
Definition participant.c:95

References ACIP_TRANSPORT_BORROWED, ACIP_TRANSPORT_OWNED, ASCIICHAT_OK, session_participant::connected, session_participant::connection, ERROR_INVALID_PARAM, session_participant::network, network_connection_transport(), session_connection_start(), session_participant_set_transport(), SET_ERRNO, session_participant::transport, and session_participant::transport_ownership.

◆ session_participant_take_connection()

asciichat_error_t session_participant_take_connection ( session_participant_t * p,
network_connection_t ** connection )

Definition at line 768 of file participant.c.

768 {
769 if (!p || !p->initialized || !connection)
770 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing participant connection output");
773 return SET_ERRNO(ERROR_INVALID_STATE, "Stop media before transferring its connection");
774 if (!p->network)
775 return SET_ERRNO(ERROR_INVALID_STATE, "Participant does not own a connection");
776 *connection = p->network;
777 p->network = NULL;
778 p->transport = NULL;
780 p->connected = false;
781 return ASCIICHAT_OK;
782}
bool session_av_state_should_run(session_av_state_t *state)
Definition av_state.c:45
@ ERROR_INVALID_STATE
session_av_state_t audio
Audio streaming active.
bool audio_thread_created
Audio worker handle requires joining.
session_av_state_t video
Video streaming active.
bool video_thread_created
Video worker handle requires joining.

References ACIP_TRANSPORT_BORROWED, ASCIICHAT_OK, session_participant::audio, session_participant::audio_thread_created, session_participant::connected, ERROR_INVALID_PARAM, ERROR_INVALID_STATE, session_participant::initialized, session_participant::network, session_av_state_should_run(), SET_ERRNO, session_participant::transport, session_participant::transport_ownership, session_participant::video, and session_participant::video_thread_created.