diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1f577ce..26f74c1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,6 +9,7 @@ "-fansi-escape-codes", "-g", "${file}", + "${fileDirname}/ring_buffer.c", "${fileDirname}/parser.c", "-lm", "-lraylib", diff --git a/build.sh b/build.sh index 996cdba..5358a2e 100644 --- a/build.sh +++ b/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 diff --git a/main.c b/main.c index 4ee4c43..c9c7335 100644 --- a/main.c +++ b/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); -} //------------------------------------------------------------------------------------ diff --git a/ring_buffer.c b/ring_buffer.c new file mode 100644 index 0000000..3d46364 --- /dev/null +++ b/ring_buffer.c @@ -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); +} diff --git a/ring_buffer.h b/ring_buffer.h new file mode 100644 index 0000000..b840759 --- /dev/null +++ b/ring_buffer.h @@ -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 diff --git a/utils.h b/utils.h new file mode 100644 index 0000000..6941528 --- /dev/null +++ b/utils.h @@ -0,0 +1,10 @@ +#ifndef UTILS_H +#define UTILS_H + +#include "stdio.h" + +#define write_log(format,args...) do { \ + printf(format, ## args); \ + } while(0) + +#endif \ No newline at end of file