AudioUnit inputCallback с AudioUnitRender -> несоответствие между audioBufferList.mBuffers[0].mDataByteSize! = InNumberFrames

Мы используем обратный вызов ввода AudioUnits для обработки входящего буфера. Настройка аудиоблока в основном взята из

https://github.com/robovm/apple-ios-samples/blob/master/aurioTouch/Classes/AudioController.mm

Я добавил некоторую проверку работоспособности в обратном вызове аудио. Это выглядит так

/// The audio input callback
static OSStatus audioInputCallback(void __unused *inRefCon,
                                   AudioUnitRenderActionFlags *ioActionFlags,
                                   const AudioTimeStamp *inTimeStamp,
                                   UInt32  __unused inBusNumber,
                                   UInt32 inNumberFrames,
                                   AudioBufferList __unused *ioData)
{
    OSStatus err = noErr;
    if(!*callbackData.audioChainIsBeingReconstructed)
    {
        // we are calling AudioUnitRender on the input bus of AURemoteIO
        // this will store the audio data captured by the microphone in cd.audioBufferList
        err = AudioUnitRender(callbackData.audioUnit, ioActionFlags, inTimeStamp, kInputBus, inNumberFrames, &callbackData.audioBufferList);

        // check if the sample count is set correctly
        assert(callbackData.audioBufferList.mBuffers[0].mDataByteSize == inNumberFrames * sizeof(float));
        // Assert that we only received one buffer
        assert(callbackData.audioBufferList.mNumberBuffers == 1);

        // Copy buffer
        TPCircularBufferCopyAudioBufferList(callbackData.buffer, &callbackData.audioBufferList, inTimeStamp, kTPCircularBufferCopyAll, NULL);

    }
    return err;
}

Теперь иногда заявление assert(callbackData.audioBufferList.mBuffers[0].mDataByteSize == inNumberFrames * sizeof(float)); терпит неудачу, поскольку буферы разные.

Есть ли у кого-нибудь объяснение этому явлению?

1 ответ

Это нормальное поведение на iOS. Обратный вызов iOS Audio Unit может изменить количество кадров, предоставленных в размере буфера, чтобы оно отличалось от исходного размера буфера. Это может произойти, когда изменяется состояние ОС, или когда изменяется состояние аудиооборудования, или когда доступный аппаратный формат не совсем соответствует вашему запросу аудиоформата.

Таким образом, все обратные вызовы Audio Unit должны быть написаны для обработки переменного числа inNumberFrames из запрошенного значения или предыдущего значения обратного вызова.

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