ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
ringbuffer.h
Go to the documentation of this file.
1#pragma once
2
70
71// C11 stdatomic.h conflicts with MSVC's C++ <atomic> header on Windows.
72// atomic_t is always defined in ascii-chat/atomic.h (wraps C11 _Atomic)
74#include <libplatform/atomic.h>
75#include <stdbool.h>
76#include <stddef.h>
77#include <stdint.h>
78#include <libplatform/mutex.h>
79#include "util/magic.h"
80
90typedef struct {
92 char *buffer;
96 size_t capacity;
98 atomic_t head;
100 atomic_t tail;
102 atomic_t size;
108
109/* ============================================================================
110 * Audio Ring Buffer - Simple ring buffer for audio samples
111 * ============================================================================
112 */
113
120
131#define AUDIO_RING_BUFFER_SIZE 192000
132
146#define AUDIO_JITTER_BUFFER_THRESHOLD 4800
147
159#define AUDIO_JITTER_LOW_WATER_MARK 2400
160
172#define AUDIO_JITTER_HIGH_WATER_MARK (AUDIO_JITTER_BUFFER_THRESHOLD * 2)
173
182#define AUDIO_JITTER_TARGET_LEVEL (AUDIO_JITTER_BUFFER_THRESHOLD + 480)
183
189#define AUDIO_CROSSFADE_SAMPLES 256
190
192
240
241/* ============================================================================
242 * Ring Buffer API
243 * ============================================================================
244 */
245
258ringbuffer_t *ringbuffer_create(size_t element_size, size_t capacity);
259
270
286bool ringbuffer_write(ringbuffer_t *rb, const void *data);
287
303bool ringbuffer_read(ringbuffer_t *rb, void *data);
304
319bool ringbuffer_peek(ringbuffer_t *rb, void *data);
320
333size_t ringbuffer_size(const ringbuffer_t *rb);
334
347bool ringbuffer_is_empty(const ringbuffer_t *rb);
348
361bool ringbuffer_is_full(const ringbuffer_t *rb);
362
377
378/* ============================================================================
379 * Frame Buffer Specific
380 * ============================================================================
381 */
382
393typedef struct {
397 size_t size;
399 char *data;
400} frame_t;
401
426
432
434#define FRAME_MAGIC MAGIC_FRAME_VALID
436#define FRAME_FREED MAGIC_FRAME_FREED
437
439
449typedef struct {
453 mutex_t mutex;
455
467framebuffer_t *framebuffer_create(size_t capacity);
468
481
493
508bool framebuffer_write_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size);
509
525
539
561bool framebuffer_write_multi_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size,
562 uint32_t source_client_id, uint32_t frame_sequence, uint32_t timestamp);
563
579
596
Application limits and constraints.
unsigned int uint32_t
Definition common.h:62
unsigned long long uint64_t
Definition common.h:63
#define MAX_CLIENT_ID_LEN
Maximum client ID length - format: "noun.N (transport:port)" e.g., "mountain.0 (tcp:48036)".
struct audio_ring_buffer audio_ring_buffer_t
Audio ring buffer for real-time audio streaming.
void ringbuffer_clear(ringbuffer_t *rb)
Clear all elements from the buffer.
Definition ringbuffer.c:144
void framebuffer_destroy(framebuffer_t *fb)
Destroy a frame buffer.
Definition ringbuffer.c:215
#define AUDIO_RING_BUFFER_SIZE
Audio ring buffer size in samples (192000 samples = 4 seconds @ 48kHz).
Definition ringbuffer.h:131
void framebuffer_clear(framebuffer_t *fb)
Clear all frames from the buffer, freeing their data.
Definition ringbuffer.c:335
bool framebuffer_read_multi_frame(framebuffer_t *fb, multi_source_frame_t *frame)
Read a multi-source frame from the buffer.
Definition ringbuffer.c:438
framebuffer_t * framebuffer_create_multi(size_t capacity)
Create a multi-source frame buffer for multi-user support.
Definition ringbuffer.c:186
ringbuffer_t * ringbuffer_create(size_t element_size, size_t capacity)
Create a new ring buffer.
Definition ringbuffer.c:34
framebuffer_t * framebuffer_create(size_t capacity)
Mutex-protected ring buffer used to exchange video frames.
Definition ringbuffer.c:157
size_t ringbuffer_size(const ringbuffer_t *rb)
Get current number of elements in the buffer.
Definition ringbuffer.c:132
bool framebuffer_read_frame(framebuffer_t *fb, frame_t *frame)
Read a frame from the buffer.
Definition ringbuffer.c:288
bool ringbuffer_is_full(const ringbuffer_t *rb)
Check if buffer is full.
Definition ringbuffer.c:140
void ringbuffer_destroy(ringbuffer_t *rb)
Destroy a ring buffer and free its memory.
Definition ringbuffer.c:61
bool ringbuffer_is_empty(const ringbuffer_t *rb)
Check if buffer is empty.
Definition ringbuffer.c:136
bool framebuffer_write_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size)
Write a frame to the buffer.
Definition ringbuffer.c:234
bool framebuffer_write_multi_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size, uint32_t source_client_id, uint32_t frame_sequence, uint32_t timestamp)
Write a multi-source frame to the buffer (for multi-user support).
Definition ringbuffer.c:391
bool framebuffer_peek_latest_multi_frame(framebuffer_t *fb, multi_source_frame_t *frame)
Peek at the latest multi-source frame without removing it.
Definition ringbuffer.c:473
bool ringbuffer_read(ringbuffer_t *rb, void *data)
Try to read an element from the ring buffer (non-blocking).
Definition ringbuffer.c:93
bool ringbuffer_write(ringbuffer_t *rb, const void *data)
Try to write an element to the ring buffer (non-blocking).
Definition ringbuffer.c:71
bool ringbuffer_peek(ringbuffer_t *rb, void *data)
Peek at the next element without removing it.
Definition ringbuffer.c:115
Magic number validation constants and macros.
Audio ring buffer for real-time audio streaming.
Definition ringbuffer.h:208
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
float last_sample
Last sample value for smooth fade-out during underrun - NOT atomic (only written by reader).
Definition ringbuffer.h:227
atomic_t crossfade_fade_in
True if we're fading in (recovering from underrun).
Definition ringbuffer.h:225
atomic_t jitter_buffer_filled
True after initial jitter buffer fill.
Definition ringbuffer.h:221
double jitter_drift_phase
Consumer-owned fractional clock correction.
Definition ringbuffer.h:236
uint64_t jitter_stable_samples
Definition ringbuffer.h:235
unsigned channels
Frame width, configured before the first read/write.
Definition ringbuffer.h:209
atomic_t read_index
Read index (consumer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:215
mutex_t mutex
Mutex for SLOW PATH only (clear/destroy operations, not regular read/write).
Definition ringbuffer.h:238
uint32_t jitter_initial_samples
Definition ringbuffer.h:234
bool jitter_buffer_enabled
Whether jitter buffering is enabled (false for capture, true for playback).
Definition ringbuffer.h:231
uint32_t jitter_target_samples
Definition ringbuffer.h:233
atomic_t underrun_count
Count of underrun events for diagnostics.
Definition ringbuffer.h:229
atomic_t write_index
Write index (producer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:213
atomic_t crossfade_samples_remaining
Samples remaining in crossfade (0 = no crossfade active).
Definition ringbuffer.h:223
float data[192000]
Audio sample data buffer.
Definition ringbuffer.h:211
One variable-length payload in the video ring buffer.
Definition ringbuffer.h:393
char * data
Owning frame payload; release with buffer_release() after reading.
Definition ringbuffer.h:399
uint64_t magic
Magic number to detect corruption (FRAME_MAGIC when valid).
Definition ringbuffer.h:395
size_t size
Actual size of frame data in bytes.
Definition ringbuffer.h:397
Mutex-protected ring buffer used to exchange video frames.
Definition ringbuffer.h:449
mutex_t mutex
Mutex for thread-safe access to framebuffer operations.
Definition ringbuffer.h:453
ringbuffer_t * rb
Underlying ring buffer for frame storage.
Definition ringbuffer.h:451
One variable-length payload in the video ring buffer.
Definition ringbuffer.h:412
char * data
Owning frame payload; release with buffer_release() after reading.
Definition ringbuffer.h:424
uint32_t timestamp
Timestamp when frame was captured.
Definition ringbuffer.h:420
uint64_t magic
Magic number to detect corruption (FRAME_MAGIC when valid).
Definition ringbuffer.h:414
uint32_t frame_sequence
Frame sequence number for ordering.
Definition ringbuffer.h:418
size_t size
Actual size of frame data in bytes.
Definition ringbuffer.h:422
char source_client_id[MAX_CLIENT_ID_LEN]
Client ID that sent this frame.
Definition ringbuffer.h:416
Audio ring buffer for real-time audio streaming.
Definition ringbuffer.h:90
bool is_power_of_two
Whether capacity is power of 2 (enables bit masking optimization).
Definition ringbuffer.h:104
size_t capacity
Number of elements that can be stored.
Definition ringbuffer.h:96
atomic_t head
Write position (producer) - atomic for lock-free operations.
Definition ringbuffer.h:98
atomic_t size
Current number of elements - atomic for fast size checks.
Definition ringbuffer.h:102
size_t capacity_mask
Mask for fast modulo when capacity is power of 2.
Definition ringbuffer.h:106
atomic_t tail
Read position (consumer) - atomic for lock-free operations.
Definition ringbuffer.h:100
size_t element_size
Size of each element in bytes.
Definition ringbuffer.h:94
char * buffer
The actual buffer memory.
Definition ringbuffer.h:92