         NSNotificationCenter.defaultCenter().removeObserver(observer, name: name, object: object)
     }
 
-    func getRingbackUri(_type: String) -> NSURL? {
-        let fileBundle: String = "incallmanager_ringback"
-        let fileBundleExt: String = "mp3"
-        let fileSysWithExt: String = "vc~ringing.caf"
-        let fileSysPath: String = "/System/Library/Audio/UISounds"
-        let type = (_type == "" || _type == "_DEFAULT_" ? fileSysWithExt : _type)
-        return self.getAudioUri(type, fileBundle, fileBundleExt, fileSysWithExt, fileSysPath, &self.bundleRingbackUri, &self.defaultRingbackUri)
-    }
-
-    func startRingback(ringbackUriType: String) -> Void {
+    // --- _ringbackUriType: never go here with  be empty string.
+    func startRingback(_ringbackUriType: String) -> Void {
         // you may rejected by apple when publish app if you use system sound instead of bundled sound.
-        print("startRingback()")
+        print("startRingback(): UriType=\(_ringbackUriType)")
         do {
             if self.mRingback != nil {
                 if self.mRingback.playing {
+                    print("startRingback(): is already playing")
                     return
                 } else {
                     self.stopRingback()
                 }
             }
+            // ios don't have embedded DTMF tone generator. use system dtmf sound files.
+            let ringbackUriType: String = (_ringbackUriType == "_DTMF_" ? "_DEFAULT_" : _ringbackUriType)
             let ringbackUri: NSURL? = getRingbackUri(ringbackUriType)
             if ringbackUri == nil {
-                print("no available ringback")
+                print("startRingback(): no available ringback")
                 return
             }
             //self.storeOriginalAudioSetup()

            }
            let ringtoneUri: NSURL? = getRingtoneUri(ringtoneUriType)
            if ringtoneUri == nil {
                print("no available ringtone")
                return
            }
            self.storeOriginalAudioSetup()
            self.mRingtone = try AVAudioPlayer(contentsOfURL: ringtoneUri!)
            self.mRingtone.delegate = self

            self.restoreOriginalAudioSetup()
            _ = try? self.audioSession.setActive(false, withOptions: .NotifyOthersOnDeactivation)
        }
    }

    func getRingbackUri(_type: String) -> NSURL? {
        let fileBundle: String = "incallmanager_ringback"
        let fileBundleExt: String = "mp3"
        let fileSysWithExt: String = "vc~ringing.caf"
        let fileSysPath: String = "/System/Library/Audio/UISounds"
        let type = (_type == "" || _type == "_DEFAULT_" ? fileSysWithExt : _type) // --- you can't get default user perfrence sound in ios
        return self.getAudioUri(type, fileBundle, fileBundleExt, fileSysWithExt, fileSysPath, &self.bundleRingbackUri, &self.defaultRingbackUri)
    }

    func getBusytoneUri(_type: String) -> NSURL? {
        let fileBundle: String = "incallmanager_busytone"
        let fileBundleExt: String = "mp3"
        let fileSysWithExt: String = "ct-busy.caf" //ct-congestion.caf
        let fileSysPath: String = "/System/Library/Audio/UISounds"
        let type = (_type == "" || _type == "_DEFAULT_" ? fileSysWithExt : _type) // --- you can't get default user perfrence sound in ios
        return self.getAudioUri(type, fileBundle, fileBundleExt, fileSysWithExt, fileSysPath, &self.bundleBusytoneUri, &self.defaultBusytoneUri)
    }

    func getRingtoneUri(_type: String) -> NSURL? {
        let fileBundle: String = "incallmanager_ringtone"
        let fileBundleExt: String = "mp3"
        let fileSysWithExt: String = "Opening.m4r" //Marimba.m4r
        let fileSysPath: String = "/Library/Ringtones"
        let type = (_type == "" || _type == "_DEFAULT_" ? fileSysWithExt : _type) // --- you can't get default user perfrence sound in ios
        return self.getAudioUri(type, fileBundle, fileBundleExt, fileSysWithExt, fileSysPath, &self.bundleRingtoneUri, &self.defaultRingtoneUri)
    }

    func getAudioUri(_type: String, _ fileBundle: String, _ fileBundleExt: String, _ fileSysWithExt: String, _ fileSysPath: String, inout _ uriBundle: NSURL!, inout _ uriDefault: NSURL!) -> NSURL? {
