Fill in CDMA gaps and clean up ToneGenerator code
diff --git a/include/media/ToneGenerator.h b/include/media/ToneGenerator.h
index 6b0cc8a..eafa661 100644
--- a/include/media/ToneGenerator.h
+++ b/include/media/ToneGenerator.h
@@ -71,6 +71,82 @@
         TONE_SUP_CONGESTION_ABBREV, // Abbreviated congestion: congestion tone limited to 4 seconds
         TONE_SUP_CONFIRM, // Confirm tone: a 350 Hz tone added to a 440 Hz tone repeated 3 times in a 100 ms on, 100 ms off cycle.
         TONE_SUP_PIP, // Pip tone: four bursts of 480 Hz tone (0.1 s on, 0.1 s off).
+
+        // CDMA Tones
+        TONE_CDMA_DIAL_TONE_LITE,
+        TONE_CDMA_NETWORK_USA_RINGBACK,
+        TONE_CDMA_INTERCEPT,
+        TONE_CDMA_ABBR_INTERCEPT,
+        TONE_CDMA_REORDER,
+        TONE_CDMA_ABBR_REORDER,
+        TONE_CDMA_NETWORK_BUSY,
+        TONE_CDMA_CONFIRM,
+        TONE_CDMA_ANSWER,
+        TONE_CDMA_NETWORK_CALLWAITING,
+        TONE_CDMA_PIP,
+
+        // ISDN
+        TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL,  // ISDN Alert Normal
+        TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP, // ISDN Intergroup
+        TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI, // ISDN SP PRI
+        TONE_CDMA_CALL_SIGNAL_ISDN_PAT3,  // ISDN Alert PAT3
+        TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING, // ISDN Alert PING RING
+        TONE_CDMA_CALL_SIGNAL_ISDN_PAT5,  // ISDN Alert PAT5
+        TONE_CDMA_CALL_SIGNAL_ISDN_PAT6,  // ISDN Alert PAT6
+        TONE_CDMA_CALL_SIGNAL_ISDN_PAT7,  // ISDN Alert PAT7
+        // ISDN end
+
+        // IS54
+        TONE_CDMA_HIGH_L,  // IS54 High Pitch Long
+        TONE_CDMA_MED_L, // IS54 Med Pitch Long
+        TONE_CDMA_LOW_L, // IS54 Low Pitch Long
+        TONE_CDMA_HIGH_SS, // IS54 High Pitch Short Short
+        TONE_CDMA_MED_SS, // IS54 Medium Pitch Short Short
+        TONE_CDMA_LOW_SS, // IS54 Low Pitch Short Short
+        TONE_CDMA_HIGH_SSL, // IS54 High Pitch Short Short Long
+        TONE_CDMA_MED_SSL, // IS54 Medium  Pitch Short Short Long
+        TONE_CDMA_LOW_SSL, // IS54 Low  Pitch Short Short Long
+        TONE_CDMA_HIGH_SS_2, // IS54 High Pitch Short Short 2
+        TONE_CDMA_MED_SS_2, // IS54 Med Pitch Short Short 2
+        TONE_CDMA_LOW_SS_2, // IS54 Low  Pitch Short Short 2
+        TONE_CDMA_HIGH_SLS, // IS54 High Pitch Short Long Short
+        TONE_CDMA_MED_SLS, // IS54 Med Pitch Short Long Short
+        TONE_CDMA_LOW_SLS, // IS54 Low Pitch Short Long Short
+        TONE_CDMA_HIGH_S_X4, // IS54 High Pitch Short Short Short Short
+        TONE_CDMA_MED_S_X4, // IS54 Med Pitch Short Short Short Short
+        TONE_CDMA_LOW_S_X4, // IS54 Low Pitch Short Short Short Short
+        TONE_CDMA_HIGH_PBX_L, // PBX High Pitch Long
+        TONE_CDMA_MED_PBX_L, // PBX Med Pitch Long
+        TONE_CDMA_LOW_PBX_L, // PBX Low  Pitch Long
+        TONE_CDMA_HIGH_PBX_SS, // PBX High Short Short
+        TONE_CDMA_MED_PBX_SS, // PBX Med Short Short
+        TONE_CDMA_LOW_PBX_SS, // PBX Low  Short Short
+        TONE_CDMA_HIGH_PBX_SSL, // PBX High Short Short Long
+        TONE_CDMA_MED_PBX_SSL, // PBX Med Short Short Long
+        TONE_CDMA_LOW_PBX_SSL,  // PBX Low Short Short Long
+        TONE_CDMA_HIGH_PBX_SLS, // PBX High  SLS
+        TONE_CDMA_MED_PBX_SLS,  // PBX Med SLS
+        TONE_CDMA_LOW_PBX_SLS, // PBX Low SLS
+        TONE_CDMA_HIGH_PBX_S_X4, // PBX High SSSS
+        TONE_CDMA_MED_PBX_S_X4, // PBX Med SSSS
+        TONE_CDMA_LOW_PBX_S_X4, // PBX LOW SSSS
+        //IS54 end
+        // proprietary
+        TONE_CDMA_ALERT_NETWORK_LITE,
+        TONE_CDMA_ALERT_AUTOREDIAL_LITE,
+        TONE_CDMA_ONE_MIN_BEEP,
+        TONE_CDMA_KEYPAD_VOLUME_KEY_LITE,
+        TONE_CDMA_PRESSHOLDKEY_LITE,
+        TONE_CDMA_ALERT_INCALL_LITE,
+        TONE_CDMA_EMERGENCY_RINGBACK,
+        TONE_CDMA_ALERT_CALL_GUARD,
+        TONE_CDMA_SOFT_ERROR_LITE,
+        TONE_CDMA_CALLDROP_LITE,
+        // proprietary end
+        TONE_CDMA_NETWORK_BUSY_ONE_SHOT,
+        TONE_CDMA_ABBR_ALERT,
+        TONE_CDMA_SIGNAL_OFF,
+        //CDMA end
         NUM_TONES,
         NUM_SUP_TONES = LAST_SUP_TONE-FIRST_SUP_TONE+1
     };
