bool TPCircularBufferCopyAudioBufferList(TPCircularBuffer *buffer, const AudioBufferList *inBufferList, const AudioTimeStamp *inTimestamp, UInt32 frames, AudioStreamBasicDescription *audioDescription) { int byteCount = inBufferList->mBuffers[0].mDataByteSize; if ( frames != kTPCircularBufferCopyAll ) { byteCount = frames * audioDescription->mBytesPerFrame; assert(byteCount <= inBufferList->mBuffers[0].mDataByteSize); } AudioBufferList *bufferList = TPCircularBufferPrepareEmptyAudioBufferList(buffer, inBufferList->mNumberBuffers, byteCount, inTimestamp); if ( !bufferList ) return false; for ( int i=0; i<bufferList->mNumberBuffers; i++ ) { memcpy(bufferList->mBuffers[i].mData, inBufferList->mBuffers[i].mData, byteCount); } TPCircularBufferProduceAudioBufferList(buffer, NULL); return true; }
AudioBufferList *TPCircularBufferPrepareEmptyAudioBufferListWithAudioFormat(TPCircularBuffer *buffer, AudioStreamBasicDescription *audioFormat, UInt32 frameCount, const AudioTimeStamp *timestamp) { return TPCircularBufferPrepareEmptyAudioBufferList(buffer, (audioFormat->mFormatFlags & kAudioFormatFlagIsNonInterleaved) ? audioFormat->mChannelsPerFrame : 1, audioFormat->mBytesPerFrame * frameCount, timestamp); }