关于iPhone SDK的ExtAudioFileRead和AudioBuffer的问题

时间:2010-06-15 19:50:45

标签: ios iphone cocoa core-audio

我正在开发一款使用扩展音频文件服务的iPhone应用程序。我尝试使用ExtAudioFileRead来读取音频文件,并将数据存储在AudioBufferList结构中。

AudioBufferList 定义为:

struct AudioBufferList {
UInt32      mNumberBuffers;
AudioBuffer mBuffers[1];
};
typedef struct AudioBufferList  AudioBufferList;

AudioBuffer 定义为

struct AudioBuffer {
   UInt32  mNumberChannels;
   UInt32  mDataByteSize;
   void*   mData;
};
typedef struct AudioBuffer  AudioBuffer;

我想操纵 mData ,但我想知道 void * 是什么意思。为什么它无效*?如何确定mData中实际存储的数据类型?

2 个答案:

答案 0 :(得分:1)

mData字段标记为void,因为不同的音频格式具有不同的存储要求。

基本上在C中,void指针可以指向任何东西。

所以你可以说

mData = (SInt32 *)malloc(sizeof(Sint32) * numElements);

然后当你想使用它时,将它转换为你想要的数据类型。

Sint32 *myBuffer = (SInt32 *)mData;

答案 1 :(得分:1)

您可以使用

确定mData数组中元素的大小(帧大小)
AudioStreamBasicDescription inputFileFormat;
UInt32 dataSize = (UInt32)sizeof(inputFileFormat);
ExtAudioFileGetProperty(inputFile, kExtAudioFileProperty_FileDataFormat, &dataSize, &inputFileFormat);
size_t sizeOfFrame = inputFileFormat.mBytesPerFrame;

然后你可以将它解释为任何具有相同大小的签名类型(对于每帧通常4个字节,它可以是Sint32或Float32)。