فهرست منبع

add ringtone and ringbacktone

alqindiirsyam 11 ماه پیش
والد
کامیت
8777c733e5

+ 35 - 35
appbuilder-ios/AppBuilder/AppBuilder.xcodeproj/project.pbxproj

@@ -14,11 +14,11 @@
 		2401CEA1275490DB00B323BB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2401CE9F275490DB00B323BB /* Main.storyboard */; };
 		2401CEA3275490E600B323BB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2401CEA2275490E600B323BB /* Assets.xcassets */; };
 		2401CEA6275490E600B323BB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2401CEA4275490E600B323BB /* LaunchScreen.storyboard */; };
-		8A1DD650DFE13CE1377AE559 /* Pods_AppBuilder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E29A430B056512EA7ADB633 /* Pods_AppBuilder.framework */; };
 		A413B18727EACB20006D16EB /* PrefsUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = A413B18627EACB20006D16EB /* PrefsUtil.swift */; };
 		A42ED92227F30BA200B0FAB7 /* FirstTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42ED92127F30BA200B0FAB7 /* FirstTabViewController.swift */; };
 		A42ED92427F3FC2F00B0FAB7 /* SecondTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42ED92327F3FC2F00B0FAB7 /* SecondTabViewController.swift */; };
 		A42ED92627F439A200B0FAB7 /* ThirdTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42ED92527F439A200B0FAB7 /* ThirdTabViewController.swift */; };
+		C11E68605CFBACF560F5A037 /* Pods_AppBuilder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 169CB3023A5723F0238D7145 /* Pods_AppBuilder.framework */; };
 		CD9D59D92BEE1D30008014B4 /* digisales_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CD9D59CE2BEE1D2F008014B4 /* digisales_icon.png */; };
 		CD9D59DA2BEE1D30008014B4 /* ikn_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CD9D59CF2BEE1D2F008014B4 /* ikn_icon.png */; };
 		CD9D59DB2BEE1D30008014B4 /* gudeg_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CD9D59D02BEE1D2F008014B4 /* gudeg_icon.png */; };
@@ -70,6 +70,7 @@
 
 /* Begin PBXFileReference section */
 		12960ADF2892361000A467DD /* FourthTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FourthTabViewController.swift; sourceTree = "<group>"; };
+		169CB3023A5723F0238D7145 /* Pods_AppBuilder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppBuilder.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		2401CE96275490DB00B323BB /* AppBuilder.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppBuilder.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		2401CE99275490DB00B323BB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		2401CE9B275490DB00B323BB /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
@@ -78,12 +79,10 @@
 		2401CEA2275490E600B323BB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		2401CEA5275490E600B323BB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		2401CEA7275490E600B323BB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		9E29A430B056512EA7ADB633 /* Pods_AppBuilder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppBuilder.framework; sourceTree = BUILT_PRODUCTS_DIR; };
 		A413B18627EACB20006D16EB /* PrefsUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefsUtil.swift; sourceTree = "<group>"; };
 		A42ED92127F30BA200B0FAB7 /* FirstTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstTabViewController.swift; sourceTree = "<group>"; };
 		A42ED92327F3FC2F00B0FAB7 /* SecondTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecondTabViewController.swift; sourceTree = "<group>"; };
 		A42ED92527F439A200B0FAB7 /* ThirdTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThirdTabViewController.swift; sourceTree = "<group>"; };
-		A703942D1144FC7ED34A2829 /* Pods-AppBuilder.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppBuilder.debug.xcconfig"; path = "Target Support Files/Pods-AppBuilder/Pods-AppBuilder.debug.xcconfig"; sourceTree = "<group>"; };
 		CD9D59CE2BEE1D2F008014B4 /* digisales_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = digisales_icon.png; sourceTree = "<group>"; };
 		CD9D59CF2BEE1D2F008014B4 /* ikn_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ikn_icon.png; sourceTree = "<group>"; };
 		CD9D59D02BEE1D2F008014B4 /* gudeg_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gudeg_icon.png; sourceTree = "<group>"; };
@@ -98,7 +97,8 @@
 		CDEE3DC929B06E1E00B420E5 /* NotificationService.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationService.appex; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDEE3DCB29B06E1E00B420E5 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
 		CDEE3DCD29B06E1E00B420E5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		EC1A81271A1A2E640699F886 /* Pods-AppBuilder.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppBuilder.release.xcconfig"; path = "Target Support Files/Pods-AppBuilder/Pods-AppBuilder.release.xcconfig"; sourceTree = "<group>"; };
+		F29D18BB0B372CE96BE45B5F /* Pods-AppBuilder.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppBuilder.debug.xcconfig"; path = "Target Support Files/Pods-AppBuilder/Pods-AppBuilder.debug.xcconfig"; sourceTree = "<group>"; };
+		F8112E05F6E80E4B82AE18CE /* Pods-AppBuilder.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppBuilder.release.xcconfig"; path = "Target Support Files/Pods-AppBuilder/Pods-AppBuilder.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -106,7 +106,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				8A1DD650DFE13CE1377AE559 /* Pods_AppBuilder.framework in Frameworks */,
+				C11E68605CFBACF560F5A037 /* Pods_AppBuilder.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -127,7 +127,7 @@
 				CDEE3DCA29B06E1E00B420E5 /* NotificationService */,
 				2401CE97275490DB00B323BB /* Products */,
 				6E32BCCF4DE50EE1A90E8AAE /* Pods */,
