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#include <utils/threads.h> 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdio.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <math.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Timers.h> 260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent#include <cutils/properties.h> 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "media/ToneGenerator.h" 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details) 340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { 355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, 365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_0 395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, 405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_1 435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, 445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_2 475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, 485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_3 515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, 525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_4 555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, 565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_5 595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, 605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_6 635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, 645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_7 675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, 685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_8 715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, 725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_9 755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, 765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_S 795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, 805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_P 835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, 845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_A 875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, 885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_B 915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, 925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_C 955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, 965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_D 995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, 1005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_DIAL 1035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, 1045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0}, 1055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_BUSY 1085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION 1135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_ACK 1175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, 1185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0}, 1195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_NOTAVAIL 1225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, 1235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0}, 1245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_ERROR 1275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 600, waveFreq: { 0 }, 0, 0 }, 1295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 1315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CALL_WAITING 1345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, 1355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RINGTONE 1395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP 1435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, 1445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 1, 1470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_ACK 1485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, 1495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_NACK 1525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_PROMPT 1565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP2 1625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0 }}, 1650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT 1675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT_ABBREV 1725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 1735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 1745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION_ABBREV 1775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 1785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONFIRM 1825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 1835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 3, 1860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_PIP 1875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, 1885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_DIAL_TONE_LITE 1915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 1925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_USA_RINGBACK 1965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_INTERCEPT 2015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 2025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 2035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_INTERCEPT 2065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_REORDER 2115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 7, 2155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_REORDER 2165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 2175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 2185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY 2215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 2225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 2255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CONFIRM 226981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { segments: { { duration: 500, waveFreq: { 660, 1000, 0 }, 0, 0 }, 227981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ANSWER 2305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 2315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_CALLWAITING 2345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 2355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 3, 2385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PIP 2395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 19, 0}, 2425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0}, 2435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 48, waveFreq: { 2556, 0}, 0, 0}, 2445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0}, 2455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0}}, 2465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL 2485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 0 }, 2505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 2525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 4 }, 2545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP 2595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 0 }, 2615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 4 }, 2655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI 2705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 271e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten repeatCnt: 0, 272e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 2735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 }, 2745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0 }, 4, 0 }, 2755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 20, waveFreq: { 2091, 0 }, 0, 0 }, 2765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 } , 0, 0 } }, 2775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING 2795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 2825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 2855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 2885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 2905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 39, 0 }, 2915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_L 2955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 2965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 39, 0 }, 2975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_L 3015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 39, 0 }, 3035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_L 3075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 0 }, 3095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS 3135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 0 }, 3155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS 3195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 0 }, 3215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS 3255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 3275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 3305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 3335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SSL 3375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 3395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 3425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 3455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SSL 3495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 3515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 3545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 3575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SSL 3615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 3635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS_2 3705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 3725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 3755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS_2 3795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 3815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 3845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS_2 3885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 3905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 3965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SLS 4005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 4055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SLS 4125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 4175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SLS 4245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 4265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 3 }, 4295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 4325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 9 }, 4355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_S_X4 4395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 3 }, 4445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 9 }, 4505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_S_X4 4545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 3 }, 4595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 9 }, 4655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_S_X4 4695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 4715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_L 4755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 4775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_L 4815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 4835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_L 4875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 4895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 4905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 4925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SS 4965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 4985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 4995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SS 5055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SS 5145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 5225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SSL 5265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 5345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SSL 5385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 5465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SSL 5505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 3 }, 5555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SLS 5625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 3 }, 5675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 5705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SLS 5745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 3 }, 5795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 5825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SLS 5865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 9 }, 5975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 5985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_S_X4 6015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 6035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 6065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 6095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 9 }, 6125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_S_X4 6165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 6185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 6215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 6245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 9 }, 6275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_S_X4 6315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 740, 0 }, 0, 0 }, 6355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 622, 0 }, 0, 0 }, 6365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_NETWORK_LITE 6405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 659, 0 }, 2, 0 }, 6425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_AUTOREDIAL_LITE 6465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 }, 6475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ONE_MIN_BEEP 6505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 }, 6515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE 6545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 }, 6555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1175, 0 }, 0, 0 }, 6565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PRESSHOLDKEY_LITE 6595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 }, 6605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_INCALL_LITE 6705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 }, 6715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 10, waveFreq: { 0 }, 2, 0 }, 6725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4990, waveFreq: { 0 }, 0, 0 }, 6735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_EMERGENCY_RINGBACK 6765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 }, 6775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 0 }, 0, 0 }, 6785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 6805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_CALL_GUARD 6815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 }, 6825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 370, 0 }, 0, 0 }, 6835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SOFT_ERROR_LITE 6865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 }, 6875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1397, 0 }, 0, 0 }, 6885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 784, 0 }, 0, 0 }, 6895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALLDROP_LITE 6925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 }, 6945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 6955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY_ONE_SHOT 6985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 }, 6995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_ALERT 7025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SIGNAL_OFF 7055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 }, 7075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_DIAL 7105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 7115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_BUSY 7155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 7165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 7175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_CONGESTION 7205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 7215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 9700, waveFreq: { 0 }, 0, 0 }, 7225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 7245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 1 }, // TONE_ANSI_CALL_WAITING 7285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 7295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 7305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7310b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_RINGTONE 7335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 }, 7345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_DIAL 7375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 }, 7385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_BUSY 7425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 }, 7435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 7445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_RADIO_ACK 7475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 7520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type 7530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// to actual tone for current region. 7543d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenconst unsigned char /*tone_type*/ ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = { 7550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // ANSI 7560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_DIAL, // TONE_SUP_DIAL 7570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_BUSY, // TONE_SUP_BUSY 7580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CONGESTION, // TONE_SUP_CONGESTION 7590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK 7600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CALL_WAITING, // TONE_SUP_CALL_WAITING 7630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_RINGTONE // TONE_SUP_RINGTONE 7640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent }, 7650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // JAPAN 7660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_DIAL, // TONE_SUP_DIAL 7670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_BUSY, // TONE_SUP_BUSY 7680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION 7690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_RADIO_ACK, // TONE_SUP_RADIO_ACK 7700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING 7730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RINGTONE // TONE_SUP_RINGTONE 7740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 7750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ToneGenerator class Implementation 78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::ToneGenerator() 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. Initializes the tone sequencer, intantiates required sine wave 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// generators, instantiates output audio track. 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 79499e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten// streamType: Type of stream used for tone playback 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume applied to tone (0.0 to 1.0) 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 801fff6d715a8db0daf08a50634f242c40268de3d49Glenn KastenToneGenerator::ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava) { 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator constructor: streamType=%d, volume=%f", streamType, volume); 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) { 80829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Unable to marshal AudioFlinger"); 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 81134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava = threadCanCallJava; 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType = streamType; 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mVolume = volume; 814a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpAudioTrack = NULL; 815a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpToneDesc = NULL; 816a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpNewToneDesc = NULL; 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Generate tone by chunks of 20 ms to keep cadencing precision 81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mProcessSize = (mSamplingRate * 20) / 1000; 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent char value[PROPERTY_VALUE_MAX]; 8210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent property_get("gsm.operator.iso-country", value, ""); 8220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (strcmp(value,"us") == 0 || 8230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent strcmp(value,"ca") == 0) { 8240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = ANSI; 8250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else if (strcmp(value,"jp") == 0) { 8260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = JAPAN; 8270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 8280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = CEPT; 8290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 8300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (initAudioTrack()) { 83290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator INIT OK, time: %d", (unsigned int)(systemTime()/1000000)); 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 83490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("!!!ToneGenerator INIT FAILED!!!"); 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::~ToneGenerator() 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. Stop sound playback and delete audio track if 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// needed and delete sine wave generators. 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::~ToneGenerator() { 85690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator destructor"); 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 858a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (mpAudioTrack != NULL) { 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project stopTone(); 86090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Delete Track: %p", mpAudioTrack); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::startTone() 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Starts tone playback. 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 87285fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// toneType: Type of tone generated (values in enum tone_type) 87385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// durationMs: The tone duration in milliseconds. If the tone is limited in time by definition, 87485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// the actual duration will be the minimum of durationMs and the defined tone duration. 87585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// Ommiting or setting durationMs to -1 does not limit tone duration. 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 8813d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenbool ToneGenerator::startTone(tone_type toneType, int durationMs) { 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lResult = false; 883e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent status_t lStatus; 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8854afdfa7fd7e9fe59fb298ef2ac252686e68bc73aDave Sparks if ((toneType < 0) || (toneType >= NUM_TONES)) 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_IDLE) { 8893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startTone: try to re-init AudioTrack"); 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!initAudioTrack()) { 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("startTone"); 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Get descriptor for requested tone 9000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent toneType = getToneForRegion(toneType); 9010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mpNewToneDesc = &sToneDescriptors[toneType]; 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 903e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mDurationMs = durationMs; 904e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 905e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mState == TONE_STOPPED) { 9063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Start waiting for previous tone to stop"); 907a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 908e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (lStatus != NO_ERROR) { 90929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- start wait for stop timed out, status %d", lStatus); 910e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mState = TONE_IDLE; 911a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent mLock.unlock(); 912e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent return lResult; 91385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_INIT) { 91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (prepareWave()) { 91890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Immediate start, time %d", (unsigned int)(systemTime()/1000000)); 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STARTING; 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->start(); 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_STARTING) { 9253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Wait for start callback"); 926a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9278365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus != NO_ERROR) { 92829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Immediate start timed out, status %d", lStatus); 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = false; 93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9345a22b909c9e8fc0d9321dcc014706a790b26b971Eric Laurent mState = TONE_IDLE; 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 93790bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Delayed start"); 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_RESTARTING; 939a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9408365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus == NO_ERROR) { 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState != TONE_IDLE) { 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cond received"); 94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 94629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Delayed start timed out, status %d", lStatus); 94789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV_IF(lResult, "Tone started, time %d", (unsigned int)(systemTime()/1000000)); 95390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGW_IF(!lResult, "Tone start failed!!!, time %d", (unsigned int)(systemTime()/1000000)); 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::stopTone() 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Stops tone playback. 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::stopTone() { 9723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopTone"); 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) { 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STOPPING; 9773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("waiting cond"); 978a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus == NO_ERROR) { 9803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000)); 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 98229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Stop timed out"); 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->stop(); 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- private methods --------------------------- 99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::initAudioTrack() 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Allocates and configures AudioTrack used for PCM output. 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::initAudioTrack() { 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 1015a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpAudioTrack = NULL; 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1018e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten // Open audio track in mono, PCM 16bit, default sampling rate, default buffer size 101934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack = new AudioTrack(); 102090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Create Track: %p", mpAudioTrack); 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102234f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack->set(mStreamType, 10232120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // sampleRate 1024fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin AUDIO_FORMAT_PCM_16_BIT, 1025fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin AUDIO_CHANNEL_OUT_MONO, 10262120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // frameCount 102798f153091e8f4190b35b9ce15250f308baf4805cGlenn Kasten AUDIO_OUTPUT_FLAG_FAST, 102834f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent audioCallback, 10292120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten this, // user 10302120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // notificationFrames 10312120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // sharedBuffer 103234f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava); 103334f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack->initCheck() != NO_ERROR) { 103529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("AudioTrack->initCheck failed"); 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->setVolume(mVolume, mVolume); 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_INIT; 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectinitAudioTrack_exit: 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Cleanup 10489d1f02d74fd395ec4de6861147da289423f0ab6fGlenn Kasten if (mpAudioTrack != NULL) { 104990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Delete Track I: %p", mpAudioTrack); 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 1051a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpAudioTrack = NULL; 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::audioCallback() 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: AudioTrack callback implementation. Generates a block of 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// PCM samples 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// and manages tone generator sequencer: tones pulses, tone duration... 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// user reference (pointer to our ToneGenerator) 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// info audio buffer descriptor 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: always true. 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 1074d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kastenvoid ToneGenerator::audioCallback(int event, void* user, void *info) { 10755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (event != AudioTrack::EVENT_MORE_DATA) return; 10775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 1078824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project short *lpOut = buffer->i16; 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lNumSmp = buffer->size/sizeof(short); 10820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; 108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffer->size == 0) return; 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Clear output buffer: WaveGenerator accumulates into lpOut buffer 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memset(lpOut, 0, buffer->size); 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (lNumSmp) { 109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize; 109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lGenSmp; 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT; 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lSignal = false; 10955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.lock(); 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1098a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update pcm frame count and end time (current time at the end of this process) 110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mTotalSmp += lReqSmp; 11015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update tone gen state machine and select wave gen command 110389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_PLAYING: 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_CONT; 110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 11083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Starting Cbk"); 11095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_START; 111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 11143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stop/restart Cbk"); 11155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 1119824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 11203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stopped Cbk"); 1121824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent goto audioCallback_EndLoop; 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 11233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Extra Cbk"); 112489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto audioCallback_EndLoop; 112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Exit if tone sequence is over 112885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || 112985fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { 113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mState == TONE_PLAYING) { 11315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mState = TONE_STOPPING; 113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 113385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 113485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent goto audioCallback_EndLoop; 113585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 1136824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // fade out before stopping if maximum duration reached 113785fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_STOP; 113885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 113989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) { 114289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Time to go to next sequence segment 11435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("End Segment, time: %d", (unsigned int)(systemTime()/1000000)); 11455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; 11470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If segment, ON -> OFF transition : ramp volume down 11490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 115089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 11510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 11520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 11530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 11550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 11560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 11570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 11580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 115990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp); 116089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // check if we need to loop and loop for the reqd times 11635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 116590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d)", 11665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx; 11705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause ++lpToneGen->mLoopCounter; 11715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // completed loop. go to next segment 11735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter = 0; 11745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 117590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d)", 11765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 118290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d)", 11835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Handle loop if last segment reached 11900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 119190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Last Seg: %d", lpToneGen->mCurSegment); 11925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 119389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Pre increment loop count and restart if total count not reached. Stop sequence otherwise 11940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) { 119590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Repeating Count: %d", lpToneGen->mCurCount); 11965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpToneGen->mCurSegment = lpToneDesc->repeatSegment; 11980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) { 11990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 12015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 120290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment, 120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 120589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 12060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 120790bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("End repeat, time: %d", (unsigned int)(systemTime()/1000000)); 120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 120989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 121090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment, 121189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 12130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If next segment is not silent, OFF -> ON transition : reset wave generator 12140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 121690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp); 12170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 12180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 12190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 122089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The 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 122389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp 12240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000; 12255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 122789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Inside a segment keep tone ON or OFF 12280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) { 122989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = 0; // If odd segment, tone is currently OFF 123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; // If event segment, tone is currently ON 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lGenSmp) { 123689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If samples must be generated, call all active wave generators and acumulate waves in lpOut 12370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 12380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 12395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 12410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 124289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 12430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 124489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 124589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 124789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp -= lReqSmp; 124889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpOut += lReqSmp; 12495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectaudioCallback_EndLoop: 12515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 125389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 125490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk restarting track"); 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->prepareWave()) { 125689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_STARTING; 1257c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent // must reload lpToneDesc as prepareWave() may change mpToneDesc 1258c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent lpToneDesc = lpToneGen->mpToneDesc; 125989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 126090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGW("Cbk restarting prepareWave() failed"); 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_IDLE; 126289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 126389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 126589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 126689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 126789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 126889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 126990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk Stopping"); 1270824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lpToneGen->mState = TONE_STOPPED; 1271824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1272824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1273824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent break; 1274824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 127589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_INIT; 127690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk Stopped track"); 127789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 127889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 127989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 1280824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 1281824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lSignal = true; 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 128389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 128490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk starting track"); 128589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_PLAYING; 128689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 1287e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten break; 1288824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_PLAYING: 1289e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten break; 129089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 1291824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1292824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1293824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 129489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 129589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 129689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 129789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lSignal) 129889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mWaitCbkCond.signal(); 129989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.unlock(); 130089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 130189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 130289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 130589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 130689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::prepareWave() 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 130889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Prepare wave generators and reset tone sequencer state machine. 13090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// mpNewToneDesc must have been initialized before calling this function. 131089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 131289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 131389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 131489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: true if wave generators have been created, false otherwise 131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 131689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 131789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::prepareWave() { 13180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int segmentIdx = 0; 131989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1320a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (mpNewToneDesc == NULL) { 132189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Remove existing wave generators if any 132589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = mpNewToneDesc; 132889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1329e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs == -1) { 1330e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = TONEGEN_INF; 1331e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1332e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) { 1333e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs / 1000) * mSamplingRate; 1334e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1335e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs * mSamplingRate) / 1000; 1336e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 13373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepareWave, duration limited to %d ms", mDurationMs); 1338e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 1339e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 13400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].duration) { 13410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Get total number of sine waves: needed to adapt sine wave gain. 13420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lNumWaves = numWaves(segmentIdx); 13430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int freqIdx = 0; 13440b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx]; 13450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (frequency) { 13460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Instantiate a wave generator if ot already done for this frequency 13470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) { 13480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent ToneGenerator::WaveGenerator *lpWaveGen = 13490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent new ToneGenerator::WaveGenerator((unsigned short)mSamplingRate, 13500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency, 13510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONEGEN_GAIN/lNumWaves); 13520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.add(frequency, lpWaveGen); 13530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx]; 135589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent segmentIdx++; 135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 135889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Initialize tone sequencer 136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTotalSmp = 0; 136189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurSegment = 0; 136289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurCount = 0; 13635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause mLoopCounter = 0; 13640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[0].duration == TONEGEN_INF) { 13650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = TONEGEN_INF; 13660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else{ 13670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000; 13680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 137189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 137289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 137589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 137689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::numWaves() 137789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 13780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF). 137989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 138089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 13810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// segmentIdx tone segment index 138289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 138389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 138489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: nummber of sine waves 138589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 138689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 13870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) { 138889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lCnt = 0; 138989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[segmentIdx].duration) { 13910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) { 13920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lCnt++; 13930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 139489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lCnt++; 139589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 139689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 139789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lCnt; 139889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 139989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 140289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 140389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::clearWaveGens() 140489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 140589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Removes all wave generators. 140689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 140789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 140889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 140989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 141189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 141289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 141489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::clearWaveGens() { 14153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Clearing mWaveGens:"); 141689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) { 14180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent delete mWaveGens.valueAt(lIdx); 141989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.clear(); 14210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent} 14220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Method: ToneGenerator::getToneForRegion() 14260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Get correct ringtone type according to current region. 14280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// The corrected ring tone type is the tone descriptor index in sToneDescriptors[]. 14290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Input: 14310b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Output: 14340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14373d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn KastenToneGenerator::tone_type ToneGenerator::getToneForRegion(tone_type toneType) { 14383d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten tone_type regionTone; 14390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) { 14410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = toneType; 14420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 14433d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten regionTone = (tone_type) sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE]; 14440b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 14450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone); 14470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent return regionTone; 144989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 145089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 145389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// WaveGenerator::WaveGenerator class Implementation 145489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 145589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 145789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 145989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::WaveGenerator() 146189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. 146389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 146589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// samplingRate: Output sampling rate in Hz 146689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// frequency: Frequency of the sine wave to generate in Hz 146789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume (0.0 to 1.0) 146889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 147089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 147189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::WaveGenerator(unsigned short samplingRate, 147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned short frequency, float volume) { 147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double d0; 147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double F_div_Fs; // frequency / samplingRate 147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project F_div_Fs = frequency / (double)samplingRate; 147989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs); 148089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2_0 = (short)d0; 148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = 0; 148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = mS2_0; 148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP); 148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // take some margin for amplitude fluctuation 148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAmplitude_Q15 > 32500) 148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = 32500; 148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos() 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d0 > 32767) 149189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32767; 149289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14 = (short) d0; 149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d", 149589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14, mS2_0, mAmplitude_Q15); 149689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 149789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 149989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::~WaveGenerator() 150189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. 150389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 150589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 150689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 150889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 150989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 151189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() { 151289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 151389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 151489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 151589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::getSamples() 151789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Generates count samples of a sine wave and accumulates 151989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// result in outBuffer. 152089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 152189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 152289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// outBuffer: Output buffer where to accumulate samples. 152389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// count: number of samples to produce. 152489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// command: special action requested (see enum gen_command). 152589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 152689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 152789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 152889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer, 153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int count, unsigned int command) { 153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lS1, lS2; 153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lA1, lAmplitude; 153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long Sample; // current sample 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init local 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_START) { 153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)0; 153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2_0; 154089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 154189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)mS1; 154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2; 154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 154489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lA1 = (long)mA1_Q14; 154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude = (long)mAmplitude_Q15; 154689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 154789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_STOP) { 154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude <<= 16; 154989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (count == 0) { 155089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 155189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 155289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long dec = lAmplitude/count; 155389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 155489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 155589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 155689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 155789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 155889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 155989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lAmplitude>>16) * Sample) >> S_Q15; 156089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 156189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude -= dec; 156289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 156389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 156489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 156589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 156689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 156789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 156889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 156989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 157089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = (lAmplitude * Sample) >> S_Q15; 157189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 157289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 157389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 157489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 157589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // save status 157689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = (short)lS1; 157789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = (short)lS2; 157889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 157989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 158089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android 1581