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",
|
"-fansi-escape-codes",
|
||||||
"-g",
|
"-g",
|
||||||
"${file}",
|
"${file}",
|
||||||
|
"${fileDirname}/ring_buffer.c",
|
||||||
"${fileDirname}/parser.c",
|
"${fileDirname}/parser.c",
|
||||||
"-lm",
|
"-lm",
|
||||||
"-lraylib",
|
"-lraylib",
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -1,3 +1,3 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
CC="${CXX:-cc}"
|
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 "stdio.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "ring_buffer.h"
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
@@ -20,119 +23,8 @@
|
|||||||
#define WINDOW_WIDTH 640
|
#define WINDOW_WIDTH 640
|
||||||
#define WINDOW_HEIGHT 480
|
#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