Что заставляет ExtAudioFileRead сделать ioData->mBuffers[0].mDataByteSize отрицательным?
Проблема возникает, когда я часто останавливаю и начинаю воспроизведение аудио и много раз ищу в аудиофайле AAC через ExtAudioFileRef
объект. В некоторых случаях это странное поведение проявляется ExtAudioFileRead
:
Иногда он присваивает эти номера mDataByteSize
из единственного AudioBuffer
из AudioBufferList
:
-51604480
-51227648
-51350528
-51440640
-51240960
В шестнадцатеричном формате эти числа имеют вид 0xFC....00
,
Код:
status = ExtAudioFileRead(_file, &numberFramesRead, ioData);
printf("s=%li d=%p d.nb=%li, d.b.d=%p, d.b.dbs=%li, d.b.nc=%li\n", status, ioData, ioData->mNumberBuffers, ioData->mBuffers[0].mData, ioData->mBuffers[0].mDataByteSize, ioData->mBuffers[0].mNumberChannels);
Выход:
s=0 d=0x16668bd0 d.nb=1, d.b.d=0x30de000, d.b.dbs=1024, d.b.nc=2 // good (usual)
s=0 d=0x16668bd0 d.nb=1, d.b.d=0x30de000, d.b.dbs=-51240960, d.b.nc=2 // misbehaving
Проблема возникает на iPhone 4S на iOS 7. Я не смог воспроизвести проблему в симуляторе.
1 ответ
Проблема возникает при одновременном вызове ExtAudioFileRead()
а также ExtAudioFileSeek()
для того же ExtAudioFileRef
из двух разных потоков / очередей.
Функция чтения была вызвана непосредственно из AURenderCallback
Таким образом, он был выполнен в потоке AudioUnit в реальном времени, в то время как поиск был выполнен в моей собственной последовательной очереди.
Я изменил код обратного вызова рендеринга так, чтобы он также отправлял dispatch_sync() в ту же последовательную очередь, в которую отправляется запрос. Это решило проблему.