ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
audio_context_t Struct Reference

Audio context for full-duplex capture and playback. More...

#include <include/ascii-chat/audio/audio.h>

Data Fields

PaStream * duplex_stream
 PortAudio full-duplex stream (simultaneous input+output)
 
PaStream * input_stream
 Separate input stream (when full-duplex unavailable)
 
PaStream * output_stream
 Separate output stream (when full-duplex unavailable)
 
audio_ring_buffer_t * raw_capture_rb
 Callback → Worker: Raw mic samples (no processing)
 
audio_ring_buffer_t * raw_render_rb
 Callback → Worker: Raw speaker samples (AEC3 reference)
 
audio_ring_buffer_t * processed_playback_rb
 Worker → Callback: Ready for speakers.
 
audio_ring_buffer_t * capture_buffer
 OLD: Worker → Network (will become processed_capture_rb)
 
audio_ring_buffer_t * playback_buffer
 OLD: Network → Worker (will become network_playback_rb)
 
audio_ring_buffer_t * render_buffer
 Ring buffer for render reference (separate streams mode)
 
asciichat_thread_t worker_thread
 Worker thread for audio processing.
 
mutex_t worker_mutex
 Mutex protecting worker state.
 
cond_t worker_cond
 Condition variable for worker signaling.
 
bool worker_running
 True if worker thread is running.
 
atomic_t worker_should_stop
 Signal worker thread to exit.
 
float * worker_capture_batch
 Pre-allocated buffer for batch capture processing.
 
float * worker_render_batch
 Pre-allocated buffer for batch render processing.
 
float * worker_playback_batch
 Pre-allocated buffer for batch playback processing.
 
bool initialized
 True if context has been initialized.
 
bool running
 True if duplex stream is active.
 
bool separate_streams
 True if using separate input/output streams.
 
bool playback_only
 True for playback-only mode (mirror), skip microphone capture.
 
atomic_t shutting_down
 True when shutdown started - callback outputs silence.
 
mutex_t state_mutex
 Mutex protecting context state.
 
void * audio_pipeline
 Client audio pipeline for AEC3 echo cancellation (opaque pointer)
 
bool monitor_local_media
 Play local file audio in solo sessions.
 
void * capture_media_source
 Borrowed local media audio; configure before starting duplex.
 
double sample_rate
 Actual sample rate of streams (48kHz)
 
double input_device_rate
 Native sample rate of input device.
 
double output_device_rate
 Native sample rate of output device.
 
double input_resample_phase
 Source position carried between native-rate input blocks.
 
float input_resample_previous
 Last input sample used at a block boundary.
 
bool input_resample_has_previous
 Whether a prior input block has been processed.
 
double output_resample_phase
 48 kHz source position carried between output callbacks
 
float output_resample_previous
 Last source sample used at an output boundary.
 
bool output_resample_has_previous
 Whether a prior output block has been processed.
 

Detailed Description

Audio context for full-duplex capture and playback.

Manages a single PortAudio full-duplex stream for simultaneous audio capture and playback. Uses a single callback that receives both render (speaker output) and capture (microphone input) at the EXACT same instant, enabling perfect timing for WebRTC AEC3 echo cancellation.

WORKER THREAD ARCHITECTURE: The audio system now uses a dedicated worker thread to move ALL heavy processing (AEC3 and RMS calculations) out of the real-time PortAudio callbacks. This ensures callbacks complete in <2ms (was 50-80ms).

Architecture:

  • PortAudio Callback (Real-Time, <2ms): Lock-free ring buffer copies only
  • Audio callbacks: Bounded stateful sample-rate conversion when device rates differ
  • Worker Thread (Non-Real-Time): Heavy processing (AEC3, filters)

Ring Buffers:

  • raw_capture_rb: Callback → Worker (raw mic samples)
  • raw_render_rb: Callback → Worker (raw speaker samples for AEC3 reference)
  • processed_capture_rb: Worker → Network (after AEC3/filters, ready for encoder)
  • processed_playback_rb: Worker → Callback (ready for speakers)
  • network_playback_rb: Network → Worker (decoded Opus from network)
Note
The audio context must be initialized with audio_init() before use.
Use audio_start_duplex()/audio_stop_duplex() to control the stream.
State is protected by state_mutex for thread-safe operations.

Definition at line 129 of file include/ascii-chat/audio/audio.h.

Field Documentation

◆ audio_pipeline

void* audio_context_t::audio_pipeline

Client audio pipeline for AEC3 echo cancellation (opaque pointer)

Definition at line 166 of file include/ascii-chat/audio/audio.h.

Referenced by audio_set_pipeline().

◆ capture_buffer

audio_ring_buffer_t* audio_context_t::capture_buffer

OLD: Worker → Network (will become processed_capture_rb)

Definition at line 141 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), audio_read_samples(), session_audio_read_captured(), and session_capture_read_audio().

◆ capture_media_source

void* audio_context_t::capture_media_source

Borrowed local media audio; configure before starting duplex.

Definition at line 168 of file include/ascii-chat/audio/audio.h.

Referenced by audio_init(), audio_start_duplex(), protocol_start_connection(), session_audio_set_capture_source(), and session_client_like_run().

