我正在努力理解核心音频,或者更确切地说:扩展音频文件服务 http://developer.apple.com/iphone/library/documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html
在这里,我想使用ExtAudioFileRead()
从文件中读取一些音频数据。
只要我使用一个巨大的缓冲区来存储我的音频数据(即一个AudioBuffer
)。一旦我使用多个AudioBuffer
, ExtAudioFileRead()
返回错误代码-50
(“参数列表中的错误”)。据我所知,这意味着论点之一ExtAudioFileRead()
是错的。大概是audioBufferList
.
我不能使用一个巨大的缓冲区,因为这样,dataByteSize
会溢出它的UInt32
- 具有大文件的整数范围。
这是创建的代码audioBufferList
:
AudioBufferList *audioBufferList;
audioBufferList = malloc(sizeof(AudioBufferList) + (numBuffers-1)*sizeof(AudioBuffer));
audioBufferList->mNumberBuffers = numBuffers;
for (int bufferIdx = 0; bufferIdx<numBuffers; bufferIdx++ ) {
audioBufferList->mBuffers[bufferIdx].mNumberChannels = numChannels;
audioBufferList->mBuffers[bufferIdx].mDataByteSize = dataByteSize;
audioBufferList->mBuffers[bufferIdx].mData = malloc(dataByteSize);
}
这是有效但溢出的代码:
UInt32 dataByteSize = fileLengthInFrames * bytesPerFrame; // this will overflow
AudioBufferList *audioBufferList = malloc(sizeof(audioBufferList));
audioBufferList->mNumberBuffers = 1;
audioBufferList->mBuffers[0].mNumberChannels = numChannels;
audioBufferList->mBuffers[0].mDataByteSize = dataByteSize;
audioBufferList->mBuffers[0].mData = malloc(dataByteSize);
最后,电话ExtAudioFileRead()
(应该适用于两个版本):
UInt32 numFrames = fileLengthInFrames;
error = ExtAudioFileRead(extAudioFileRef,
&numFrames,
audioBufferList);
你知道我在这里做错了什么吗?