Cocoa 存储ExtAudioFile API中的AudioBufferList供以后使用

Cocoa 存储ExtAudioFile API中的AudioBufferList供以后使用,cocoa,core-audio,Cocoa,Core Audio,使用Xcode/Cocoa和ExtAudioFile API,我试图存储AudioBufferList*对象以备以后使用,但在重新访问数据时遇到了麻烦。这些对象来自重复的ExtAudioFileRead调用 我意识到我不能将这些AudioBufferList*对象塞进NSArray,但我觉得NSPointerArray可以实现这一目的。但是,在尝试访问audioBufferList->mBuffers[0].mData时,将音频缓冲区列表存储在NSPointerArray中后,它们会被归零 我将

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

我意识到我不能将这些AudioBufferList*对象塞进NSArray,但我觉得NSPointerArray可以实现这一目的。但是,在尝试访问audioBufferList->mBuffers[0].mData时,将音频缓冲区列表存储在NSPointerArray中后,它们会被归零

我将audioBufferList存储到新的audioBufferList对象中,因为每次ExtAudioFileRead调用都使用相同的音频缓冲区列表。不过,我不确定这是否足够,而使用void*audioBufferList->mBuffers[0].mData对象也没有帮助


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

audioBufferList将其数据保存在
audioBufferList.mBuffers[I].mData

mData
void*
,值的实际类型由指定的输出格式决定

示例:
如果您定义了
kAudioFormatFlagsCanonical

kAudioFormatLinearPCM

mBitsPerChannel=32

mFramesPerPacket=1

作为输出格式,mData数组包含类型为
AudioSampleType
(即
Float32
a typedef)的值

如果选择了另一种格式,数组可能包含SInt16值或其他内容。
因此,当您要复制周围mData的内容时,必须了解输出类型。
如果你知道这种格式,你可以简单地创建一个c数组

dataCopy = calloc(dataSize, sizeof(Float32));
和memcpy audioBufferList.mBuffers[i].mData放入其中。

如果要使用cocoa NSMutableArray,则必须将浮点数包装到NSNumber对象中。

或者可以创建一个NSMutableData,其中包含
dataSize
字节,并
memcpy
mData
放入数据的
mutableBytes