ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
mixer.h
Go to the documentation of this file.
1#pragma once
2
78#include <stdbool.h>
79#include <stdint.h>
80
81// Include ringbuffer.h to get the audio_ring_buffer_t type
82#include "ringbuffer.h"
83#include "platform/rwlock.h"
84#include "asciichat_errno.h"
85
86#ifdef __cplusplus
87extern "C" {
88#endif
89
104#define MIXER_MAX_SOURCES 32 // Increased to match MAX_CLIENTS
105
114#define MIXER_FRAME_SIZE 256
115
137typedef struct {
141 float knee_dB;
143 float ratio;
150
154 float envelope;
156 float gain_lin;
162
180typedef struct {
189
193 float envelope;
201
218typedef struct {
223
225 float alpha;
231
241typedef struct {
246
248 float alpha;
252
271typedef struct {
277 float atten_dB;
282
288 float *envelope;
290 float *gain;
291} ducking_t;
292
363
383mixer_t *mixer_create(int max_sources, int sample_rate);
384
396void mixer_destroy(mixer_t *mixer);
397
422int mixer_add_source(mixer_t *mixer, uint32_t client_id, audio_ring_buffer_t *buffer);
423
438void mixer_remove_source(mixer_t *mixer, uint32_t client_id);
439
455void mixer_set_source_active(mixer_t *mixer, uint32_t client_id, bool active);
456
485int mixer_process(mixer_t *mixer, float *output, int num_samples);
486
505int mixer_process_excluding_source(mixer_t *mixer, float *output, int num_samples, uint32_t exclude_client_id);
506
524float db_to_linear(float db);
525
535float linear_to_db(float linear);
536
549float clamp_float(float value, float min, float max);
550
569void compressor_init(compressor_t *comp, float sample_rate);
570
585void compressor_set_params(compressor_t *comp, float threshold_dB, float ratio, float attack_ms, float release_ms,
586 float makeup_dB);
587
602float compressor_process_sample(compressor_t *comp, float sidechain);
603
626int ducking_init(ducking_t *duck, int num_sources, float sample_rate);
627
636void ducking_free(ducking_t *duck);
637
652void ducking_set_params(ducking_t *duck, float threshold_dB, float leader_margin_dB, float atten_dB, float attack_ms,
653 float release_ms);
654
670void ducking_process_frame(ducking_t *duck, float *envelopes, float *gains, int num_sources);
671
690void noise_gate_init(noise_gate_t *gate, float sample_rate);
691
705void noise_gate_set_params(noise_gate_t *gate, float threshold, float attack_ms, float release_ms, float hysteresis);
706
721float noise_gate_process_sample(noise_gate_t *gate, float input, float peak_amplitude);
722
735void noise_gate_process_buffer(noise_gate_t *gate, float *buffer, int num_samples);
736
746bool noise_gate_is_open(const noise_gate_t *gate);
747
767void highpass_filter_init(highpass_filter_t *filter, float cutoff_hz, float sample_rate);
768
779
791float highpass_filter_process_sample(highpass_filter_t *filter, float input);
792
803void highpass_filter_process_buffer(highpass_filter_t *filter, float *buffer, int num_samples);
804
824void lowpass_filter_init(lowpass_filter_t *filter, float cutoff_hz, float sample_rate);
825
835
847float lowpass_filter_process_sample(lowpass_filter_t *filter, float input);
848
859void lowpass_filter_process_buffer(lowpass_filter_t *filter, float *buffer, int num_samples);
860
879float smoothstep(float t);
880
891int16_t float_to_int16(float sample);
892
902float int16_to_float(int16_t sample);
903
914void buffer_float_to_int16(const float *src, int16_t *dst, int count);
915
926void buffer_int16_to_float(const int16_t *src, float *dst, int count);
927
939float buffer_peak(const float *buffer, int count);
940
951void apply_gain_buffer(float *buffer, int count, float gain);
952
965void fade_buffer(float *buffer, int count, float start_gain, float end_gain);
966
977void fade_buffer_smooth(float *buffer, int count, bool fade_in);
978
991void copy_buffer_with_gain(const float *src, float *dst, int count, float gain);
992
1021float soft_clip(float sample, float threshold, float steepness);
1022
1034void soft_clip_buffer(float *buffer, int num_samples, float threshold, float steepness);
1035
1038#ifdef __cplusplus
1039}
1040#endif
⚠️‼️ Error and/or exit() when things go bad.
float hysteresis
Hysteresis factor (0-1, prevents gate chatter)
Definition mixer.h:188
float release_coeff
Release coefficient (converted from release_ms)
Definition mixer.h:197
bool noise_gate_is_open(const noise_gate_t *gate)
Check if noise gate is currently open.
Definition mixer.c:911
float base_gain
Base gain before crowd scaling is applied.
Definition mixer.h:353
void copy_buffer_with_gain(const float *src, float *dst, int count, float gain)
Copy buffer with gain scaling.
Definition mixer.c:1128
float leader_margin_dB
Leader margin in dB (sources within this of loudest are leaders)
Definition mixer.h:275
void noise_gate_process_buffer(noise_gate_t *gate, float *buffer, int num_samples)
Process a buffer of samples through noise gate.
Definition mixer.c:892
void buffer_float_to_int16(const float *src, int16_t *dst, int count)
Convert float buffer to int16 buffer.
Definition mixer.c:1067
float alpha
Filter coefficient alpha (calculated from cutoff_hz)
Definition mixer.h:225
float release_coeff
Release coefficient (converted from release_ms)
Definition mixer.h:286
float clamp_float(float value, float min, float max)
Clamp a float value to a range.
Definition mixer.c:31
float ratio
Compression ratio (e.g., 4.0 for 4:1 compression)
Definition mixer.h:143
void highpass_filter_reset(highpass_filter_t *filter)
Reset high-pass filter state.
Definition mixer.c:934
float sample_rate
Sample rate in Hz (set during initialization)
Definition mixer.h:222
void soft_clip_buffer(float *buffer, int num_samples, float threshold, float steepness)
Apply soft clipping to a buffer.
Definition mixer.c:1032
float prev_input
Previous input sample (filter state)
Definition mixer.h:227
float prev_output
Previous output sample (filter state)
Definition mixer.h:250
float highpass_filter_process_sample(highpass_filter_t *filter, float input)
Process a single sample through high-pass filter.
Definition mixer.c:942
float envelope
Current envelope follower state (linear, 0-1)
Definition mixer.h:154
bool * source_active
Array of active flags (true if source is active)
Definition mixer.h:338
float cutoff_hz
Cutoff frequency in Hz (frequencies above this are attenuated)
Definition mixer.h:243
void apply_gain_buffer(float *buffer, int count, float gain)
Apply gain to buffer in-place.
Definition mixer.c:1096
float atten_dB
Attenuation in dB for non-leader sources.
Definition mixer.h:277
rwlock_t source_lock
Reader-writer lock protecting source arrays and bitset.
Definition mixer.h:348
void mixer_set_source_active(mixer_t *mixer, uint32_t client_id, bool active)
Set whether a source is active (receiving audio)
Definition mixer.c:432
float * gain
Per-source ducking gain (linear, calculated from envelope)
Definition mixer.h:290
float attack_coeff
Attack coefficient (converted from attack_ms)
Definition mixer.h:284
void ducking_set_params(ducking_t *duck, float threshold_dB, float leader_margin_dB, float atten_dB, float attack_ms, float release_ms)
Set ducking parameters.
Definition mixer.c:175
float release_ms
Release time in milliseconds (how fast gate closes)
Definition mixer.h:186
void ducking_free(ducking_t *duck)
Free ducking system resources.
Definition mixer.c:166
float threshold_dB
Speaking threshold in dB (sources below this are not "speaking")
Definition mixer.h:273
void ducking_process_frame(ducking_t *duck, float *envelopes, float *gains, int num_sources)
Process a frame of audio through ducking system.
Definition mixer.c:184
void noise_gate_init(noise_gate_t *gate, float sample_rate)
Initialize a noise gate.
Definition mixer.c:838
float crowd_alpha
Crowd scaling exponent (typically 0.5 for sqrt scaling)
Definition mixer.h:351
float buffer_peak(const float *buffer, int count)
Find peak absolute value in buffer.
Definition mixer.c:1083
ducking_t ducking
Ducking system (active speaker detection and attenuation)
Definition mixer.h:356
float cutoff_hz
Cutoff frequency in Hz (frequencies below this are attenuated)
Definition mixer.h:220
int num_sources
Current number of active audio sources.
Definition mixer.h:327
float soft_clip(float sample, float threshold, float steepness)
Apply soft clipping to a sample.
Definition mixer.c:1019
float sample_rate
Sample rate in Hz (set during initialization)
Definition mixer.h:191
float knee_dB
Knee width in dB for soft knee (e.g., 2.0)
Definition mixer.h:141
float attack_ms
Attack time in milliseconds (how fast compression kicks in)
Definition mixer.h:145
void compressor_set_params(compressor_t *comp, float threshold_dB, float ratio, float attack_ms, float release_ms, float makeup_dB)
Set compressor parameters.
Definition mixer.c:53
void fade_buffer(float *buffer, int count, float start_gain, float end_gain)
Apply linear fade to buffer in-place.
Definition mixer.c:1105
void compressor_init(compressor_t *comp, float sample_rate)
Initialize a compressor.
Definition mixer.c:42
float alpha
Filter coefficient alpha (calculated from cutoff_hz)
Definition mixer.h:248
int ducking_init(ducking_t *duck, int num_sources, float sample_rate)
Initialize ducking system.
Definition mixer.c:111
void highpass_filter_init(highpass_filter_t *filter, float cutoff_hz, float sample_rate)
Initialize a high-pass filter.
Definition mixer.c:920
uint32_t * source_ids
Array of client IDs (one per source slot)
Definition mixer.h:336
uint64_t active_sources_mask
Bitset of active sources (bit i = source i is active, O(1) iteration)
Definition mixer.h:341
float int16_to_float(int16_t sample)
Convert int16 sample to float.
Definition mixer.c:1063
float * envelope
Per-source envelope follower state (linear, allocated per source)
Definition mixer.h:288
float threshold_dB
Compression threshold in dB (e.g., -10.0)
Definition mixer.h:139
float release_ms
Release time in milliseconds (how fast compression releases)
Definition mixer.h:147
int max_sources
Maximum number of sources (allocated array sizes)
Definition mixer.h:329
float * mix_buffer
Temporary buffer for mixing operations (pre-allocated)
Definition mixer.h:361
float attack_ms
Attack time in milliseconds (how fast gate opens)
Definition mixer.h:184
float envelope
Current envelope follower state (linear, 0-1)
Definition mixer.h:193
float sample_rate
Sample rate in Hz (set during initialization)
Definition mixer.h:152
bool gate_open
True if gate is currently open (allowing audio through)
Definition mixer.h:199
float smoothstep(float t)
Compute smoothstep interpolation.
Definition mixer.c:1046
void fade_buffer_smooth(float *buffer, int count, bool fade_in)
Apply smoothstep fade to buffer in-place.
Definition mixer.c:1117
float attack_ms
Ducking attack time in milliseconds.
Definition mixer.h:279
int mixer_add_source(mixer_t *mixer, uint32_t client_id, audio_ring_buffer_t *buffer)
Add an audio source to the mixer.
Definition mixer.c:363
int16_t float_to_int16(float sample)
Convert float sample to int16 (WebRTC format)
Definition mixer.c:1054
compressor_t compressor
Compressor (dynamic range compression)
Definition mixer.h:358
float sample_rate
Sample rate in Hz (set during initialization)
Definition mixer.h:245
void lowpass_filter_init(lowpass_filter_t *filter, float cutoff_hz, float sample_rate)
Initialize a low-pass filter.
Definition mixer.c:970
mixer_t * mixer_create(int max_sources, int sample_rate)
Create a new audio mixer.
Definition mixer.c:218
int mixer_process_excluding_source(mixer_t *mixer, float *output, int num_samples, uint32_t exclude_client_id)
Process audio from all sources except one (for per-client output)
Definition mixer.c:604
float db_to_linear(float db)
Convert decibels to linear gain.
Definition mixer.c:23
void lowpass_filter_process_buffer(lowpass_filter_t *filter, float *buffer, int num_samples)
Process a buffer of samples through low-pass filter.
Definition mixer.c:1005
void highpass_filter_process_buffer(highpass_filter_t *filter, float *buffer, int num_samples)
Process a buffer of samples through high-pass filter.
Definition mixer.c:956
float release_ms
Ducking release time in milliseconds.
Definition mixer.h:281
audio_ring_buffer_t ** source_buffers
Array of pointers to client audio ring buffers.
Definition mixer.h:334
void noise_gate_set_params(noise_gate_t *gate, float threshold, float attack_ms, float release_ms, float hysteresis)
Set noise gate parameters.
Definition mixer.c:852
float makeup_dB
Makeup gain in dB (compensates for gain reduction)
Definition mixer.h:149
float compressor_process_sample(compressor_t *comp, float sidechain)
Process a single sample through compressor.
Definition mixer.c:87
void mixer_destroy(mixer_t *mixer)
Destroy a mixer and free all resources.
Definition mixer.c:346
int sample_rate
Sample rate in Hz (e.g., 44100)
Definition mixer.h:331
float lowpass_filter_process_sample(lowpass_filter_t *filter, float input)
Process a single sample through low-pass filter.
Definition mixer.c:993
float linear_to_db(float linear)
Convert linear gain to decibels.
Definition mixer.c:27
void lowpass_filter_reset(lowpass_filter_t *filter)
Reset low-pass filter state.
Definition mixer.c:986
float attack_coeff
Attack coefficient (converted from attack_ms)
Definition mixer.h:158
int mixer_process(mixer_t *mixer, float *output, int num_samples)
Process audio from all active sources.
Definition mixer.c:459
void mixer_remove_source(mixer_t *mixer, uint32_t client_id)
Remove an audio source from the mixer.
Definition mixer.c:400
void buffer_int16_to_float(const int16_t *src, float *dst, int count)
Convert int16 buffer to float buffer.
Definition mixer.c:1075
float threshold
Gate threshold in linear units (e.g., 0.01f for -40dB)
Definition mixer.h:182
float prev_output
Previous output sample (filter state)
Definition mixer.h:229
float release_coeff
Release coefficient (converted from release_ms)
Definition mixer.h:160
float gain_lin
Current gain multiplier (linear, calculated from envelope)
Definition mixer.h:156
float attack_coeff
Attack coefficient (converted from attack_ms)
Definition mixer.h:195
float noise_gate_process_sample(noise_gate_t *gate, float input, float peak_amplitude)
Process a single sample through noise gate.
Definition mixer.c:867
unsigned int uint32_t
Definition common.h:58
unsigned long long uint64_t
Definition common.h:59
unsigned char uint8_t
Definition common.h:56
pthread_rwlock_t rwlock_t
Read-write lock type (POSIX: pthread_rwlock_t)
Definition rwlock.h:40
Lock-Free Ring Buffer and Frame Buffer Management.
Cross-platform read-write lock interface for ascii-chat.
Audio ring buffer for real-time audio streaming.
Definition ringbuffer.h:208
Dynamic range compressor settings and state.
Definition mixer.h:137
Ducking system settings and state.
Definition mixer.h:271
High-pass filter settings and state.
Definition mixer.h:218
Low-pass filter state.
Definition mixer.h:241
Main mixer structure for multi-source audio processing.
Definition mixer.h:325
Noise gate settings and state.
Definition mixer.h:180