ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
lib/audio/audio.h
Go to the documentation of this file.
1#pragma once
2
60#include <stdbool.h>
61// C11 stdatomic.h conflicts with MSVC's C++ <atomic> header on Windows.
62#if defined(__cplusplus) && defined(_WIN32)
63#include <atomic>
64#else
65#include <stdatomic.h>
66#endif
67#include <portaudio.h>
68#ifdef __linux__
69#include <sched.h>
70#include <sys/resource.h>
71#elif defined(__APPLE__)
72#include <mach/mach.h>
73#include <mach/thread_policy.h>
74#include <mach/kern_return.h>
75#endif
76
77#include "common.h"
78#include "platform/mutex.h"
79#include "ringbuffer.h"
80
81/* ============================================================================
82 * Audio Configuration Constants
83 * ============================================================================
84 */
85
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)
94
95/* ============================================================================
96 * Data Structures
97 * ============================================================================
98 */
99
131
132/* ============================================================================
133 * Audio Context Lifecycle
134 * @{
135 */
136
155
170
185void audio_set_pipeline(audio_context_t *ctx, void *pipeline);
186
189/* ============================================================================
190 * Full-Duplex Audio Control
191 * @{
192 */
193
221
235
238/* ============================================================================
239 * Audio I/O Operations
240 * @{
241 */
242
263asciichat_error_t audio_read_samples(audio_context_t *ctx, float *buffer, int num_samples);
264
285asciichat_error_t audio_write_samples(audio_context_t *ctx, const float *buffer, int num_samples);
286
289/* ============================================================================
290 * Real-Time Priority Scheduling
291 * @{
292 */
293
321
324/* ============================================================================
325 * Audio Device Enumeration
326 * @{
327 */
328
330#define AUDIO_DEVICE_NAME_MAX 256
331
349
366asciichat_error_t audio_list_input_devices(audio_device_info_t **out_devices, unsigned int *out_count);
367
384asciichat_error_t audio_list_output_devices(audio_device_info_t **out_devices, unsigned int *out_count);
385
396
399/* ============================================================================
400 * Protocol Helper Functions - Audio Format Conversion
401 * @{
402 */
403
424asciichat_error_t audio_dequantize_samples(const uint8_t *samples_ptr, uint32_t total_samples, float *out_samples);
425
428/* ============================================================================
429 * Audio Ring Buffer Management
430 * @{
431 */
432
451
469
482
493
513asciichat_error_t audio_ring_buffer_write(audio_ring_buffer_t *rb, const float *data, int samples);
514
535size_t audio_ring_buffer_read(audio_ring_buffer_t *rb, float *data, size_t samples);
536
550size_t audio_ring_buffer_peek(audio_ring_buffer_t *rb, float *data, size_t samples);
551
567
583
586/* ============================================================================
587 * Audio Resampling Utilities
588 * @{
589 */
590
617void resample_linear(const float *src, size_t src_samples, float *dst, size_t dst_samples, double src_rate,
618 double dst_rate);
619
622/* ============================================================================
623 * Audio Batch Packet Format
624 * @{
625 */
626
651
685asciichat_error_t audio_parse_batch_header(const void *data, size_t len, audio_batch_info_t *out_batch);
686
716
736
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.
unsigned int uint32_t
Definition common.h:58
unsigned char uint8_t
Definition common.h:56
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
pthread_mutex_t mutex_t
Mutex type (POSIX: pthread_mutex_t)
Definition mutex.h:38
#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.
Definition ringbuffer.h:208