¿Cómo evito el siguiente error: la condición requerida de AVAudioEngineGraph es false: NULL! = Tap

He buscado este error y no he encontrado a nadie con el mismo error. Estoy bastante seguro de que sé lo que significa este error, pero no sé cómo evitarlo.

Básicamente, lo que está sucediendo es que tengo una llamada telefónica sobre MultipeerConnectivity. Estoy usando un AVAudioEngine para grabar audio y reproducir audio del compañero.

Me he dado count de que hubo un gran retraso entre el momento en que el usuario estaba hablando y el time que tardaría el otro dispositivo en reproducir ese audio, pero solucioné el problema eliminando el toque y volviéndolo a instalar. Esto elimina completamente cualquier retraso. Sin embargo, a veces arroja un error.

También permito al usuario silenciar su micrófono, y cuando hacen clic en silenciar, se quita el toque. Una vez que hacen clic en "unmute", se vuelve a instalar el toque. Nuevamente a veces esto también arroja el mismo error:

AVAudioEngineGraph.mm:2707: InputAvailable: la condición requerida es false: NULL! = Tap

Sin embargo, este error parece ser completamente aleatorio. A veces sucede, otras veces no. No he podido reproducir constantemente el error.


Mi conjetura es que esto es porque está tratando de instalar un toque donde ya existe un toque, pero no sé cómo evitarlo. Creo que podría boost el bus en el que se está instalando el grifo, pero esta no parece ser la mejor opción.

También miré para ver si había una propiedad en AVAudioInputNode que me diría si ya había un toque instalado en un bus en particular, pero no parecía encontrar ninguno.

¿Alguien tiene alguna experiencia con este problema?

Si encuentras una solución mejor, entonces avísame de qué se trata. Esta no es una solución 100% completa, pero fue lo mejor que pude encontrar con la poca ayuda que recibí sobre el problema.

Encontré algo de una solución, sin embargo, es probable que todavía haya una mejor solución. Esto no elimina completamente el problema, he visto el problema una o dos veces desde que hice el cambio, pero definitivamente networkinguce las posibilidades de que ocurra.

Básicamente lo que hice fue cuando quito un grifo, asegúrate de esperar hasta que termine antes de permitir la installation de un grifo. En mi caso, tenía un button de silencio, y me aseguré de no permitir que el usuario presionara el button más rápido de lo que se podía quitar el toque. Tan pronto como se toca el button, no permito ninguna presión hasta que se retira el grifo, y luego reactivo el button.

En segundo lugar, no estoy seguro de que esto haga nada en absoluto, pero antes de instalar un toque en el inputNode, siempre invoco inputNode.reset () y luego inputNode.removeTap (onBus: 0) primero, y luego instale el toque.

inputNode.reset() inputNode.removeTap(onBus: 0) inputNode.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) { ... }