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