From b8b6344ee094022d88a62fe980a9dd7d4182f3cf Mon Sep 17 00:00:00 2001 From: QuentinArguillere Date: Tue, 8 Feb 2022 14:42:19 +0100 Subject: [PATCH] Fix audio route change issue when enabling a video call before the audio session was activated by call kit --- Classes/CallManager.swift | 5 +++-- Classes/ProviderDelegate.swift | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Classes/CallManager.swift b/Classes/CallManager.swift index 19e27093b..d9b798d3f 100644 --- a/Classes/CallManager.swift +++ b/Classes/CallManager.swift @@ -46,7 +46,7 @@ import AVFoundation var globalState : GlobalState = .Off var actionsToPerformOnceWhenCoreIsOn : [(()->Void)] = [] var conference: Conference? - + var callkitAudioSessionActivated : Bool? = nil // if "nil", ignore. var backgroundContextCall : Call? @objc var backgroundContextCameraIsEnabled : Bool = false @@ -633,7 +633,8 @@ import AVFoundation break } - if (cstate == .IncomingReceived || cstate == .OutgoingInit || cstate == .Connected || cstate == .StreamsRunning) { + let readyForRoutechange = CallManager.instance().callkitAudioSessionActivated == nil || (CallManager.instance().callkitAudioSessionActivated == true) + if (readyForRoutechange && (cstate == .IncomingReceived || cstate == .OutgoingInit || cstate == .Connected || cstate == .StreamsRunning)) { if ((call.currentParams?.videoEnabled ?? false) && CallManager.instance().isReceiverEnabled()) { CallManager.instance().changeRouteToSpeaker() } else if (isBluetoothAvailable()) { diff --git a/Classes/ProviderDelegate.swift b/Classes/ProviderDelegate.swift index c9eb1dbb1..2c6669a0a 100644 --- a/Classes/ProviderDelegate.swift +++ b/Classes/ProviderDelegate.swift @@ -191,6 +191,7 @@ extension ProviderDelegate: CXProviderDelegate { CallManager.instance().backgroundContextCameraIsEnabled = call!.params?.videoEnabled ?? false call?.cameraEnabled = false // Disable camera while app is not on foreground } + CallManager.instance().callkitAudioSessionActivated = false CallManager.instance().lc?.configureAudioSession() CallManager.instance().acceptCall(call: call!, hasVideo: call!.params?.videoEnabled ?? false) action.fulfill() @@ -305,11 +306,13 @@ extension ProviderDelegate: CXProviderDelegate { func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) { Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: audio session activated.") CallManager.instance().lc?.activateAudioSession(actived: true) + CallManager.instance().callkitAudioSessionActivated = true } func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) { Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: audio session deactivated.") CallManager.instance().lc?.activateAudioSession(actived: false) + CallManager.instance().callkitAudioSessionActivated = nil } }