¿Es seguro usar dos unidades de audio para I / O simultáneas en iOS?

Estoy trabajando en un proyecto VOIP para iOS y noté un problema extraño. Mi configuration se ve a continuación:

  1. Capture end tiene una unidad VoiceProcessingIO (para la cancelación de eco), con scope de salida, bus de salida y scope de input, bus de input habilitado.
  2. Render end tiene una unidad RemoteIO, con scope de salida, bus de salida habilitado.

No utilizo ningún gráfico de audio hasta el momento.

Cuando comienzo a grabar voz, noto que la configuration anterior causó una voz de salida muy baja, hasta que apago el scope de salida, bus de salida de VoiceProcessingIO. Aunque suena como un error en mi código (configuration del bus IO incorrecto), todavía no tiene sentido que el motivo por el cual un cambio en la captura finalice el procesamiento finalice.

Después de leer la Guía de alojamiento de la unidad de audio para iOS de developer.apple.com, noté que mencionaba varias veces que cada patrón de layout debería include solo una unidad de audio de E / S. Me pregunto si esto es obligatorio o simplemente opcional. ¿Es seguro mantener mi código con dos unidades de audio?

De hecho, usar dos unidades de audio puede tener su propio motivo, ya que simplemente puedo apagar una unidad si quiero silenciar un extremo. No puedo hacerlo con kAudioUnitProperty_EnableIO porque no se puede cambiar después de AudioUnitInitialize (), lo que significa que la solución de una unidad de audio puede tener que apagar ambos canales y reiniciar la unidad de audio de nuevo si quiero deshabilitar uno de ellos. Esto provoca una mala experiencia de usuario porque la voz puede detenerse durante un corto time durante este momento.

Gracias, Fuzhou

Bueno, parece que estoy haciendo una pregunta en la esquina. De todos modos, creo que tengo algunas ideas basadas en mis experimentos hasta ahora:

  1. Utilizo dos unidades RemoteIO … Puede parecer bien en el extremo local, pero causará problemas en el extremo remoto. ¿Restrings que mencioné que estaba trabajando en una aplicación VOIP? Encontré que mi extremo de captura solo puede pasar de un volumen muy bajo a un extremo remoto cuando se usa el renderizado. El extremo está utilizando un altavoz.

  2. Si utilizo dos unidades VoiceProcessingIO … Aunque parece que podemos crear dos objects de unidades de audio, en realidad son los mismos. Quiero decir, en mi código, si creo dos unidades y cierro una de ellas (p. Ej., Micrófono de silenciamiento), entonces la otra deja de funcionar también.

  3. Si uso una unidad VoiceProcessingIO y una unidad RemoteIO … Eso es más complejo. Primero, no use la unidad VoiceProcessingIO como final de renderizado solamente. No activará la cancelación de eco. Entonces, la única opción es usar la unidad VoiceProcessingIO como captura y RemoteIO como renderizado. Puede funcionar pero ten cuidado. Si activó tanto el extremo de input como el de salida de la unidad VoiceProcessingIO, es posible que escuche una salida de volumen más baja desde su propio altavoz o altavoz.

Por cierto, todas las discusiones son solo para iOS. No tuve la oportunidad de jugar con Mac.

Entonces, sí, parece que no hay un comportamiento garantizado si realmente lo hacemos, y la última esperanza es seguir la Guía de alojamiento de la unidad de audio de Apple.

Todavía espero que más chicos tengan sus comentarios aquí. Por favor, avíseme si encuentra algo nuevo.

Bueno, parece que he tenido el mismo problema con usted, también uso dos unidades de audio para mi aplicación, process IO para logging y control remoto para reproducción, y descubrí que el volumen de salida se presiona.

Desde su consejo: "Si activó tanto el extremo de input como el de salida de la unidad VoiceProcessingIO, es posible que escuche una salida de volumen más baja desde su propio altavoz o altavoz", ahora bash desactivar la salida del IO de precesión como esta:

flag = 0; status = AudioUnitSetProperty(_recordAudioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, kOutputBus, &flag, sizeof(flag)); 

Sí, en final obtuve un volumen de renderización más alto, pero ocurre otro problema, que es el logging, no funciona de nuevo.

No sé si te encuentras con ese problema, así que desearía ver tu actualización pronto.

Hay un código de error para AUGraph

kAUGraphErr_OutputNodeErr AUGraphs solo puede contener una OutputUnit. este error se devuelve si intenta agregar una segunda unidad de salida o la unidad de salida del gráfico se elimina mientras el gráfico se está ejecutando

AUGraph.h, línea 106