Аудиоустройство увеличивает обратный вызов рендеринга inNumberFrames, когда датчик приближения закрыт - PullRequest
0 голосов
/ 10 мая 2018

Я использую Linphone SDK для приложения VoIP для iOS. И я обнаружил, что датчик приближения (тот, который затемняет ваш экран, когда вы подносите телефон близко к уху) плохо влияет на входящий голос.

Я обнаружил, что inBusNumber для обратного вызова ввода будет увеличен до 1024 при закрытии близости, обычно это 256. Когда это происходит, это также вызывает промежуток времени около 180 мс, что Audio Unit не вызывает этот обратный вызов, что разрушает стратегию буфера Linphone ,

настройка обратного вызова рендеринга:

AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc       = au_write_cb;
renderCallbackStruct.inputProcRefCon = card;
auresult=AudioUnitSetProperty (
                               card->io_unit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               outputBus,
                               &renderCallbackStruct,
                               sizeof (renderCallbackStruct)
                               );

В обратном вызове рендеринга:

static OSStatus au_write_cb (
                          void                        *inRefCon,
                          AudioUnitRenderActionFlags  *ioActionFlags,
                          const AudioTimeStamp        *inTimeStamp,
                          UInt32                      inBusNumber,
                          //it changes to 1024 when proximity sensor is triggered
                          UInt32                      inNumberFrames,
                          AudioBufferList             *ioData
                         ) {}

В моем понимании, inNumberFrames будет меняться только при переключении воспроизводящих устройств (например, при переключении наушников на Bluetooth). Можно ли как-нибудь исправить эту цифру при срабатывании датчика приближения?

Я также пытаюсь установить для kAudioUnitProperty_MaximumFramesPerSlice значение 256 и setPreferredIOBufferDuration аудиосеанса, но оба не работают.

Я загружаю официальную демонстрацию Apple под названием Speakerbox, и я обнаружил, что их обратный вызов рендеринга inNumberFrames сохраняется до 256 независимо от того, как я запускаю датчик приближения. Я сравнил код Apple и мой, но не могу найти никакой разницы, которая может вызвать это. Спасибо за любую помощь, спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

Ваше понимание неверно. iOS может изменить inNumberFrames по другим причинам, например, в связи с текущими состояниями жизненного цикла приложения и изменениями управления питанием. Стратегия управления буфером аудиоустройства приложения должна допускать такие изменения размера буфера, как, например, пропадание звука / скрытие ошибок или повторная синхронизация.

Что касается различий в поведении размера буфера iOS, они могут быть изменены в зависимости от выбора приложением аудиоустройства, типа и параметров аудиосеанса и параметров фонового режима.

...