|
@@ -18,6 +18,9 @@ class QmeraAudioViewController: UIViewController {
|
|
|
static private var volumeView: MPVolumeView!
|
|
|
static private var lastVolume: Float! = AVAudioSession.sharedInstance().outputVolume
|
|
|
static private var bSpeakerPhone: Bool! = false
|
|
|
+ private var tempSpeaker = false
|
|
|
+ private var timerSpeaker: Timer?
|
|
|
+ private var canChangeSpeaker = false
|
|
|
static private var isLoop = false
|
|
|
|
|
|
|
|
@@ -363,6 +366,12 @@ class QmeraAudioViewController: UIViewController {
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(onStatusCall(_:)), name: NSNotification.Name(rawValue: Nexilis.listenerStatusCall), object: nil)
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(onReceiveMessage(notification:)), name: NSNotification.Name(rawValue: Nexilis.listenerReceiveChat), object: nil)
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(onCallFCM(notification:)), name: NSNotification.Name(rawValue: Nexilis.callFCM), object: nil)
|
|
|
+ NotificationCenter.default.addObserver(
|
|
|
+ self,
|
|
|
+ selector: #selector(handleRouteChange),
|
|
|
+ name: AVAudioSession.routeChangeNotification,
|
|
|
+ object: nil
|
|
|
+ )
|
|
|
|
|
|
if let u = self.user {
|
|
|
self.users.append(u)
|
|
@@ -450,6 +459,39 @@ class QmeraAudioViewController: UIViewController {
|
|
|
self.idCall = (User.getMyPin() ?? "") + CoreMessage_TMessageUtil.getTID()
|
|
|
}
|
|
|
|
|
|
+ @objc func handleRouteChange(notification: Notification) {
|
|
|
+ guard let userInfo = notification.userInfo,
|
|
|
+ let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
|
|
|
+ let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { return }
|
|
|
+
|
|
|
+ switch reason {
|
|
|
+ case .newDeviceAvailable:
|
|
|
+ print("🎧 Headphones plugged in")
|
|
|
+ case .oldDeviceUnavailable:
|
|
|
+ print("🎧 Headphones unplugged")
|
|
|
+ case .categoryChange:
|
|
|
+ DispatchQueue.main.async { [self] in
|
|
|
+ if !canChangeSpeaker {
|
|
|
+ canChangeSpeaker = true
|
|
|
+ } else if APIS.checkAppStateisBackground() {
|
|
|
+ if canChangeSpeaker {
|
|
|
+ didSpeaker(sender: nil)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ case .override:
|
|
|
+ DispatchQueue.main.async { [self] in
|
|
|
+ if APIS.checkAppStateisBackground() {
|
|
|
+ if canChangeSpeaker {
|
|
|
+ didSpeaker(sender: nil)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ print("🔄 Audio route changed: \(reason)")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
|
|
if (keyPath! == "outputVolume") {
|
|
|
if let newKey = change?[NSKeyValueChangeKey.newKey] as? NSNumber {
|
|
@@ -776,11 +818,18 @@ class QmeraAudioViewController: UIViewController {
|
|
|
}
|
|
|
|
|
|
@objc func didSpeaker(sender: Any?) {
|
|
|
- QmeraAudioViewController.bSpeakerPhone = !QmeraAudioViewController.bSpeakerPhone
|
|
|
- speaker.isSelected = QmeraAudioViewController.bSpeakerPhone
|
|
|
- DispatchQueue.global().async {
|
|
|
- QmeraAudioViewController.turnSpeakerOn()
|
|
|
- }
|
|
|
+ timerSpeaker?.invalidate()
|
|
|
+ tempSpeaker = !tempSpeaker
|
|
|
+ speaker.isSelected = tempSpeaker
|
|
|
+ timerSpeaker = Timer.scheduledTimer(withTimeInterval: 1, repeats: false, block: {_ in
|
|
|
+ if QmeraAudioViewController.bSpeakerPhone != self.tempSpeaker {
|
|
|
+ QmeraAudioViewController.bSpeakerPhone = !QmeraAudioViewController.bSpeakerPhone
|
|
|
+ self.tempSpeaker = QmeraAudioViewController.bSpeakerPhone
|
|
|
+ DispatchQueue.global().async {
|
|
|
+ QmeraAudioViewController.turnSpeakerOn()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
@objc func didMute(sender: Any?) {
|
|
@@ -1071,7 +1120,8 @@ class QmeraAudioViewController: UIViewController {
|
|
|
// } while (QmeraAudioViewController.isLoop)
|
|
|
// }
|
|
|
DispatchQueue.main.async { [self] in
|
|
|
- QmeraAudioViewController.bSpeakerPhone = APIS.checkAppStateisBackground() ? false : true
|
|
|
+ QmeraAudioViewController.bSpeakerPhone = true
|
|
|
+ self.tempSpeaker = true
|
|
|
didSpeaker(sender: nil)
|
|
|
}
|
|
|
} else if state == Nexilis.AUDIO_CALL_RINGING || (!ticketId.isEmpty && state == Nexilis.VIDEO_CALL_RINGING) {
|