PJSip con IOS, volumen del micrófono muy bajo

Hemos creado un teléfono suave VOIP que conecta a la persona que llama a un puente de conferencia. Las indicaciones del puente de conferencia y las llamadas de los teléfonos normales pueden escucharse bien, pero la input del softphone apenas es audible.

Estamos usando PJSip, AVAudioSession, Objective C y IOS 10.2

Intentamos establecer la ganancia de input con AVAudioSession, pero la ganancia no es configurable.

¿Alguien tiene alguna idea? Gracias

Necesita una combinación de 3 características específicas de iOS aquí.

1. Categoría de session de audio

Según la documentation y el código, los estoy enumerando a continuación:

/* Use this category for background sounds such as rain, car engine noise, etc. Mixes with other music. */ public let AVAudioSessionCategoryAmbient: String /* Use this category for background sounds. Other music will stop playing. */ public let AVAudioSessionCategorySoloAmbient: String /* Use this category for music tracks.*/ public let AVAudioSessionCategoryPlayback: String /* Use this category when recording audio. */ public let AVAudioSessionCategoryRecord: String /* Use this category when recording and playing back audio. */ public let AVAudioSessionCategoryPlayAndRecord: String /* Use this category when using a hardware codec or signal processor while not playing or recording audio. */ @available(iOS, introduced: 3.0, deprecated: 10.0) public let AVAudioSessionCategoryAudioProcessing: String /* Use this category to customize the usage of available audio accessories and built-in audio hardware. For example, this category provides an application with the ability to use an available USB output and headphone output simultaneously for separate, distinct streams of audio data. Use of this category by an application requires a more detailed knowledge of, and interaction with, the capabilities of the available audio routes. May be used for input, output, or both. Note that not all output types and output combinations are eligible for multi-route. Input is limited to the last-in input port. Eligible inputs consist of the following: AVAudioSessionPortUSBAudio, AVAudioSessionPortHeadsetMic, and AVAudioSessionPortBuiltInMic. Eligible outputs consist of the following: AVAudioSessionPortUSBAudio, AVAudioSessionPortLineOut, AVAudioSessionPortHeadphones, AVAudioSessionPortHDMI, and AVAudioSessionPortBuiltInSpeaker. Note that AVAudioSessionPortBuiltInSpeaker is only allowed to be used when there are no other eligible outputs connected. */ @available(iOS 6.0, *) public let AVAudioSessionCategoryMultiRoute: String 

Para su caso de uso, recogeré AVAudioSessionCategoryPlayAndRecord y estableceré usando

Para swift:

 AVAudioSession.shanetworkingInstance().setCategory(AVAudioSessionCategoryPlayAndRecord) 

Para Obj-c

 [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&err] 

2. Modos de session de audio

Estos modos ayudan a configurar automáticamente la ganancia adecuada, la cancelación de eco y otras funciones de procesamiento de audio.

 /* The default mode */ /*! @abstract Modes modify the audio category in order to introduce behavior that is tailonetworking to the specific use of audio within an application. Available in iOS 5.0 and greater. */ @available(iOS 5.0, *) public let AVAudioSessionModeDefault: String /* Only valid with AVAudioSessionCategoryPlayAndRecord. Appropriate for Voice over IP (VoIP) applications. Reduces the number of allowable audio routes to be only those that are appropriate for VoIP applications and may engage appropriate system-supplied signal processing. Has the side effect of setting AVAudioSessionCategoryOptionAllowBluetooth */ @available(iOS 5.0, *) public let AVAudioSessionModeVoiceChat: String /* Set by Game Kit on behalf of an application that uses a GKVoiceChat object; valid only with the AVAudioSessionCategoryPlayAndRecord category. Do not set this mode directly. If you need similar behavior and are not using a GKVoiceChat object, use AVAudioSessionModeVoiceChat instead. */ @available(iOS 5.0, *) public let AVAudioSessionModeGameChat: String /* Only valid with AVAudioSessionCategoryPlayAndRecord or AVAudioSessionCategoryRecord. Modifies the audio routing options and may engage appropriate system-supplied signal processing. */ @available(iOS 5.0, *) public let AVAudioSessionModeVideoRecording: String /* Appropriate for applications that wish to minimize the effect of system-supplied signal processing for input and/or output audio signals. */ @available(iOS 5.0, *) public let AVAudioSessionModeMeasurement: String /* Engages appropriate output signal processing for movie playback scenarios. Currently only applied during playback over built-in speaker. */ @available(iOS 6.0, *) public let AVAudioSessionModeMoviePlayback: String /* Only valid with kAudioSessionCategory_PlayAndRecord. Reduces the number of allowable audio routes to be only those that are appropriate for video chat applications. May engage appropriate system-supplied signal processing. Has the side effect of setting AVAudioSessionCategoryOptionAllowBluetooth and AVAudioSessionCategoryOptionDefaultToSpeaker. */ @available(iOS 7.0, *) public let AVAudioSessionModeVideoChat: String /* Appropriate for applications which play spoken audio and wish to be paused (via audio session interruption) rather than ducked if another app (such as a navigation app) plays a spoken audio prompt. Examples of apps that would use this are podcast players and audio books. For more information, see the related category option AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers. */ @available(iOS 9.0, *) public let AVAudioSessionModeSpokenAudio: String 

AVAudioSessionModeVideoChat para su caso y estableceré usando

Rápido

 AVAudioSession.shanetworkingInstance().setMode(AVAudioSessionModeVideoChat) 

Obj-c

 [[AVAudioSession shanetworkingInstance] setMode:AVAudioSessionModeVideoChat error:&err] 

3. Ruta de audio

De forma pnetworkingeterminada, para la mayoría de los modos / categorías, el audio se enruta al earpiece/receiver . Si está mirando el modo de altavoz, debe establecerlo manualmente usando

Rápido

 AVAudioSession.shanetworkingInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) 

Obj-c

 [[AVAudioSession shanetworkingInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];