@@ -125,7 +201,7 @@
     static const unsigned char sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES];
 
     static const unsigned int TONEGEN_MAX_WAVES = 3;     // Maximun number of sine waves in a tone segment
-    static const unsigned int TONEGEN_MAX_SEGMENTS = 5;  // Maximun number of segments in a tone descriptor
+    static const unsigned int TONEGEN_MAX_SEGMENTS = 12;  // Maximun number of segments in a tone descriptor
     static const unsigned int TONEGEN_INF = 0xFFFFFFFF;  // Represents infinite time duration
     static const float TONEGEN_GAIN = 0.9;  // Default gain passed to  WaveGenerator().
 
@@ -140,6 +216,8 @@
     //        correspond to tone ON state and segments with odd index to OFF state.
     //        The data stored in segments[] is the duration of the corresponding period in ms.
     //        The first segment encountered with a 0 duration    indicates that no more segment follows.
+    //    - loopCnt - Number of times to repeat a sequence of seqments after playing this
+    //    - loopIndx - The segment index to go back and play is loopcnt > 0
     //    - repeatCnt indicates the number of times the sequence described by segments[] array must be repeated.
     //        When the tone generator encounters the first 0 duration segment, it will compare repeatCnt to mCurCount.
     //        If mCurCount > repeatCnt, the tone is stopped automatically. Otherwise, tone sequence will be
@@ -150,6 +228,8 @@
     public:
         unsigned int duration;
         unsigned short waveFreq[TONEGEN_MAX_WAVES+1];
