У меня есть модуль RemoteIO, настроенный с помощью AVAudioSessionCategoryPlayAndRecord. Я нахожу в этом странное поведение. Я открываю приложение и сразу же закрываю его до полной инициализации audioUnit (фактически, он инициализируется в фоновом режиме, так как я слишком быстро закрываю приложение). Затем я вывожу приложение на передний план и сразу после перезапуска вижу, что AudioUnitRender непрерывно завершается с ошибкой -50. Я нахожу inNumberFrames 1115, и он терпит неудачу всякий раз, когда это число нечетное.
func recordingCallback(inRefCon:UnsafeMutableRawPointer,
ioActionFlags:UnsafeMutablePointer<AudioUnitRenderActionFlags>,
inTimeStamp:UnsafePointer<AudioTimeStamp>,
inBusNumber:UInt32,
inNumberFrames:UInt32,
ioData:UnsafeMutablePointer<AudioBufferList>?) -> OSStatus
{
let controller = unsafeBitCast(inRefCon, to: MicrophoneOutput.self)
let listPtr = controller.audioBufferList.unsafeMutablePointer
let buffers = UnsafeBufferPointer<AudioBuffer>(start: &listPtr.pointee.mBuffers, count: Int(listPtr.pointee.mNumberBuffers))
for var buf in buffers {
buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
}
let status = AudioUnitRender(controller.audioUnit!, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, listPtr)
if noErr != status {
print("Error \(status)");
NSLog("\(AVAudioSession.sharedInstance().currentRoute.inputs[0])")
fatalError("Render status \(status)")
// return status;
}
return noErr
}
Странно, если я жестко закодирую inNumberFrames в 1114 в вызове AudioUnitRender, это будет успешно! Кто-нибудь знает что происходит? Шаблон, как только приложение возобновляет работу из фона, появляется уведомление об изменении маршрута, и затем первый пример в обратном вызове имеет длину 1114 кадров, но следующий за ним имеет 1115 кадров, что не удается.