◆ duplex_stream

PaStream* audio_context_t::duplex_stream

PortAudio full-duplex stream (simultaneous input+output)

Definition at line 131 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ initialized

◆ input_device_rate

double audio_context_t::input_device_rate

Native sample rate of input device.

Definition at line 170 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ input_resample_has_previous

bool audio_context_t::input_resample_has_previous

Whether a prior input block has been processed.

Definition at line 174 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ input_resample_phase

double audio_context_t::input_resample_phase

Source position carried between native-rate input blocks.

Definition at line 172 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ input_resample_previous

float audio_context_t::input_resample_previous

Last input sample used at a block boundary.

Definition at line 173 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ input_stream

PaStream* audio_context_t::input_stream

Separate input stream (when full-duplex unavailable)

Definition at line 132 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ monitor_local_media

bool audio_context_t::monitor_local_media

Play local file audio in solo sessions.

Definition at line 167 of file include/ascii-chat/audio/audio.h.

Referenced by audio_init(), and session_client_like_run().

◆ output_device_rate

double audio_context_t::output_device_rate

Native sample rate of output device.

Definition at line 171 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ output_resample_has_previous

bool audio_context_t::output_resample_has_previous

Whether a prior output block has been processed.

Definition at line 177 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ output_resample_phase

double audio_context_t::output_resample_phase

48 kHz source position carried between output callbacks

Definition at line 175 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ output_resample_previous

float audio_context_t::output_resample_previous

Last source sample used at an output boundary.

Definition at line 176 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ output_stream

PaStream* audio_context_t::output_stream

Separate output stream (when full-duplex unavailable)

Definition at line 133 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ playback_buffer

audio_ring_buffer_t* audio_context_t::playback_buffer

◆ playback_only

bool audio_context_t::playback_only

True for playback-only mode (mirror), skip microphone capture.

Definition at line 161 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and session_client_like_run().

◆ processed_playback_rb

audio_ring_buffer_t* audio_context_t::processed_playback_rb

Worker → Callback: Ready for speakers.

Definition at line 138 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_flush_playback_buffers(), and audio_init().

◆ raw_capture_rb

audio_ring_buffer_t* audio_context_t::raw_capture_rb

Callback → Worker: Raw mic samples (no processing)

Definition at line 136 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), and audio_init().

◆ raw_render_rb

audio_ring_buffer_t* audio_context_t::raw_render_rb

Callback → Worker: Raw speaker samples (AEC3 reference)

Definition at line 137 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_flush_playback_buffers(), and audio_init().

◆ render_buffer

audio_ring_buffer_t* audio_context_t::render_buffer

Ring buffer for render reference (separate streams mode)

Definition at line 143 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_flush_playback_buffers(), audio_start_duplex(), and audio_stop_duplex().

◆ running

bool audio_context_t::running

True if duplex stream is active.

Definition at line 159 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_start_duplex(), and audio_stop_duplex().

◆ sample_rate

double audio_context_t::sample_rate

Actual sample rate of streams (48kHz)

Definition at line 169 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex().

◆ separate_streams

bool audio_context_t::separate_streams

True if using separate input/output streams.

Definition at line 160 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ shutting_down

atomic_t audio_context_t::shutting_down

True when shutdown started - callback outputs silence.

Definition at line 162 of file include/ascii-chat/audio/audio.h.

Referenced by audio_init(), audio_stop_duplex(), and audio_write_samples().

◆ state_mutex

mutex_t audio_context_t::state_mutex

Mutex protecting context state.

Definition at line 163 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), audio_start_duplex(), and audio_stop_duplex().

◆ worker_capture_batch

float* audio_context_t::worker_capture_batch

Pre-allocated buffer for batch capture processing.

Definition at line 153 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), and audio_init().

◆ worker_cond

cond_t audio_context_t::worker_cond

Condition variable for worker signaling.

Definition at line 148 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), audio_stop_duplex(), and audio_stop_thread().

◆ worker_mutex

mutex_t audio_context_t::worker_mutex

Mutex protecting worker state.

Definition at line 147 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), and audio_stop_thread().

◆ worker_playback_batch

float* audio_context_t::worker_playback_batch

Pre-allocated buffer for batch playback processing.

Definition at line 155 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), and audio_init().

◆ worker_render_batch

float* audio_context_t::worker_render_batch

Pre-allocated buffer for batch render processing.

Definition at line 154 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), and audio_init().

◆ worker_running

bool audio_context_t::worker_running

True if worker thread is running.

Definition at line 149 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), audio_start_duplex(), and audio_stop_duplex().

◆ worker_should_stop

atomic_t audio_context_t::worker_should_stop

Signal worker thread to exit.

Definition at line 150 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_init(), audio_start_duplex(), audio_stop_duplex(), and audio_stop_thread().

◆ worker_thread

asciichat_thread_t audio_context_t::worker_thread

Worker thread for audio processing.

Definition at line 146 of file include/ascii-chat/audio/audio.h.

Referenced by audio_destroy(), audio_start_duplex(), and audio_stop_duplex().


The documentation for this struct was generated from the following file: