62#if defined(__cplusplus) && defined(_WIN32)
70#include <sys/resource.h>
71#elif defined(__APPLE__)
73#include <mach/thread_policy.h>
74#include <mach/kern_return.h>
87#define AUDIO_SAMPLE_RATE 48000
89#define AUDIO_FRAMES_PER_BUFFER 480
91#define AUDIO_CHANNELS 1
93#define AUDIO_BUFFER_SIZE (AUDIO_FRAMES_PER_BUFFER * AUDIO_CHANNELS)
330#define AUDIO_DEVICE_NAME_MAX 256
617void resample_linear(
const float *src,
size_t src_samples,
float *dst,
size_t dst_samples,
double src_rate,
size_t audio_ring_buffer_read(audio_ring_buffer_t *rb, float *data, size_t samples)
Read audio samples from ring buffer.
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_ring_buffer_write(audio_ring_buffer_t *rb, const float *data, int samples)
Write audio samples to ring buffer.
void audio_ring_buffer_destroy(audio_ring_buffer_t *rb)
Destroy an audio ring buffer.
asciichat_error_t audio_init(audio_context_t *ctx)
Initialize audio context and PortAudio.
asciichat_error_t audio_set_realtime_priority(void)
Request real-time priority for current thread.
audio_ring_buffer_t * audio_ring_buffer_create(void)
Create a new audio ring buffer (for playback with jitter buffering)
bool audio_is_supported_sample_rate(uint32_t sample_rate)
Check if a sample rate is a standard/supported rate.
size_t audio_ring_buffer_available_read(audio_ring_buffer_t *rb)
Get number of samples available for reading.
asciichat_error_t audio_start_duplex(audio_context_t *ctx)
Start full-duplex audio (simultaneous capture and playback)
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.
void audio_destroy(audio_context_t *ctx)
Destroy audio context and clean up resources.
asciichat_error_t audio_stop_duplex(audio_context_t *ctx)
Stop full-duplex audio.
asciichat_error_t audio_write_samples(audio_context_t *ctx, const float *buffer, int num_samples)
Write audio samples to playback buffer.
void audio_set_pipeline(audio_context_t *ctx, void *pipeline)
Set audio pipeline for echo cancellation.
audio_ring_buffer_t * audio_ring_buffer_create_for_capture(void)
Create a new audio ring buffer for capture (without jitter buffering)
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)
asciichat_error_t audio_validate_batch_params(const audio_batch_info_t *batch)
Validate audio batch parameters for sanity.
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_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_list_output_devices(audio_device_info_t **out_devices, unsigned int *out_count)
List available audio output devices (speakers)
void audio_ring_buffer_clear(audio_ring_buffer_t *rb)
Clear all audio samples from ring buffer.
asciichat_error_t audio_read_samples(audio_context_t *ctx, float *buffer, int num_samples)
Read captured audio samples from capture buffer.
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.
size_t audio_ring_buffer_available_write(audio_ring_buffer_t *rb)
Get number of sample slots available for writing.
asciichat_error_t
Error and exit codes - unified status values (0-255)
#define AUDIO_DEVICE_NAME_MAX
Maximum length of audio device name.
Cross-platform mutex interface for ascii-chat.
Lock-Free Ring Buffer and Frame Buffer Management.
Parsed audio batch packet header information.
uint32_t batch_count
Number of audio frames in this batch.
uint32_t channels
Number of channels (1=mono, 2=stereo)
uint32_t sample_rate
Sample rate in Hz (e.g., 48000)
uint32_t total_samples
Total number of samples across all frames.
Audio context for full-duplex capture and playback.
bool initialized
True if context has been initialized.
double input_device_rate
Native sample rate of input device.
audio_ring_buffer_t * playback_buffer
Ring buffer for decoded audio from network.
PaStream * input_stream
Separate input stream (when full-duplex unavailable)
bool separate_streams
True if using separate input/output streams.
double sample_rate
Actual sample rate of streams (48kHz)
audio_ring_buffer_t * capture_buffer
Ring buffer for processed capture (after AEC3) for encoder thread.
void * audio_pipeline
Client audio pipeline for AEC3 echo cancellation (opaque pointer)
bool running
True if duplex stream is active.
audio_ring_buffer_t * render_buffer
Ring buffer for render reference (separate streams mode)
double output_device_rate
Native sample rate of output device.
mutex_t state_mutex
Mutex protecting context state.
_Atomic bool shutting_down
True when shutdown started - callback outputs silence.
PaStream * duplex_stream
PortAudio full-duplex stream (simultaneous input+output)
PaStream * output_stream
Separate output stream (when full-duplex unavailable)
Audio device information structure.
int max_output_channels
Maximum output channels (0 if input only)
int max_input_channels
Maximum input channels (0 if output only)
int index
PortAudio device index.
double default_sample_rate
Default sample rate in Hz.
bool is_default_output
True if this is the default output device.
bool is_default_input
True if this is the default input device.
Audio ring buffer for real-time audio streaming.