ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
ringbuffer.h
Go to the documentation of this file.
1#pragma once
2
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)
73#include <ascii-chat/atomic.h>
74#include <stdbool.h>
75#include <stddef.h>
76#include <stdint.h>
77#include "platform/mutex.h"
78#include "util/magic.h"
79
106
107/* ============================================================================
108 * Audio Ring Buffer - Simple ring buffer for audio samples
109 * ============================================================================
110 */
111
128#define AUDIO_RING_BUFFER_SIZE 192000
129
143#define AUDIO_JITTER_BUFFER_THRESHOLD 4800
144
156#define AUDIO_JITTER_LOW_WATER_MARK 2400
157
169#define AUDIO_JITTER_HIGH_WATER_MARK (AUDIO_JITTER_BUFFER_THRESHOLD * 2)
170
179#define AUDIO_JITTER_TARGET_LEVEL (AUDIO_JITTER_BUFFER_THRESHOLD + 480)
180
186#define AUDIO_CROSSFADE_SAMPLES 256
187
231
232/* ============================================================================
233 * Ring Buffer API
234 * ============================================================================
235 */
236
249ringbuffer_t *ringbuffer_create(size_t element_size, size_t capacity);
250
261
277bool ringbuffer_write(ringbuffer_t *rb, const void *data);
278
294bool ringbuffer_read(ringbuffer_t *rb, void *data);
295
310bool ringbuffer_peek(ringbuffer_t *rb, void *data);
311
324size_t ringbuffer_size(const ringbuffer_t *rb);
325
338bool ringbuffer_is_empty(const ringbuffer_t *rb);
339
352bool ringbuffer_is_full(const ringbuffer_t *rb);
353
368
369/* ============================================================================
370 * Frame Buffer Specific
371 * ============================================================================
372 */
373
383typedef struct {
387 size_t size;
389 char *data;
390} frame_t;
391
400typedef struct {
404 char source_client_id[64];
410 size_t size;
412 char *data;
414
422#define FRAME_MAGIC MAGIC_FRAME_VALID
424#define FRAME_FREED MAGIC_FRAME_FREED
425
442
453framebuffer_t *framebuffer_create(size_t capacity);
454
467
479
494bool framebuffer_write_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size);
495
514
528
550bool framebuffer_write_multi_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size,
551 uint32_t source_client_id, uint32_t frame_sequence, uint32_t timestamp);
552
571
589
⚛️ Atomic operations abstraction layer with debug tracking
unsigned int uint32_t
Definition common.h:58
unsigned long long uint64_t
Definition common.h:59
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:133
void framebuffer_destroy(framebuffer_t *fb)
Destroy a frame buffer.
Definition ringbuffer.c:202
#define AUDIO_RING_BUFFER_SIZE
Audio ring buffer size in samples (192000 samples = 4 seconds @ 48kHz)
Definition ringbuffer.h:128
void framebuffer_clear(framebuffer_t *fb)
Clear all frames from the buffer, freeing their data.
Definition ringbuffer.c:322
bool framebuffer_read_multi_frame(framebuffer_t *fb, multi_source_frame_t *frame)
Read a multi-source frame from the buffer.
Definition ringbuffer.c:425
framebuffer_t * framebuffer_create_multi(size_t capacity)
Create a multi-source frame buffer for multi-user support.
Definition ringbuffer.c:174
ringbuffer_t * ringbuffer_create(size_t element_size, size_t capacity)
Create a new ring buffer.
Definition ringbuffer.c:29
framebuffer_t * framebuffer_create(size_t capacity)
Create a frame buffer for ASCII frames.
Definition ringbuffer.c:146
size_t ringbuffer_size(const ringbuffer_t *rb)
Get current number of elements in the buffer.
Definition ringbuffer.c:121
bool framebuffer_read_frame(framebuffer_t *fb, frame_t *frame)
Read a frame from the buffer.
Definition ringbuffer.c:275
bool ringbuffer_is_full(const ringbuffer_t *rb)
Check if buffer is full.
Definition ringbuffer.c:129
void ringbuffer_destroy(ringbuffer_t *rb)
Destroy a ring buffer and free its memory.
Definition ringbuffer.c:53
bool ringbuffer_is_empty(const ringbuffer_t *rb)
Check if buffer is empty.
Definition ringbuffer.c:125
bool framebuffer_write_frame(framebuffer_t *fb, const char *frame_data, size_t frame_size)
Write a frame to the buffer.
Definition ringbuffer.c:221
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:378
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:460
bool ringbuffer_read(ringbuffer_t *rb, void *data)
Try to read an element from the ring buffer (non-blocking)
Definition ringbuffer.c:82
bool ringbuffer_write(ringbuffer_t *rb, const void *data)
Try to write an element to the ring buffer (non-blocking)
Definition ringbuffer.c:60
bool ringbuffer_peek(ringbuffer_t *rb, void *data)
Peek at the next element without removing it.
Definition ringbuffer.c:104
Magic number validation constants and macros.
Cross-platform mutex interface for ascii-chat.
int frame
Definition splash.c:99
ClangTool/LibTooling compatibility shim for stdbool.h.
Atomic value wrapper for integral/boolean types.
Definition atomic.h:76
Audio ring buffer for real-time audio streaming.
Definition ringbuffer.h:205
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
float last_sample
Last sample value for smooth fade-out during underrun - NOT atomic (only written by reader)
Definition ringbuffer.h:223
atomic_t crossfade_fade_in
True if we're fading in (recovering from underrun)
Definition ringbuffer.h:221
atomic_t jitter_buffer_filled
True after initial jitter buffer fill.
Definition ringbuffer.h:217
atomic_t read_index
Read index (consumer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:211
mutex_t mutex
Mutex for SLOW PATH only (clear/destroy operations, not regular read/write)
Definition ringbuffer.h:229
bool jitter_buffer_enabled
Whether jitter buffering is enabled (false for capture, true for playback)
Definition ringbuffer.h:227
atomic_t underrun_count
Count of underrun events for diagnostics.
Definition ringbuffer.h:225
atomic_t write_index
Write index (producer position) - LOCK-FREE with atomic operations.
Definition ringbuffer.h:209
atomic_t crossfade_samples_remaining
Samples remaining in crossfade (0 = no crossfade active)
Definition ringbuffer.h:219
float data[192000]
Audio sample data buffer.
Definition ringbuffer.h:207
Frame structure that stores both data and actual size.
Definition ringbuffer.h:383
char * data
Pointer to frame data (not owned by this struct)
Definition ringbuffer.h:389
uint64_t magic
Magic number to detect corruption (FRAME_MAGIC when valid)
Definition ringbuffer.h:385
size_t size
Actual size of frame data in bytes.
Definition ringbuffer.h:387
Frame buffer structure for managing video frames.
Definition ringbuffer.h:436
mutex_t mutex
Mutex for thread-safe access to framebuffer operations.
Definition ringbuffer.h:440
ringbuffer_t * rb
Underlying ring buffer for frame storage.
Definition ringbuffer.h:438
Multi-source frame structure for multi-user support.
Definition ringbuffer.h:400
char * data
Pointer to frame data (not owned by this struct)
Definition ringbuffer.h:412
uint32_t timestamp
Timestamp when frame was captured.
Definition ringbuffer.h:408
uint64_t magic
Magic number to detect corruption (FRAME_MAGIC when valid)
Definition ringbuffer.h:402
uint32_t frame_sequence
Frame sequence number for ordering.
Definition ringbuffer.h:406
size_t size
Actual size of frame data in bytes.
Definition ringbuffer.h:410
Mutex type (POSIX: pthread_mutex_t with debug tracking)
Lock-free ring buffer structure.
Definition ringbuffer.h:88
bool is_power_of_two
Whether capacity is power of 2 (enables bit masking optimization)
Definition ringbuffer.h:102
size_t capacity
Number of elements that can be stored.
Definition ringbuffer.h:94
atomic_t head
Write position (producer) - atomic for lock-free operations.
Definition ringbuffer.h:96
atomic_t size
Current number of elements - atomic for fast size checks.
Definition ringbuffer.h:100
size_t capacity_mask
Mask for fast modulo when capacity is power of 2.
Definition ringbuffer.h:104
atomic_t tail
Read position (consumer) - atomic for lock-free operations.
Definition ringbuffer.h:98
size_t element_size
Size of each element in bytes.
Definition ringbuffer.h:92
char * buffer
The actual buffer memory.
Definition ringbuffer.h:90