+        unsigned short loopCnt;
+        unsigned short loopIndx;
     };
 
     class ToneDescriptor {
@@ -174,6 +254,8 @@
     const ToneDescriptor *mpToneDesc;  // pointer to active tone descriptor
     const ToneDescriptor *mpNewToneDesc;  // pointer to next active tone descriptor
 
+    unsigned short mLoopCounter; // Current tone loopback count
+
     int mSamplingRate;  // AudioFlinger Sampling rate
     AudioTrack *mpAudioTrack;  // Pointer to audio track used for playback
     Mutex mLock;  // Mutex to control concurent access to ToneGenerator object from audio callback and application API
diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp
index 81ee92c..c22cd53 100644
--- a/media/libmedia/ToneGenerator.cpp
+++ b/media/libmedia/ToneGenerator.cpp
@@ -33,199 +33,720 @@
 
 // Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details)
 const ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = {
-        { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }},
-                     { duration: 0 , waveFreq: { 0 }}},
+        { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0},
+                     { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_0
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_1
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_2
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_3
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_4
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_5
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_6
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_7
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_8
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_9
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_S
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_P
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_A
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                             // TONE_DTMF_B
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_C
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_DTMF_D
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_DIAL
-        { segments: { { duration: 500 , waveFreq: { 425, 0 }},
-                      { duration: 500, waveFreq: { 0 }},
-                         { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0},
+                      { duration: 500, waveFreq: { 0 }, 0, 0},
+                         { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_BUSY
-        { segments: { { duration: 200, waveFreq: { 425, 0 } },
-                      { duration: 200, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_CONGESTION
-        { segments: { { duration: 200, waveFreq: { 425, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 0,
           repeatSegment: 0 },                              // TONE_SUP_RADIO_ACK
-        { segments: { { duration: 200, waveFreq: { 425, 0 }},
-                      { duration: 200, waveFreq: { 0 }},
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0},
+                      { duration: 200, waveFreq: { 0 }, 0, 0},
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 2,
           repeatSegment: 0 },                              // TONE_SUP_RADIO_NOTAVAIL
-        { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }},
-                      { duration: 1000, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0},
+                      { duration: 1000, waveFreq: { 0 }, 0, 0},
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_ERROR
-        { segments: { { duration: 200, waveFreq: { 425, 0 } },
-                      { duration: 600, waveFreq: { 0 } },
-                      { duration: 200, waveFreq: { 425, 0 } },
-                      { duration: 3000, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 600, waveFreq: { 0 }, 0, 0 },
+                      { duration: 200, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_CALL_WAITING
-        { segments: { { duration: 1000, waveFreq: { 425, 0 } },
-                      { duration: 4000, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_RINGTONE
-        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 0,
           repeatSegment: 0 },                              // TONE_PROP_BEEP
-        { segments: { { duration: 100, waveFreq: { 1200, 0 } },
-                      { duration: 100, waveFreq: { 0 }  },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0  },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 1,
           repeatSegment: 0 },                              // TONE_PROP_ACK
-        { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 0,
           repeatSegment: 0 },                              // TONE_PROP_NACK
-        { segments: { { duration: 200, waveFreq: { 400, 1200, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 0,
           repeatSegment: 0 },                              // TONE_PROP_PROMPT
-        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 } },
-                      { duration: 200, waveFreq: { 0 } },
-                      { duration: 40, waveFreq: { 400, 1200, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 0,
           repeatSegment: 0 },                             // TONE_PROP_BEEP2
-        { segments: { { duration: 250, waveFreq: { 440, 0 } },
-                      { duration: 250, waveFreq: { 620, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0 }},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_SUP_INTERCEPT
-        { segments: { { duration: 250, waveFreq: { 440, 0 } },
-                      { duration: 250, waveFreq: { 620, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 7,
           repeatSegment: 0 },                             // TONE_SUP_INTERCEPT_ABBREV
-        { segments: { { duration: 250, waveFreq: { 480, 620, 0 } },
-                      { duration: 250, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 7,
           repeatSegment: 0 },                             // TONE_SUP_CONGESTION_ABBREV
-        { segments: { { duration: 100, waveFreq: { 350, 440, 0 } },
-                      { duration: 100, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 2,
           repeatSegment: 0 },                             // TONE_SUP_CONFIRM
-        { segments: { { duration: 100, waveFreq: { 480, 0 } },
-                      { duration: 100, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: 3,
           repeatSegment: 0 },                              // TONE_SUP_PIP
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0},
+                     { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                              // TONE_CDMA_DIAL_TONE_LITE
+        { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_USA_RINGBACK
+        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt:  ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                             // TONE_CDMA_INTERCEPT
+        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt:  0,
+          repeatSegment: 0 },                             // TONE_CDMA_ABBR_INTERCEPT
+        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                              // TONE_CDMA_REORDER
+        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: 7,
+          repeatSegment: 0 },                              // TONE_CDMA_ABBR_REORDER
+        { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_BUSY
+        { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: 2,
+          repeatSegment: 0 },                              // TONE_CDMA_CONFIRM
+        { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: 0,
+          repeatSegment: 0 },                              // TONE_CDMA_ANSWER
+        { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: 0,
+          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_CALLWAITING
+        { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
+          repeatCnt: 3,
+          repeatSegment: 0 },                              // TONE_CDMA_PIP
+
+        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 64, waveFreq: { 2556, 0}, 19, 0},
+                      { duration: 32, waveFreq: { 2091, 0}, 0, 0},
+                      { duration: 48, waveFreq: { 2556, 0}, 0, 0},
+                      { duration: 4000, waveFreq: { 0 }, 0, 0},
+                      { duration: 0,  waveFreq: { 0 }, 0, 0}},
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL
+        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 64, waveFreq: { 2556, 0}, 7, 0 },
+                      { duration: 32, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 400, waveFreq: { 0 }, 0, 0 },
+                      { duration: 32,  waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 64,  waveFreq: { 2556, 0}, 7, 4 },
+                      { duration: 32,  waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0,    waveFreq: { 0 }, 0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                              // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP
+        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 64, waveFreq: { 2556, 0}, 3, 0 },
+                      { duration: 16, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 200, waveFreq: { 0 },     0, 0 },
+                      { duration: 32, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 64, waveFreq: { 2556, 0}, 3, 4 },
+                      { duration: 16, waveFreq: { 2091, 0}, 0, 0 },
+                      { duration: 200, waveFreq: { 0 },     0, 0 },
+                      { duration: 0,   waveFreq: { 0 },     0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI
+        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} },
+           repeatCnt: 0,
+           repeatSegment: 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3
+        { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 },
+                      { duration: 64, waveFreq: { 2556, 0 }, 4, 0 },
+                      { duration: 20, waveFreq: { 2091, 0 }, 0, 0 },
+                      { duration: 0,  waveFreq: { 0 }      , 0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING
+        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} },
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5
+        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} },
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6
+        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} },
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7
+
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 39, 0 },
+                      { duration: 4000, waveFreq: { 0 },     0, 0 },
+                      { duration: 0,    waveFreq: { 0 },     0, 0 } },
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_L
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 39, 0 },
+                      { duration: 4000, waveFreq: { 0 },     0, 0 },
+                      { duration: 0,    waveFreq: { 0 },     0, 0 } },
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_L
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 39, 0 },
+                      { duration: 4000, waveFreq: { 0 },     0, 0 },
+                      { duration: 0,    waveFreq: { 0 },     0, 0 } },
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_L
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 15, 0 },
+                      { duration: 400, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 } },
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SS
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 15, 0 },
+                      { duration: 400, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_SS
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 15, 0 },
+                      { duration: 400, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_SS
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 15, 6 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SSL
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 15, 6 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_SSL
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 15, 6 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_SSL
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 19, 0 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 19, 3 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SS_2
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 19, 0 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 19, 3 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_SS_2
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 19, 0 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 19, 3 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_SS_2
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 19, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 6 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SLS
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 19, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 6 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_SLS
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 19, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 6 },
+                      { duration: 3000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_SLS
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 6 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 9, 9 },
+                      { duration: 2500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_S_X4
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 6 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 9, 9 },
+                      { duration: 2500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_S_X4
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 3 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 6 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 9, 9 },
+                      { duration: 2500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_S_X4
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 19, 0 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_L
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 19, 0 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_L
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 19, 0 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_L
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SS
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SS
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SS
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 15, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SSL
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 15, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SSL
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 15, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SSL
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 15, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SLS
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 15, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SLS
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 15, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 6 },
+                      { duration: 1000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SLS
+        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 6 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 4000, 0 }, 7, 9 },
+                      { duration: 800, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_S_X4
+        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 6 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 2900, 0 }, 7, 9 },
+                      { duration: 800, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_S_X4
+        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 6 },
+                      { duration: 200, waveFreq: { 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 },
+                      { duration: 25, waveFreq: { 1450, 0 }, 7, 9 },
+                      { duration: 800, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_S_X4
+
+        { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 784, 0 },  0, 0 },
+                      { duration: 62, waveFreq: { 740, 0 },  0, 0 },
+                      { duration: 62, waveFreq: { 622, 0 },  0, 0 },
+                      { duration: 62, waveFreq: { 1109, 0 }, 0, 0 },
+                      { duration: 0,  waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_ALERT_NETWORK_LITE
+        { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 659, 0 },  2, 0 },
+                      { duration: 62, waveFreq: { 1245, 0 }, 0, 0 },
+                      { duration: 0,  waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_ALERT_AUTOREDIAL_LITE
+        { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 },
+                      { duration: 0,   waveFreq: { 0 },            0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_ONE_MIN_BEEP
+        { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 },
+                      { duration: 0,   waveFreq: { 0 },            0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE
+        { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 },
+                      { duration: 125, waveFreq: { 1175, 0 }, 0, 0 },
+                      { duration: 0,   waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_PRESSHOLDKEY_LITE
+        { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 831, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 1109, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 831, 0 }, 0, 0 },
+                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 },
+                      { duration: 0,  waveFreq: { 0 },      0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                             // TONE_CDMA_ALERT_INCALL_LITE
+        { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 },
+                      { duration: 10,  waveFreq: { 0 },      2, 0 },
+                      { duration: 4990, waveFreq: { 0 },     0, 0 },
+                      { duration: 0,    waveFreq: { 0 },     0, 0 } },
+          repeatCnt: ToneGenerator::TONEGEN_INF,
+          repeatSegment: 0 },                            // TONE_CDMA_EMERGENCY_RINGBACK
+        { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 },
+                      { duration: 125, waveFreq: { 0 },       0, 0 },
+                      { duration: 0,   waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 2,
+          repeatSegment: 0 },                            // TONE_CDMA_ALERT_CALL_GUARD
+        { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 },
+                      { duration: 125, waveFreq: { 370,  0 }, 0, 0 },
+                      { duration: 0,   waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_SOFT_ERROR_LITE
+        { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 },
+                      { duration: 125, waveFreq: { 1397, 0 }, 0, 0 },
+                      { duration: 125, waveFreq: { 784, 0 },  0, 0 },
+                      { duration: 0,   waveFreq: { 0 },       0, 0 } },
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_CALLDROP_LITE
+
+        { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: 0,
+          repeatSegment: 0 },                           // TONE_CDMA_NETWORK_BUSY_ONE_SHOT
+        { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 },
+                      { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: 0,
+          repeatSegment: 0 },                           // TONE_CDMA_ABBR_ALERT
+          { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }},
+          repeatCnt: 0,
+          repeatSegment: 0 },                            // TONE_CDMA_SIGNAL_OFF
+
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_ANSI_DIAL
-        { segments: { { duration: 500, waveFreq: { 480, 620, 0 } },
-                      { duration: 500, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_ANSI_BUSY
-        { segments: { { duration: 250, waveFreq: { 480, 620, 0 } },
-                      { duration: 250, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 },
+                      { duration: 250, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_ANSI_CONGESTION
-        { segments: { { duration: 300, waveFreq: { 440, 0 } },
-                      { duration: 9700, waveFreq: { 0 } },
-                      { duration: 100, waveFreq: { 440, 0 } },
-                      { duration: 100, waveFreq: { 0 } },
-                      { duration: 100, waveFreq: { 440, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 9700, waveFreq: { 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 0 }, 0, 0 },
+                      { duration: 100, waveFreq: { 440, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 1 },                              // TONE_ANSI_CALL_WAITING
-        { segments: { { duration: 2000, waveFreq: { 440, 480, 0 } },
-                      { duration: 4000, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 },
+                      { duration: 4000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_ANSI_RINGTONE
-        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_JAPAN_DIAL
-        { segments: { { duration: 500, waveFreq: { 400, 0 } },
-                      { duration: 500, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 },
+                      { duration: 500, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_JAPAN_BUSY
-        { segments: { { duration: 1000, waveFreq: { 400, 0 } },
-                      { duration: 2000, waveFreq: { 0 } },
-                      { duration: 0 , waveFreq: { 0 }}},
+        { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 },
+                      { duration: 2000, waveFreq: { 0 }, 0, 0 },
+                      { duration: 0 , waveFreq: { 0 }, 0, 0}},
           repeatCnt: ToneGenerator::TONEGEN_INF,
           repeatSegment: 0 },                              // TONE_JAPAN_RADIO_ACK
+
+
+
 };
 
 // Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
@@ -529,9 +1050,9 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 void ToneGenerator::audioCallback(int event, void* user, void *info) {
-    
+
     if (event != AudioTrack::EVENT_MORE_DATA) return;
-    
+
     const AudioTrack::Buffer *buffer = static_cast<const AudioTrack::Buffer *>(info);
     ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
     short *lpOut = buffer->i16;
@@ -549,12 +1070,12 @@
         unsigned int lGenSmp;
         unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT;
         bool lSignal = false;
- 
+
         lpToneGen->mLock.lock();
 
         // Update pcm frame count and end time (current time at the end of this process)
         lpToneGen->mTotalSmp += lReqSmp;
-    
+
         // Update tone gen state machine and select wave gen command
         switch (lpToneGen->mState) {
         case TONE_PLAYING:
@@ -562,13 +1083,13 @@
             break;
         case TONE_STARTING:
             LOGV("Starting Cbk");
-    
+
             lWaveCmd = WaveGenerator::WAVEGEN_START;
             break;
         case TONE_STOPPING:
         case TONE_RESTARTING:
             LOGV("Stop/restart Cbk");
-    
+
             lWaveCmd = WaveGenerator::WAVEGEN_STOP;
             lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
             break;
@@ -578,21 +1099,21 @@
             lNumSmp = 0;
             goto audioCallback_EndLoop;
         }
-        
-    
+
+
         // Exit if tone sequence is over
         if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
             if (lpToneGen->mState == TONE_PLAYING) {
-                lpToneGen->mState = TONE_STOPPING;            
+                lpToneGen->mState = TONE_STOPPING;
             }
             goto audioCallback_EndLoop;
         }
-    
+
         if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) {
             // Time to go to next sequence segment
-    
+
             LOGV("End Segment, time: %d\n", (unsigned int)(systemTime()/1000000));
-    
+
             lGenSmp = lReqSmp;
 
             // If segment,  ON -> OFF transition : ramp volume down
@@ -609,25 +1130,49 @@
                 LOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp);
             }
 
-            // Go to next segment
-            lpToneGen->mCurSegment++;
+            // check if we need to loop and loop for the reqd times
+            if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) {
+                if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) {
+                    LOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n",
+                          lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
+                          lpToneGen->mLoopCounter,
+                          lpToneGen->mCurSegment);
+                    lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx;
+                    ++lpToneGen->mLoopCounter;
+                } else {
+                    // completed loop. go to next segment
+                    lpToneGen->mLoopCounter = 0;
+                    lpToneGen->mCurSegment++;
+                    LOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n",
+                          lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
+                          lpToneGen->mLoopCounter,
+                          lpToneGen->mCurSegment);
+                }
+            } else {
+                lpToneGen->mCurSegment++;
+                LOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d) \n",
+                      lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
+                      lpToneGen->mLoopCounter,
+                      lpToneGen->mCurSegment);
+
+            }
 
             // Handle loop if last segment reached
             if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
                 LOGV("Last Seg: %d\n", lpToneGen->mCurSegment);
-    
+
                 // Pre increment loop count and restart if total count not reached. Stop sequence otherwise
                 if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) {
                     LOGV("Repeating Count: %d\n", lpToneGen->mCurCount);
-    
+
                     lpToneGen->mCurSegment = lpToneDesc->repeatSegment;
                     if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) {
                         lWaveCmd = WaveGenerator::WAVEGEN_START;
                     }
-    
+
                     LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment,
                             (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate);
-    
+
                 } else {
                     lGenSmp = 0;
                     LOGV("End repeat, time: %d\n", (unsigned int)(systemTime()/1000000));
@@ -644,11 +1189,11 @@
                     lGenSmp = 0;
                 }
             }
-    
+
             // Update next segment transition position. No harm to do it also for last segment as lpToneGen->mNextSegSmp won't be used any more
             lpToneGen->mNextSegSmp
                     += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000;
-    
+
         } else {
             // Inside a segment keep tone ON or OFF
             if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) {
@@ -657,24 +1202,24 @@
                 lGenSmp = lReqSmp;  // If event segment, tone is currently ON
             }
         }
-    
+
         if (lGenSmp) {
             // If samples must be generated, call all active wave generators and acumulate waves in lpOut
             unsigned int lFreqIdx = 0;
             unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
-    
+
             while (lFrequency != 0) {
                 WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency);
                 lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd);
                 lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx];
             }
         }
-        
+
         lNumSmp -= lReqSmp;
         lpOut += lReqSmp;
-    
+
 audioCallback_EndLoop:
-    
+
         switch (lpToneGen->mState) {
         case TONE_RESTARTING:
             LOGV("Cbk restarting track\n");
@@ -694,7 +1239,7 @@
             LOGV("Cbk Stopping track\n");
             lSignal = true;
             lpToneGen->mpAudioTrack->stop();
-            
+
             // Force loop exit
             lNumSmp = 0;
             break;
@@ -765,6 +1310,7 @@
     mTotalSmp = 0;
     mCurSegment = 0;
     mCurCount = 0;
+    mLoopCounter = 0;
     if (mpToneDesc->segments[0].duration == TONEGEN_INF) {
         mNextSegSmp = TONEGEN_INF;
     } else{