AVAudioSessionManager availableInputs “Fuente de datos seleccionada desconocida para el puerto del micrófono del iPhone”
(2)
He notado este error en el registro de mi consola por un tiempo. Aunque no afecta la ejecución de mi aplicación, me resulta realmente molesto. Por lo tanto, comencé a rastrear de dónde vino este error. Resulta que cuando llamo a availableInputs
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs];
Me dará el mensaje de registro:
ERROR: [0x3d61318c] AVAudioSessionPortImpl.mm:50: ValidateRequiredFields: Unknown selected data source for Port iPhone Microphone (type: MicrophoneBuiltIn)
Intenté imprimir las entradas ...
Printing description of inputs:
<__NSArrayI 0x188c4610>(
<AVAudioSessionPortDescription: 0x188c4580, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = (null)>,
<AVAudioSessionPortDescription: 0x18835d90, type = BluetoothHFP; name = Valore-BTi22; UID = 00:23:01:10:38:77-tsco; selectedDataSource = (null)>
Así que selectedDataSource es (nulo). ¿No sé qué debo hacer para que no sea nulo? El micrófono del iPhone es una entrada incorporada ... ¿Supongo que Apple ya la ha configurado?
Con respecto al error en su consola, también puedo confirmar que a veces recibo este mensaje cuando uso mi iPhone 5S, pero nunca lo he visto en mi 4S. Podría ser solo un volcado de audio central, pero no parece afectar el rendimiento real (al menos para mí).
Con respecto a las entradas disponibles, lo que realmente está imprimiendo son los puertos de entrada disponibles y sus descripciones. Este bit es más confuso y no entiendo por qué el campo selectedDataSource es nulo para cada uno.
Diré que el iPhone definitivamente está predeterminado para una de esas fuentes (probablemente el micrófono incorporado) independientemente de lo que diga el origen de datos seleccionado.
Ahora, si desea seleccionar explícitamente una de las descripciones de puertos, podría hacer algo como esto:
NSArray *availableInputs = [[AVAudioSession sharedInstance] availableInputs];
AVAudioSessionPortDescription *port = [availableInputs objectAtIndex:0]; //built in mic for your case
NSError *portErr = nil;
[[AVAudioSession sharedInstance] setPreferredInput:port error:&portErr];
y verificaría portErr luego para asegurarme de que no haya ningún error al configurar el preferredInput.
Vale la pena señalar que también puede alternar entre las fuentes de datos disponibles para una descripción de puerto particular y seleccionar una usando
[port setPreferredDataSource:source error:&sourceErr];
luego sigue con
[[AVAudioSession sharedInstance] setPreferredInput:port error:&portErr];
Estas son algunas características útiles de iOS7 que aprovechan el hardware con varios ratones integrados.
Este problema parece no solo me pasa a mí ... compartiré mi entendimiento aquí ...
Mi situación es ... Estoy usando la biblioteca pjsip, que tiene un control de recursos de audio de nivel inferior. Noté que el dispositivo de sonido se cerró antes de que llame a [[AVAudioSession sharedInstance] availableInputs];
Por lo tanto, (supongo) AVAudioSession
, como un control de nivel superior, no pudo encontrar la fuente de datos de audio correspondiente para su entrada, como indica el error ...
Para investigar más a fondo el problema, es mejor verificar en algún lugar de su código que modifique la fuente de audio ... y asegúrese de que la fuente de audio esté activada antes de llamar a AVAudioSession
Por ahora solo puedo llegar tan lejos ... ¡Siempre se agradece una comprensión más profunda y una mejor explicación del control de audio!