Ios 试图了解AudioBuffer的mDataByteSize属性发生变化的原因

Ios 试图了解AudioBuffer的mDataByteSize属性发生变化的原因,ios,objective-c,Ios,Objective C,我使用以下代码将WAV文件的内容读取到SInt16数组中: AudioBufferList *buffers; UInt32 ablSize = offsetof(AudioBufferList, mBuffers) + (sizeof(AudioBuffer) * 1); buffers = malloc(ablSize); buffers->mNumberBuffers = 1; buffers->mBuffers[0].mNumberChannels = 1; bu

我使用以下代码将WAV文件的内容读取到
SInt16
数组中:

AudioBufferList *buffers;
UInt32 ablSize = offsetof(AudioBufferList, mBuffers) + 
    (sizeof(AudioBuffer) * 1);
buffers = malloc(ablSize);

buffers->mNumberBuffers = 1;
buffers->mBuffers[0].mNumberChannels = 1;
buffers->mBuffers[0].mDataByteSize = dataByteSize;

UInt32 dataSize = (UInt32)fileLengthFrames * sizeof(SInt16);

self.extractedSamples = malloc(dataSize);
self.extractedByteCount = dataByteSize; 

UInt32 totalFramesRead = 0;
do {
    UInt32 framesRead = (UInt32)fileLengthFrames - totalFramesRead;
    buffers->mBuffers[0].mData = self.extractedSamples + 
        (totalFramesRead * sizeof(SInt16));
    ExtAudioFileRead(eaf, &framesRead, buffers);
    totalFramesRead += framesRead;

} while (totalFramesRead < fileLengthFrames);

free(buffers);
AudioBufferList*缓冲区;
UInt32 ablSize=偏移量(音频缓冲列表,MBuffer)+
(sizeof(音频缓冲器)*1);
缓冲区=malloc(ablSize);
缓冲区->mNumberBuffers=1;
buffers->mbuffer[0]。mNumberChannels=1;
缓冲区->MBuffer[0]。mDataByteSize=dataByteSize;
UInt32数据大小=(UInt32)文件长度帧*sizeof(SInt16);
self.extractedSamples=malloc(数据大小);
self.extractedByteCount=数据字节大小;
UInt32 totalFramesRead=0;
做{
UInt32 framesRead=(UInt32)fileLengthFrames-totalFramesRead;
缓冲区->MBuffer[0]。mData=self.extractedSamples+
(总框架READ*sizeof(SInt16));
ExtAudioFileRead(eaf、帧读取和缓冲区);
totalFramesRead+=framesRead;
}而(totalFramesRead
对于持续时间小于0.5秒的文件,这可以正常工作。但是对于我正在测试的较长的文件,应用程序在
do
循环中由于错误的访问错误而崩溃。对于这个文件,
dataByteSize
是60472,在循环的开始处
buffer->mBuffers[0]。mDataByteSize
也是60472。但当崩溃发生时,我看到
buffer->mBuffers[0].mDataByteSize
已更改为57300,这大概就是崩溃现在发生的原因

有人知道这个值在循环的中间是如何变化的吗?我的一个猜测是我没有正确地保留
AudioBufferList
,而
mDataByteSize
的内存空间不知何故被覆盖了


编辑:在模拟器上使用同一文件运行此代码时,它工作正常。

mDataByteSize应在每次调用ExtAudioFileRead之前设置为framesRead*sizeof(SInt16)*channelCount