ToneGenerator.cpp revision 981594f5c3697c3330bdbd4bb5a743fb9f01e6ab
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 <sys/resource.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Timers.h> 270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent#include <cutils/properties.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "media/ToneGenerator.h" 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details) 350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { 365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, 375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_0 405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, 415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_1 445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, 455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_2 485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, 495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_3 525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, 535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_4 565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, 575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_5 605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, 615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_6 645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, 655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_7 685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, 695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_8 725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, 735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_9 765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, 775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_S 805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, 815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_P 845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, 855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_A 885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, 895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_B 925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, 935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_C 965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, 975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_D 1005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, 1015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_DIAL 1045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, 1055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0}, 1065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_BUSY 1095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION 1145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_ACK 1185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, 1195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0}, 1205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_NOTAVAIL 1235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, 1245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0}, 1255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_ERROR 1285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 600, waveFreq: { 0 }, 0, 0 }, 1305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 1325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CALL_WAITING 1355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, 1365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RINGTONE 1405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP 1445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, 1455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 1, 1480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_ACK 1495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, 1505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_NACK 1535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_PROMPT 1575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP2 1635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0 }}, 1660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT 1685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT_ABBREV 1735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 1745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 1755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION_ABBREV 1785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 1795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONFIRM 1835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 1845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 3, 1870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_PIP 1885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, 1895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_DIAL_TONE_LITE 1925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 1935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_USA_RINGBACK 1975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_INTERCEPT 2025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 2035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 2045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_INTERCEPT 2075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_REORDER 2125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 7, 2165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_REORDER 2175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 2185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 2195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY 2225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 2235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 2265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CONFIRM 227981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { segments: { { duration: 500, waveFreq: { 660, 1000, 0 }, 0, 0 }, 228981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ANSWER 2315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 2325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_CALLWAITING 2355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 2365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 3, 2395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PIP 2405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 19, 0}, 2435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0}, 2445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 48, waveFreq: { 2556, 0}, 0, 0}, 2455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0}, 2465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0}}, 2475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL 2495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 0 }, 2515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 2535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 4 }, 2555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP 2605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 0 }, 2625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 4 }, 2665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI 2715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 2745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 }, 2755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0 }, 4, 0 }, 2765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 20, waveFreq: { 2091, 0 }, 0, 0 }, 2775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 } , 0, 0 } }, 2785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING 2805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 2835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 2865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 2895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 2915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 39, 0 }, 2925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_L 2965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 2975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 39, 0 }, 2985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_L 3025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 39, 0 }, 3045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_L 3085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 0 }, 3105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS 3145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 0 }, 3165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS 3205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 0 }, 3225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS 3265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 3285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 3315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 3345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SSL 3385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 3405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 3435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 3465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SSL 3505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 3525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 3555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 3585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SSL 3625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 3645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS_2 3715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 3735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 3765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS_2 3805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 3825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 3855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS_2 3895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 3915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 3975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SLS 4015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 4065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SLS 4135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 4185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SLS 4255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 4275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 3 }, 4305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 4335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 9 }, 4365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_S_X4 4405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 3 }, 4455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 9 }, 4515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_S_X4 4555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 3 }, 4605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 9 }, 4665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_S_X4 4705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 4725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_L 4765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 4785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_L 4825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 4845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_L 4885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 4905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 4915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 4935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SS 4975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 4995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SS 5065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SS 5155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 5235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SSL 5275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 5355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SSL 5395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 5475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SSL 5515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 3 }, 5565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SLS 5635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 3 }, 5685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 5715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SLS 5755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 3 }, 5805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 5835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SLS 5875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 9 }, 5985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 5995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_S_X4 6025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 6045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 6075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 6105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 9 }, 6135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_S_X4 6175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 6195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 6225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 6255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 9 }, 6285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_S_X4 6325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 740, 0 }, 0, 0 }, 6365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 622, 0 }, 0, 0 }, 6375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_NETWORK_LITE 6415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 659, 0 }, 2, 0 }, 6435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_AUTOREDIAL_LITE 6475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 }, 6485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ONE_MIN_BEEP 6515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 }, 6525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE 6555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 }, 6565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1175, 0 }, 0, 0 }, 6575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PRESSHOLDKEY_LITE 6605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 }, 6615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_INCALL_LITE 6715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 }, 6725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 10, waveFreq: { 0 }, 2, 0 }, 6735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4990, waveFreq: { 0 }, 0, 0 }, 6745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_EMERGENCY_RINGBACK 6775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 }, 6785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 0 }, 0, 0 }, 6795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 6815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_CALL_GUARD 6825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 }, 6835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 370, 0 }, 0, 0 }, 6845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SOFT_ERROR_LITE 6875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 }, 6885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1397, 0 }, 0, 0 }, 6895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 784, 0 }, 0, 0 }, 6905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALLDROP_LITE 6935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 }, 6955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 6965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY_ONE_SHOT 6995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 }, 7005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_ALERT 7035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SIGNAL_OFF 7065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 }, 7085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7100b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_DIAL 7115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 7125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_BUSY 7165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 7175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 7185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_CONGESTION 7215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 7225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 9700, waveFreq: { 0 }, 0, 0 }, 7235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 7255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 1 }, // TONE_ANSI_CALL_WAITING 7295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 7305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 7315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_RINGTONE 7345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 }, 7355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_DIAL 7385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 }, 7395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_BUSY 7435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 }, 7445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 7455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_RADIO_ACK 7485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 7530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type 7540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// to actual tone for current region. 7550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst unsigned char ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = { 7560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // ANSI 7570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_DIAL, // TONE_SUP_DIAL 7580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_BUSY, // TONE_SUP_BUSY 7590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CONGESTION, // TONE_SUP_CONGESTION 7600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK 7610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CALL_WAITING, // TONE_SUP_CALL_WAITING 7640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_RINGTONE // TONE_SUP_RINGTONE 7650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent }, 7660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // JAPAN 7670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_DIAL, // TONE_SUP_DIAL 7680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_BUSY, // TONE_SUP_BUSY 7690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION 7700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_RADIO_ACK, // TONE_SUP_RADIO_ACK 7710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING 7740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RINGTONE // TONE_SUP_RINGTONE 7750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 7760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ToneGenerator class Implementation 78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::ToneGenerator() 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. Initializes the tone sequencer, intantiates required sine wave 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// generators, instantiates output audio track. 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// streamType: Type of stream used for tone playback (enum AudioTrack::stream_type) 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume applied to tone (0.0 to 1.0) 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 80234f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric LaurentToneGenerator::ToneGenerator(int streamType, float volume, bool threadCanCallJava) { 80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator constructor: streamType=%d, volume=%f\n", streamType, volume); 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) { 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("Unable to marshal AudioFlinger"); 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 81234f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava = threadCanCallJava; 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType = streamType; 81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mVolume = volume; 81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = 0; 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpNewToneDesc = 0; 81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Generate tone by chunks of 20 ms to keep cadencing precision 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mProcessSize = (mSamplingRate * 20) / 1000; 82089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent char value[PROPERTY_VALUE_MAX]; 8220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent property_get("gsm.operator.iso-country", value, ""); 8230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (strcmp(value,"us") == 0 || 8240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent strcmp(value,"ca") == 0) { 8250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = ANSI; 8260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else if (strcmp(value,"jp") == 0) { 8270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = JAPAN; 8280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 8290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = CEPT; 8300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 8310b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (initAudioTrack()) { 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator INIT OK, time: %d\n", (unsigned int)(systemTime()/1000000)); 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("!!!ToneGenerator INIT FAILED!!!\n"); 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// 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::~ToneGenerator() 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. Stop sound playback and delete audio track if 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// needed and delete sine wave generators. 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::~ToneGenerator() { 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator destructor\n"); 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project stopTone(); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delete Track: %p\n", mpAudioTrack); 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 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// 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::startTone() 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Starts tone playback. 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 87385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// toneType: Type of tone generated (values in enum tone_type) 87485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// durationMs: The tone duration in milliseconds. If the tone is limited in time by definition, 87585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// the actual duration will be the minimum of durationMs and the defined tone duration. 87685fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// Ommiting or setting durationMs to -1 does not limit tone duration. 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 88285fa14d35468acca07ce0085d67b909f673fae07Eric Laurentbool ToneGenerator::startTone(int toneType, int durationMs) { 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lResult = false; 884e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent status_t lStatus; 88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8864afdfa7fd7e9fe59fb298ef2ac252686e68bc73aDave Sparks if ((toneType < 0) || (toneType >= NUM_TONES)) 88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_IDLE) { 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("startTone: try to re-init AudioTrack"); 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!initAudioTrack()) { 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("startTone\n"); 89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Get descriptor for requested tone 9010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent toneType = getToneForRegion(toneType); 9020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mpNewToneDesc = &sToneDescriptors[toneType]; 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 904e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mDurationMs = durationMs; 905e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 906e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mState == TONE_STOPPED) { 907e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent LOGV("Start waiting for previous tone to stop"); 908a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 909e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (lStatus != NO_ERROR) { 910e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent LOGE("--- start wait for stop timed out, status %d", lStatus); 911e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mState = TONE_IDLE; 912a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent mLock.unlock(); 913e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent return lResult; 91485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91585fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91685fa14d35468acca07ce0085d67b909f673fae07Eric Laurent 91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_INIT) { 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (prepareWave()) { 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Immediate start, time %d\n", (unsigned int)(systemTime()/1000000)); 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STARTING; 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->start(); 92489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_STARTING) { 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Wait for start callback"); 927a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9288365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus != NO_ERROR) { 9298365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project LOGE("--- Immediate start timed out, status %d", lStatus); 93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = false; 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9355a22b909c9e8fc0d9321dcc014706a790b26b971Eric Laurent mState = TONE_IDLE; 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delayed start\n"); 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_RESTARTING; 940a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9418365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus == NO_ERROR) { 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState != TONE_IDLE) { 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("cond received"); 94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9478365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project LOGE("--- Delayed start timed out, status %d", lStatus); 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV_IF(lResult, "Tone started, time %d\n", (unsigned int)(systemTime()/1000000)); 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGW_IF(!lResult, "Tone start failed!!!, time %d\n", (unsigned int)(systemTime()/1000000)); 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::stopTone() 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Stops tone playback. 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::stopTone() { 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("stopTone"); 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) { 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STOPPING; 97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("waiting cond"); 979a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus == NO_ERROR) { 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000)); 98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("--- Stop timed out"); 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->stop(); 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- private methods --------------------------- 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// 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::initAudioTrack() 100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Allocates and configures AudioTrack used for PCM output. 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::initAudioTrack() { 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Open audio track in mono, PCM 16bit, default sampling rate, default buffer size 102034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack = new AudioTrack(); 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack == 0) { 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("AudioTrack allocation failed"); 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Create Track: %p\n", mpAudioTrack); 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102734f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack->set(mStreamType, 102834f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 0, 102934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent AudioSystem::PCM_16_BIT, 103034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent AudioSystem::CHANNEL_OUT_MONO, 103134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 0, 103234f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 0, 103334f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent audioCallback, 103434f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent this, 103534f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 0, 103634f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 0, 103734f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava); 103834f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack->initCheck() != NO_ERROR) { 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("AudioTrack->initCheck failed"); 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->setVolume(mVolume, mVolume); 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_INIT; 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectinitAudioTrack_exit: 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Cleanup 105389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delete Track I: %p\n", mpAudioTrack); 105589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 106089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::audioCallback() 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: AudioTrack callback implementation. Generates a block of 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// PCM samples 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// and manages tone generator sequencer: tones pulses, tone duration... 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// user reference (pointer to our ToneGenerator) 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// info audio buffer descriptor 107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: always true. 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 107889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::audioCallback(int event, void* user, void *info) { 10805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (event != AudioTrack::EVENT_MORE_DATA) return; 10825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 1083824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project short *lpOut = buffer->i16; 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lNumSmp = buffer->size/sizeof(short); 10870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffer->size == 0) return; 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Clear output buffer: WaveGenerator accumulates into lpOut buffer 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memset(lpOut, 0, buffer->size); 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (lNumSmp) { 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize; 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lGenSmp; 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT; 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lSignal = false; 11005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.lock(); 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1103a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update pcm frame count and end time (current time at the end of this process) 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mTotalSmp += lReqSmp; 11065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 110789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update tone gen state machine and select wave gen command 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_PLAYING: 111089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_CONT; 111189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Starting Cbk"); 11145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_START; 111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Stop/restart Cbk"); 11205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 1124824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 1125824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent LOGV("Stopped Cbk"); 1126824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent goto audioCallback_EndLoop; 112789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Extra Cbk"); 112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto audioCallback_EndLoop; 113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Exit if tone sequence is over 113385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || 113485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { 113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mState == TONE_PLAYING) { 11365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mState = TONE_STOPPING; 113789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 113885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 113985fa14d35468acca07ce0085d67b909f673fae07Eric Laurent goto audioCallback_EndLoop; 114085fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 1141824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // fade out before stopping if maximum duration reached 114285fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_STOP; 114385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 114489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) { 114789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Time to go to next sequence segment 11485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("End Segment, time: %d\n", (unsigned int)(systemTime()/1000000)); 11505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; 11520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If segment, ON -> OFF transition : ramp volume down 11540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 115589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 11560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 11570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 11580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 11600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 11610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 11620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 11630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 116489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 116589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // check if we need to loop and loop for the reqd times 11685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx; 11755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause ++lpToneGen->mLoopCounter; 11765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // completed loop. go to next segment 11785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter = 0; 11795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 11805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 11875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Handle loop if last segment reached 11950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 119689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Last Seg: %d\n", lpToneGen->mCurSegment); 11975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 119889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Pre increment loop count and restart if total count not reached. Stop sequence otherwise 11990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) { 120089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Repeating Count: %d\n", lpToneGen->mCurCount); 12015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpToneGen->mCurSegment = lpToneDesc->repeatSegment; 12030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) { 12040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 12065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 120789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 120889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 121089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 12110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 121289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("End repeat, time: %d\n", (unsigned int)(systemTime()/1000000)); 121389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 121489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 121589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 121689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 12180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If next segment is not silent, OFF -> ON transition : reset wave generator 12190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 12210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent LOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 12220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 12230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 12240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 122589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The 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 122889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp 12290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000; 12305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Inside a segment keep tone ON or OFF 12330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) { 123489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = 0; // If odd segment, tone is currently OFF 123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 123689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; // If event segment, tone is currently ON 123789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 124089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lGenSmp) { 124189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If samples must be generated, call all active wave generators and acumulate waves in lpOut 12420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 12430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 12445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 12460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 124789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 12480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 124989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 125089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp -= lReqSmp; 125389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpOut += lReqSmp; 12545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectaudioCallback_EndLoop: 12565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 125889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 125989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Cbk restarting track\n"); 126089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->prepareWave()) { 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_STARTING; 1262c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent // must reload lpToneDesc as prepareWave() may change mpToneDesc 1263c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent lpToneDesc = lpToneGen->mpToneDesc; 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 126589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGW("Cbk restarting prepareWave() failed\n"); 126689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_IDLE; 126789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 126889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 126989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 127089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 127189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 127289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 127389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 1274824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent LOGV("Cbk Stopping\n"); 1275824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lpToneGen->mState = TONE_STOPPED; 1276824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1277824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1278824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent break; 1279824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 128089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_INIT; 1281824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent LOGV("Cbk Stopped track\n"); 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 128389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 128489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 1285824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 1286824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lSignal = true; 128789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 128889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 128989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Cbk starting track\n"); 129089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_PLAYING; 129189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 129289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 1293824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_PLAYING: 1294824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent break; 129589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 1296824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1297824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1298824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 129989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 130089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 130189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lSignal) 130389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mWaitCbkCond.signal(); 130489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.unlock(); 130589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 130689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 130989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 131089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::prepareWave() 131289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 131389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Prepare wave generators and reset tone sequencer state machine. 13140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// mpNewToneDesc must have been initialized before calling this function. 131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 131689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 131789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 131889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 131989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: true if wave generators have been created, false otherwise 132089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 132189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::prepareWave() { 13230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int segmentIdx = 0; 132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!mpNewToneDesc) { 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 132989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Remove existing wave generators if any 133089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 133189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = mpNewToneDesc; 133389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1334e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs == -1) { 1335e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = TONEGEN_INF; 1336e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1337e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) { 1338e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs / 1000) * mSamplingRate; 1339e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1340e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs * mSamplingRate) / 1000; 1341e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 1342e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent LOGV("prepareWave, duration limited to %d ms", mDurationMs); 1343e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 1344e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 13450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].duration) { 13460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Get total number of sine waves: needed to adapt sine wave gain. 13470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lNumWaves = numWaves(segmentIdx); 13480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int freqIdx = 0; 13490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx]; 13500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (frequency) { 13510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Instantiate a wave generator if ot already done for this frequency 13520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) { 13530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent ToneGenerator::WaveGenerator *lpWaveGen = 13540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent new ToneGenerator::WaveGenerator((unsigned short)mSamplingRate, 13550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency, 13560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONEGEN_GAIN/lNumWaves); 13570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpWaveGen == 0) { 13580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent goto prepareWave_exit; 13590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.add(frequency, lpWaveGen); 13610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx]; 136389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent segmentIdx++; 136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Initialize tone sequencer 136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTotalSmp = 0; 136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurSegment = 0; 137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurCount = 0; 13715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause mLoopCounter = 0; 13720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[0].duration == TONEGEN_INF) { 13730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = TONEGEN_INF; 13740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else{ 13750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000; 13760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 137789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 137889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 137989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectprepareWave_exit: 138189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 138389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 138589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 138689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 138889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 138989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 139089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::numWaves() 139189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 13920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF). 139389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 139489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 13950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// segmentIdx tone segment index 139689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 139789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 139889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: nummber of sine waves 139989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 140089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) { 140289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lCnt = 0; 140389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[segmentIdx].duration) { 14050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) { 14060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lCnt++; 14070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 140889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lCnt++; 140989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 141089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lCnt; 141289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 141389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 141689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::clearWaveGens() 141889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Removes all wave generators. 142089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 142289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 142389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 142889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::clearWaveGens() { 142989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Clearing mWaveGens:"); 143089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14310b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) { 14320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent delete mWaveGens.valueAt(lIdx); 143389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.clear(); 14350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent} 14360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Method: ToneGenerator::getToneForRegion() 14400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Get correct ringtone type according to current region. 14420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// The corrected ring tone type is the tone descriptor index in sToneDescriptors[]. 14430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14440b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Input: 14450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Output: 14480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentint ToneGenerator::getToneForRegion(int toneType) { 14520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent int regionTone; 14530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) { 14550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = toneType; 14560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 14570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE]; 14580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 14590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent LOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone); 14610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent return regionTone; 146389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 146489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 146589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 146689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 146789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// WaveGenerator::WaveGenerator class Implementation 146889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 146989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 147189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::WaveGenerator() 147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. 147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 147989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// samplingRate: Output sampling rate in Hz 148089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// frequency: Frequency of the sine wave to generate in Hz 148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume (0.0 to 1.0) 148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::WaveGenerator(unsigned short samplingRate, 148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned short frequency, float volume) { 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double d0; 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double F_div_Fs; // frequency / samplingRate 149189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project F_div_Fs = frequency / (double)samplingRate; 149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs); 149489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2_0 = (short)d0; 149589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = 0; 149689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = mS2_0; 149789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP); 149989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // take some margin for amplitude fluctuation 150089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAmplitude_Q15 > 32500) 150189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = 32500; 150289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 150389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos() 150489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d0 > 32767) 150589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32767; 150689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14 = (short) d0; 150789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 150889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d\n", 150989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14, mS2_0, mAmplitude_Q15); 151089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 151189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 151289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 151389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::~WaveGenerator() 151589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. 151789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 151889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 151989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 152089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 152189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 152289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 152389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 152489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 152589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() { 152689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 152789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 152889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::getSamples() 153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Generates count samples of a sine wave and accumulates 153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// result in outBuffer. 153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// outBuffer: Output buffer where to accumulate samples. 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// count: number of samples to produce. 153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// command: special action requested (see enum gen_command). 153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 154089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 154189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 154489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer, 154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int count, unsigned int command) { 154689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lS1, lS2; 154789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lA1, lAmplitude; 154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long Sample; // current sample 154989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 155089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init local 155189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_START) { 155289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)0; 155389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2_0; 155489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 155589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)mS1; 155689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2; 155789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 155889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lA1 = (long)mA1_Q14; 155989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude = (long)mAmplitude_Q15; 156089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 156189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_STOP) { 156289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude <<= 16; 156389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (count == 0) { 156489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 156589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 156689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long dec = lAmplitude/count; 156789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 156889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 156989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 157089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 157189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 157289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 157389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lAmplitude>>16) * Sample) >> S_Q15; 157489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 157589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude -= dec; 157689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 157789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 157889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 157989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 158089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 158189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 158289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 158389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 158489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = (lAmplitude * Sample) >> S_Q15; 158589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 158689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 158789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 158889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 158989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // save status 159089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = (short)lS1; 159189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = (short)lS2; 159289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 159389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 159489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android 159589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1596