Что заставляет 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() в ту же последовательную очередь, в которую отправляется запрос. Это решило проблему.

Другие вопросы по тегам