Ошибка AudioUnitRender -50 с буферами нечетной длины - PullRequest
0 голосов
/ 28 августа 2018

У меня есть модуль 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 кадров, что не удается.

1 Ответ

0 голосов
/ 28 ноября 2018

Оказалось, что это была ошибка программирования из-за недоразумений в языке Swift. Линия, которая была виновником, была такой:

for var buf in buffers {
   buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
}

Этот ответ дает более подробную информацию - Swift vs Objective C проблема манипулирования указателем

...