如何正确初始化(分配内存)和释放(释放内存)带有3个AudioBuffers的AudioBufferList?(我知道可能有多种方法可以做到这一点。)
我想使用这三个缓冲区将音频文件的连续部分读入它们中,并使用Audio Units回放。
如何正确初始化(分配内存)和释放(释放内存)带有3个AudioBuffers的AudioBufferList?(我知道可能有多种方法可以做到这一点。)
我想使用这三个缓冲区将音频文件的连续部分读入它们中,并使用Audio Units回放。
这是我的做法:
AudioBufferList *
AllocateABL(UInt32 channelsPerFrame, UInt32 bytesPerFrame, bool interleaved, UInt32 capacityFrames)
{
AudioBufferList *bufferList = NULL;
UInt32 numBuffers = interleaved ? 1 : channelsPerFrame;
UInt32 channelsPerBuffer = interleaved ? channelsPerFrame : 1;
bufferList = static_cast<AudioBufferList *>(calloc(1, offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer) * numBuffers)));
bufferList->mNumberBuffers = numBuffers;
for(UInt32 bufferIndex = 0; bufferIndex < bufferList->mNumberBuffers; ++bufferIndex) {
bufferList->mBuffers[bufferIndex].mData = static_cast<void *>(calloc(capacityFrames, bytesPerFrame));
bufferList->mBuffers[bufferIndex].mDataByteSize = capacityFrames * bytesPerFrame;
bufferList->mBuffers[bufferIndex].mNumberChannels = channelsPerBuffer;
}
return bufferList;
}
#define kNumChannels 2
AudioBufferList *bufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList) * kNumChannels);
bufferList->mNumberBuffers = kNumChannels; // 2 for stereo, 1 for mono
for(int i = 0; i < 2; i++) {
int numSamples = 123456; // Number of sample frames in the buffer
bufferList->mBuffers[i].mNumberChannels = 1;
bufferList->mBuffers[i].mDataByteSize = numSamples * sizeof(Float32);
bufferList->mBuffers[i].mData = (Float32*)malloc(sizeof(Float32) * numSamples);
}
// Do stuff...
for(int i = 0; i < 2; i++) {
free(bufferList->mBuffers[i].mData);
}
free(bufferList);
上面的代码假设您将数据读取为浮点数。如果您没有对文件进行任何特殊处理,以SInt16(原始PCM数据)的形式读取它们更加高效,因为iPhone没有FPU。
此外,如果您不在单个方法之外使用列表,则通过将其声明为普通对象而不是指针,在堆栈上分配它们比在堆上更有意义。您仍然需要malloc() AudioBuffer的实际mData成员,但至少您不需要担心free()实际的AudioBufferList本身。