More work on the ring buffer class.

This commit is contained in:
Jonathan Naylor 2016-02-15 20:59:24 +00:00
parent 945d79a3ca
commit 8e2e38e88c
1 changed files with 26 additions and 37 deletions

View File

@ -32,8 +32,7 @@ public:
m_name(name), m_name(name),
m_buffer(NULL), m_buffer(NULL),
m_iPtr(0U), m_iPtr(0U),
m_oPtr(0U), m_oPtr(0U)
m_full(false)
{ {
assert(length > 0U); assert(length > 0U);
assert(name != NULL); assert(name != NULL);
@ -50,49 +49,44 @@ public:
bool addData(const T* buffer, unsigned int nSamples) bool addData(const T* buffer, unsigned int nSamples)
{ {
for (unsigned int i = 0U; i < nSamples; i++) { if (nSamples >= freeSpace()) {
if (m_full) { LogError("**** Overflow in %s ring buffer, %u >= %u", m_name, nSamples, freeSpace());
LogError("**** Overflow in %s ring buffer", m_name); return false;
return false; }
}
for (unsigned int i = 0U; i < nSamples; i++) {
m_buffer[m_iPtr++] = buffer[i]; m_buffer[m_iPtr++] = buffer[i];
if (m_iPtr == m_length) if (m_iPtr == m_length)
m_iPtr = 0U; m_iPtr = 0U;
if (m_iPtr == m_oPtr)
m_full = true;
} }
return true; return true;
} }
unsigned int getData(T* buffer, unsigned int nSamples) bool getData(T* buffer, unsigned int nSamples)
{ {
unsigned int data = dataSize(); if (dataSize() < nSamples) {
LogError("**** Underflow in %s ring buffer, %u < %u", m_name, dataSize(), nSamples);
if (data < nSamples) return false;
nSamples = data; }
for (unsigned int i = 0U; i < nSamples; i++) { for (unsigned int i = 0U; i < nSamples; i++) {
m_full = false;
buffer[i] = m_buffer[m_oPtr++]; buffer[i] = m_buffer[m_oPtr++];
if (m_oPtr == m_length) if (m_oPtr == m_length)
m_oPtr = 0U; m_oPtr = 0U;
} }
return nSamples; return true;
} }
unsigned int peek(T* buffer, unsigned int nSamples) bool peek(T* buffer, unsigned int nSamples)
{ {
unsigned int data = dataSize(); if (dataSize() < nSamples) {
LogError("**** Underflow peek in %s ring buffer, %u < %u", m_name, dataSize(), nSamples);
if (data < nSamples) return false;
nSamples = data; }
unsigned int ptr = m_oPtr; unsigned int ptr = m_oPtr;
for (unsigned int i = 0U; i < nSamples; i++) { for (unsigned int i = 0U; i < nSamples; i++) {
@ -102,26 +96,22 @@ public:
ptr = 0U; ptr = 0U;
} }
return nSamples; return true;
} }
void clear() void clear()
{ {
m_iPtr = 0U; m_iPtr = 0U;
m_oPtr = 0U; m_oPtr = 0U;
m_full = false;
::memset(m_buffer, 0x00, m_length * sizeof(T)); ::memset(m_buffer, 0x00, m_length * sizeof(T));
} }
unsigned int freeSpace() const unsigned int freeSpace() const
{ {
if (m_oPtr == m_iPtr && !m_full) if (m_oPtr == m_iPtr)
return m_length; return m_length;
if (m_oPtr == m_iPtr && m_full)
return 0U;
if (m_iPtr > m_oPtr) if (m_iPtr > m_oPtr)
return m_iPtr - m_oPtr; return m_iPtr - m_oPtr;
@ -140,21 +130,20 @@ public:
bool hasData() const bool hasData() const
{ {
return m_oPtr != m_iPtr || (m_oPtr == m_iPtr && m_full); return m_oPtr != m_iPtr;
} }
bool isEmpty() const bool isEmpty() const
{ {
return m_oPtr == m_iPtr && !m_full; return m_oPtr == m_iPtr;
} }
private: private:
unsigned int m_length; unsigned int m_length;
const char* m_name; const char* m_name;
T* m_buffer; T* m_buffer;
volatile unsigned int m_iPtr; unsigned int m_iPtr;
volatile unsigned int m_oPtr; unsigned int m_oPtr;
volatile bool m_full;
}; };
#endif #endif