if (outputFormat.mFormatFlags & kAudioFormatFlagIsNonInterleaved) {
// The audio is non-interleaved
printf("Not interleaved!\n");
self.isInterleaved = NO;
// allocate an AudioBufferList plus enough space for array of AudioBuffers
UInt32 propsize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * outputFormat.mChannelsPerFrame);
//malloc buffer lists
self.inputBuffer = (AudioBufferList *)malloc(propsize);
self.inputBuffer->mNumberBuffers = outputFormat.mChannelsPerFrame;
//pre-malloc buffers for AudioBufferLists
for(UInt32 i =0; i< self.inputBuffer->mNumberBuffers ; i++) {
self.inputBuffer->mBuffers[i].mNumberChannels = 1;
self.inputBuffer->mBuffers[i].mDataByteSize = bufferSizeBytes;
self.inputBuffer->mBuffers[i].mData = malloc(bufferSizeBytes);
memset(self.inputBuffer->mBuffers[i].mData, 0, bufferSizeBytes);
}
} else {
printf ("Format is interleaved\n");
self.isInterleaved = YES;
// allocate an AudioBufferList plus enough space for array of AudioBuffers
UInt32 propsize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * 1);
//malloc buffer lists
self.inputBuffer = (AudioBufferList *)malloc(propsize);
self.inputBuffer->mNumberBuffers = 1;
//pre-malloc buffers for AudioBufferLists
self.inputBuffer->mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame;
self.inputBuffer->mBuffers[0].mDataByteSize = bufferSizeBytes;
self.inputBuffer->mBuffers[0].mData = malloc(bufferSizeBytes);
memset(self.inputBuffer->mBuffers[0].mData, 0, bufferSizeBytes);
}
// The audio is non-interleaved
printf("Not interleaved!\n");
self.isInterleaved = NO;
// allocate an AudioBufferList plus enough space for array of AudioBuffers
UInt32 propsize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * outputFormat.mChannelsPerFrame);
//malloc buffer lists
self.inputBuffer = (AudioBufferList *)malloc(propsize);
self.inputBuffer->mNumberBuffers = outputFormat.mChannelsPerFrame;
//pre-malloc buffers for AudioBufferLists
for(UInt32 i =0; i< self.inputBuffer->mNumberBuffers ; i++) {
self.inputBuffer->mBuffers[i].mNumberChannels = 1;
self.inputBuffer->mBuffers[i].mDataByteSize = bufferSizeBytes;
self.inputBuffer->mBuffers[i].mData = malloc(bufferSizeBytes);
memset(self.inputBuffer->mBuffers[i].mData, 0, bufferSizeBytes);
}
} else {
printf ("Format is interleaved\n");
self.isInterleaved = YES;
// allocate an AudioBufferList plus enough space for array of AudioBuffers
UInt32 propsize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * 1);
//malloc buffer lists
self.inputBuffer = (AudioBufferList *)malloc(propsize);
self.inputBuffer->mNumberBuffers = 1;
//pre-malloc buffers for AudioBufferLists
self.inputBuffer->mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame;
self.inputBuffer->mBuffers[0].mDataByteSize = bufferSizeBytes;
self.inputBuffer->mBuffers[0].mData = malloc(bufferSizeBytes);
memset(self.inputBuffer->mBuffers[0].mData, 0, bufferSizeBytes);
}
本文探讨了音频格式中的kAudioFormatFlagIsNonInterleaved标志,该标志指示音频是否为非交织。非交织音频每个通道的数据分别存储,而交织音频则将所有通道数据混合在一起存储。代码示例展示了如何根据音频格式创建相应的AudioBufferList结构,用于处理非交织和交织音频的内存分配和初始化。
6326

被折叠的 条评论
为什么被折叠?



