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

When code needs to work with audio device info, it keeps index, max_input_channels, max_output_channels, default_sample_rate here instead of scattering it across globals. Initialization establishes the handles and sizes; teardown must release any allocation, lock, thread, or callback context recorded in those fields. 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).
platform_thread_t worker_thread
 Worker thread for audio processing.
mutex_t audio_processing_wait_guard
 Coordinates device-worker sleep with shutdown.
cond_t audio_processing_wakeup
 Capture/AEC work, monitor refill, or shutdown notification.
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.
uint64_t test_audio_playback_position
 Output callback's synthesized monitor sample clock.
void * capture_media_source
 Borrowed local media audio; configure before starting duplex.
double sample_rate
 Actual sample rate of streams (48kHz).
unsigned input_device_channels
unsigned output_device_channels
audio_resampler_t capture_resampler
audio_resampler_t playback_resampler
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

When code needs to work with audio device info, it keeps index, max_input_channels, max_output_channels, default_sample_rate here instead of scattering it across globals. Initialization establishes the handles and sizes; teardown must release any allocation, lock, thread, or callback context recorded in those fields.

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 117 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 154 of file include/ascii-chat/audio/audio.h.

Referenced by audio_set_pipeline().

◆ audio_processing_wait_guard

mutex_t audio_context_t::audio_processing_wait_guard

Coordinates device-worker sleep with shutdown.

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

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

◆ audio_processing_wakeup

cond_t audio_context_t::audio_processing_wakeup

Capture/AEC work, monitor refill, or shutdown notification.

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

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

◆ capture_buffer

audio_ring_buffer_t* audio_context_t::capture_buffer

OLD: Worker → Network (will become processed_capture_rb).

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

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

◆ capture_media_source

void* audio_context_t::capture_media_source

Borrowed local media audio; configure before starting duplex.

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

Referenced by audio_init(), audio_start_duplex(), client_protocol_start(), session_audio_set_capture_source(), and session_audio_start_duplex().

◆ capture_resampler

audio_resampler_t audio_context_t::capture_resampler

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

Referenced by audio_start_duplex().

◆ duplex_stream

PaStream* audio_context_t::duplex_stream

PortAudio full-duplex stream (simultaneous input+output).

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

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ initialized

◆ input_device_channels

unsigned audio_context_t::input_device_channels

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

Referenced by audio_start_duplex().

◆ input_device_rate

double audio_context_t::input_device_rate

Native sample rate of input device.

Definition at line 163 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 167 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 165 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 166 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 120 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 155 of file include/ascii-chat/audio/audio.h.

Referenced by audio_init(), and audio_start_duplex().

◆ output_device_channels

unsigned audio_context_t::output_device_channels

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

Referenced by audio_start_duplex().

◆ output_device_rate

double audio_context_t::output_device_rate

Native sample rate of output device.

Definition at line 164 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 170 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 168 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 169 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 121 of file include/ascii-chat/audio/audio.h.

Referenced by audio_start_duplex(), and audio_stop_duplex().

◆ playback_buffer

◆ playback_only

bool audio_context_t::playback_only

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

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

Referenced by audio_start_duplex().

◆ playback_resampler

audio_resampler_t audio_context_t::playback_resampler

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

Referenced by audio_start_duplex().

◆ processed_playback_rb

audio_ring_buffer_t* audio_context_t::processed_playback_rb

Worker → Callback: Ready for speakers.

Definition at line 126 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 124 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 125 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 131 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 147 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 158 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 148 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 150 of file include/ascii-chat/audio/audio.h.

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

◆ state_mutex

mutex_t audio_context_t::state_mutex

Mutex protecting context state.

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

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

◆ test_audio_playback_position

uint64_t audio_context_t::test_audio_playback_position

Output callback's synthesized monitor sample clock.

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

Referenced by audio_start_duplex().

◆ worker_capture_batch

float* audio_context_t::worker_capture_batch

Pre-allocated buffer for batch capture processing.

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

Referenced by audio_destroy(), and audio_init().

◆ worker_playback_batch

float* audio_context_t::worker_playback_batch

Pre-allocated buffer for batch playback processing.

Definition at line 143 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 142 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 137 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 138 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

platform_thread_t audio_context_t::worker_thread

Worker thread for audio processing.

Definition at line 134 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: