我正在开发一款使用扩展音频文件服务的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中实际存储的数据类型?
答案 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)。