feat: explicit ring buffer file
This commit is contained in:
1
.vscode/tasks.json
vendored
1
.vscode/tasks.json
vendored
@@ -9,6 +9,7 @@
|
||||
"-fansi-escape-codes",
|
||||
"-g",
|
||||
"${file}",
|
||||
"${fileDirname}/ring_buffer.c",
|
||||
"${fileDirname}/parser.c",
|
||||
"-lm",
|
||||
"-lraylib",
|
||||
|
||||
2
build.sh
2
build.sh
@@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
CC="${CXX:-cc}"
|
||||
$CC -Wall -std=c11 ./main.c ./parser.c -lm -lraylib -o ./bin/main
|
||||
$CC -Wall -std=c11 ./main.c ./ring_buffer.c ./parser.c -lm -lraylib -o ./bin/main
|
||||
|
||||
114
main.c
114
main.c
@@ -2,7 +2,10 @@
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "math.h"
|
||||
|
||||
#include "parser.h"
|
||||
#include "utils.h"
|
||||
#include "ring_buffer.h"
|
||||
|
||||
#include "raylib.h"
|
||||
|
||||
@@ -20,119 +23,8 @@
|
||||
#define WINDOW_WIDTH 640
|
||||
#define WINDOW_HEIGHT 480
|
||||
|
||||
#define write_log(format,args...) do { \
|
||||
printf(format, ## args); \
|
||||
} while(0)
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Ring Buffer
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
typedef struct RingBuffer {
|
||||
float* items;
|
||||
size_t head;
|
||||
size_t tail;
|
||||
int is_full;
|
||||
int is_empty;
|
||||
size_t size;
|
||||
} RingBuffer;
|
||||
|
||||
RingBuffer ring_buffer_init(size_t buffer_size) {
|
||||
RingBuffer buffer = {
|
||||
.items = calloc(buffer_size, sizeof(float)),
|
||||
.head = 0,
|
||||
.tail = 0,
|
||||
.is_full = 0,
|
||||
.is_empty = 1,
|
||||
.size = buffer_size
|
||||
};
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void ring_buffer_reset(RingBuffer* me) {
|
||||
me->head = 0;
|
||||
me->tail = 0;
|
||||
me->is_full = 0;
|
||||
}
|
||||
|
||||
// +
|
||||
static void advance_pointer(RingBuffer* me) {
|
||||
if(me->is_full) {
|
||||
me->tail++;
|
||||
if (me->tail == me->size) {
|
||||
me->tail = 0;
|
||||
}
|
||||
}
|
||||
me->head++;
|
||||
if (me->head == me->size) {
|
||||
me->head = 0;
|
||||
}
|
||||
size_t is_full = me->head == me->tail ? 1 : 0;
|
||||
me->is_full = is_full;
|
||||
}
|
||||
|
||||
// -
|
||||
static void retreat_pointer(RingBuffer* me) {
|
||||
me->is_full = 0;
|
||||
me->tail++;
|
||||
if (me->tail == me->size) {
|
||||
me->tail = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ring_buffer_write(RingBuffer* buffer, float* data, size_t count) {
|
||||
if (buffer->is_full || buffer->head + count > buffer->size) {
|
||||
write_log("[WARN] Trying to overfill the ring buffer: \n\tIsFull:%d\n\tHead:%zu\n\tCount:%zu\n\t",
|
||||
buffer->is_full,
|
||||
buffer->head,
|
||||
count);
|
||||
return;
|
||||
}
|
||||
buffer->is_empty = 0;
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
buffer->items[buffer->head] = data[i];
|
||||
advance_pointer(buffer);
|
||||
}
|
||||
//me->is_empty = is_full && (me->head == me->tail);
|
||||
}
|
||||
|
||||
int ring_buffer_read(RingBuffer* buffer, float* output, size_t count) {
|
||||
if (buffer->is_empty) {
|
||||
write_log("[WARN] Trying to read empty buffer");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
output[i] = buffer->items[buffer->tail];
|
||||
retreat_pointer(buffer);
|
||||
}
|
||||
buffer->is_empty = !buffer->is_full && (buffer->head == buffer->tail);
|
||||
return 1;
|
||||
}
|
||||
|
||||
size_t ring_buffer_size(RingBuffer* buffer) {
|
||||
size_t size = buffer->size;
|
||||
if(!buffer->is_full) {
|
||||
if(buffer->head >= buffer->tail) {
|
||||
size = (buffer->head - buffer->tail);
|
||||
}
|
||||
else {
|
||||
size = (buffer->size + buffer->head - buffer->tail);
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void ring_buffer_print(RingBuffer* me) {
|
||||
write_log("[INFO] The ring buffer: \n\tIsFull:%d\n\tIsEmpty:%d\n\tHead:%zu\n\tTail:%zu\n\t",
|
||||
me->is_full,
|
||||
me->is_empty,
|
||||
me->head,
|
||||
me->tail);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
99
ring_buffer.c
Normal file
99
ring_buffer.c
Normal file
@@ -0,0 +1,99 @@
|
||||
#include "ring_buffer.h"
|
||||
#include "utils.h"
|
||||
|
||||
RingBuffer ring_buffer_init(size_t buffer_size) {
|
||||
RingBuffer buffer = {
|
||||
.items = calloc(buffer_size, sizeof(float)),
|
||||
.head = 0,
|
||||
.tail = 0,
|
||||
.is_full = 0,
|
||||
.is_empty = 1,
|
||||
.size = buffer_size
|
||||
};
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void ring_buffer_reset(RingBuffer* me) {
|
||||
me->head = 0;
|
||||
me->tail = 0;
|
||||
me->is_full = 0;
|
||||
}
|
||||
|
||||
// +
|
||||
static void advance_pointer(RingBuffer* me) {
|
||||
if(me->is_full) {
|
||||
me->tail++;
|
||||
if (me->tail == me->size) {
|
||||
me->tail = 0;
|
||||
}
|
||||
}
|
||||
me->head++;
|
||||
if (me->head == me->size) {
|
||||
me->head = 0;
|
||||
}
|
||||
size_t is_full = me->head == me->tail ? 1 : 0;
|
||||
me->is_full = is_full;
|
||||
}
|
||||
|
||||
// -
|
||||
static void retreat_pointer(RingBuffer* me) {
|
||||
me->is_full = 0;
|
||||
me->tail++;
|
||||
if (me->tail == me->size) {
|
||||
me->tail = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ring_buffer_write(RingBuffer* buffer, float* data, size_t count) {
|
||||
if (buffer->is_full || buffer->head + count > buffer->size) {
|
||||
write_log("[WARN] Trying to overfill the ring buffer: \n\tIsFull:%d\n\tHead:%zu\n\tCount:%zu\n\t",
|
||||
buffer->is_full,
|
||||
buffer->head,
|
||||
count);
|
||||
return;
|
||||
}
|
||||
buffer->is_empty = 0;
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
buffer->items[buffer->head] = data[i];
|
||||
advance_pointer(buffer);
|
||||
}
|
||||
//me->is_empty = is_full && (me->head == me->tail);
|
||||
}
|
||||
|
||||
int ring_buffer_read(RingBuffer* buffer, float* output, size_t count) {
|
||||
if (buffer->is_empty) {
|
||||
write_log("[WARN] Trying to read empty buffer");
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
output[i] = buffer->items[buffer->tail];
|
||||
retreat_pointer(buffer);
|
||||
}
|
||||
buffer->is_empty = !buffer->is_full && (buffer->head == buffer->tail);
|
||||
return 1;
|
||||
}
|
||||
|
||||
size_t ring_buffer_size(RingBuffer* buffer) {
|
||||
size_t size = buffer->size;
|
||||
if(!buffer->is_full) {
|
||||
if(buffer->head >= buffer->tail) {
|
||||
size = (buffer->head - buffer->tail);
|
||||
}
|
||||
else {
|
||||
size = (buffer->size + buffer->head - buffer->tail);
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void ring_buffer_print(RingBuffer* me) {
|
||||
write_log("[INFO] The ring buffer: \n\tIsFull:%d\n\tIsEmpty:%d\n\tHead:%zu\n\tTail:%zu\n\t",
|
||||
me->is_full,
|
||||
me->is_empty,
|
||||
me->head,
|
||||
me->tail);
|
||||
}
|
||||
22
ring_buffer.h
Normal file
22
ring_buffer.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef RING_BUFFER_H
|
||||
#define RING_BUFFER_H
|
||||
|
||||
#include "stdlib.h"
|
||||
|
||||
typedef struct RingBuffer {
|
||||
float* items;
|
||||
size_t head;
|
||||
size_t tail;
|
||||
int is_full;
|
||||
int is_empty;
|
||||
size_t size;
|
||||
} RingBuffer;
|
||||
|
||||
RingBuffer ring_buffer_init(size_t buffer_size);
|
||||
void ring_buffer_reset(RingBuffer* me);
|
||||
void ring_buffer_write(RingBuffer* buffer, float* data, size_t count);
|
||||
int ring_buffer_read(RingBuffer* buffer, float* output, size_t count);
|
||||
size_t ring_buffer_size(RingBuffer* buffer);
|
||||
void ring_buffer_print(RingBuffer* me);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user