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.h File Reference

🔊 Audio Capture and Playback Interface for ascii-chat More...

Go to the source code of this file.

Data Structures

struct  audio_context_t
 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...
struct  audio_device_info_t
 Audio device information structure. More...
struct  audio_batch_info_t
 Parsed audio batch packet header information. More...

Macros

#define AUDIO_DEVICE_NAME_MAX   256
 Maximum length of audio device name.

Functions

asciichat_error_t audio_init (audio_context_t *ctx)
 Initialize audio context and PortAudio.
void audio_destroy (audio_context_t *ctx)
 Destroy audio context and clean up resources.
void audio_terminate_portaudio_final (void)
 Terminate PortAudio and free all device resources.
void audio_set_pipeline (audio_context_t *ctx, void *pipeline)
 Set audio pipeline for echo cancellation.
asciichat_error_t audio_start_duplex (audio_context_t *ctx)
 Start full-duplex audio (simultaneous capture and playback).
asciichat_error_t audio_stop_duplex (audio_context_t *ctx)
 Stop full-duplex audio.
asciichat_error_t audio_read_samples (audio_context_t *ctx, float *buffer, int num_samples)
 Read captured audio samples from capture buffer.
asciichat_error_t audio_write_samples (audio_context_t *ctx, const float *buffer, int num_samples)
 Write audio samples to playback buffer.
asciichat_error_t audio_set_realtime_priority (void)
 Request real-time priority for current thread.
asciichat_error_t audio_list_input_devices (audio_device_info_t **out_devices, unsigned int *out_count)
 List available audio input devices (microphones).
asciichat_error_t audio_list_output_devices (audio_device_info_t **out_devices, unsigned int *out_count)
 List available audio output devices (speakers).
void audio_free_device_list (audio_device_info_t *devices)
 Free device list allocated by audio_list_input_devices/audio_list_output_devices.
asciichat_error_t audio_dequantize_samples (const uint8_t *samples_ptr, uint32_t total_samples, float *out_samples)
 Dequantize network audio samples from int32 to float.
audio_ring_buffer_t * audio_ring_buffer_create (void)
 Create a new audio ring buffer (for playback with jitter buffering).
audio_ring_buffer_t * audio_ring_buffer_create_format (unsigned channels, bool capture)
void audio_ring_buffer_set_jitter_target (audio_ring_buffer_t *rb, uint32_t samples)
audio_ring_buffer_t * audio_ring_buffer_create_for_capture (void)
 Create a new audio ring buffer for capture (without jitter buffering).
void audio_ring_buffer_destroy (audio_ring_buffer_t *rb)
 Destroy an audio ring buffer.
void audio_ring_buffer_register_atomics (audio_ring_buffer_t *rb, const char *context_name)
 Register audio ring buffer atomic fields for debug tracking.
void audio_ring_buffer_unregister_atomics (audio_ring_buffer_t *rb)
 Unregister audio ring buffer atomic fields.
void audio_ring_buffer_clear (audio_ring_buffer_t *rb)
 Clear all audio samples from ring buffer.
void audio_ring_buffer_discard_pending (audio_ring_buffer_t *rb)
asciichat_error_t audio_ring_buffer_write (audio_ring_buffer_t *rb, const float *data, int samples)
 Write audio samples to ring buffer.
size_t audio_ring_buffer_read (audio_ring_buffer_t *rb, float *data, size_t samples)
 Read audio samples from ring buffer.
size_t audio_ring_buffer_peek (audio_ring_buffer_t *rb, float *data, size_t samples)
 Peek at available samples without consuming them (for AEC3 render signal).
size_t audio_ring_buffer_available_read (audio_ring_buffer_t *rb)
 Get number of samples available for reading.
size_t audio_ring_buffer_available_write (audio_ring_buffer_t *rb)
 Get number of sample slots available for writing.
void resample_linear (const float *src, size_t src_samples, float *dst, size_t dst_samples, double src_rate, double dst_rate)
 Resample audio using linear interpolation.
asciichat_error_t audio_parse_batch_header (const void *data, size_t len, audio_batch_info_t *out_batch)
 Parse an audio batch packet header from raw packet data.
asciichat_error_t audio_validate_batch_params (const audio_batch_info_t *batch)
 Validate audio batch parameters for sanity.
bool audio_is_supported_sample_rate (uint32_t sample_rate)
 Check if a sample rate is a standard/supported rate.
