Ошибка инициализации звука CallKit в фоновом режиме — звук не работает после первого вызова

Недавно я добавил функциональность pjsip VoIP в свое приложение для iOS. Использование pjsip не вызывает проблем, пока приложение активно, я могу без проблем принимать и совершать звонки.

Но у меня, кажется, проблема со звуковыми устройствами в фоновом режиме. Первый звонок, который я получаю из фона, работает нормально, у меня есть звук, и я могу нормально закрыть его.

Проблема в том, что после первого звонка у меня нет звука, когда я принимаю вызов из фона. То же самое происходит, если я делаю или получаю вызов, когда приложение активно, а затем перехожу в фоновый режим и принимаю вызов. Когда я закрываю приложение, первый звонок из фона снова работает нормально.

Я понятия не имею, что может быть причиной этого.

Я пытался вручную закрыть все вызовы через CallManager, и я вызываю CXEndCallAction, когда сторона сервера завершает вызов, чтобы CallKit закрывалась должным образом.

Я был бы рад опубликовать конкретные фрагменты кода, но в настоящее время я понятия не имею, в чем может заключаться проблема...


ОБНОВИТЬ:

Я понял, что pjsip coreaudio инициализируется по-другому во второй раз.

Теперь вопрос в том, как правильно сбросить CoreAudio в pjsip?

Успешная инициация вызова:

11:03:01.615 tsx0x1030710a8  .....State changed from Trying to 
Proceeding, event=TX_MSG
11:03:01.615 dlg0x1030840a8  ......Transaction tsx0x1030710a8 state changed to Proceeding
2019-02-13 11:03:01.615745+0100 VarioCallCTI[11928:2820452] Incoming call from "Matthias" <sip:[email protected]>
11:03:01.618    pjsua_aud.c  ..Set sound device: capture=0, playback=0
11:03:01.618    pjsua_aud.c !Set sound device: capture=0, playback=0
11:03:01.619    pjsua_aud.c !...Opening sound device PCM@16000/1/20ms
11:03:01.619 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.808024+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,  16000 Hz, Int16> inf< 1 ch,  16000 Hz, Int16>)
11:03:01.851    pjsua_aud.c  ...Opening sound device PCM@44100/1/20ms
11:03:01.851 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.859854+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,  44100 Hz, Int16> inf< 1 ch,  44100 Hz, Int16>)
11:03:01.860    pjsua_aud.c  ...Opening sound device PCM@48000/1/20ms
11:03:01.860 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.867061+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,  48000 Hz, Int16> inf< 1 ch,  48000 Hz, Int16>)
11:03:01.867    pjsua_aud.c  ...Opening sound device PCM@32000/1/20ms
11:03:01.867 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.874321+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,  32000 Hz, Int16> inf< 1 ch,  32000 Hz, Int16>)
11:03:01.875    pjsua_aud.c  ...Opening sound device PCM@16000/1/20ms
11:03:01.875 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.881126+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,  16000 Hz, Int16> inf< 1 ch,  16000 Hz, Int16>)
11:03:01.881    pjsua_aud.c  ...Opening sound device PCM@8000/1/20ms
11:03:01.881 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
2019-02-13 11:03:01.888214+0100 VarioCallCTI[11928:2820452] [aurioc] 1029: failed: '!int' (enable 3, outf< 1 ch,   8000 Hz, Int16> inf< 1 ch,   8000 Hz, Int16>)
11:03:01.888    pjsua_aud.c  ...Unable to open sound device: Unknown error -560117684 [status=-560117684]
Error in Setting of Audio Devices - IncomingCall
TESTPRINT FOR NOTIFICATION INFO: eingehender anruf von 238
TESTPRINT FOR NOTIFICATION INFO: 238

Неудачная инициализация вызова:

    11:03:49.840 tsx0x103064ea8  .....State changed from Trying to Proceeding, event=TX_MSG
11:03:49.840 dlg0x1030906a8  ......Transaction tsx0x103064ea8 state changed to Proceeding
2019-02-13 11:03:49.841013+0100 VarioCallCTI[11928:2820906] Incoming call from "Matthias" <sip:[email protected]>
11:03:49.842    pjsua_aud.c  ..Set sound device: capture=0, playback=0

11:03:49.842    pjsua_aud.c  ...Opening sound device PCM@16000/1/20ms
11:03:49.842 coreaudio_dev.  ....Using VoiceProcessingIO audio unit
11:03:49.847    pjsua_aud.c !Set sound device: capture=0, playback=0
2019-02-13 11:03:50.276837+0100 VarioCallCTI[11928:2820280] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker)
2019-02-13 11:03:50.277597+0100 VarioCallCTI[11928:2820280] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Receiver (type: Receiver)
2019-02-13 11:03:50.292488+0100 VarioCallCTI[11928:2820280] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Receiver (type: Receiver)
2019-02-13 11:03:50.293379+0100 VarioCallCTI[11928:2820280] [avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Receiver (type: Receiver)
11:03:50.383 coreaudio_dev. !....core audio stream started
Setting of Audio Devices Successfull - IncomingCall











TESTPRINT FOR NOTIFICATION INFO: eingehender anruf von 238
TESTPRINT FOR NOTIFICATION INFO: 238

person Matthias Kostwein    schedule 11.02.2019    source источник
comment
проблема может заключаться в том, что после окончания первого звонка вы очищаете аудиосеанс. поэтому при следующем звонке звук прерывается. если вы убиваете и перезапускаете, вы снова устанавливаете аудиосессию. так это работает   -  person karthik    schedule 11.02.2019
comment
Я так и подозревал, но если я запускаю приложение на переднем плане и делаю или получаю SIP-вызов, звук работает нормально...   -  person Matthias Kostwein    schedule 13.02.2019


Ответы (1)


Я понял, как решить проблему.

Поскольку инициализация библиотеки PJSIP вызвала инициализацию coreAudio до того, как изменение приоритета, требуемое iOS, было полностью завершено, мне пришлось открыть CallKit и зарегистрироваться на сервере PJSIP внутри CallKit — ProviderDelegate.

  func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)?) {
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: handle)
update.hasVideo = hasVideo
//MARK: Final Working Solution
print("Starting PJSIP after PUSH")
pjsipfunctions.init().registersip(mainUser.sipData["User"], mainUser.sipData["Password"], mainUser.sipData["Server"])

provider.reportNewIncomingCall(with: uuid, update: update) { error in
  if error == nil {
    let call = Call(uuid: uuid, handle: handle)
    self.callManager.add(call: call)
    userTerminatedCall = false

  }

  completion?(error as? NSError)
}
}
}
person Matthias Kostwein    schedule 20.03.2019
comment
привет, точно, ты переинициализировался? - person Jeeva; 18.12.2019