#include <RingBuffer.h>
Collaboration diagram for RingBuffer< T, N >:

For efficiency, RingBuffer frequently initialises samples by writing zeroes into their memory space, so T should normally be a simple type that can safely be set to zero using memset.
Definition at line 45 of file RingBuffer.h.
Public Member Functions | |
| RingBuffer (size_t n) | |
| Create a ring buffer with room to write n samples. | |
| virtual | ~RingBuffer () |
| size_t | getSize () const |
| Return the total capacity of the ring buffer in samples. | |
| void | resize (size_t newSize) |
| Resize the ring buffer. | |
| bool | mlock () |
| Lock the ring buffer into physical memory. | |
| void | reset () |
| Reset read and write pointers, thus emptying the buffer. | |
| size_t | getReadSpace (int R=0) const |
| Return the amount of data available for reading by reader R, in samples. | |
| size_t | getWriteSpace () const |
| Return the amount of space available for writing, in samples. | |
| size_t | read (T *destination, size_t n, int R=0) |
| Read n samples from the buffer, for reader R. | |
| size_t | readAdding (T *destination, size_t n, int R=0) |
| Read n samples from the buffer, for reader R, adding them to the destination. | |
| T | readOne (int R=0) |
| Read one sample from the buffer, for reader R. | |
| size_t | peek (T *destination, size_t n, int R=0) const |
| Read n samples from the buffer, if available, for reader R, without advancing the read pointer -- i.e. | |
| T | peekOne (int R=0) const |
| Read one sample from the buffer, if available, without advancing the read pointer -- i.e. | |
| size_t | skip (size_t n, int R=0) |
| Pretend to read n samples from the buffer, for reader R, without actually returning them (i.e. | |
| size_t | write (const T *source, size_t n) |
| Write n samples to the buffer. | |
| size_t | zero (size_t n) |
| Write n zero-value samples to the buffer. | |
Protected Attributes | |
| T * | m_buffer |
| volatile size_t | m_writer |
| volatile size_t | m_readers [N] |
| size_t | m_size |
| bool | m_mlocked |
Static Protected Attributes | |
| static Scavenger< ScavengerArrayWrapper< T > > | m_scavenger |
Private Member Functions | |
| RingBuffer (const RingBuffer &) | |
| RingBuffer & | operator= (const RingBuffer &) |
| RingBuffer< T, N >::RingBuffer | ( | size_t | n | ) |
Create a ring buffer with room to write n samples.
Note that the internal storage size will actually be n+1 samples, as one element is unavailable for administrative reasons. Since the ring buffer performs best if its size is a power of two, this means n should ideally be some power of two minus one.
Definition at line 178 of file RingBuffer.h.
References RingBuffer< T, N >::m_readers, RingBuffer< T, N >::m_scavenger, and Scavenger< T >::scavenge().
| RingBuffer< T, N >::~RingBuffer | ( | ) | [virtual] |
Definition at line 194 of file RingBuffer.h.
References RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_mlocked, RingBuffer< T, N >::m_scavenger, RingBuffer< T, N >::m_size, MUNLOCK, and Scavenger< T >::scavenge().
| RingBuffer< T, N >::RingBuffer | ( | const RingBuffer< T, N > & | ) | [private] |
| size_t RingBuffer< T, N >::getSize | ( | ) | const |
Return the total capacity of the ring buffer in samples.
(This is the argument n passed to the constructor.)
Definition at line 210 of file RingBuffer.h.
References RingBuffer< T, N >::m_size.
Referenced by OSCQueue::postMessage().
| void RingBuffer< T, N >::resize | ( | size_t | newSize | ) |
Resize the ring buffer.
This also empties it. Actually swaps in a new, larger buffer; the old buffer is scavenged after a seemly delay. Should be called from the write thread.
Definition at line 221 of file RingBuffer.h.
References Scavenger< T >::claim(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_mlocked, RingBuffer< T, N >::m_scavenger, RingBuffer< T, N >::m_size, MLOCK, MUNLOCK, RingBuffer< T, N >::reset(), and Scavenger< T >::scavenge().
| bool RingBuffer< T, N >::mlock | ( | ) |
Lock the ring buffer into physical memory.
Returns true for success.
Definition at line 248 of file RingBuffer.h.
References RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_mlocked, RingBuffer< T, N >::m_size, and MLOCK.
| void RingBuffer< T, N >::reset | ( | ) |
Reset read and write pointers, thus emptying the buffer.
Should be called from the write thread.
Definition at line 257 of file RingBuffer.h.
References RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_writer.
Referenced by DSSIPluginInstance::clearEvents(), DSSIPluginInstance::discardEvents(), and RingBuffer< T, N >::resize().
| size_t RingBuffer< T, N >::getReadSpace | ( | int | R = 0 |
) | const |
Return the amount of data available for reading by reader R, in samples.
Definition at line 269 of file RingBuffer.h.
References RingBuffer< T, N >::m_readers, RingBuffer< T, N >::m_size, and RingBuffer< T, N >::m_writer.
Referenced by OSCQueue::getMessagesAvailable(), AudioCallbackPlaySource::getSourceSamples(), RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::peek(), RingBuffer< T, N >::read(), RingBuffer< T, N >::readAdding(), DSSIPluginInstance::run(), RingBuffer< T, N >::skip(), AudioCallbackPlaySource::unifyRingBuffers(), and OSCQueue::~OSCQueue().
| size_t RingBuffer< T, N >::getWriteSpace | ( | ) | const |
Return the amount of space available for writing, in samples.
Definition at line 287 of file RingBuffer.h.
References RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::m_readers, RingBuffer< T, N >::m_size, and RingBuffer< T, N >::m_writer.
Referenced by OSCQueue::postMessage(), RingBuffer< T, N >::write(), and RingBuffer< T, N >::zero().
| size_t RingBuffer< T, N >::read | ( | T * | destination, | |
| size_t | n, | |||
| int | R = 0 | |||
| ) |
Read n samples from the buffer, for reader R.
If fewer than n are available, the remainder will be zeroed out. Returns the number of samples actually read.
Definition at line 312 of file RingBuffer.h.
References RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_size.
Referenced by AudioCallbackPlaySource::getSourceSamples().
| size_t RingBuffer< T, N >::readAdding | ( | T * | destination, | |
| size_t | n, | |||
| int | R = 0 | |||
| ) |
Read n samples from the buffer, for reader R, adding them to the destination.
If fewer than n are available, the remainder will be left alone. Returns the number of samples actually read.
Definition at line 348 of file RingBuffer.h.
References RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_size.
| T RingBuffer< T, N >::readOne | ( | int | R = 0 |
) |
Read one sample from the buffer, for reader R.
If no sample is available, this will silently return zero. Calling this repeatedly is obviously slower than calling read once, but it may be good enough if you don't want to allocate a buffer to read into.
Definition at line 385 of file RingBuffer.h.
References RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_readers, RingBuffer< T, N >::m_size, and RingBuffer< T, N >::m_writer.
Referenced by OSCQueue::readMessage(), and OSCQueue::~OSCQueue().
| size_t RingBuffer< T, N >::peek | ( | T * | destination, | |
| size_t | n, | |||
| int | R = 0 | |||
| ) | const |
Read n samples from the buffer, if available, for reader R, without advancing the read pointer -- i.e.
a subsequent read() or skip() will be necessary to empty the buffer. If fewer than n are available, the remainder will be zeroed out. Returns the number of samples actually read.
Definition at line 407 of file RingBuffer.h.
References RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_size.
| T RingBuffer< T, N >::peekOne | ( | int | R = 0 |
) | const |
Read one sample from the buffer, if available, without advancing the read pointer -- i.e.
a subsequent read() or skip() will be necessary to empty the buffer. Returns zero if no sample was available.
Definition at line 441 of file RingBuffer.h.
References RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_writer.
Referenced by DSSIPluginInstance::run().
| size_t RingBuffer< T, N >::skip | ( | size_t | n, | |
| int | R = 0 | |||
| ) |
Pretend to read n samples from the buffer, for reader R, without actually returning them (i.e.
discard the next n samples). Returns the number of samples actually available for discarding.
Definition at line 462 of file RingBuffer.h.
References RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::m_readers, and RingBuffer< T, N >::m_size.
Referenced by DSSIPluginInstance::run().
| size_t RingBuffer< T, N >::write | ( | const T * | source, | |
| size_t | n | |||
| ) |
Write n samples to the buffer.
If insufficient space is available, not all samples may actually be written. Returns the number of samples actually written.
Definition at line 483 of file RingBuffer.h.
References RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_size, and RingBuffer< T, N >::m_writer.
Referenced by AudioCallbackPlaySource::fillBuffers(), OSCQueue::postMessage(), and DSSIPluginInstance::sendEvent().
| size_t RingBuffer< T, N >::zero | ( | size_t | n | ) |
Write n zero-value samples to the buffer.
If insufficient space is available, not all zeros may actually be written. Returns the number of zeroes actually written.
Definition at line 518 of file RingBuffer.h.
References RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::m_buffer, RingBuffer< T, N >::m_size, and RingBuffer< T, N >::m_writer.
| RingBuffer& RingBuffer< T, N >::operator= | ( | const RingBuffer< T, N > & | ) | [private] |
T* RingBuffer< T, N >::m_buffer [protected] |
Definition at line 161 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::mlock(), RingBuffer< T, N >::peek(), RingBuffer< T, N >::peekOne(), RingBuffer< T, N >::read(), RingBuffer< T, N >::readAdding(), RingBuffer< T, N >::readOne(), RingBuffer< T, N >::resize(), RingBuffer< T, N >::write(), RingBuffer< T, N >::zero(), and RingBuffer< T, N >::~RingBuffer().
volatile size_t RingBuffer< T, N >::m_writer [protected] |
Definition at line 162 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::peekOne(), RingBuffer< T, N >::readOne(), RingBuffer< T, N >::reset(), RingBuffer< T, N >::write(), and RingBuffer< T, N >::zero().
volatile size_t RingBuffer< T, N >::m_readers[N] [protected] |
Definition at line 163 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::peek(), RingBuffer< T, N >::peekOne(), RingBuffer< T, N >::read(), RingBuffer< T, N >::readAdding(), RingBuffer< T, N >::readOne(), RingBuffer< T, N >::reset(), RingBuffer< T, N >::RingBuffer(), and RingBuffer< T, N >::skip().
size_t RingBuffer< T, N >::m_size [protected] |
Definition at line 164 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::getReadSpace(), RingBuffer< T, N >::getSize(), RingBuffer< T, N >::getWriteSpace(), RingBuffer< T, N >::mlock(), RingBuffer< T, N >::peek(), RingBuffer< T, N >::read(), RingBuffer< T, N >::readAdding(), RingBuffer< T, N >::readOne(), RingBuffer< T, N >::resize(), RingBuffer< T, N >::skip(), RingBuffer< T, N >::write(), RingBuffer< T, N >::zero(), and RingBuffer< T, N >::~RingBuffer().
bool RingBuffer< T, N >::m_mlocked [protected] |
Definition at line 165 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::mlock(), RingBuffer< T, N >::resize(), and RingBuffer< T, N >::~RingBuffer().
Scavenger< ScavengerArrayWrapper< T > > RingBuffer< T, N >::m_scavenger [static, protected] |
Definition at line 167 of file RingBuffer.h.
Referenced by RingBuffer< T, N >::resize(), RingBuffer< T, N >::RingBuffer(), and RingBuffer< T, N >::~RingBuffer().
1.5.1