Cómo configurar la aplicación iOS para utilizar el audio USB para la input y salida de altavoces internos

Tengo 2 marcas diferentes de adaptadores de guitarra que se conectan a mi iPhone usando el conector de iluminación

Cuando el adaptador 1 está conectado, el dispositivo se convierte en un micrófono de audio USB y reproduce el sonido a través de los altavoces de mi iPhone ya que el adaptador no contiene un conector para auriculares

Cuando el adaptador 2 está enchufado, el dispositivo se convierte en un micrófono de audio USB pero reproduce el sonido a través de la toma de auriculares en el adaptador.

Estoy intentando escribir una aplicación que funcione con el adaptador 2, pero en lugar de enviar el sonido a la toma de auriculares del adaptador, quiero guiarlo a través de los altavoces del iPhone.

El código a continuación debería funcionar, pero lo que encuentro es que llamar a AVAudioSessionPortOverride con la opción AVAudioSessionPortOverrideSpeaker y la categoría de la session de audio es AVAudioSessionCategoryPlayAndRecord hace que el audio use el altavoz incorporado y el micrófono independientemente de otras configuraciones, básicamente ignorando setPrefernetworkingInput

No puedo entender completamente cómo el adaptador 1 logra tomar la input del audio usb y la salida al altavoz, pero mi aplicación no puede debido a las restricciones anteriores. ¿Alguien sabe de una solución?

 AVAudioSession* session = [AVAudioSession shanetworkingInstance]; //Set the audioSession category. Needs to be Record or PlayAndRecord to use audioRouteOverride: [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; //set the audioSession override [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; //activate the audio session [session setActive:YES error:nil]; //set input to usb for (AVAudioSessionPortDescription *destPort in session.availableInputs){ if ([destPort.portType isEqualToString:AVAudioSessionPortUSBAudio]) { [setPrefernetworkingInput:(AVAudioSessionPortDescription *)inPort error:(nil)outError session setPrefernetworkingInput:destPort error:nil]; } } 

Creo que solo puedes lograr la input a través del dispositivo USB y salir a través de los altavoces cuando el dispositivo USB no tiene componentes de salida de audio.

No puedo encontrar ninguna documentation que diga exactamente esto, pero mi razonamiento es el siguiente:

La mezcla y adaptación de dispositivos de audio se realiza a través de la versión general de AVAudioSessionCategoryPlayAndRecord , la llamada categoría de múltiples routes ( AVAudioSessionCategoryMultiRoute ) y su documentation en AVAudioSession.h dice que

  1. La input está limitada al último puerto de input.
  2. AVAudioSessionPortBuiltInSpeaker solo se puede usar cuando no hay otras salidas elegibles conectadas

El punto 1 no es un problema, pero el punto 2 no permite el escenario del adaptador 2.

NB Esto permitiría que el adaptador 1 y 2 funcionen con input y salida de línea o auriculares USB. ¿Sería de alguna utilidad para ti?

Esto es un poco remota, pero ¿lo has intentado?

 [session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil] 

… en lugar de overrideOutputAudioPort: 😕