存储ExtAudioFile API中的AudioBufferLists供以后使用

时间:2009-12-08 10:11:56

标签: cocoa core-audio

使用Xcode / Cocoa和ExtAudioFile API,我试图将AudioBufferList *对象存储起来供以后使用,但是我在重新访问数据时遇到了麻烦。这些对象来自重复的ExtAudioFileRead调用。

我意识到我不能将这些AudioBufferList *对象填充到NSArray中,但我的印象是NSPointerArray可以用于此目的。但是,当在NSPointerArray中存储音频缓冲区列表后尝试访问audioBufferList-> mBuffers [0] .mData时,它们只是将其归零。

我正在将audioBufferLists memcpying到新的audioBufferList对象,因为我正在为每个ExtAudioFileRead调用重用相同的音频缓冲区列表。我不确定这是否足够,并且memcpying void * audioBufferList-> mBuffers [0] .mData对象也没有帮助。

存储这些AudioBufferList *对象的最简单方法是什么?我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:5)

AudioBufferLists将其数据保存在audioBufferList.mBuffers[i].mData mDatavoid*,值的实际类型由您指定的输出格式决定。

示例:
如果你定义了 kAudioFormatFlagsCanonical
kAudioFormatLinearPCM
mBitsPerChannel = 32  和
mFramesPerPacket = 1
作为输出格式,mData数组包含AudioSampleType类型的值(Float32为typedef)

如果您选择了其他格式,则阵列可能包含SInt16值或其他内容 因此,当您想要复制mData的内容时,您必须知道您的输出类型 如果你知道格式,你可以简单地创建一个c-array

dataCopy = calloc(dataSize, sizeof(Float32));

和memcpy audioBufferList.mBuffers [i] .mData到那个。
如果要使用cocoa NSMutableArray,则必须将浮点数包装到NSNumber对象中。