ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
audio.c File Reference

🔊 Audio capture and playback using PortAudio with buffer management More...

Go to the source code of this file.

Macros

#define WORKER_BATCH_FRAMES   480
 
#define WORKER_BATCH_SAMPLES   (WORKER_BATCH_FRAMES * AUDIO_CHANNELS)
 
#define WORKER_TIMEOUT_MS   1
 

Functions

void audio_terminate_portaudio_final (void)
 Terminate PortAudio and free all device resources.
 
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.
 
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_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.
 
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_set_pipeline (audio_context_t *ctx, void *pipeline)
 Set audio pipeline for echo cancellation.
 
void audio_flush_playback_buffers (audio_context_t *ctx)
 Flush all audio buffers to synchronize with seek operations.
 
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_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.
 
asciichat_error_t audio_set_realtime_priority (void)
 Request real-time priority for current thread.
 
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.
 
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 using PortAudio with buffer management

Definition in file lib/audio/audio.c.

Macro Definition Documentation

◆ WORKER_BATCH_FRAMES

#define WORKER_BATCH_FRAMES   480

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

◆ WORKER_BATCH_SAMPLES

#define WORKER_BATCH_SAMPLES   (WORKER_BATCH_FRAMES * AUDIO_CHANNELS)

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

◆ WORKER_TIMEOUT_MS

#define WORKER_TIMEOUT_MS   1

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

Function Documentation

◆ audio_ring_buffer_discard_pending()

void audio_ring_buffer_discard_pending ( audio_ring_buffer_t *  rb)

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

1087 {
1088 if (rb) {
1089 // Capture the current producer position before the caller writes its new
1090 // samples. The consumer can drop everything through this point while
1091 // preserving samples appended afterward.
1092 unsigned int write_idx = atomic_load_u64(&rb->write_index);
1093 atomic_store_u64(&rb->discard_to_index, write_idx);
1095 }
1096}
void atomic_store_bool(atomic_t *a, bool value)
Atomically store a boolean value.
Definition atomic.c:177
void atomic_store_u64(atomic_t *a, uint64_t value)
Atomically store a uint64_t value.
Definition atomic.c:241
uint64_t atomic_load_u64(atomic_t *a)
Atomically load a uint64_t value.
Definition atomic.c:233
atomic_t discard_pending
Consumer should discard queued samples before its next read.
Definition ringbuffer.h:213
atomic_t discard_to_index
Producer position at which the stale queue ends.
Definition ringbuffer.h:215
atomic_t write_index
Write index (producer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:209

References atomic_load_u64(), atomic_store_bool(), atomic_store_u64(), audio_ring_buffer::discard_pending, audio_ring_buffer::discard_to_index, and audio_ring_buffer::write_index.

Referenced by audio_ring_buffer_write().