void AUBufferList::Allocate(const CAStreamBasicDescription &format, UInt32 nFrames) { UInt32 nStreams; UInt32 channelsPerStream; if (format.IsInterleaved()) { nStreams = 1; channelsPerStream = format.mChannelsPerFrame; } else { nStreams = format.mChannelsPerFrame; channelsPerStream = 1; } // careful -- the I/O thread could be running! if (nStreams > mAllocatedStreams) { mPtrs = (AudioBufferList *)CA_realloc(mPtrs, offsetof(AudioBufferList, mBuffers) + nStreams * sizeof(AudioBuffer)); mAllocatedStreams = nStreams; } UInt32 bytesPerStream = (nFrames * format.mBytesPerFrame + 0xF) & ~0xF; UInt32 nBytes = nStreams * bytesPerStream; if (nBytes > mAllocatedBytes) { if (mExternalMemory) { mExternalMemory = false; mMemory = NULL; } mMemory = (Byte *)CA_realloc(mMemory, nBytes); mAllocatedBytes = nBytes; } mAllocatedFrames = nFrames; mPtrState = kPtrsInvalid; }
void AUBufferList::Allocate(const CAStreamBasicDescription &format, UInt32 nFrames) { UInt32 nStreams; if (format.IsInterleaved()) { nStreams = 1; } else { nStreams = format.mChannelsPerFrame; } // careful -- the I/O thread could be running! if (nStreams > mAllocatedStreams) { size_t theHeaderSize = sizeof(AudioBufferList) - sizeof(AudioBuffer); mPtrs = (AudioBufferList *)CA_realloc(mPtrs, SafeMultiplyAddUInt32(nStreams, sizeof(AudioBuffer), theHeaderSize)); mAllocatedStreams = nStreams; } UInt32 bytesPerStream = SafeMultiplyAddUInt32(nFrames, format.mBytesPerFrame, 0xF) & ~0xF; UInt32 nBytes = SafeMultiplyAddUInt32(nStreams, bytesPerStream, 0); if (nBytes > mAllocatedBytes) { if (mExternalMemory) { mExternalMemory = false; mMemory = NULL; } mMemory = (Byte *)CA_realloc(mMemory, nBytes); mAllocatedBytes = nBytes; } mAllocatedFrames = nFrames; mPtrState = kPtrsInvalid; }