VISR  0.12.0
Versatile Interactive Scene Renderer
circular_buffer.hpp
Go to the documentation of this file.
1 /* Copyright Institute of Sound and Vibration Research - All rights reserved */
2 
3 #ifndef VISR_LIBRBBL_CIRCULAR_BUFFER_HPP_INCLUDED
4 #define VISR_LIBRBBL_CIRCULAR_BUFFER_HPP_INCLUDED
5 
6 #include "export_symbols.hpp"
7 
9 
10 #include <cassert>
11 #include <cstddef>
12 #include <memory>
13 #include <stdexcept>
14 #include <vector>
15 
16 namespace visr
17 {
18 namespace rbbl
19 {
20 
33 template< typename DataType >
34 class VISR_RBBL_LIBRARY_SYMBOL CircularBuffer
35 {
36 public:
42  using DelayIndexType = std::size_t;
43 
52  explicit CircularBuffer( std::size_t numberOfChannels, std::size_t length, std::size_t alignment = 0 );
53 
57  ~CircularBuffer();
58 
62  std::size_t numberOfChannels() const { return mNumberOfChannels; }
63 
67  std::size_t length() const { return mLength; }
68 
73  std::size_t stride() const { return mStride; }
74 
86  void write( DataType const * const * writeData,
87  std::size_t numberOfChannels,
88  std::size_t numberOfSamples,
89  std::size_t alignmentElements = 0 );
90 
91  void write( DataType const * writeData,
92  std::size_t channelStrideElements,
93  std::size_t numberOfChannels,
94  std::size_t numberOfSamples,
95  std::size_t alignmentElements = 0 );
96 
104  void write( efl::BasicMatrix<DataType> const & writeData );
105 
114  DataType * getFirstWritePointer();
115 
122  void getWritePointers( DataType * * writePointers );
123 
130  void commitWrite( std::size_t numberOfElementsWritten );
131 
139  void getReadPointers( DelayIndexType delay, DataType const * * readPointers ) const;
140 
149  void getReadPointers( DelayIndexType const * const delay, DataType const * * readPointers ) const;
150 
157  DataType const * getReadPointer( std::size_t channelIndex,
158  DelayIndexType delay ) const
159  {
160  assert( channelIndex < numberOfChannels() );
161  assert( delay <= length() );
162  return (mBasePointer + channelIndex * mStride + mAllocatedLength + mWriteHeadIndex) - delay;
163  }
164 
165 private:
169  class Impl;
173  std::unique_ptr<Impl> mImpl;
174 
178  std::size_t const mLength;
179 
183  std::size_t const mAllocatedLength;
184 
188  std::size_t const mStride;
189 
193  std::size_t const mNumberOfChannels;
194 
199  DataType * const mBasePointer;
200 
204  std::size_t mWriteHeadIndex;
205 };
206 
207 } // namespace rbbl
208 } // namespace visr
209 
210 #endif // #ifndef VISR_LIBRBBL_CIRCULAR_BUFFER_HPP_INCLUDED
std::size_t DelayIndexType
Definition: circular_buffer.hpp:42
DataType const * getReadPointer(std::size_t channelIndex, DelayIndexType delay) const
Definition: circular_buffer.hpp:157
Definition: circular_buffer.hpp:34
std::size_t stride() const
Definition: circular_buffer.hpp:73
Definition: options.cpp:10
std::size_t length() const
Definition: circular_buffer.hpp:67
std::size_t numberOfChannels() const
Definition: circular_buffer.hpp:62