Я работаю над пониманием Core Audio, а точнее: Расширенные аудиофайлы
Здесь я хочу использовать 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);
Вы знаете, что я здесь не так делаю?