189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License.
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "ToneGenerator"
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <math.h>
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent#include <cutils/properties.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "media/ToneGenerator.h"
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details)
300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = {
311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 941, 0 }, 0, 0},
321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_0
351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 697, 0 }, 0, 0 },
361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_1
391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 697, 0 }, 0, 0 },
401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_2
431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 697, 0 }, 0, 0 },
441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_3
471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 770, 0 }, 0, 0 },
481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_4
511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 770, 0 }, 0, 0 },
521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_5
551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 770, 0 }, 0, 0 },
561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_6
591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 852, 0 }, 0, 0 },
601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_7
631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 852, 0 }, 0, 0 },
641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_8
671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 852, 0 }, 0, 0 },
681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_9
711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 941, 0 }, 0, 0 },
721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_S
751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 941, 0 }, 0, 0 },
761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_P
791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 697, 0 }, 0, 0 },
801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_A
831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 770, 0 }, 0, 0 },
841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_DTMF_B
871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 852, 0 }, 0, 0 },
881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_C
911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 941, 0 }, 0, 0 },
921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_DTMF_D
951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0 },
961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_DIAL
991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500 , .waveFreq = { 425, 0 }, 0, 0},
1001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0},
1011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                           { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_BUSY
1041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
1051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
1061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_CONGESTION
1091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
1101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
1121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_RADIO_ACK
1131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0},
1141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0},
1151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 2,
1171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_RADIO_NOTAVAIL
1181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 330, .waveFreq = { 950, 1400, 1800, 0 }, 0, 0},
1191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0},
1201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_ERROR
1231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
1241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 600, .waveFreq = { 0 }, 0, 0 },
1251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
1261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
1271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_CALL_WAITING
1301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 1000, .waveFreq = { 425, 0 }, 0, 0 },
1311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
1321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_RINGTONE
1351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
1361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
1381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_PROP_BEEP
1391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 100, .waveFreq = { 1200, 0 }, 0, 0 },
1401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0  },
1411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 1,
1431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_PROP_ACK
1441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 400, .waveFreq = { 300, 400, 500, 0 }, 0, 0 },
1451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
1471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_PROP_NACK
1481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 200, .waveFreq = { 400, 1200, 0 }, 0, 0 },
1491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
1511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_PROP_PROMPT
1521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
1531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
1541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
1551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
1571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_PROP_BEEP2
1581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
1591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
1601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0 }},
1611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_INTERCEPT
1631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
1641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
1651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 7,
1671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_SUP_INTERCEPT_ABBREV
1681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
1691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 0 }, 0, 0 },
1701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 7,
1721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_SUP_CONGESTION_ABBREV
1731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 },
1741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0 },
1751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 2,
1771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_SUP_CONFIRM
1781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 },
1791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0 },
1801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 3,
1821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_SUP_PIP
1831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = {{ .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0},
1841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                       { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_DIAL_TONE_LITE
1871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 },
1881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
1891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
1911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_USA_RINGBACK
1921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
1931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
1941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
1951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt =  ToneGenerator::TONEGEN_INF,
1961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_INTERCEPT
1971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
1981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
1991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt =  0,
2011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_ABBR_INTERCEPT
2021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
2031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 0 }, 0, 0 },
2041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
2061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_REORDER
2071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
2081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 0 }, 0, 0 },
2091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 7,
2111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_ABBR_REORDER
2121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
2131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
2141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
2161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_BUSY
2171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 },
2181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0 },
2191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 2,
2211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_CONFIRM
2221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500, .waveFreq = { 660, 1000, 0 }, 0, 0 },
2231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_ANSWER
2261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 },
2271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_CALLWAITING
2301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 },
2311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0 },
2321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
2331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 3,
2341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_PIP
2355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
2361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
2371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64, .waveFreq = { 2556, 0}, 19, 0},
2381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0},
2391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 48, .waveFreq = { 2556, 0}, 0, 0},
2401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0},
2411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,  .waveFreq = { 0 }, 0, 0}},
2421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL
2441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
2451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64, .waveFreq = { 2556, 0}, 7, 0 },
2461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
2471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 400, .waveFreq = { 0 }, 0, 0 },
2481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 },
2491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64,  .waveFreq = { 2556, 0}, 7, 4 },
2501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 },
2511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
2521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,    .waveFreq = { 0 }, 0, 0 } },
2531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP
2551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
2561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64, .waveFreq = { 2556, 0}, 3, 0 },
2571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 },
2581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 },     0, 0 },
2591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
2601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64, .waveFreq = { 2556, 0}, 3, 4 },
2611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 },
2621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 },     0, 0 },
2631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },     0, 0 } },
2641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI
2661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
2671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3
2691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 32, .waveFreq = { 2091, 0 }, 0, 0 },
2701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 64, .waveFreq = { 2556, 0 }, 4, 0 },
2711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 20, .waveFreq = { 2091, 0 }, 0, 0 },
2721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,  .waveFreq = { 0 }      , 0, 0 } },
2731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING
2751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
2761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5
2781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
2791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6
2811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
2821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
2831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7
2845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
2851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
2861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 39, 0 },
2871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 },     0, 0 },
2881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
2891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
2901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_L
2911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
2921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 39, 0 },
2931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 },     0, 0 },
2941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
2951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
2961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_L
2971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
2981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 39, 0 },
2991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 },     0, 0 },
3001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
3011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_L
3031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 0 },
3051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 400, .waveFreq = { 0 }, 0, 0 },
3061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 } },
3071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS
3091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 0 },
3111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 400, .waveFreq = { 0 }, 0, 0 },
3121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_SS
3151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 0 },
3171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 400, .waveFreq = { 0 }, 0, 0 },
3181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS
3211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
3231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
3261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 },
3291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
3301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SSL
3331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
3351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
3381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 },
3411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
3421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_SSL
3451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
3471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
3501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
3511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 },
3531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
3541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SSL
3571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                          { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 },
3591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
3601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 },
3621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
3631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS_2
3661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 },
3681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
3691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 },
3711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
3721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_SS_2
3751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 },
3771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
3781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
3791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 },
3801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
3811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS_2
3841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 },
3861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
3871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 },
3891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
3901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
3911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 },
3921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
3931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
3941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
3951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SLS
3961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
3971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 },
3981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
3991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 },
4011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 },
4041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
4051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_SLS
4081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 },
4101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 },
4131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 },
4161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
4171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SLS
4201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 },
4221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 3 },
4251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 },
4281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 9 },
4311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
4321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_S_X4
4351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 },
4371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 3 },
4401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 },
4431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 9 },
4461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
4471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_S_X4
4501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 },
4521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 3 },
4551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 },
4581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
4591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 9 },
4611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
4621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_S_X4
4651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 },
4671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
4681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_L
4711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 },
4731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
4741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_L
4771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
4781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 },
4791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
4801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_L
4831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
4851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
4861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
4871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
4881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
4891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
4911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SS
4921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
4941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
4951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
4961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
4971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
4981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
4991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SS
5011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
5031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
5061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
5071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SS
5101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
5121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
5151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 },
5181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SSL
5221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
5241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
5271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 },
5301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SSL
5341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
5361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
5391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 },
5421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SSL
5461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
5481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 3 },
5511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 },
5541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SLS
5581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
5601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 3 },
5631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 },
5661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SLS
5701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
5721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 3 },
5751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
5771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 },
5781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
5791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh           .repeatCnt = ToneGenerator::TONEGEN_INF,
5811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SLS
5821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
5841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
5871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5881b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 },
5901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
5911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
5921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 9 },
5931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 800, .waveFreq = { 0 }, 0, 0 },
5941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
5951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
5961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_S_X4
5971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
5981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
5991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
6011b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
6021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
6041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 },
6051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
6071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 9 },
6081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 800, .waveFreq = { 0 }, 0, 0 },
6091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
6101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
6111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_S_X4
6121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
6131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
6141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
6161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
6171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
6191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 },
6201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
6211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
6221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 9 },
6231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 800, .waveFreq = { 0 }, 0, 0 },
6241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
6251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
6261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_S_X4
6275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
6281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
6291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 784, 0 },  0, 0 },
6301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 740, 0 },  0, 0 },
6311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 622, 0 },  0, 0 },
6321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
6331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,  .waveFreq = { 0 },       0, 0 } },
6341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_NETWORK_LITE
6361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 },
6371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 659, 0 },  2, 0 },
6381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 },
6391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,  .waveFreq = { 0 },       0, 0 } },
6401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_AUTOREDIAL_LITE
6421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 400, .waveFreq = { 1150, 770, 0 }, 0, 0 },
6431b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },            0, 0 } },
6441b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6451b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_ONE_MIN_BEEP
6461b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 120, .waveFreq = { 941, 1477, 0 }, 0, 0 },
6471b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },            0, 0 } },
6481b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6491b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE
6501b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 375, .waveFreq = { 587, 0 }, 0, 0 },
6511b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 125, .waveFreq = { 1175, 0 }, 0, 0 },
6521b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
6531b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6541b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_PRESSHOLDKEY_LITE
6551b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 62, .waveFreq = { 587, 0 }, 0, 0 },
6561b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
6571b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 },
6581b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
6591b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
6601b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
6611b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 },
6621b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
6631b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,  .waveFreq = { 0 },      0, 0 } },
6641b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6651b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                             // TONE_CDMA_ALERT_INCALL_LITE
6661b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 125, .waveFreq = { 941, 0 }, 0, 0 },
6671b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 10,  .waveFreq = { 0 },      2, 0 },
6681b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4990, .waveFreq = { 0 },     0, 0 },
6691b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
6701b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
6711b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_EMERGENCY_RINGBACK
6721b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 125, .waveFreq = { 1319, 0 }, 0, 0 },
6731b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 125, .waveFreq = { 0 },       0, 0 },
6741b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
6751b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 2,
6761b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_CALL_GUARD
6771b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 125, .waveFreq = { 1047, 0 }, 0, 0 },
6781b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 125, .waveFreq = { 370,  0 }, 0, 0 },
6791b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
6801b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6811b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_SOFT_ERROR_LITE
6821b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 125, .waveFreq = { 1480, 0 }, 0, 0 },
6831b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 125, .waveFreq = { 1397, 0 }, 0, 0 },
6841b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 125, .waveFreq = { 784, 0 },  0, 0 },
6851b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
6861b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6871b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_CALLDROP_LITE
6885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
6891b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500, .waveFreq = { 425, 0 }, 0, 0 },
6901b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
6911b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
6921b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6931b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_NETWORK_BUSY_ONE_SHOT
6941b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 400, .waveFreq = { 1150, 770 }, 0, 0 },
6951b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
6961b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
6971b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                           // TONE_CDMA_ABBR_ALERT
6981b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          { .segments = { { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
6991b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = 0,
7001b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                            // TONE_CDMA_SIGNAL_OFF
7015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
7021b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 350, 440, 0 }, 0, 0 },
7031b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7041b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7051b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_ANSI_DIAL
7061b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
7071b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
7081b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7091b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7101b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_ANSI_BUSY
7111b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
7121b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 250, .waveFreq = { 0 }, 0, 0 },
7131b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7141b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7151b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_ANSI_CONGESTION
7161b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 },
7171b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 9700, .waveFreq = { 0 }, 0, 0 },
7181b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 },
7191b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 0 }, 0, 0 },
7201b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 },
7211b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7221b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7231b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 1 },                              // TONE_ANSI_CALL_WAITING
7241b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 },
7251b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
7261b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7271b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7281b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_ANSI_RINGTONE
7291b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 400, 0 }, 0, 0 },
7301b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7311b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7321b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_JAPAN_DIAL
7331b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 500, .waveFreq = { 400, 0 }, 0, 0 },
7341b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 500, .waveFreq = { 0 }, 0, 0 },
7351b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7361b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7371b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_JAPAN_BUSY
7381b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh        { .segments = { { .duration = 1000, .waveFreq = { 400, 0 }, 0, 0 },
7391b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
7401b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
7411b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatCnt = ToneGenerator::TONEGEN_INF,
7421b12b211cea11e319e72d9a5bf2bc4f7361f719dChih-Hung Hsieh          .repeatSegment = 0 },                              // TONE_JAPAN_RADIO_ACK
743e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu        { .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
744e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
745e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu                        { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
746e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu                        { .duration = 2000, .waveFreq = { 0 }, 0, 0},
747e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu                        { .duration = 0, .waveFreq = { 0 }, 0, 0}},
748e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu          .repeatCnt = ToneGenerator::TONEGEN_INF,
749a97494e3aedc0be9362c13fad1fd83ac814b76d0Hall Liu          .repeatSegment = 0 },                              // TONE_GB_RINGTONE
75050029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        { .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
75150029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
75250029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
75350029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 2000, .waveFreq = { 0 }, 0, 0},
75450029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 0, .waveFreq = { 0 }, 0, 0}},
75550029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatCnt = ToneGenerator::TONEGEN_INF,
75650029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatSegment = 0 },                              // TONE_AUSTRALIA_RINGTONE
75750029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        { .segments = { { .duration = 375, .waveFreq = { 425, 0 }, 0, 0 },
75850029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 375, .waveFreq = { 0 }, 0, 0 },
75950029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
76050029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatCnt = ToneGenerator::TONEGEN_INF,
76150029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatSegment = 0 },                              // TONE_AUSTRALIA_BUSY
76250029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
76350029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 200, .waveFreq = { 0 }, 0, 0 },
76450029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
76550029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 4400, .waveFreq = { 0 }, 0, 0 },
76650029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
76750029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatCnt = ToneGenerator::TONEGEN_INF,
76850029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatSegment = 0 },                              // TONE_AUSTRALIA_CALL_WAITING
76950029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        { .segments = { { .duration = 375, .waveFreq = { 425, 0 }, 0, 0 },
77050029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 375, .waveFreq = { 0 }, 0, 0 },
77150029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
77250029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatCnt = ToneGenerator::TONEGEN_INF,
77350029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn          .repeatSegment = 0 },                              // TONE_AUSTRALIA_CONGESTION
7740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent};
7750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
7760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
7770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// to actual tone for current region.
7783d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenconst unsigned char /*tone_type*/ ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = {
7790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        {   // ANSI
7800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_ANSI_DIAL,             // TONE_SUP_DIAL
7810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_ANSI_BUSY,             // TONE_SUP_BUSY
7820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_ANSI_CONGESTION,       // TONE_SUP_CONGESTION
7830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_RADIO_ACK,         // TONE_SUP_RADIO_ACK
7840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_RADIO_NOTAVAIL,    // TONE_SUP_RADIO_NOTAVAIL
7850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_ERROR,             // TONE_SUP_ERROR
7860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_ANSI_CALL_WAITING,     // TONE_SUP_CALL_WAITING
7870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_ANSI_RINGTONE          // TONE_SUP_RINGTONE
7880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        },
7890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        {   // JAPAN
7900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_JAPAN_DIAL,             // TONE_SUP_DIAL
7910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_JAPAN_BUSY,             // TONE_SUP_BUSY
7920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
7930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_JAPAN_RADIO_ACK,        // TONE_SUP_RADIO_ACK
7940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
7950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_ERROR,              // TONE_SUP_ERROR
7960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
7970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            TONE_SUP_RINGTONE            // TONE_SUP_RINGTONE
798e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu        },
799a97494e3aedc0be9362c13fad1fd83ac814b76d0Hall Liu        {   // GB
800e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_DIAL,               // TONE_SUP_DIAL
801e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_BUSY,               // TONE_SUP_BUSY
802e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
803e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
804e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
805e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_ERROR,              // TONE_SUP_ERROR
806e7b4463fcd2597b8a17e776648396e85853c25d9Hall Liu            TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
807a97494e3aedc0be9362c13fad1fd83ac814b76d0Hall Liu            TONE_GB_RINGTONE             // TONE_SUP_RINGTONE
80850029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        },
80950029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        {   // AUSTRALIA
81050029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_ANSI_DIAL,             // TONE_SUP_DIAL
81150029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_AUSTRALIA_BUSY,        // TONE_SUP_BUSY
81250029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_AUSTRALIA_CONGESTION,  // TONE_SUP_CONGESTION
81350029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_SUP_RADIO_ACK,         // TONE_SUP_RADIO_ACK
81450029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_SUP_RADIO_NOTAVAIL,    // TONE_SUP_RADIO_NOTAVAIL
81550029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_SUP_ERROR,             // TONE_SUP_ERROR
81650029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_AUSTRALIA_CALL_WAITING,// TONE_SUP_CALL_WAITING
81750029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn            TONE_AUSTRALIA_RINGTONE     // TONE_SUP_RINGTONE
8180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        }
8190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent};
8200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
82189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
82289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
82389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//                           ToneGenerator class Implementation
82489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
82589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
82689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
82789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ----------------------------
82889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
82989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::ToneGenerator()
83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Constructor. Initializes the tone sequencer, intantiates required sine wave
83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        generators, instantiates output audio track.
83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
83899e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten//        streamType:        Type of stream used for tone playback
83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        volume:            volume applied to tone (0.0 to 1.0)
84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
845fff6d715a8db0daf08a50634f242c40268de3d49Glenn KastenToneGenerator::ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava) {
84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
84790bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGV("ToneGenerator constructor: streamType=%d, volume=%f", streamType, volume);
84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mState = TONE_IDLE;
85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) {
85229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("Unable to marshal AudioFlinger");
85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return;
85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
85534f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent    mThreadCanCallJava = threadCanCallJava;
85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mStreamType = streamType;
85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mVolume = volume;
858a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten    mpToneDesc = NULL;
859a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten    mpNewToneDesc = NULL;
86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Generate tone by chunks of 20 ms to keep cadencing precision
86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mProcessSize = (mSamplingRate * 20) / 1000;
86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    char value[PROPERTY_VALUE_MAX];
8641bcae276ab189c364393d6971ed8a7d5e6376498Lukasz Wasowicz    if (property_get("gsm.operator.iso-country", value, "") == 0) {
8651bcae276ab189c364393d6971ed8a7d5e6376498Lukasz Wasowicz        property_get("gsm.sim.operator.iso-country", value, "");
8661bcae276ab189c364393d6971ed8a7d5e6376498Lukasz Wasowicz    }
8677a9c55c5cedf46ef4f6b3de034634312bd1ff0eetadashi.aoyama    if (strstr(value, "us") != NULL ||
8687a9c55c5cedf46ef4f6b3de034634312bd1ff0eetadashi.aoyama        strstr(value, "ca") != NULL) {
8690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        mRegion = ANSI;
8707a9c55c5cedf46ef4f6b3de034634312bd1ff0eetadashi.aoyama    } else if (strstr(value, "jp") != NULL) {
8710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        mRegion = JAPAN;
872a97494e3aedc0be9362c13fad1fd83ac814b76d0Hall Liu    } else if (strstr(value, "gb") != NULL) {
873a97494e3aedc0be9362c13fad1fd83ac814b76d0Hall Liu        mRegion = GB;
87450029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn    } else if (strstr(value, "au") != NULL) {
87550029b6d7333197cc3d48e5d7e3bfd6ac3a288f0Tyler Gunn        mRegion = AUSTRALIA;
8760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    } else {
8770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        mRegion = CEPT;
8780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    }
8790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (initAudioTrack()) {
88190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten        ALOGV("ToneGenerator INIT OK, time: %d", (unsigned int)(systemTime()/1000000));
88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
88390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten        ALOGV("!!!ToneGenerator INIT FAILED!!!");
88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::~ToneGenerator()
89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Destructor. Stop sound playback and delete audio track if
89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//      needed and delete sine wave generators.
89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::~ToneGenerator() {
90590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGV("ToneGenerator destructor");
90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9072799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten    if (mpAudioTrack != 0) {
90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        stopTone();
9092799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten        ALOGV("Delete Track: %p", mpAudioTrack.get());
9102799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten        mpAudioTrack.clear();
91189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9122b49066e0261377477aef9743a9db82805d0eb8dMykola Kondratenko    clearWaveGens();
91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::startTone()
91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Starts tone playback.
92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
92285fa14d35468acca07ce0085d67b909f673fae07Eric Laurent//        toneType:        Type of tone generated (values in enum tone_type)
92385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent//        durationMs:      The tone duration in milliseconds. If the tone is limited in time by definition,
92485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent//              the actual duration will be the minimum of durationMs and the defined tone duration.
92585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent//              Ommiting or setting durationMs to -1 does not limit tone duration.
92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
9313d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenbool ToneGenerator::startTone(tone_type toneType, int durationMs) {
93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool lResult = false;
933e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    status_t lStatus;
93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9354afdfa7fd7e9fe59fb298ef2ac252686e68bc73aDave Sparks    if ((toneType < 0) || (toneType >= NUM_TONES))
93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return lResult;
93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9386eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent    toneType = getToneForRegion(toneType);
9396eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent    if (toneType == TONE_CDMA_SIGNAL_OFF) {
9406eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent        return true;
9416eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent    }
9426eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent
94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mState == TONE_IDLE) {
9443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("startTone: try to re-init AudioTrack");
94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (!initAudioTrack()) {
94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return lResult;
94789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGV("startTone");
95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Get descriptor for requested tone
9550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    mpNewToneDesc = &sToneDescriptors[toneType];
95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
957e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    mDurationMs = durationMs;
958e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent
959e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    if (mState == TONE_STOPPED) {
9603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Start waiting for previous tone to stop");
961a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent        lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
962e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent        if (lStatus != NO_ERROR) {
96329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("--- start wait for stop timed out, status %d", lStatus);
964e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent            mState = TONE_IDLE;
965a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent            mLock.unlock();
966e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent            return lResult;
96785fa14d35468acca07ce0085d67b909f673fae07Eric Laurent        }
96885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent    }
96985fa14d35468acca07ce0085d67b909f673fae07Eric Laurent
97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mState == TONE_INIT) {
97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (prepareWave()) {
97290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("Immediate start, time %d", (unsigned int)(systemTime()/1000000));
97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lResult = true;
97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mState = TONE_STARTING;
975681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            if (clock_gettime(CLOCK_MONOTONIC, &mStartTime) != 0) {
976681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                mStartTime.tv_sec = 0;
977681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            }
97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mLock.unlock();
97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mpAudioTrack->start();
98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mLock.lock();
98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mState == TONE_STARTING) {
9823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("Wait for start callback");
983a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent                lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
9848365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project                if (lStatus != NO_ERROR) {
98529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                    ALOGE("--- Immediate start timed out, status %d", lStatus);
98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    mState = TONE_IDLE;
98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    lResult = false;
98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                }
98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
9915a22b909c9e8fc0d9321dcc014706a790b26b971Eric Laurent            mState = TONE_IDLE;
99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
99490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten        ALOGV("Delayed start");
99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mState = TONE_RESTARTING;
996681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent        mStartTime.tv_sec = 0;
997a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent        lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
9988365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project        if (lStatus == NO_ERROR) {
99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (mState != TONE_IDLE) {
100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lResult = true;
100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
10023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("cond received");
100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
100429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("--- Delayed start timed out, status %d", lStatus);
100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mState = TONE_IDLE;
100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGV_IF(lResult, "Tone started, time %d", (unsigned int)(systemTime()/1000000));
101190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGW_IF(!lResult, "Tone start failed!!!, time %d", (unsigned int)(systemTime()/1000000));
101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return lResult;
101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::stopTone()
101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Stops tone playback.
102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::stopTone() {
10303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stopTone");
103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
103309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent    if (mState != TONE_IDLE && mState != TONE_INIT) {
103409108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent        if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) {
1035681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            struct timespec stopTime;
1036681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            // If the start time is valid, make sure that the number of audio samples produced
1037681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            // corresponds at least to the time between the start and stop commands.
1038681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            // This is needed in case of cold start of the output stream.
1039a8eccec73a40d4afcff505eb463a016c89aeed42Eric Laurent            if ((mStartTime.tv_sec != 0) && (clock_gettime(CLOCK_MONOTONIC, &stopTime) == 0)) {
1040681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                time_t sec = stopTime.tv_sec - mStartTime.tv_sec;
1041681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                long nsec = stopTime.tv_nsec - mStartTime.tv_nsec;
1042681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                if (nsec < 0) {
1043681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    --sec;
1044681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    nsec += 1000000000;
1045681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                }
1046681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent
1047681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                if ((sec + 1) > ((long)(INT_MAX / mSamplingRate))) {
1048681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    mMaxSmp = sec * mSamplingRate;
1049681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                } else {
1050681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    // mSamplingRate is always > 1000
1051681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    sec = sec * 1000 + nsec / 1000000; // duration in milliseconds
1052a8eccec73a40d4afcff505eb463a016c89aeed42Eric Laurent                    mMaxSmp = (unsigned int)(((int64_t)sec * mSamplingRate) / 1000);
1053681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                }
1054681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                ALOGV("stopTone() forcing mMaxSmp to %d, total for far %d", mMaxSmp,  mTotalSmp);
1055681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            } else {
1056681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                mState = TONE_STOPPING;
1057681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent            }
105809108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent        }
10593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("waiting cond");
1060a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent        status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lStatus == NO_ERROR) {
106209108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent            // If the tone was restarted exit now before calling clearWaveGens();
106309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent            if (mState != TONE_INIT) {
1064704455a5a6cd22f03bb8984e0c7f46108eb1afb7Eric Laurent                mLock.unlock();
106509108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent                return;
106609108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent            }
10673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000));
106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
106929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("--- Stop timed out");
107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mState = TONE_IDLE;
107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mpAudioTrack->stop();
107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
107309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent        clearWaveGens();
107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- private methods ---------------------------
108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::initAudioTrack()
108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Allocates and configures AudioTrack used for PCM output.
108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::initAudioTrack() {
10987711c90d957514efd5fa68d3fdf269e919a36720Andy Hung    // Open audio track in mono, PCM 16bit, default sampling rate.
109934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent    mpAudioTrack = new AudioTrack();
11007711c90d957514efd5fa68d3fdf269e919a36720Andy Hung    ALOGV("AudioTrack(%p) created", mpAudioTrack.get());
11017711c90d957514efd5fa68d3fdf269e919a36720Andy Hung
11027711c90d957514efd5fa68d3fdf269e919a36720Andy Hung    const size_t frameCount = mProcessSize;
11037711c90d957514efd5fa68d3fdf269e919a36720Andy Hung    status_t status = mpAudioTrack->set(
11047711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            mStreamType,
11057711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            0,    // sampleRate
11067711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            AUDIO_FORMAT_PCM_16_BIT,
11077711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            AUDIO_CHANNEL_OUT_MONO,
11087711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            frameCount,
11097711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            AUDIO_OUTPUT_FLAG_FAST,
11107711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            audioCallback,
11117711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            this, // user
11127711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            0,    // notificationFrames
11137711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            0,    // sharedBuffer
11147711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            mThreadCanCallJava,
11157711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            AUDIO_SESSION_ALLOCATE,
11167711c90d957514efd5fa68d3fdf269e919a36720Andy Hung            AudioTrack::TRANSFER_CALLBACK);
11177711c90d957514efd5fa68d3fdf269e919a36720Andy Hung
11187711c90d957514efd5fa68d3fdf269e919a36720Andy Hung    if (status != NO_ERROR) {
11197711c90d957514efd5fa68d3fdf269e919a36720Andy Hung        ALOGE("AudioTrack(%p) set failed with error %d", mpAudioTrack.get(), status);
11207711c90d957514efd5fa68d3fdf269e919a36720Andy Hung        mpAudioTrack.clear();
11217711c90d957514efd5fa68d3fdf269e919a36720Andy Hung        return false;
112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1124b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten    mpAudioTrack->setVolume(mVolume);
112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mState = TONE_INIT;
112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return true;
112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::audioCallback()
113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
113389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    AudioTrack callback implementation. Generates a block of
113489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        PCM samples
113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        and manages tone generator sequencer: tones pulses, tone duration...
113689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
113789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
113889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        user    reference (pointer to our ToneGenerator)
113989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        info    audio buffer descriptor
114089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
114189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
114289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        returned value: always true.
114389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
114489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
1145d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kastenvoid ToneGenerator::audioCallback(int event, void* user, void *info) {
11465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
114789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (event != AudioTrack::EVENT_MORE_DATA) return;
11485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
1149824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent    AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info);
115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    short *lpOut = buffer->i16;
115289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    unsigned int lNumSmp = buffer->size/sizeof(short);
11530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc;
115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
115589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (buffer->size == 0) return;
115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
115789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
115889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Clear output buffer: WaveGenerator accumulates into lpOut buffer
115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    memset(lpOut, 0, buffer->size);
116089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
116189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    while (lNumSmp) {
116289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize;
116389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        unsigned int lGenSmp;
116489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT;
116589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        bool lSignal = false;
11665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
116789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lpToneGen->mLock.lock();
116889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1169a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent
117089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Update pcm frame count and end time (current time at the end of this process)
117189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lpToneGen->mTotalSmp += lReqSmp;
11725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
117389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Update tone gen state machine and select wave gen command
117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        switch (lpToneGen->mState) {
117589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_PLAYING:
117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lWaveCmd = WaveGenerator::WAVEGEN_CONT;
117789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
117889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_STARTING:
11793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Starting Cbk");
11805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
118189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lWaveCmd = WaveGenerator::WAVEGEN_START;
118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
118389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_STOPPING:
118489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_RESTARTING:
11853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Stop/restart Cbk");
11865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
118789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
118889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
118989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
1190824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent        case TONE_STOPPED:
11913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Stopped Cbk");
1192824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            goto audioCallback_EndLoop;
119389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
11943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("Extra Cbk");
119589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            goto audioCallback_EndLoop;
119689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
11975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
119889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Exit if tone sequence is over
119985fa14d35468acca07ce0085d67b909f673fae07Eric Laurent        if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 ||
120085fa14d35468acca07ce0085d67b909f673fae07Eric Laurent            lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) {
120189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (lpToneGen->mState == TONE_PLAYING) {
12025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                lpToneGen->mState = TONE_STOPPING;
120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
120485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent            if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
120585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent                goto audioCallback_EndLoop;
120685fa14d35468acca07ce0085d67b909f673fae07Eric Laurent            }
1207824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            // fade out before stopping if maximum duration reached
120885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent            lWaveCmd = WaveGenerator::WAVEGEN_STOP;
120985fa14d35468acca07ce0085d67b909f673fae07Eric Laurent            lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
121089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
121289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) {
121389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // Time to go to next sequence segment
12145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
121590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("End Segment, time: %d", (unsigned int)(systemTime()/1000000));
12165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
121789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lGenSmp = lReqSmp;
12180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
12190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            // If segment,  ON -> OFF transition : ramp volume down
12200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) {
122189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lWaveCmd = WaveGenerator::WAVEGEN_STOP;
12220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                unsigned int lFreqIdx = 0;
12230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
12240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
12250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                while (lFrequency != 0) {
12260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency);
12270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd);
12280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx];
12290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                }
123090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                ALOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp);
123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
12320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
12335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause            // check if we need to loop and loop for the reqd times
12345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause            if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) {
12355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) {
123690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d)",
12375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
12385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneGen->mLoopCounter,
12395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneGen->mCurSegment);
12405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                    lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx;
12415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                    ++lpToneGen->mLoopCounter;
12425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                } else {
12435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                    // completed loop. go to next segment
12445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                    lpToneGen->mLoopCounter = 0;
12455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                    lpToneGen->mCurSegment++;
124690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d)",
12475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
12485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneGen->mLoopCounter,
12495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                          lpToneGen->mCurSegment);
12505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                }
12515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause            } else {
12525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                lpToneGen->mCurSegment++;
125390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                ALOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d)",
12545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                      lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt,
12555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                      lpToneGen->mLoopCounter,
12565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause                      lpToneGen->mCurSegment);
12575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
12585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause            }
12590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
12600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            // Handle loop if last segment reached
12610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) {
126290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                ALOGV("Last Seg: %d", lpToneGen->mCurSegment);
12635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                // Pre increment loop count and restart if total count not reached. Stop sequence otherwise
12650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) {
126690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV("Repeating Count: %d", lpToneGen->mCurCount);
12675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
12680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lpToneGen->mCurSegment = lpToneDesc->repeatSegment;
12690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) {
12700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                        lWaveCmd = WaveGenerator::WAVEGEN_START;
12710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    }
12725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
127390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment,
127489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                            (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate);
12755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
127689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                } else {
12770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lGenSmp = 0;
127890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV("End repeat, time: %d", (unsigned int)(systemTime()/1000000));
127989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                }
128089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
128190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment,
128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                        (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate);
12830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) {
12840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    // If next segment is not silent,  OFF -> ON transition : reset wave generator
12850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lWaveCmd = WaveGenerator::WAVEGEN_START;
12860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
128790bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                    ALOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp);
12880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                } else {
12890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    lGenSmp = 0;
12900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                }
129189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
12925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
129389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // Update next segment transition position. No harm to do it also for last segment as lpToneGen->mNextSegSmp won't be used any more
129489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lpToneGen->mNextSegSmp
12950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                    += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000;
12965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
129789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {
129889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // Inside a segment keep tone ON or OFF
12990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) {
130089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lGenSmp = 0;  // If odd segment, tone is currently OFF
130189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
130289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lGenSmp = lReqSmp;  // If event segment, tone is currently ON
130389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
130489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
130689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lGenSmp) {
130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // If samples must be generated, call all active wave generators and acumulate waves in lpOut
13080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            unsigned int lFreqIdx = 0;
13090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
13105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
13110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            while (lFrequency != 0) {
13120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency);
131389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd);
13140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx];
131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
131689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
13175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
131889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lNumSmp -= lReqSmp;
131989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lpOut += lReqSmp;
13205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
132189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectaudioCallback_EndLoop:
13225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause
132389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        switch (lpToneGen->mState) {
132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_RESTARTING:
132590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("Cbk restarting track");
132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (lpToneGen->prepareWave()) {
132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lpToneGen->mState = TONE_STARTING;
1328681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                if (clock_gettime(CLOCK_MONOTONIC, &lpToneGen->mStartTime) != 0) {
1329681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                    lpToneGen->mStartTime.tv_sec = 0;
1330681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent                }
1331c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent                // must reload lpToneDesc as prepareWave() may change mpToneDesc
1332c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent                lpToneDesc = lpToneGen->mpToneDesc;
133389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            } else {
133490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten                ALOGW("Cbk restarting prepareWave() failed");
133589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lpToneGen->mState = TONE_IDLE;
133689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lpToneGen->mpAudioTrack->stop();
133789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                // Force loop exit
133889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                lNumSmp = 0;
133989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
134089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lSignal = true;
134189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
134289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_STOPPING:
134390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("Cbk Stopping");
1344824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            lpToneGen->mState = TONE_STOPPED;
1345824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            // Force loop exit
1346824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            lNumSmp = 0;
1347824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            break;
1348824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent        case TONE_STOPPED:
134989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lpToneGen->mState = TONE_INIT;
135090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("Cbk Stopped track");
135189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lpToneGen->mpAudioTrack->stop();
135289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // Force loop exit
135389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lNumSmp = 0;
1354824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            buffer->size = 0;
1355824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            lSignal = true;
135689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case TONE_STARTING:
135890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten            ALOGV("Cbk starting track");
135989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lpToneGen->mState = TONE_PLAYING;
136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lSignal = true;
1361e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            break;
1362824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent        case TONE_PLAYING:
1363e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            break;
136489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default:
1365824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            // Force loop exit
1366824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            lNumSmp = 0;
1367824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent            buffer->size = 0;
136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (lSignal)
137209108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent            lpToneGen->mWaitCbkCond.broadcast();
137389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lpToneGen->mLock.unlock();
137489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
137589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
137689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
137889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
137989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
138089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::prepareWave()
138189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
138289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Prepare wave generators and reset tone sequencer state machine.
13830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//      mpNewToneDesc must have been initialized before calling this function.
138489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
138589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
138689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
138789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
138889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        returned value:   true if wave generators have been created, false otherwise
138989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
139089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
139189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::prepareWave() {
13920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    unsigned int segmentIdx = 0;
139389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1394a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten    if (mpNewToneDesc == NULL) {
139589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return false;
139689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
139889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Remove existing wave generators if any
139989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    clearWaveGens();
140089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
140189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mpToneDesc = mpNewToneDesc;
140289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1403e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    if (mDurationMs == -1) {
1404e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent        mMaxSmp = TONEGEN_INF;
1405e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    } else {
1406e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent        if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) {
1407e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent            mMaxSmp = (mDurationMs / 1000) * mSamplingRate;
1408e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent        } else {
1409e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent            mMaxSmp = (mDurationMs * mSamplingRate) / 1000;
1410e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent        }
14113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("prepareWave, duration limited to %d ms", mDurationMs);
1412e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent    }
1413e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent
14140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    while (mpToneDesc->segments[segmentIdx].duration) {
14150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        // Get total number of sine waves: needed to adapt sine wave gain.
14160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        unsigned int lNumWaves = numWaves(segmentIdx);
14170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        unsigned int freqIdx = 0;
14180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx];
14190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        while (frequency) {
14200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            // Instantiate a wave generator if  ot already done for this frequency
14210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) {
14220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                ToneGenerator::WaveGenerator *lpWaveGen =
1423b53dae6ea693561cd5e3dae1ec112949cb079b2cGlenn Kasten                        new ToneGenerator::WaveGenerator(mSamplingRate,
14240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                                frequency,
14250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                                TONEGEN_GAIN/lNumWaves);
14260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent                mWaveGens.add(frequency, lpWaveGen);
14270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            }
14280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx];
142989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
14300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        segmentIdx++;
143189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
143289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
143389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // Initialize tone sequencer
143489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mTotalSmp = 0;
143589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurSegment = 0;
143689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurCount = 0;
14375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause    mLoopCounter = 0;
14380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    if (mpToneDesc->segments[0].duration == TONEGEN_INF) {
14390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        mNextSegSmp = TONEGEN_INF;
14400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    } else{
14410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000;
14420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    }
144389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
144489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return true;
144589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
144689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
144789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
144889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
144989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
145089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::numWaves()
145189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
14520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//    Description:    Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF).
145389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
145489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
14550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//        segmentIdx        tone segment index
145689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
145789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
145889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        returned value:    nummber of sine waves
145989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
146089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
14610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) {
146289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    unsigned int lCnt = 0;
146389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    if (mpToneDesc->segments[segmentIdx].duration) {
14650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) {
14660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent            lCnt++;
14670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        }
146889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lCnt++;
146989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
147089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
147189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return lCnt;
147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        ToneGenerator::clearWaveGens()
147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
147989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Removes all wave generators.
148089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::clearWaveGens() {
14893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("Clearing mWaveGens:");
149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) {
14920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        delete mWaveGens.valueAt(lIdx);
149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
14940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    mWaveGens.clear();
14950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}
14960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
14970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent////////////////////////////////////////////////////////////////////////////////
14980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//
14990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//    Method:       ToneGenerator::getToneForRegion()
15000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//
15010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//    Description:  Get correct ringtone type according to current region.
15020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//      The corrected ring tone type is the tone descriptor index in sToneDescriptors[].
15030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//
15040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//    Input:
15050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//        none
15060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//
15070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//    Output:
15080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//        none
15090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//
15100b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent////////////////////////////////////////////////////////////////////////////////
15113d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn KastenToneGenerator::tone_type ToneGenerator::getToneForRegion(tone_type toneType) {
15123d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten    tone_type regionTone;
15130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
15140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) {
15150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent        regionTone = toneType;
15160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    } else {
15173d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten        regionTone = (tone_type) sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE];
15180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    }
15190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
15203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone);
15210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent
15220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent    return regionTone;
152389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
152489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
152589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
152689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
152789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//                WaveGenerator::WaveGenerator class    Implementation
152889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ----------------------------
153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        WaveGenerator::WaveGenerator()
153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Constructor.
153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        samplingRate:    Output sampling rate in Hz
154089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        frequency:       Frequency of the sine wave to generate in Hz
154189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        volume:          volume (0.0 to 1.0)
154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
154489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
154689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
1547b53dae6ea693561cd5e3dae1ec112949cb079b2cGlenn KastenToneGenerator::WaveGenerator::WaveGenerator(uint32_t samplingRate,
154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        unsigned short frequency, float volume) {
154989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    double d0;
155089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    double F_div_Fs;  // frequency / samplingRate
155189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
155289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    F_div_Fs = frequency / (double)samplingRate;
155389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs);
155489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mS2_0 = (short)d0;
155589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mS1 = 0;
155689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mS2 = mS2_0;
155789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
155889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP);
155989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // take some margin for amplitude fluctuation
156089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mAmplitude_Q15 > 32500)
156189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mAmplitude_Q15 = 32500;
156289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
156389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    d0 = 32768.0 * cos(2 * M_PI * F_div_Fs);  // Q14*2*cos()
156489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (d0 > 32767)
156589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        d0 = 32767;
156689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mA1_Q14 = (short) d0;
156789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
156890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten    ALOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d",
156989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mA1_Q14, mS2_0, mAmplitude_Q15);
157089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
157189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
157289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
157389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
157489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        WaveGenerator::~WaveGenerator()
157589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
157689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Destructor.
157789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
157889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
157989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
158089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
158189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
158289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
158389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
158489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
158589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() {
158689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
158789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
158889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
158989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
159089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Method:        WaveGenerator::getSamples()
159189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
159289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Description:    Generates count samples of a sine wave and accumulates
159389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        result in outBuffer.
159489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
159589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Input:
159689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        outBuffer:      Output buffer where to accumulate samples.
159789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        count:          number of samples to produce.
159889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        command:        special action requested (see enum gen_command).
159989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
160089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//    Output:
160189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//        none
160289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//
160389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
160489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer,
160589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        unsigned int count, unsigned int command) {
160689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    long lS1, lS2;
160789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    long lA1, lAmplitude;
160889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    long Sample;  // current sample
160989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
161089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // init local
161189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (command == WAVEGEN_START) {
161289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lS1 = (long)0;
161389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lS2 = (long)mS2_0;
161489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
1615b29385110c3f6a52e209c0e1cf70e9cf2eed5e89Eric Laurent        lS1 = mS1;
1616b29385110c3f6a52e209c0e1cf70e9cf2eed5e89Eric Laurent        lS2 = mS2;
161789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
161889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    lA1 = (long)mA1_Q14;
161989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    lAmplitude = (long)mAmplitude_Q15;
162089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
162189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (command == WAVEGEN_STOP) {
162289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        lAmplitude <<= 16;
162389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (count == 0) {
162489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return;
162589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
162689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        long dec = lAmplitude/count;
162789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // loop generation
16286f5a43f495b7d633c21ca4eb74956b71658c0c5dChad Brubaker        while (count) {
16296f5a43f495b7d633c21ca4eb74956b71658c0c5dChad Brubaker            count--;
163089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            Sample = ((lA1 * lS1) >> S_Q14) - lS2;
163189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // shift delay
163289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lS2 = lS1;
163389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lS1 = Sample;
163489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            Sample = ((lAmplitude>>16) * Sample) >> S_Q15;
163589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *(outBuffer++) += (short)Sample;  // put result in buffer
163689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lAmplitude -= dec;
163789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
163889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
163989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // loop generation
16406f5a43f495b7d633c21ca4eb74956b71658c0c5dChad Brubaker        while (count) {
16416f5a43f495b7d633c21ca4eb74956b71658c0c5dChad Brubaker            count--;
164289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            Sample = ((lA1 * lS1) >> S_Q14) - lS2;
164389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // shift delay
164489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lS2 = lS1;
164589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            lS1 = Sample;
164689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            Sample = (lAmplitude * Sample) >> S_Q15;
164789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            *(outBuffer++) += (short)Sample;  // put result in buffer
164889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
164989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
165089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
165189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    // save status
1652b29385110c3f6a52e209c0e1cf70e9cf2eed5e89Eric Laurent    mS1 = lS1;
1653b29385110c3f6a52e209c0e1cf70e9cf2eed5e89Eric Laurent    mS2 = lS2;
165489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
165589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
165689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}  // end namespace android
1657