Skip to content
Snippets Groups Projects
Commit a1af4088 authored by Kateryna Kostiuk's avatar Kateryna Kostiuk
Browse files

audio: fix speaker switch

Change-Id: I45ef4c1da798aab9039bffaa33219b40d86e4537
parent 0630286d
No related branches found
No related tags found
No related merge requests found
...@@ -172,7 +172,7 @@ class ButtonsContainerView: UIView, NibLoadable { ...@@ -172,7 +172,7 @@ class ButtonsContainerView: UIView, NibLoadable {
if switchSpeakerButton.isEnabled && !switchSpeakerButton.isHidden { if switchSpeakerButton.isEnabled && !switchSpeakerButton.isHidden {
self.optionsWithSpeaker() self.optionsWithSpeaker()
} else if !switchSpeakerButton.isHidden { } else if !switchSpeakerButton.isHidden {
self.optionsWithSpeaker() self.optionsWithoutSpeaker()
} }
} }
......
...@@ -405,7 +405,13 @@ class CallViewModel: Stateable, ViewModel { ...@@ -405,7 +405,13 @@ class CallViewModel: Stateable, ViewModel {
.filter({ serviceEvent in .filter({ serviceEvent in
serviceEvent.eventType == .audioActivated serviceEvent.eventType == .audioActivated
}).subscribe(onNext: { [weak self] _ in }).subscribe(onNext: { [weak self] _ in
self?.audioService.startAudio() guard let self = self else {return}
self.audioService.startAudio()
//for outgoing calls ve create audio sesion with default parameters.
//for incoming call audio session is created, ve need to override it
let overrideOutput = self.call?.callTypeValue == CallType.incoming.rawValue
self.audioService.setDefaultOutput(toSpeaker: !self.isAudioOnly,
override: overrideOutput)
}).disposed(by: self.disposeBag) }).disposed(by: self.disposeBag)
} }
...@@ -433,22 +439,12 @@ class CallViewModel: Stateable, ViewModel { ...@@ -433,22 +439,12 @@ class CallViewModel: Stateable, ViewModel {
} }
} }
} }
self.callService.hangUpCallOrConference(callId: rendererId) self.callService
.subscribe(onCompleted: { [weak self] in .hangUpCallOrConference(callId: rendererId)
// switch to either spk or headset (if connected) for loud ringtone .subscribe().disposed(by: self.disposeBag)
// incase we were using rcv during the call
self?.videoService.stopAudioDevice()
self?.log.info("Call canceled")
}, onError: { [weak self] error in
self?.log.error("Failed to cancel the call")
}).disposed(by: self.disposeBag)
} }
func answerCall() -> Completable { func answerCall() -> Completable {
if !self.audioService.isHeadsetConnected.value {
isAudioOnly ?
self.audioService.overrideToReceiver() : self.audioService.overrideToSpeaker()
}
return self.callService.accept(call: call) return self.callService.accept(call: call)
} }
...@@ -456,10 +452,6 @@ class CallViewModel: Stateable, ViewModel { ...@@ -456,10 +452,6 @@ class CallViewModel: Stateable, ViewModel {
guard let account = self.accountService.currentAccount else { guard let account = self.accountService.currentAccount else {
return return
} }
if !self.audioService.isHeadsetConnected.value {
isAudioOnly ?
self.audioService.overrideToReceiver() : self.audioService.overrideToSpeaker()
}
self.callService.placeCall(withAccount: account, self.callService.placeCall(withAccount: account,
toRingId: uri, toRingId: uri,
userName: userName, userName: userName,
......
...@@ -44,6 +44,9 @@ class AudioService { ...@@ -44,6 +44,9 @@ class AudioService {
init(withAudioAdapter audioAdapter: AudioAdapter) { init(withAudioAdapter audioAdapter: AudioAdapter) {
self.audioAdapter = audioAdapter self.audioAdapter = audioAdapter
let bluetoothConnected = bluetoothAudioConnected()
let headphonesConnected = headphoneAudioConnected()
isHeadsetConnected.value = bluetoothConnected || headphonesConnected
// Listen for audio route changes // Listen for audio route changes
NotificationCenter.default.addObserver( NotificationCenter.default.addObserver(
...@@ -53,35 +56,31 @@ class AudioService { ...@@ -53,35 +56,31 @@ class AudioService {
object: nil) object: nil)
} }
// swiftlint:disable force_cast
@objc private func audioRouteChangeListener(_ notification: Notification) { @objc private func audioRouteChangeListener(_ notification: Notification) {
let reasonRaw = notification.userInfo![AVAudioSessionRouteChangeReasonKey] as! UInt guard let userInfo = notification.userInfo,
self.log.debug("Audio route change: \(reasonRaw)") let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt else {
guard let reason = AVAudioSession.RouteChangeReason(rawValue: reasonRaw) else { return
return }
guard let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue),
(reason == .newDeviceAvailable || reason == .oldDeviceUnavailable || reason == .categoryChange) else {
return
} }
overrideAudioRoute(reason) overrideAudioRoute()
} }
// swiftlint:enable force_cast
func overrideAudioRoute(_ reason: AVAudioSession.RouteChangeReason) { func overrideAudioRoute() {
let wasHeadsetConnected = isHeadsetConnected.value
let bluetoothConnected = bluetoothAudioConnected() let bluetoothConnected = bluetoothAudioConnected()
let headphonesConnected = headphoneAudioConnected() let headphonesConnected = headphoneAudioConnected()
self.log.debug("Audio route override - reason: \(reason.rawValue), status: bluetooth: \(bluetoothConnected), headphones: \(headphonesConnected)")
isHeadsetConnected.value = bluetoothConnected || headphonesConnected isHeadsetConnected.value = bluetoothConnected || headphonesConnected
if reason == .override && !isHeadsetConnected.value { if bluetoothConnected {
setAudioOutputDevice(port: OutputPortType.builtinspk) setAudioOutputDevice(port: OutputPortType.bluetooth)
} else if wasHeadsetConnected != isHeadsetConnected.value { return
if bluetoothConnected { } else if headphonesConnected {
setAudioOutputDevice(port: OutputPortType.bluetooth) setAudioOutputDevice(port: OutputPortType.headphones)
} else if headphonesConnected { return
setAudioOutputDevice(port: OutputPortType.headphones)
} else if wasHeadsetConnected {
let outputPort = isOutputToSpeaker.value ? OutputPortType.builtinspk : OutputPortType.receiver
setAudioOutputDevice(port: outputPort)
}
} }
let outputPort = isOutputToSpeaker.value ? OutputPortType.builtinspk : OutputPortType.receiver
setAudioOutputDevice(port: outputPort)
} }
func switchSpeaker() { func switchSpeaker() {
...@@ -111,6 +110,13 @@ class AudioService { ...@@ -111,6 +110,13 @@ class AudioService {
setAudioOutputDevice(port: OutputPortType.receiver) setAudioOutputDevice(port: OutputPortType.receiver)
} }
func setDefaultOutput(toSpeaker: Bool, override: Bool = false) {
isOutputToSpeaker.value = toSpeaker
if override {
overrideAudioRoute()
}
}
func bluetoothAudioConnected() -> Bool { func bluetoothAudioConnected() -> Bool {
let outputs = AVAudioSession.sharedInstance().currentRoute.outputs let outputs = AVAudioSession.sharedInstance().currentRoute.outputs
for output in outputs { for output in outputs {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment