std::shared_ptr<BufferListT<T> > createBufferList( uint32_t sampleCount, uint16_t channelCount, bool isInterleaved ) { void (*fn)( BufferListT<T> * ) = deleteBufferList; std::shared_ptr<BufferListT<T> > bufferList( new BufferListT<T>, fn ); uint16_t bufferCount = 0; uint32_t bufferSize = 0; uint16_t channelsPerBuffer = 0; if( ! isInterleaved ) { bufferCount = channelCount; bufferSize = sampleCount; channelsPerBuffer = 1; } else { bufferCount = 1; bufferSize = sampleCount * channelCount; channelsPerBuffer = channelCount; } bufferList->mNumberBuffers = bufferCount; bufferList->mBuffers = new BufferT<T>[bufferCount]; for( int i = 0; i < bufferCount; i++ ) { bufferList->mBuffers[i].mNumberChannels = channelsPerBuffer; bufferList->mBuffers[i].mDataByteSize = bufferSize * sizeof(T); bufferList->mBuffers[i].mData = new T[bufferSize]; bufferList->mBuffers[i].mSampleCount = sampleCount; } return bufferList; }
// ---------------------------------------------------------- ofxAudioUnitInput::RingBuffer::RingBuffer(UInt32 buffers, UInt32 channels, UInt32 samples) : _readItrIndex(0), _writeItrIndex(0) // ---------------------------------------------------------- { reserve(buffers); for(UInt32 i = 0; i < buffers; i++) { AudioBufferListRef bufferList(allocBufferList(channels,samples), releaseBufferList); push_back(bufferList); } _readItr = _writeItr = begin(); }