void audio_flush_playback_buffers (audio_context_t *ctx)
 Flush all audio buffers to synchronize with seek operations.
bool audio_should_enable_microphone (audio_capture_source_t source, bool has_media_audio)
 Determine if microphone should be enabled based on audio source setting and media state.

Detailed Description

🔊 Audio Capture and Playback Interface for ascii-chat

Definition in file include/ascii-chat/audio/audio.h.

Macro Definition Documentation

◆ AUDIO_DEVICE_NAME_MAX

#define AUDIO_DEVICE_NAME_MAX   256

Maximum length of audio device name.

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

Function Documentation

◆ audio_ring_buffer_create_format()

audio_ring_buffer_t * audio_ring_buffer_create_format ( unsigned channels,
bool capture )

Allocate an explicitly formatted mono/stereo queue.

Definition at line 908 of file lib/audio/audio.c.

908 {
909 if (channels != 1 && channels != 2) {
910 SET_ERRNO(ERROR_INVALID_PARAM, "Invalid audio queue channel count");
911 return NULL;
912 }
913 audio_ring_buffer_t *rb = audio_ring_buffer_create_internal(!capture);
914 if (rb) {
915 rb->channels = channels;
916 rb->jitter_initial_samples *= channels;
918 }
919 return rb;
920}
#define SET_ERRNO(code,...)
@ ERROR_INVALID_PARAM
struct audio_ring_buffer audio_ring_buffer_t
Audio ring buffer for real-time audio streaming.
unsigned channels
Frame width, configured before the first read/write.
Definition ringbuffer.h:209
uint32_t jitter_initial_samples
Definition ringbuffer.h:234
uint32_t jitter_target_samples
Definition ringbuffer.h:233

References audio_ring_buffer::channels, ERROR_INVALID_PARAM, audio_ring_buffer::jitter_initial_samples, audio_ring_buffer::jitter_target_samples, and SET_ERRNO.

Referenced by audio_init(), audio_start_duplex(), and session_audio_add_source().

◆ audio_ring_buffer_discard_pending()

void audio_ring_buffer_discard_pending ( audio_ring_buffer_t * rb)

Definition at line 995 of file lib/audio/audio.c.

995 {
996 if (rb) {
997 // Capture the current producer position before the caller writes its new
998 // samples. The consumer can drop everything through this point while
999 // preserving samples appended afterward.
1000 unsigned int write_idx = atomic_load_u64(&rb->write_index);
1001 atomic_store_u64(&rb->discard_to_index, write_idx);
1002 atomic_store_bool(&rb->discard_pending, true);
1003 }
1004}
atomic_t discard_pending
Consumer should discard queued samples before its next read.
Definition ringbuffer.h:217
atomic_t discard_to_index
Producer position at which the stale queue ends.
Definition ringbuffer.h:219
atomic_t write_index
Write index (producer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:213

References audio_ring_buffer::discard_pending, audio_ring_buffer::discard_to_index, and audio_ring_buffer::write_index.

Referenced by audio_ring_buffer_write().

◆ audio_ring_buffer_set_jitter_target()

void audio_ring_buffer_set_jitter_target ( audio_ring_buffer_t * rb,
uint32_t samples )

Set initial 20-160 ms target before starting producer/consumer threads.

Definition at line 887 of file lib/audio/audio.c.

887 {
888 if (!rb)
889 return;
890 if (samples < OPUS_FRAME_SAMPLES * rb->channels)
891 samples = OPUS_FRAME_SAMPLES * rb->channels;
892 if (samples > 7680 * rb->channels)
893 samples = 7680 * rb->channels;
894 rb->jitter_initial_samples = samples;
895 rb->jitter_target_samples = samples;
896 rb->jitter_stable_samples = 0;
897 rb->jitter_drift_phase = 0;
898}
#define OPUS_FRAME_SAMPLES
double jitter_drift_phase
Consumer-owned fractional clock correction.
Definition ringbuffer.h:236
uint64_t jitter_stable_samples
Definition ringbuffer.h:235

References audio_ring_buffer::channels, audio_ring_buffer::jitter_drift_phase, audio_ring_buffer::jitter_initial_samples, audio_ring_buffer::jitter_stable_samples, audio_ring_buffer::jitter_target_samples, and OPUS_FRAME_SAMPLES.

Referenced by audio_connection_init().