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 из запрошенного значения или предыдущего значения обратного вызова.