From f7de54fc6fa6b40dfa2dfbe4c2a8ee933affa126 Mon Sep 17 00:00:00 2001 From: JanHenrik Date: Wed, 1 Apr 2020 00:40:03 +0200 Subject: added files --- midi-dials/Src/curelib_src/curebuffer.c | 272 ++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 midi-dials/Src/curelib_src/curebuffer.c (limited to 'midi-dials/Src/curelib_src') diff --git a/midi-dials/Src/curelib_src/curebuffer.c b/midi-dials/Src/curelib_src/curebuffer.c new file mode 100644 index 0000000..3792914 --- /dev/null +++ b/midi-dials/Src/curelib_src/curebuffer.c @@ -0,0 +1,272 @@ +/* + ******************************************************************************* + * [curebuffer.c] + * This module is for FIFO buffer. + * + * This program is under the terms of the GPLv3. + * https://www.gnu.org/licenses/gpl-3.0.html + * + * Copyright(c) 2017 Keshikan (www.keshikan.net) + ******************************************************************************* + */ + +#include "curebuffer.h" +#include +#include + + +///////////////////////////// +//methods for uint8_t FIFO. +///////////////////////////// + +BUFFER_STATUS cureRingBufferU8Init(RingBufferU8 *rbuf, uint16_t buflen) +{ + + uint32_t i; + + cureRingBufferU8Free(rbuf); + + rbuf->buffer = (uint8_t *)malloc( buflen * sizeof(uint8_t) ); + if(NULL == rbuf->buffer){ + return BUFFER_FAILURE; + } + for(i=0; ibuffer[i] = 0; + } + + rbuf->length = buflen; + + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBufferU8Free(RingBufferU8 *rbuf) +{ + if(NULL != rbuf->buffer){ + free(rbuf->buffer); + } + + rbuf->idx_front = rbuf->idx_rear = 0; + rbuf->length = 0; + + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBufferU8Enqueue(RingBufferU8 *rbuf, uint8_t *inputc) +{ + if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. + return BUFFER_FAILURE; + }else{ + + rbuf->buffer[rbuf->idx_front]= *inputc; + rbuf->idx_front++; + rbuf->idx_front &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + +BUFFER_STATUS cureRingBufferU8Dequeue(RingBufferU8 *rbuf, uint8_t *ret) +{ + if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. + return BUFFER_FAILURE; + }else{ + + *ret = (rbuf->buffer[rbuf->idx_rear]); + rbuf->idx_rear++; + rbuf->idx_rear &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + +//debug +uint16_t _cureRingBufferU8GetUsedSize(RingBufferU8 *rbuf) +{ + if(rbuf->idx_front >= rbuf->idx_rear){ + return rbuf->idx_front - rbuf->idx_rear; + }else{ + return rbuf->idx_front + rbuf->length - rbuf->idx_rear; + } + +} + +///////////////////////////// +//methods for int16_t FIFO. +///////////////////////////// + +BUFFER_STATUS cureRingBuffer16Init(RingBuffer16 *rbuf, uint16_t buflen) +{ + + uint32_t i; + + cureRingBuffer16Free(rbuf); + + rbuf->buffer = (int16_t *)malloc( buflen * sizeof(int16_t) ); + if(NULL == rbuf->buffer){ + return BUFFER_FAILURE; + } + for(i=0; ibuffer[i] = 0; + } + rbuf->length = buflen; + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBuffer16Free(RingBuffer16 *rbuf) +{ + if(NULL != rbuf->buffer){ + free(rbuf->buffer); + } + + rbuf->idx_front = rbuf->idx_rear = 0; + rbuf->length = 0; + + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBuffer16Enqueue(RingBuffer16 *rbuf, int16_t *inputc) +{ + if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. + return BUFFER_FAILURE; + }else{ + rbuf->buffer[rbuf->idx_front]= *inputc; + rbuf->idx_front++; + rbuf->idx_front &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + +BUFFER_STATUS cureRingBuffer16EnqueueIgnoreErr(RingBuffer16 *rbuf, int16_t *inputc) +{ + + rbuf->buffer[rbuf->idx_front]= *inputc; + rbuf->idx_front++; + rbuf->idx_front &= (rbuf->length -1); + return BUFFER_SUCCESS; + +} + + +BUFFER_STATUS cureRingBuffer16Dequeue(RingBuffer16 *rbuf, int16_t *ret) +{ + if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. + return BUFFER_FAILURE; + }else{ + *ret = (rbuf->buffer[rbuf->idx_rear]); + rbuf->idx_rear++; + rbuf->idx_rear &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + + +BUFFER_STATUS cureRingBuffer16GetElement(RingBuffer16 *rbuf, int16_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) +{ + + if(rbuf->idx_front >= delaynum){ + rbuf->idx_rear = rbuf->idx_front - delaynum; + }else{ + rbuf->idx_rear = delay_buffer_length - (delaynum - rbuf->idx_front); + } + *ret = (rbuf->buffer[rbuf->idx_rear]); + return BUFFER_SUCCESS; + +} + +///////////////////////////// +//methods for uint32_t FIFO. +///////////////////////////// + +BUFFER_STATUS cureRingBufferU32Init(RingBuffer32 *rbuf, uint16_t buflen) +{ + + uint32_t i; + + cureRingBufferU32Free(rbuf); + + rbuf->buffer = (uint32_t *)malloc( buflen * sizeof(uint32_t) ); + if(NULL == rbuf->buffer){ + return BUFFER_FAILURE; + } + for(i=0; ibuffer[i] = 0; + } + rbuf->length = buflen; + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBufferU32Free(RingBuffer32 *rbuf) +{ + if(NULL != rbuf->buffer){ + free(rbuf->buffer); + } + + rbuf->idx_front = rbuf->idx_rear = 0; + rbuf->length = 0; + + return BUFFER_SUCCESS; +} + +BUFFER_STATUS cureRingBufferU32Enqueue(RingBuffer32 *rbuf, uint32_t *inputc) +{ + if( ((rbuf->idx_front +1)&(rbuf->length -1)) == rbuf->idx_rear ){//buffer overrun error occurs. + return BUFFER_FAILURE; + }else{ + rbuf->buffer[rbuf->idx_front]= *inputc; + rbuf->idx_front++; + rbuf->idx_front &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + +BUFFER_STATUS cureRingBufferU32EnqueueIgnoreErr(RingBuffer32 *rbuf, uint32_t *inputc) +{ + + rbuf->buffer[rbuf->idx_front]= *inputc; + rbuf->idx_front++; + rbuf->idx_front &= (rbuf->length -1); + return BUFFER_SUCCESS; + +} + + +BUFFER_STATUS cureRingBufferU32Dequeue(RingBuffer32 *rbuf, uint32_t *ret) +{ + if(rbuf->idx_front == rbuf->idx_rear){//if buffer underrun error occurs. + return BUFFER_FAILURE; + }else{ + *ret = (rbuf->buffer[rbuf->idx_rear]); + rbuf->idx_rear++; + rbuf->idx_rear &= (rbuf->length -1); + return BUFFER_SUCCESS; + } +} + + +BUFFER_STATUS cureRingBufferU32GetElement(RingBuffer32 *rbuf, uint32_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) +{ + uint16_t buf; + + + if(rbuf->idx_front >= delaynum){ + buf = rbuf->idx_front - delaynum; + }else{ + buf = delay_buffer_length - (delaynum - rbuf->idx_front); + } + *ret = (rbuf->buffer[buf]); + return BUFFER_SUCCESS; + +} + + +//BUFFER_STATUS cureRingBufferU32GetElement(RingBuffer32 *rbuf, uint32_t *ret, uint16_t delaynum, uint16_t delay_buffer_length) +//{ +// +// +// if(rbuf->idx_front >= delaynum){ +// rbuf->idx_rear = rbuf->idx_front - delaynum; +// }else{ +// rbuf->idx_rear = delay_buffer_length - (delaynum - rbuf->idx_front); +// } +// *ret = (rbuf->buffer[rbuf->idx_rear]); +// return BUFFER_SUCCESS; +// +//} -- cgit