-				5ED36E6D222EFEE64A25FBF3 /* Frameworks */,
+				EB3AD86EF0270518F84092C6 /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -170,19 +170,11 @@
 			path = AppBuilder;
 			sourceTree = "<group>";
 		};
-		5ED36E6D222EFEE64A25FBF3 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				9E29A430B056512EA7ADB633 /* Pods_AppBuilder.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 		6E32BCCF4DE50EE1A90E8AAE /* Pods */ = {
 			isa = PBXGroup;
 			children = (
-				A703942D1144FC7ED34A2829 /* Pods-AppBuilder.debug.xcconfig */,
-				EC1A81271A1A2E640699F886 /* Pods-AppBuilder.release.xcconfig */,
+				F29D18BB0B372CE96BE45B5F /* Pods-AppBuilder.debug.xcconfig */,
+				F8112E05F6E80E4B82AE18CE /* Pods-AppBuilder.release.xcconfig */,
 			);
 			path = Pods;
 			sourceTree = "<group>";
@@ -196,6 +188,14 @@
 			path = NotificationService;
 			sourceTree = "<group>";
 		};
+		EB3AD86EF0270518F84092C6 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				169CB3023A5723F0238D7145 /* Pods_AppBuilder.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -203,13 +203,13 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 2401CEC0275490E600B323BB /* Build configuration list for PBXNativeTarget "AppBuilder" */;
 			buildPhases = (
-				8561761270F402ED943DCD5F /* [CP] Check Pods Manifest.lock */,
+				59A167444AFEF3E3735EB5CB /* [CP] Check Pods Manifest.lock */,
 				2401CE92275490DB00B323BB /* Sources */,
 				2401CE93275490DB00B323BB /* Frameworks */,
 				2401CE94275490DB00B323BB /* Resources */,
 				247E0A722796969200430E5F /* Embed Frameworks */,
 				CDEE3DD129B06E1E00B420E5 /* Embed Foundation Extensions */,
-				19F42EF7078614A0A6F710A8 /* [CP] Embed Pods Frameworks */,
+				C75656FBE6F44FE88E2B122C /* [CP] Embed Pods Frameworks */,
 			);
 			buildRules = (
 			);
