Audio Effects Framework
RingBuffer.h
Go to the documentation of this file.
1 #if !defined(__RingBuffer_hdr__)
2 #define __RingBuffer_hdr__
3 
4 #include <cassert>
5 #include <algorithm>
6 #include <cmath>
7 
10 template <class T>
12 {
13 public:
14  explicit CRingBuffer (int iBufferLengthInSamples) :
15  m_iBuffLength(iBufferLengthInSamples),
16  m_iReadIdx(0),
17  m_iWriteIdx(0),
18  m_ptBuff(0)
19  {
20  assert(iBufferLengthInSamples > 0);
21 
22  m_ptBuff = new T [m_iBuffLength];
23  reset();
24  }
25 
26  virtual ~CRingBuffer ()
27  {
28  delete [] m_ptBuff;
29  m_ptBuff = 0;
30  }
31 
36  void putPostInc (T tNewValue)
37  {
38  put(tNewValue);
39  incIdx(m_iWriteIdx);
40  }
41 
47  void putPostInc (const T* ptNewBuff, int iLength)
48  {
49  put(ptNewBuff, iLength);
50  incIdx(m_iWriteIdx, iLength);
51  }
52 
57  void put(T tNewValue)
58  {
59  m_ptBuff[m_iWriteIdx] = tNewValue;
60  }
61 
67  void put(const T* ptNewBuff, int iLength)
68  {
69  assert(iLength <= m_iBuffLength && iLength >= 0);
70 
71  // copy two parts: to the end of buffer and after wrap around
72  int iNumValues2End = std::min(iLength,m_iBuffLength - m_iWriteIdx);
73 
74  memcpy (&m_ptBuff[m_iWriteIdx], ptNewBuff, sizeof(T)*iNumValues2End);
75  if ((iLength - iNumValues2End)>0)
76  memcpy (m_ptBuff, &ptNewBuff[iNumValues2End], sizeof(T)*(iLength - iNumValues2End));
77  }
78 
83  {
84  T tValue = get();
85  incIdx(m_iReadIdx);
86  return tValue;
87  }
88 
94  void getPostInc (T* ptBuff, int iLength)
95  {
96  get(ptBuff, iLength);
97  incIdx(m_iReadIdx, iLength);
98  }
99 
104  T get (float fOffset = 0) const
105  {
106  if (fOffset == 0)
107  return m_ptBuff[m_iReadIdx];
108  else
109  {
110 
111  // compute fraction for linear interpolation
112  int iOffset = static_cast<int>(std::floor(fOffset));
113  float fFrac = fOffset - iOffset;
114  int iRead = m_iReadIdx + iOffset;
115  while (iRead > m_iBuffLength-1)
116  iRead -= m_iBuffLength;
117  while (iRead < 0)
118  iRead += m_iBuffLength;
119 
120  return (1-fFrac) * m_ptBuff[iRead] +
121  fFrac * m_ptBuff[(iRead+1) % m_iBuffLength];
122  }
123  }
124 
130  void get (T* ptBuff, int iLength) const
131  {
132  assert(iLength <= m_iBuffLength && iLength >= 0);
133 
134  // copy two parts: to the end of buffer and after wrap around
135  int iNumValues2End = std::min(iLength, m_iBuffLength - m_iReadIdx);
136 
137  memcpy (ptBuff, &m_ptBuff[m_iReadIdx], sizeof(T)*iNumValues2End);
138  if ((iLength - iNumValues2End)>0)
139  memcpy (&ptBuff[iNumValues2End], m_ptBuff, sizeof(T)*(iLength - iNumValues2End));
140  }
141 
145  void reset ()
146  {
147  memset (m_ptBuff, 0, sizeof(T)*m_iBuffLength);
148  m_iReadIdx = 0;
149  m_iWriteIdx = 0;
150  }
151 
155  int getWriteIdx () const
156  {
157  return m_iWriteIdx;
158  }
159 
164  void setWriteIdx (int iNewWriteIdx)
165  {
166  incIdx(m_iWriteIdx, iNewWriteIdx - m_iWriteIdx);
167  }
168 
172  int getReadIdx () const
173  {
174  return m_iReadIdx;
175  }
176 
181  void setReadIdx (int iNewReadIdx)
182  {
183  incIdx(m_iReadIdx, iNewReadIdx - m_iReadIdx);
184  }
185 
189  int getNumValuesInBuffer () const
190  {
191  return (m_iWriteIdx - m_iReadIdx + m_iBuffLength)%m_iBuffLength;
192  }
193 
197  int getLength () const
198  {
199  return m_iBuffLength;
200  }
201 private:
202  CRingBuffer ();
203  CRingBuffer(const CRingBuffer& that);
204 
205  void incIdx (int &iIdx, int iOffset = 1)
206  {
207  while ((iIdx + iOffset) < 0)
208  {
209  // avoid negative buffer indices
210  iOffset += m_iBuffLength;
211  }
212  iIdx = (iIdx + iOffset) % m_iBuffLength;
213  };
214 
215  int m_iBuffLength,
216  m_iReadIdx,
217  m_iWriteIdx;
218 
219  T *m_ptBuff;
220 };
221 #endif // __RingBuffer_hdr__
CRingBuffer::setWriteIdx
void setWriteIdx(int iNewWriteIdx)
Definition: RingBuffer.h:164
CRingBuffer::put
void put(const T *ptNewBuff, int iLength)
Definition: RingBuffer.h:67
CRingBuffer::CRingBuffer
CRingBuffer(int iBufferLengthInSamples)
Definition: RingBuffer.h:14
CRingBuffer::get
void get(T *ptBuff, int iLength) const
Definition: RingBuffer.h:130
CRingBuffer::putPostInc
void putPostInc(const T *ptNewBuff, int iLength)
Definition: RingBuffer.h:47
CRingBuffer::getPostInc
void getPostInc(T *ptBuff, int iLength)
Definition: RingBuffer.h:94
CRingBuffer::put
void put(T tNewValue)
Definition: RingBuffer.h:57
CRingBuffer
implement a circular buffer of type T
Definition: RingBuffer.h:12
CRingBuffer::reset
void reset()
Definition: RingBuffer.h:145
CRingBuffer::getPostInc
T getPostInc()
Definition: RingBuffer.h:82
CRingBuffer::~CRingBuffer
virtual ~CRingBuffer()
Definition: RingBuffer.h:26
CRingBuffer::get
T get(float fOffset=0) const
Definition: RingBuffer.h:104
CRingBuffer::getLength
int getLength() const
Definition: RingBuffer.h:197
CRingBuffer::getWriteIdx
int getWriteIdx() const
Definition: RingBuffer.h:155
CRingBuffer::getNumValuesInBuffer
int getNumValuesInBuffer() const
Definition: RingBuffer.h:189
CRingBuffer::getReadIdx
int getReadIdx() const
Definition: RingBuffer.h:172
CRingBuffer::putPostInc
void putPostInc(T tNewValue)
Definition: RingBuffer.h:36
CRingBuffer::setReadIdx
void setReadIdx(int iNewReadIdx)
Definition: RingBuffer.h:181