Могу ли я ограничить inNumberFrames, передаваемые iOS в функции AURenderCallback? - PullRequest
3 голосов
/ 05 октября 2011

Я создал пользовательский класс аудиоплеера, который использует AudioUnit и ExtAudioFile.В моем классе я подготовил свою собственную функцию обратного вызова рендеринга, такую ​​как

OSStatus MyAURenderCallack (
   void                        *inRefCon,
   AudioUnitRenderActionFlags  *ioActionFlags,
   const AudioTimeStamp        *inTimeStamp,
   UInt32                      inBusNumber,
   UInt32                      inNumberFrames,
   AudioBufferList             *ioData
);

Когда мое приложение находится на переднем плане, параметр inNumberFrames, передаваемый ОС, всегда 512 или 1024, и мой проигрыватель работает хорошо.
Но когда устройство iOS спало, inNumberFrames становится 4096, и мой плеер не работает, потому что он не мог подготовить столько кадров за один раз.

Трудно улучшить подготовку кадровпроцесс, потому что он интенсивно использует extAudioFileRead функцию, которую трудно ускорить.

Итак, я хочу ограничить inNumberFrames от того, чтобы стать больше, чем 1024.
Могу ли я сделать это?

1 Ответ

3 голосов
/ 17 октября 2011

Как заметил @sbooth, вы действительно должны записывать на диск в другом потоке.Если нет, то это создает реальную нагрузку на основной поток вашего приложения, которое должно быть сосредоточено на передаче звука без пропусков.

Но чтобы прямо ответить на ваш вопрос: нет, вы не можете напрямую сообщить ОС точное количество кадровиспользовать для размера блока.Вы можете посоветовать ему использовать определенную задержку, которая в сочетании с запрошенной частотой дискретизации даст вам приблизительный размер блока.Тем не менее, нет гарантии, что iOS вернет вам этот размер блока.

Тем не менее, ваш лучший выбор здесь - заставить ваш алгоритм работать с произвольными размерами блоков.Если вы не делаете что-то вроде свертки, обычно это должно быть проще с большими размерами блоков.Поэтому, если у вас возникли проблемы на 4096, вам, вероятно, следует профилировать свой код и посмотреть, в чем заключается основная проблема.

...