@@ -306,43 +306,43 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		19F42EF7078614A0A6F710A8 /* [CP] Embed Pods Frameworks */ = {
+		59A167444AFEF3E3735EB5CB /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			name = "[CP] Embed Pods Frameworks";
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
 			outputFileListPaths = (
-				"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-AppBuilder-checkManifestLockResult.txt",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks.sh\"\n";
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
-		8561761270F402ED943DCD5F /* [CP] Check Pods Manifest.lock */ = {
+		C75656FBE6F44FE88E2B122C /* [CP] Embed Pods Frameworks */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks-${CONFIGURATION}-input-files.xcfilelist",
 			);
-			inputPaths = (
-				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
-				"${PODS_ROOT}/Manifest.lock",
-			);
-			name = "[CP] Check Pods Manifest.lock";
+			name = "[CP] Embed Pods Frameworks";
 			outputFileListPaths = (
-			);
-			outputPaths = (
-				"$(DERIVED_FILE_DIR)/Pods-AppBuilder-checkManifestLockResult.txt",
+				"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks-${CONFIGURATION}-output-files.xcfilelist",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppBuilder/Pods-AppBuilder-frameworks.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
 /* End PBXShellScriptBuildPhase section */
@@ -519,7 +519,7 @@
 		};
 		2401CEC1275490E600B323BB /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = A703942D1144FC7ED34A2829 /* Pods-AppBuilder.debug.xcconfig */;
+			baseConfigurationReference = F29D18BB0B372CE96BE45B5F /* Pods-AppBuilder.debug.xcconfig */;
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
@@ -551,7 +551,7 @@
 		};
 		2401CEC2275490E600B323BB /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = EC1A81271A1A2E640699F886 /* Pods-AppBuilder.release.xcconfig */;
+			baseConfigurationReference = F8112E05F6E80E4B82AE18CE /* Pods-AppBuilder.release.xcconfig */;
 			buildSettings = {
 				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

BIN
appbuilder-ios/NexilisLite/NexilisLite/Resource/Sound/pb_call_in.mp3


BIN
appbuilder-ios/NexilisLite/NexilisLite/Resource/Sound/pb_call_out.mp3


+ 36 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -118,6 +118,9 @@ public class Nexilis: NSObject {
     public static let IDX_SOCIAL_COMMERCE = 101
     public static let IDX_NEWS = 102
     
+    static var ringtonePlayer: AVAudioPlayer?
+    static var ringbacktonePlayer: AVAudioPlayer?
+    
     private func createDelegate() {
         //print("createDelegate...")
         callDelegate = self
@@ -296,9 +299,40 @@ public class Nexilis: NSObject {
         
         _ = LocationManager()
         
+        initiateSoundCall()
+        
         //print("MANIA \(UIFont.systemFont(ofSize: 12)) <> \(UIFont.italicSystemFont(ofSize: 12)) <> \(UIFont.boldSystemFont(ofSize: 12))")
     }
     
+    private static func initiateSoundCall() {
+        do {
+            guard let ringtonePath = Bundle.resourceBundle(for: Nexilis.self).url(forResource: "pb_call_in", withExtension: "mp3") else {
+                return
+            }
+//            print("ringtone ada")
+            
+            ringtonePlayer = try AVAudioPlayer(contentsOf:ringtonePath)
+            ringtonePlayer?.numberOfLoops = -1
+            ringtonePlayer?.prepareToPlay()
+            
+//            print("END INITIATE ringtone")
+            
+            guard let ringbacktonePath = Bundle.resourceBundle(for: Nexilis.self).url(forResource: "pb_call_out", withExtension: "mp3") else {
+                return
+            }
+//            print("ringbacktone ada")
+            
+            ringbacktonePlayer = try AVAudioPlayer(contentsOf:ringbacktonePath)
+            ringbacktonePlayer?.numberOfLoops = -1
+            ringbacktonePlayer?.prepareToPlay()
+            
+//            print("END INITIATE ringbacktone")
+            
+        } catch {
+            
+        }
+    }
+    
     private static func isDebuggerAttached() -> Bool {
         var name = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
         var info = kinfo_proc()
@@ -2368,6 +2402,7 @@ extension Nexilis: CallDelegate {
 //                    self.displayIncomingCall(uuid: uuidOngoing, handle: String(deviceId), hasVideo: false) { error in
 //                        UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
 //                    }
+                Nexilis.ringtonePlayer?.play()
                 let controller = QmeraAudioViewController()
                 controller.user = User.getData(pin: String(deviceId))
                 controller.isOutgoing = false
@@ -2397,6 +2432,7 @@ extension Nexilis: CallDelegate {
                     })
                     return
                 }
+                Nexilis.ringtonePlayer?.play()
                 let videoController = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "videoVCQmera") as! QmeraVideoViewController
                 videoController.fPin = String(deviceId)
                 videoController.isInisiator = false

+ 27 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraAudioViewController.swift

@@ -300,6 +300,7 @@ class QmeraAudioViewController: UIViewController {
                         }
                     }
                 } else {
+                    Nexilis.ringbacktonePlayer?.play()
                     API.initiateCCall(sParty: u.pin)
                 }
             } else if !ticketId.isEmpty {
@@ -321,6 +322,7 @@ class QmeraAudioViewController: UIViewController {
         DispatchQueue.main.async {
             let data:[AnyHashable : Any] = notification.userInfo!
             if let l_pin = data["l_pin"] as? String {
+                Nexilis.ringbacktonePlayer?.play()
                 API.initiateCCall(sParty: l_pin)
             }
         }
@@ -738,10 +740,20 @@ class QmeraAudioViewController: UIViewController {
     }
     
     @objc func didReject(sender: Any?) {
+        if isOutgoing {
+            Nexilis.ringbacktonePlayer?.stop()
+        } else {
+            Nexilis.ringtonePlayer?.stop()
+        }
         didEnd(sender: sender)
     }
     
     @objc func didAccept(sender: Any?) {
+        if isOutgoing {
+            Nexilis.ringbacktonePlayer?.stop()
+        } else {
+            Nexilis.ringtonePlayer?.stop()
+        }
         NSLayoutConstraint.deactivate(stack.constraints)
         stack.subviews.forEach { subview in
             subview.removeFromSuperview()
@@ -838,6 +850,11 @@ class QmeraAudioViewController: UIViewController {
                     }
                 }
             } else if state == Nexilis.AUDIO_CALL_END || (!ticketId.isEmpty && state == Nexilis.VIDEO_CALL_END) {
+                if isOutgoing {
+                    Nexilis.ringbacktonePlayer?.stop()
+                } else {
+                    Nexilis.ringtonePlayer?.stop()
+                }
                 let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
                 if let pin = arrayMessage.first, let index = users.firstIndex(of: User(pin: String(pin))) {
                     users.remove(at: index)
@@ -904,6 +921,11 @@ class QmeraAudioViewController: UIViewController {
 //                    }
 //                }
             } else if state == Nexilis.OFFLINE { // Offline
+                if isOutgoing {
+                    Nexilis.ringbacktonePlayer?.stop()
+                } else {
+                    Nexilis.ringtonePlayer?.stop()
+                }
                 let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
                 if let pin = arrayMessage.first, let index = users.firstIndex(of: User(pin: String(pin))) {
                     users.remove(at: index)
@@ -931,6 +953,11 @@ class QmeraAudioViewController: UIViewController {
                     }
                 }
             } else if state == Nexilis.BUSY { // Busy
+                if isOutgoing {
+                    Nexilis.ringbacktonePlayer?.stop()
+                } else {
+                    Nexilis.ringtonePlayer?.stop()
+                }
                 let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
                 if let pin = arrayMessage.first, let index = users.firstIndex(of: User(pin: String(pin))) {
                     users.remove(at: index)

+ 22 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Call/QmeraVideoViewController.swift

@@ -400,6 +400,7 @@ class QmeraVideoViewController: UIViewController {
                         }
                     }
                 } else {
+                    Nexilis.ringtonePlayer?.play()
                     API.initiateCCall(sParty: dataPerson[0]["f_pin"]!, nCamIdx: 1, nResIdx: 2, nVQuality: 4, ivRemoteView: listRemoteViewFix, ivLocalView: cameraView, ivRemoteZ: zoomView)
                 }
             } else {
@@ -466,6 +467,7 @@ class QmeraVideoViewController: UIViewController {
         DispatchQueue.main.async { [self] in
             let data:[AnyHashable : Any] = notification.userInfo!
             if let l_pin = data["l_pin"] as? String {
+                Nexilis.ringtonePlayer?.play()
                 API.initiateCCall(sParty: l_pin, nCamIdx: 1, nResIdx: 2, nVQuality: 4, ivRemoteView: listRemoteViewFix, ivLocalView: cameraView, ivRemoteZ: zoomView)
             }
         }
@@ -841,6 +843,11 @@ class QmeraVideoViewController: UIViewController {
     }
     
     func endAllCall() {
+        if isInisiator {
+            Nexilis.ringbacktonePlayer?.stop()
+        } else {
+            Nexilis.ringtonePlayer?.stop()
+        }
         let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
         if !onGoingCC.isEmpty {
             let requester = onGoingCC.components(separatedBy: ",")[0]
@@ -1109,6 +1116,11 @@ class QmeraVideoViewController: UIViewController {
                 }
             }
         } else if (state == Nexilis.VIDEO_CALL_END || state == Nexilis.AUDIO_CALL_END) {
+            if isInisiator {
+                Nexilis.ringbacktonePlayer?.stop()
+            } else {
+                Nexilis.ringtonePlayer?.stop()
+            }
             let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
             if !onGoingCC.isEmpty {
                 let requester = onGoingCC.components(separatedBy: ",")[0]
@@ -1246,6 +1258,11 @@ class QmeraVideoViewController: UIViewController {
                 }
             }
         } else if (state == Nexilis.OFFLINE) {
+            if isInisiator {
+                Nexilis.ringbacktonePlayer?.stop()
+            } else {
+                Nexilis.ringtonePlayer?.stop()
+            }
             let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
             DispatchQueue.main.async {
                 if (self.dataPerson.count == 1) {
@@ -1312,6 +1329,11 @@ class QmeraVideoViewController: UIViewController {
                 }
             }
         } else if (state == Nexilis.BUSY) {
+            if isInisiator {
+                Nexilis.ringbacktonePlayer?.stop()
+            } else {
+                Nexilis.ringtonePlayer?.stop()
+            }
             let onGoingCC = UserDefaults.standard.string(forKey: "onGoingCC") ?? ""
             DispatchQueue.main.async { [self] in
                 if (self.dataPerson.count == 1) {