Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #pragma once
00024
00025 namespace cinder { namespace audio {
00026
00027 template<typename T>
00028 class CircularBuffer {
00029 public:
00030 typedef std::pair<T*,uint32_t> ArrayRange;
00031
00032 CircularBuffer( uint32_t size );
00033 ~CircularBuffer();
00034
00035 void insert( const T* src, uint32_t size );
00036
00037 ArrayRange arrayOne() const {
00038 return ArrayRange( mBufferStart, ( mBufferStart >= mBufferLast && mSize == mMaxSize ) ? ( mBufferEnd - mBufferStart ) : mSize );
00039 }
00040 ArrayRange arrayTwo() const {
00041 uint32_t size = ( mBufferStart >= mBufferLast && mSize == mMaxSize ) ? ( mBufferLast - mBuffer ) : 0;
00042 return ArrayRange( mBufferLast - size, size );
00043 }
00044
00045 uint32_t size() const { return mSize; }
00046 uint32_t maxSize() const { return mMaxSize; }
00047
00048 private:
00049 T * mBuffer;
00050 T * mBufferLast;
00051 T * mBufferStart;
00052 T * mBufferEnd;
00053
00054 uint32_t mMaxSize;
00055 uint32_t mSize;
00056
00057 };
00058
00059 template<typename T>
00060 CircularBuffer<T>::CircularBuffer( uint32_t size )
00061 : mMaxSize( size ), mSize( 0 )
00062 {
00063 mBuffer = new T[mMaxSize];
00064 mBufferEnd = mBuffer + mMaxSize;
00065 mBufferStart = mBuffer;
00066 mBufferLast = mBuffer;
00067
00068 }
00069
00070 template<typename T>
00071 CircularBuffer<T>::~CircularBuffer()
00072 {
00073 delete [] mBuffer;
00074 }
00075
00076 template<typename T>
00077 void CircularBuffer<T>::insert( const T* src, uint32_t size )
00078 {
00079 if( size > mMaxSize ) {
00080 throw;
00081 }
00082
00083
00084 if( ( mBufferLast + size ) > mBufferEnd ) {
00085 uint32_t copySize = mBufferEnd - mBufferLast;
00086 memcpy( mBufferLast, src, sizeof(T) * copySize );
00087 mBufferLast = mBuffer;
00088 if( mSize < mMaxSize ) {
00089 mSize = mMaxSize;
00090 }
00091 src = src + copySize;
00092 copySize = size - copySize;
00093 memcpy( mBufferLast, src, sizeof(T) * copySize );
00094 mBufferLast += copySize;
00095 mBufferStart = mBufferLast;
00096 } else {
00097 memcpy( mBufferLast, src, sizeof(T) * size );
00098 mBufferLast += size;
00099 if( mSize < mMaxSize ) {
00100 mSize += size;
00101 } else {
00102 mBufferStart = mBufferLast;
00103 if( mBufferStart == mBufferEnd ) {
00104 mBufferStart = mBuffer;
00105 }
00106 }
00107 }
00108 }
00109
00110
00111 }}