ToneGenerator.cpp revision 2799d743ee2ae5a25fe869a7f9c052acc029559f
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "ToneGenerator" 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/threads.h> 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdio.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <math.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Timers.h> 260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent#include <cutils/properties.h> 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "media/ToneGenerator.h" 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details) 340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { 355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, 365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_0 395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, 405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_1 435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, 445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_2 475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, 485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_3 515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, 525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_4 555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, 565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_5 595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, 605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_6 635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, 645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_7 675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, 685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_8 715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, 725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_9 755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, 765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_S 795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, 805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_P 835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, 845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_A 875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, 885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_B 915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, 925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_C 955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, 965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_D 995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, 1005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_DIAL 1035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, 1045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0}, 1055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_BUSY 1085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION 1135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1150b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_ACK 1175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, 1185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0}, 1195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_NOTAVAIL 1225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, 1235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0}, 1245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_ERROR 1275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 600, waveFreq: { 0 }, 0, 0 }, 1295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 1315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CALL_WAITING 1345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, 1355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1370b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RINGTONE 1395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP 1435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, 1445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 1, 1470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_ACK 1485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, 1495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_NACK 1525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_PROMPT 1565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP2 1625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0 }}, 1650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT 1675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT_ABBREV 1725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 1735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 1745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION_ABBREV 1775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 1785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONFIRM 1825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 1835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 3, 1860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_PIP 1875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, 1885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_DIAL_TONE_LITE 1915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 1925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_USA_RINGBACK 1965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_INTERCEPT 2015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 2025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 2035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_INTERCEPT 2065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_REORDER 2115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 7, 2155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_REORDER 2165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 2175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 2185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY 2215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 2225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 2255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CONFIRM 226981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { segments: { { duration: 500, waveFreq: { 660, 1000, 0 }, 0, 0 }, 227981594f5c3697c3330bdbd4bb5a743fb9f01e6abNaveen Kalla { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ANSWER 2305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 2315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_CALLWAITING 2345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 2355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 3, 2385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PIP 2395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 19, 0}, 2425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0}, 2435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 48, waveFreq: { 2556, 0}, 0, 0}, 2445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0}, 2455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0}}, 2465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL 2485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 0 }, 2505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 2525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 4 }, 2545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP 2595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 0 }, 2615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 2645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 4 }, 2655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 2665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 2675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI 2705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 271e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten repeatCnt: 0, 272e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 2735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 }, 2745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 64, waveFreq: { 2556, 0 }, 4, 0 }, 2755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 20, waveFreq: { 2091, 0 }, 0, 0 }, 2765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 } , 0, 0 } }, 2775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING 2795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 2825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 2855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 2865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 2885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 2895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 2905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 39, 0 }, 2915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_L 2955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 2965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 39, 0 }, 2975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 2985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 2995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_L 3015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 39, 0 }, 3035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_L 3075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 0 }, 3095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 3115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS 3135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 0 }, 3155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS 3195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 0 }, 3215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 3225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS 3255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 3275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 3305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 3335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SSL 3375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 3395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 3425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 3455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SSL 3495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 3515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 3545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 3555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 3575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 3585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SSL 3615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 3635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS_2 3705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 3725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 3745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 3755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS_2 3795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 3815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 3825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 3835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 3845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS_2 3885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 3905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 3935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 3945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 3955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 3965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 3975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 3985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 3995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SLS 4005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 4055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SLS 4125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 4175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 4215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SLS 4245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 4265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 3 }, 4295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 4325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 9 }, 4355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_S_X4 4395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 4415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 3 }, 4445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 4475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 9 }, 4505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_S_X4 4545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 4565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 3 }, 4595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 4625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 4635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 9 }, 4655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 4665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_S_X4 4695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 4715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_L 4755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 4775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_L 4815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 4825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 4835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_L 4875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 4895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 4905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 4915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 4925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 4935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 4945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 4955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SS 4965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 4975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 4985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 4995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SS 5055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 5115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SS 5145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 5225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SSL 5265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 5315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 5345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SSL 5385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 5435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 5465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SSL 5505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 3 }, 5555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SLS 5625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 5645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 3 }, 5675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 5695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 5705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SLS 5745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 5765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 3 }, 5795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 5815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 5825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 5835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 5855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SLS 5865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 5885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 5915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 5945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 5955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 5965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 9 }, 5975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 5985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 5995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_S_X4 6015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 6035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 6065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 6095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 6115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 9 }, 6125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_S_X4 6165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 6185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 6215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 6245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 6255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 6265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 9 }, 6275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 6285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_S_X4 6315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 740, 0 }, 0, 0 }, 6355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 622, 0 }, 0, 0 }, 6365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_NETWORK_LITE 6405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 659, 0 }, 2, 0 }, 6425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 6435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_AUTOREDIAL_LITE 6465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 }, 6475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ONE_MIN_BEEP 6505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 }, 6515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE 6545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 }, 6555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1175, 0 }, 0, 0 }, 6565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_PRESSHOLDKEY_LITE 6595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 }, 6605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6625e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 6645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 6665e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 6675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_INCALL_LITE 6705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 }, 6715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 10, waveFreq: { 0 }, 2, 0 }, 6725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4990, waveFreq: { 0 }, 0, 0 }, 6735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 6755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_EMERGENCY_RINGBACK 6765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 }, 6775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 0 }, 0, 0 }, 6785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 6805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_CALL_GUARD 6815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 }, 6825e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 370, 0 }, 0, 0 }, 6835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SOFT_ERROR_LITE 6865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 }, 6875e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 1397, 0 }, 0, 0 }, 6885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 125, waveFreq: { 784, 0 }, 0, 0 }, 6895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 6905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CALLDROP_LITE 6925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 6935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 }, 6945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 6955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 6965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 6975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY_ONE_SHOT 6985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 }, 6995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_ALERT 7025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }}, 7035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 7045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_SIGNAL_OFF 7055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 }, 7075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_DIAL 7105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 7115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_BUSY 7155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 7165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 7175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_CONGESTION 7205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 7215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 9700, waveFreq: { 0 }, 0, 0 }, 7225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 7245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 7255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 1 }, // TONE_ANSI_CALL_WAITING 7285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 7295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 7305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7310b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_ANSI_RINGTONE 7335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 }, 7345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_DIAL 7375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 }, 7385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 7395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7400b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_BUSY 7425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 }, 7435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 7445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 7450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 7460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_RADIO_ACK 7475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 7500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 7520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type 7530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// to actual tone for current region. 7543d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenconst unsigned char /*tone_type*/ ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = { 7550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // ANSI 7560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_DIAL, // TONE_SUP_DIAL 7570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_BUSY, // TONE_SUP_BUSY 7580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CONGESTION, // TONE_SUP_CONGESTION 7590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK 7600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_CALL_WAITING, // TONE_SUP_CALL_WAITING 7630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_ANSI_RINGTONE // TONE_SUP_RINGTONE 7640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent }, 7650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent { // JAPAN 7660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_DIAL, // TONE_SUP_DIAL 7670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_BUSY, // TONE_SUP_BUSY 7680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION 7690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_JAPAN_RADIO_ACK, // TONE_SUP_RADIO_ACK 7700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 7710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 7720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING 7730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONE_SUP_RINGTONE // TONE_SUP_RINGTONE 7740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 7750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent}; 7760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 77789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 77889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 77989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ToneGenerator class Implementation 78089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 78489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 78689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 78789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 78889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::ToneGenerator() 78989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. Initializes the tone sequencer, intantiates required sine wave 79189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// generators, instantiates output audio track. 79289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 79499e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten// streamType: Type of stream used for tone playback 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume applied to tone (0.0 to 1.0) 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 801fff6d715a8db0daf08a50634f242c40268de3d49Glenn KastenToneGenerator::ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava) { 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator constructor: streamType=%d, volume=%f", streamType, volume); 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) { 80829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Unable to marshal AudioFlinger"); 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 81134f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava = threadCanCallJava; 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType = streamType; 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mVolume = volume; 814a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpToneDesc = NULL; 815a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten mpNewToneDesc = NULL; 81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Generate tone by chunks of 20 ms to keep cadencing precision 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mProcessSize = (mSamplingRate * 20) / 1000; 81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent char value[PROPERTY_VALUE_MAX]; 8200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent property_get("gsm.operator.iso-country", value, ""); 8210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (strcmp(value,"us") == 0 || 8220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent strcmp(value,"ca") == 0) { 8230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = ANSI; 8240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else if (strcmp(value,"jp") == 0) { 8250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = JAPAN; 8260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 8270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = CEPT; 8280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 8290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 83089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (initAudioTrack()) { 83190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator INIT OK, time: %d", (unsigned int)(systemTime()/1000000)); 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 83390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("!!!ToneGenerator INIT FAILED!!!"); 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::~ToneGenerator() 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. Stop sound playback and delete audio track if 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// needed and delete sine wave generators. 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::~ToneGenerator() { 85590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ToneGenerator destructor"); 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8572799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten if (mpAudioTrack != 0) { 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project stopTone(); 8592799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten ALOGV("Delete Track: %p", mpAudioTrack.get()); 8602799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten mpAudioTrack.clear(); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::startTone() 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Starts tone playback. 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 87185fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// toneType: Type of tone generated (values in enum tone_type) 87285fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// durationMs: The tone duration in milliseconds. If the tone is limited in time by definition, 87385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// the actual duration will be the minimum of durationMs and the defined tone duration. 87485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent// Ommiting or setting durationMs to -1 does not limit tone duration. 87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 8803d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kastenbool ToneGenerator::startTone(tone_type toneType, int durationMs) { 88189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lResult = false; 882e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent status_t lStatus; 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8844afdfa7fd7e9fe59fb298ef2ac252686e68bc73aDave Sparks if ((toneType < 0) || (toneType >= NUM_TONES)) 88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8876eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent toneType = getToneForRegion(toneType); 8886eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent if (toneType == TONE_CDMA_SIGNAL_OFF) { 8896eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent return true; 8906eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent } 8916eb954f54e4a92b3c4bfbee177a3259d1320500dEric Laurent 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_IDLE) { 8933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startTone: try to re-init AudioTrack"); 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!initAudioTrack()) { 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 89689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("startTone"); 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Get descriptor for requested tone 9040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mpNewToneDesc = &sToneDescriptors[toneType]; 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 906e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mDurationMs = durationMs; 907e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 908e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mState == TONE_STOPPED) { 9093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Start waiting for previous tone to stop"); 910a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 911e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (lStatus != NO_ERROR) { 91229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- start wait for stop timed out, status %d", lStatus); 913e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mState = TONE_IDLE; 914a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent mLock.unlock(); 915e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent return lResult; 91685fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91785fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 91885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_INIT) { 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (prepareWave()) { 92190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Immediate start, time %d", (unsigned int)(systemTime()/1000000)); 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 92389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STARTING; 924681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent if (clock_gettime(CLOCK_MONOTONIC, &mStartTime) != 0) { 925681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent mStartTime.tv_sec = 0; 926681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->start(); 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 93089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_STARTING) { 9313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Wait for start callback"); 932a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9338365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus != NO_ERROR) { 93429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Immediate start timed out, status %d", lStatus); 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = false; 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9405a22b909c9e8fc0d9321dcc014706a790b26b971Eric Laurent mState = TONE_IDLE; 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 94390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Delayed start"); 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_RESTARTING; 945681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent mStartTime.tv_sec = 0; 946a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9478365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus == NO_ERROR) { 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState != TONE_IDLE) { 94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 9513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cond received"); 95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 95329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Delayed start timed out, status %d", lStatus); 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV_IF(lResult, "Tone started, time %d", (unsigned int)(systemTime()/1000000)); 96090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGW_IF(!lResult, "Tone start failed!!!, time %d", (unsigned int)(systemTime()/1000000)); 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::stopTone() 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Stops tone playback. 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::stopTone() { 9793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopTone"); 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 98209108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent if (mState != TONE_IDLE && mState != TONE_INIT) { 98309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) { 984681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent struct timespec stopTime; 985681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent // If the start time is valid, make sure that the number of audio samples produced 986681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent // corresponds at least to the time between the start and stop commands. 987681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent // This is needed in case of cold start of the output stream. 988a8eccec73a40d4afcff505eb463a016c89aeed42Eric Laurent if ((mStartTime.tv_sec != 0) && (clock_gettime(CLOCK_MONOTONIC, &stopTime) == 0)) { 989681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent time_t sec = stopTime.tv_sec - mStartTime.tv_sec; 990681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent long nsec = stopTime.tv_nsec - mStartTime.tv_nsec; 991681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent long durationMs; 992681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent if (nsec < 0) { 993681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent --sec; 994681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent nsec += 1000000000; 995681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } 996681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent 997681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent if ((sec + 1) > ((long)(INT_MAX / mSamplingRate))) { 998681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent mMaxSmp = sec * mSamplingRate; 999681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } else { 1000681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent // mSamplingRate is always > 1000 1001681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent sec = sec * 1000 + nsec / 1000000; // duration in milliseconds 1002a8eccec73a40d4afcff505eb463a016c89aeed42Eric Laurent mMaxSmp = (unsigned int)(((int64_t)sec * mSamplingRate) / 1000); 1003681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } 1004681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent ALOGV("stopTone() forcing mMaxSmp to %d, total for far %d", mMaxSmp, mTotalSmp); 1005681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } else { 1006681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent mState = TONE_STOPPING; 1007681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } 100809108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent } 10093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("waiting cond"); 1010a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus == NO_ERROR) { 101209108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent // If the tone was restarted exit now before calling clearWaveGens(); 101309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent if (mState != TONE_INIT) { 1014704455a5a6cd22f03bb8984e0c7f46108eb1afb7Eric Laurent mLock.unlock(); 101509108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent return; 101609108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent } 10173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000)); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 101929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("--- Stop timed out"); 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->stop(); 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 102309108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent clearWaveGens(); 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- private methods --------------------------- 103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::initAudioTrack() 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Allocates and configures AudioTrack used for PCM output. 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::initAudioTrack() { 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1049e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten // Open audio track in mono, PCM 16bit, default sampling rate, default buffer size 105034f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack = new AudioTrack(); 10512799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten ALOGV("Create Track: %p", mpAudioTrack.get()); 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 105334f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mpAudioTrack->set(mStreamType, 10542120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // sampleRate 1055fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin AUDIO_FORMAT_PCM_16_BIT, 1056fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin AUDIO_CHANNEL_OUT_MONO, 10572120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // frameCount 105898f153091e8f4190b35b9ce15250f308baf4805cGlenn Kasten AUDIO_OUTPUT_FLAG_FAST, 105934f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent audioCallback, 10602120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten this, // user 10612120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // notificationFrames 10622120fe5bd4e14b53d8bef4a220e8a32830cf8cf9Glenn Kasten 0, // sharedBuffer 106334f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent mThreadCanCallJava); 106434f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack->initCheck() != NO_ERROR) { 106629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("AudioTrack->initCheck failed"); 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1070b1c0993b215c5c3eebd1c6bafc22bba23d57a70bGlenn Kasten mpAudioTrack->setVolume(mVolume); 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_INIT; 107389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectinitAudioTrack_exit: 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 10782799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten ALOGV("Init failed: %p", mpAudioTrack.get()); 10792799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Cleanup 10812799d743ee2ae5a25fe869a7f9c052acc029559fGlenn Kasten mpAudioTrack.clear(); 108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::audioCallback() 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: AudioTrack callback implementation. Generates a block of 109289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// PCM samples 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// and manages tone generator sequencer: tones pulses, tone duration... 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// user reference (pointer to our ToneGenerator) 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// info audio buffer descriptor 109889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 109989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: always true. 110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 110289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 1103d217a8c4632b3e3065f8c2a26b9ce4dc4c97171fGlenn Kastenvoid ToneGenerator::audioCallback(int event, void* user, void *info) { 11045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 110589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (event != AudioTrack::EVENT_MORE_DATA) return; 11065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 1107824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); 110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project short *lpOut = buffer->i16; 111089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lNumSmp = buffer->size/sizeof(short); 11110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffer->size == 0) return; 111489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 111589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 111689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Clear output buffer: WaveGenerator accumulates into lpOut buffer 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memset(lpOut, 0, buffer->size); 111889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 111989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (lNumSmp) { 112089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize; 112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lGenSmp; 112289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT; 112389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lSignal = false; 11245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 112589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.lock(); 112689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1127a9a4390989072d579eedab6b71fb41248b3ad8feEric Laurent 112889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update pcm frame count and end time (current time at the end of this process) 112989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mTotalSmp += lReqSmp; 11305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update tone gen state machine and select wave gen command 113289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 113389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_PLAYING: 113489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_CONT; 113589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 113689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 11373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Starting Cbk"); 11385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 113989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_START; 114089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 114189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 114289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 11433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stop/restart Cbk"); 11445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 114589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 114689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 114789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 1148824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 11493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Stopped Cbk"); 1150824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent goto audioCallback_EndLoop; 115189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 11523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Extra Cbk"); 115389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto audioCallback_EndLoop; 115489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 115689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Exit if tone sequence is over 115785fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || 115885fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { 115989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mState == TONE_PLAYING) { 11605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mState = TONE_STOPPING; 116189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 116285fa14d35468acca07ce0085d67b909f673fae07Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 116385fa14d35468acca07ce0085d67b909f673fae07Eric Laurent goto audioCallback_EndLoop; 116485fa14d35468acca07ce0085d67b909f673fae07Eric Laurent } 1165824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // fade out before stopping if maximum duration reached 116685fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_STOP; 116785fa14d35468acca07ce0085d67b909f673fae07Eric Laurent lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 116889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 117089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) { 117189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Time to go to next sequence segment 11725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 117390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("End Segment, time: %d", (unsigned int)(systemTime()/1000000)); 11745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 117589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; 11760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If segment, ON -> OFF transition : ramp volume down 11780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 11800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 11810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 11820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 11840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 11850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 11860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 11870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 118890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp); 118989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // check if we need to loop and loop for the reqd times 11925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 119490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d)", 11955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx; 11995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause ++lpToneGen->mLoopCounter; 12005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 12015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // completed loop. go to next segment 12025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter = 0; 12035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 120490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d)", 12055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 12065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 12075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 12085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 12095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 12105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 121190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d)", 12125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 12135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 12145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 12155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 12170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 12180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Handle loop if last segment reached 12190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 122090bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Last Seg: %d", lpToneGen->mCurSegment); 12215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Pre increment loop count and restart if total count not reached. Stop sequence otherwise 12230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) { 122490bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Repeating Count: %d", lpToneGen->mCurCount); 12255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpToneGen->mCurSegment = lpToneDesc->repeatSegment; 12270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) { 12280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 12305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 123190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment, 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 123489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 12350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 123690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("End repeat, time: %d", (unsigned int)(systemTime()/1000000)); 123789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 123990bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("New segment %d, Next Time: %d", lpToneGen->mCurSegment, 124089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 12410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 12420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If next segment is not silent, OFF -> ON transition : reset wave generator 12430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 12440b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 124590bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp); 12460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 12470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 12480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 124989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The 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 125289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp 12530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000; 12545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 125689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Inside a segment keep tone ON or OFF 12570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) { 125889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = 0; // If odd segment, tone is currently OFF 125989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 126089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; // If event segment, tone is currently ON 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 126289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lGenSmp) { 126589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If samples must be generated, call all active wave generators and acumulate waves in lpOut 12660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 12670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 12685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 12700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 127189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 12720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 127389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 127489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 127689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp -= lReqSmp; 127789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpOut += lReqSmp; 12785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 127989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectaudioCallback_EndLoop: 12805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 128189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 128390bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk restarting track"); 128489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->prepareWave()) { 128589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_STARTING; 1286681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent if (clock_gettime(CLOCK_MONOTONIC, &lpToneGen->mStartTime) != 0) { 1287681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent lpToneGen->mStartTime.tv_sec = 0; 1288681be0398a06da7e24db4ed934a92af64d1409b1Eric Laurent } 1289c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent // must reload lpToneDesc as prepareWave() may change mpToneDesc 1290c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent lpToneDesc = lpToneGen->mpToneDesc; 129189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 129290bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGW("Cbk restarting prepareWave() failed"); 129389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_IDLE; 129489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 129589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 129689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 129789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 129889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 129989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 130089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 130190bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk Stopping"); 1302824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lpToneGen->mState = TONE_STOPPED; 1303824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1304824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1305824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent break; 1306824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_STOPPED: 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_INIT; 130890bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk Stopped track"); 130989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 131089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 1312824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 1313824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lSignal = true; 131489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 131589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 131690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("Cbk starting track"); 131789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_PLAYING; 131889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 1319e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten break; 1320824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent case TONE_PLAYING: 1321e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten break; 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 1323824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent // Force loop exit 1324824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent lNumSmp = 0; 1325824b6a4a67166c3937400702944f659bd0d5d386Eric Laurent buffer->size = 0; 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 132889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lSignal) 133009108adeca8cbbf3fbb21f8aea2a2ff250db9531Eric Laurent lpToneGen->mWaitCbkCond.broadcast(); 133189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.unlock(); 133289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 133389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 133489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 133789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 133889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::prepareWave() 133989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 134089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Prepare wave generators and reset tone sequencer state machine. 13410b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// mpNewToneDesc must have been initialized before calling this function. 134289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 134389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 134489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 134589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 134689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: true if wave generators have been created, false otherwise 134789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 134889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 134989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::prepareWave() { 13500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int segmentIdx = 0; 135189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1352a0d68338a88c2ddb4502f95017b546d603ef1ec7Glenn Kasten if (mpNewToneDesc == NULL) { 135389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 135489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 135689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Remove existing wave generators if any 135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 135889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = mpNewToneDesc; 136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1361e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs == -1) { 1362e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = TONEGEN_INF; 1363e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1364e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) { 1365e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs / 1000) * mSamplingRate; 1366e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } else { 1367e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent mMaxSmp = (mDurationMs * mSamplingRate) / 1000; 1368e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 13693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepareWave, duration limited to %d ms", mDurationMs); 1370e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent } 1371e33e00e931d1381d402484aa5cde67e540e3c82cEric Laurent 13720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].duration) { 13730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Get total number of sine waves: needed to adapt sine wave gain. 13740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lNumWaves = numWaves(segmentIdx); 13750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int freqIdx = 0; 13760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx]; 13770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (frequency) { 13780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Instantiate a wave generator if ot already done for this frequency 13790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) { 13800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent ToneGenerator::WaveGenerator *lpWaveGen = 13810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent new ToneGenerator::WaveGenerator((unsigned short)mSamplingRate, 13820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency, 13830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONEGEN_GAIN/lNumWaves); 13840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.add(frequency, lpWaveGen); 13850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx]; 138789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent segmentIdx++; 138989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 139089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 139189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Initialize tone sequencer 139289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTotalSmp = 0; 139389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurSegment = 0; 139489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurCount = 0; 13955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause mLoopCounter = 0; 13960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[0].duration == TONEGEN_INF) { 13970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = TONEGEN_INF; 13980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else{ 13990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000; 14000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 140189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 140389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 140489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 140789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 140889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::numWaves() 140989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 14100b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF). 141189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 14130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// segmentIdx tone segment index 141489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 141689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: nummber of sine waves 141789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) { 142089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lCnt = 0; 142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[segmentIdx].duration) { 14230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) { 14240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lCnt++; 14250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lCnt++; 142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 142889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 142989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lCnt; 143089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 143189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 143289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 143389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 143489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 143589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::clearWaveGens() 143689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 143789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Removes all wave generators. 143889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 143989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 144089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 144189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 144289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 144389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 144489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 144589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 144689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::clearWaveGens() { 14473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Clearing mWaveGens:"); 144889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 14490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) { 14500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent delete mWaveGens.valueAt(lIdx); 145189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 14520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.clear(); 14530b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent} 14540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14570b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Method: ToneGenerator::getToneForRegion() 14580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Get correct ringtone type according to current region. 14600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// The corrected ring tone type is the tone descriptor index in sToneDescriptors[]. 14610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Input: 14630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14640b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Output: 14660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 14670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 14680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 14693d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn KastenToneGenerator::tone_type ToneGenerator::getToneForRegion(tone_type toneType) { 14703d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten tone_type regionTone; 14710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) { 14730b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = toneType; 14740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 14753d2f877c1cb4e4ae4ddde7f57f4353de9341f11bGlenn Kasten regionTone = (tone_type) sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE]; 14760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 14770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone); 14790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent return regionTone; 148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// WaveGenerator::WaveGenerator class Implementation 148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 149189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 149289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::WaveGenerator() 149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 149489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. 149589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 149689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 149789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// samplingRate: Output sampling rate in Hz 149889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// frequency: Frequency of the sine wave to generate in Hz 149989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume (0.0 to 1.0) 150089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 150289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 150389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 150489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 150589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::WaveGenerator(unsigned short samplingRate, 150689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned short frequency, float volume) { 150789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double d0; 150889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double F_div_Fs; // frequency / samplingRate 150989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 151089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project F_div_Fs = frequency / (double)samplingRate; 151189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs); 151289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2_0 = (short)d0; 151389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = 0; 151489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = mS2_0; 151589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 151689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP); 151789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // take some margin for amplitude fluctuation 151889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAmplitude_Q15 > 32500) 151989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = 32500; 152089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 152189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos() 152289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d0 > 32767) 152389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32767; 152489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14 = (short) d0; 152589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 152690bebef5669a9385c706b042d146a31dca2e5d9bGlenn Kasten ALOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d", 152789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14, mS2_0, mAmplitude_Q15); 152889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::~WaveGenerator() 153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 154089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 154189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 154289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 154389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() { 154489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 154589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 154689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 154789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 154889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::getSamples() 154989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 155089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Generates count samples of a sine wave and accumulates 155189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// result in outBuffer. 155289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 155389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 155489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// outBuffer: Output buffer where to accumulate samples. 155589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// count: number of samples to produce. 155689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// command: special action requested (see enum gen_command). 155789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 155889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 155989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 156089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 156189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 156289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer, 156389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int count, unsigned int command) { 156489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lS1, lS2; 156589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lA1, lAmplitude; 156689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long Sample; // current sample 156789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 156889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init local 156989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_START) { 157089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)0; 157189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2_0; 157289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 157389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)mS1; 157489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2; 157589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 157689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lA1 = (long)mA1_Q14; 157789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude = (long)mAmplitude_Q15; 157889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 157989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_STOP) { 158089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude <<= 16; 158189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (count == 0) { 158289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 158389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 158489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long dec = lAmplitude/count; 158589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 158689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 158789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 158889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 158989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 159089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 159189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lAmplitude>>16) * Sample) >> S_Q15; 159289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 159389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude -= dec; 159489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 159589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 159689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 159789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 159889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 159989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 160089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 160189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 160289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = (lAmplitude * Sample) >> S_Q15; 160389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 160489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 160589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 160689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 160789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // save status 160889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = (short)lS1; 160989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = (short)lS2; 161089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 161189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 161289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android 1613