bool SFB::Audio::RingBuffer::Allocate(const AudioFormat& format, size_t capacityFrames) { // Only non-interleaved formats are supported if(format.IsInterleaved()) return false; Deallocate(); // Round up to the next power of two capacityFrames = NextPowerOfTwo((uint32_t)capacityFrames); mFormat = format; mCapacityFrames = capacityFrames; mCapacityFramesMask = capacityFrames - 1; size_t capacityBytes = format.FrameCountToByteCount(capacityFrames); // One memory allocation holds everything- first the pointers followed by the deinterleaved channels size_t allocationSize = (capacityBytes + sizeof(uint8_t *)) * format.mChannelsPerFrame; uint8_t *memoryChunk = (uint8_t *)malloc(allocationSize); if(nullptr == memoryChunk) return false; // Zero the entire allocation memset(memoryChunk, 0, allocationSize); // Assign the pointers and channel buffers mBuffers = (uint8_t **)memoryChunk; memoryChunk += format.mChannelsPerFrame * sizeof(uint8_t *); for(UInt32 i = 0; i < format.mChannelsPerFrame; ++i) { mBuffers[i] = memoryChunk; memoryChunk += capacityBytes; } mReadPointer = 0; mWritePointer = 0; return true; }