Files
radio/ringbuf.c
T
jens 290fd5f5e0 Initial import
git-svn-id: http://moon:8086/svn/software/trunk/libsrc/radio@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-07-19 07:44:42 +00:00

169 lines
2.9 KiB
C
Executable File

// --------------------------------------------------------------
#include <string.h>
#include <malloc.h>
#include "ringbuf.h"
// --------------------------------------------------------------
void RBufInit(rbuf_t *pObj, uint32_t size)
{
pObj->ir = 0;
pObj->iw = 0;
pObj->dist = 0;
pObj->size = size;
pObj->pData = (radio_float_t*)malloc(size*sizeof(radio_float_t));
memset(pObj->pData, 0, size*sizeof(radio_float_t));
}
void RBufFree(rbuf_t *pObj)
{
if (pObj->pData)
free(pObj->pData);
pObj->pData = NULL;
pObj->size = 0;
}
void RBufPut(rbuf_t *pObj, radio_float_t x)
{
(pObj->iw)++;
if (pObj->iw >= pObj->size)
pObj->iw = 0;
pObj->pData[pObj->iw] = x;
pObj->dist++;
}
radio_float_t RBufGet(rbuf_t *pObj)
{
radio_float_t y;
y = pObj->pData[(pObj->ir)++];
if (pObj->ir >= pObj->size)
pObj->ir = 0;
pObj->dist--;
return y;
}
radio_float_t RBufGetAfter(rbuf_t *pObj, int32_t delay)
{
pObj->ir = (pObj->iw-delay)%pObj->size;
if (pObj->ir < 0)
pObj->ir += pObj->size;
pObj->dist = delay;
return pObj->pData[pObj->ir];
}
radio_float_t RBufGetAt(rbuf_t *pObj, uint32_t index)
{
if (index < 0)
index = 0;
pObj->ir = (index)%pObj->size;
pObj->dist = pObj->iw-pObj->ir;
if (pObj->dist < 0)
pObj->dist += pObj->size;
return pObj->pData[pObj->ir];
}
void FifoInit(fifo_t *pObj, uint32_t max_size)
{
pObj->size_max = max_size;
pObj->size = 0;
pObj->iw = (uint32_t)0;
pObj->ir = (uint32_t)0;
pObj->pData = (uint32_t*)malloc(max_size*sizeof(uint32_t));
memset(pObj->pData, 0, max_size*sizeof(uint32_t));
}
void FifoFree(fifo_t *pObj)
{
if (pObj->pData)
free(pObj->pData);
pObj->pData = NULL;
pObj->size_max = 0;
pObj->size = 0;
}
uint32_t FifoSize(fifo_t *pObj)
{
return pObj->size;
}
uint32_t FifoSizeMax(fifo_t *pObj)
{
return pObj->size_max;
}
uint32_t FifoFront(fifo_t *pObj)
{
return pObj->pData[pObj->ir];
}
uint32_t FifoBack(fifo_t *pObj)
{
return pObj->pData[pObj->iw];
}
void FifoPushBack(fifo_t *pObj, uint32_t item)
{
pObj->pData[pObj->iw++] = item;
if (pObj->iw >= pObj->size_max)
pObj->iw = 0;
if (pObj->size < pObj->size_max)
{
pObj->size++;
}
else
{
if (++pObj->ir >= pObj->size_max)
pObj->ir = 0;
}
}
void FifoPushFront(fifo_t *pObj, uint32_t item)
{
pObj->ir--;
if (pObj->ir >= pObj->size_max)
pObj->ir = 0;
pObj->pData[pObj->ir] = item;
if (pObj->size < pObj->size_max)
{
pObj->size++;
}
else
{
if (--pObj->iw >= pObj->size_max)
pObj->iw = 0;
}
}
void FifoPopBack(fifo_t *pObj)
{
pObj->iw--;
if (pObj->iw >= pObj->size_max)
pObj->iw = 0;
if (pObj->size > 0)
pObj->size--;
}
void FifoPopFront(fifo_t *pObj)
{
pObj->ir++;
if (pObj->ir >= pObj->size_max)
pObj->ir = 0;
if (pObj->size > 0)
pObj->size--;
}
// --------------------------------------------------------------