48 std::unique_ptr<char[]>
data;
70 ring->data = std::make_unique<char[]>(size);
84 int avail = (end -
start + 2 * buf_len) % buf_len;
85 if(avail == 0 && (end >= buf_len) != (
start >= buf_len))
97 void **ptr1,
int *size1,
98 void **ptr2,
int *size2)
103 int end = std::atomic_load_explicit(&ring->
end, std::memory_order_acquire);
105 int start = std::atomic_load_explicit(&ring->
start, std::memory_order_relaxed);
108 if(read_len > max_len)
112 int to_end = ring->
len - start_idx;
113 *ptr1 = ring->
data.get() + start_idx;
114 if(read_len <= to_end) {
120 *ptr2 = ring->
data.get();
121 *size2 = read_len - to_end;
129 int start = std::atomic_load_explicit(&ring->
start, std::memory_order_relaxed);
134 std::atomic_store_explicit(&ring->
start,
135 (
start + amount) % (2*ring->
len), std::memory_order_release);
146 memcpy(out, ptr1, size1);
148 memcpy(out + size1, ptr2, size2);
165 void **ptr1,
int *size1,
166 void **ptr2,
int *size2)
174 int end = std::atomic_load_explicit(&ring->
end, std::memory_order_relaxed);
176 if(requested_len > ring->
len) {
180 int end_idx = end % ring->
len;
181 int to_end = ring->
len - end_idx;
182 *ptr1 = ring->
data.get() + end_idx;
183 *size1 = requested_len < to_end ? requested_len : to_end;
184 if(*size1 < requested_len){
185 *ptr2 = ring->
data.get();
186 *size2 = requested_len - *size1;
189 return *size1 + *size2;
193 const int start = std::atomic_load_explicit(&ring->
start, std::memory_order_acquire);
195 const int end = std::atomic_load_explicit(&ring->
end, std::memory_order_relaxed);
201 std::atomic_store_explicit(&ring->
end,
202 (end + amount) % (2*ring->
len), std::memory_order_release);
215 fprintf(stderr,
"Warning: too long write request for ring buffer (%d B)!!!\n",
len);
219 memcpy(ptr1, in, size1);
221 memcpy(ptr2, in + size1, size2);
225 fprintf(stderr,
"Warning: ring buffer overflow!!!\n");
241 fprintf(stderr,
"Warning: too long write request for ring buffer (%d B)!!!\n", size);
245 memset(ptr1, c, size1);
247 memset(ptr2, c, size2);
251 fprintf(stderr,
"Warning: ring buffer overflow!!!\n");
271 int start = std::atomic_load_explicit(&ring->
start, std::memory_order_acquire);
272 int end = std::atomic_load_explicit(&ring->
end, std::memory_order_acquire);
277 int start = std::atomic_load_explicit(&ring->
start, std::memory_order_acquire);
278 int end = std::atomic_load_explicit(&ring->
end, std::memory_order_acquire);
int ring_get_size(struct ring_buffer *ring)
int ring_get_current_size(struct ring_buffer *ring)
static int calculate_avail_write(int start, int end, int buf_len)
void ring_buffer_destroy(struct ring_buffer *ring)
struct audio_buffer_api ring_buffer_fns
struct ring_buffer * ring_buffer_init(int size)
bool ring_advance_write_idx(struct ring_buffer *ring, int amount)
int ring_get_write_regions(struct ring_buffer *ring, int requested_len, void **ptr1, int *size1, void **ptr2, int *size2)
static int calculate_avail_read(int start, int end, int buf_len)
void ring_advance_read_idx(struct ring_buffer *ring, int amount)
void ring_buffer_flush(struct ring_buffer *buf)
int ring_get_read_regions(struct ring_buffer *ring, int max_len, void **ptr1, int *size1, void **ptr2, int *size2)
int ring_buffer_read(struct ring_buffer *ring, char *out, int max_len)
void ring_buffer_write(struct ring_buffer *ring, const char *in, int len)
int ring_get_available_write_size(struct ring_buffer *ring)
void ring_fill(struct ring_buffer *ring, int c, int size)
std::unique_ptr< char[]> data