ToneGenerator.cpp revision c38bb0614dc0b5dee682b9a1de47de5ae7d215d8
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "ToneGenerator" 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/threads.h> 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <stdio.h> 2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <math.h> 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h> 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <sys/resource.h> 2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/RefBase.h> 2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Timers.h> 270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent#include <cutils/properties.h> 2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include "media/ToneGenerator.h" 2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android { 3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details) 350b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { 365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, 375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_0 405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, 415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_1 445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, 455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 460b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_2 485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, 495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_3 525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, 535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_4 565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, 575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 580b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_5 605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, 615e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 630b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_6 645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, 655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_7 685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, 695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_8 725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, 735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 740b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_9 765e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, 775e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_S 805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, 815e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_P 845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, 855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_A 885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, 895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_B 925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, 935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_C 965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, 975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_DTMF_D 1005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, 1015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_DIAL 1045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, 1055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0}, 1065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1070b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_BUSY 1095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1130b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION 1145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_ACK 1185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, 1195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0}, 1205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_NOTAVAIL 1235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, 1245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 1000, waveFreq: { 0 }, 0, 0}, 1255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_ERROR 1285e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1295e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 600, waveFreq: { 0 }, 0, 0 }, 1305e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 1315e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 1325e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1330b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1340b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CALL_WAITING 1355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, 1365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1380b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_RINGTONE 1405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1420b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1430b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP 1445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, 1455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1470b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 1, 1480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_ACK 1495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, 1505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1520b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_NACK 1535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1550b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1560b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_PROMPT 1575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 1595e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 1605e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 0, 1620b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP2 1635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1645e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1655e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0 }}, 1660b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 1670b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT 1685e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1695e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1705e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1720b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT_ABBREV 1735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 1745e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 1755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 7, 1770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION_ABBREV 1785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 1795e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1805e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 2, 1820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONFIRM 1835e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 1845e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 1855e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatCnt: 3, 1870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent repeatSegment: 0 }, // TONE_SUP_PIP 1885e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, 1895e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1905e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1915e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_DIAL_TONE_LITE 1925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 1935e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 1945e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 1955e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 1965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_USA_RINGBACK 1975e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 1985e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 1995e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2005e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2015e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_INTERCEPT 2025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 2035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 2045e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2065e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_INTERCEPT 2075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2085e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2095e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_REORDER 2125e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 2135e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 2145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 7, 2165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_REORDER 2175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 2185e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 2195e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 2215e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY 2225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 2235e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 2245e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 2255e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 2, 2265e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatSegment: 0 }, // TONE_CDMA_CONFIRM 2275e0a3043af16bc71a4211ee00dc00724de6623a7David Krause { segments: { { 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} }, 2715e0a3043af16bc71a4211ee00dc00724de6623a7David Krause repeatCnt: 0, 2725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 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. 7540b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentconst unsigned char 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: 79489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// toneType: Type of tone generated (values in enum tone_type) 79589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// streamType: Type of stream used for tone playback (enum AudioTrack::stream_type) 79689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume applied to tone (0.0 to 1.0) 79789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 79889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 79989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 80089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 80189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 80289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::ToneGenerator(int streamType, float volume) { 80389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator constructor: streamType=%d, volume=%f\n", streamType, volume); 80589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 80789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 80889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) { 80989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("Unable to marshal AudioFlinger"); 81089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 81189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 81289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mStreamType = streamType; 81389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mVolume = volume; 81489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 81589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = 0; 81689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpNewToneDesc = 0; 81789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Generate tone by chunks of 20 ms to keep cadencing precision 81889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mProcessSize = (mSamplingRate * 20) / 1000; 81989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent char value[PROPERTY_VALUE_MAX]; 8210b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent property_get("gsm.operator.iso-country", value, ""); 8220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (strcmp(value,"us") == 0 || 8230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent strcmp(value,"ca") == 0) { 8240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = ANSI; 8250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else if (strcmp(value,"jp") == 0) { 8260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = JAPAN; 8270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 8280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mRegion = CEPT; 8290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 8300b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 83189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (initAudioTrack()) { 83289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator INIT OK, time: %d\n", (unsigned int)(systemTime()/1000000)); 83389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 83489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("!!!ToneGenerator INIT FAILED!!!\n"); 83589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 83689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 83789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 83989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 84189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 84289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::~ToneGenerator() 84489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. Stop sound playback and delete audio track if 84689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// needed and delete sine wave generators. 84789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 84889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 84989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 85289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 85389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 85489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 85589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::~ToneGenerator() { 85689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ToneGenerator destructor\n"); 85789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 85889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 85989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project stopTone(); 86089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delete Track: %p\n", mpAudioTrack); 86189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 86289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 86389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 86489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 86589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 86689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::startTone() 86889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 86989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Starts tone playback. 87089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 87289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 87389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 87589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 87689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 87789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 87889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::startTone(int toneType) { 87989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lResult = false; 88089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 8814afdfa7fd7e9fe59fb298ef2ac252686e68bc73aDave Sparks if ((toneType < 0) || (toneType >= NUM_TONES)) 88289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 88389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 88489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_IDLE) { 88589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("startTone: try to re-init AudioTrack"); 88689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!initAudioTrack()) { 88789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 88889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 88989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 89089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("startTone\n"); 89289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 89489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Get descriptor for requested tone 8960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent toneType = getToneForRegion(toneType); 8970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mpNewToneDesc = &sToneDescriptors[toneType]; 89889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 89989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_INIT) { 90089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (prepareWave()) { 90189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Immediate start, time %d\n", (unsigned int)(systemTime()/1000000)); 90289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 90389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STARTING; 90489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 90589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->start(); 90689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 90789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_STARTING) { 90889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Wait for start callback"); 9098365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); 9108365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus != NO_ERROR) { 9118365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project LOGE("--- Immediate start timed out, status %d", lStatus); 91289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 91389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = false; 91489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 91589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 91689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 91789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState == TONE_IDLE; 91889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 91989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 92089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delayed start\n"); 92189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 92289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_RESTARTING; 9238365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); 9248365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project if (lStatus == NO_ERROR) { 92589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState != TONE_IDLE) { 92689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lResult = true; 92789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 92889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("cond received"); 92989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 9308365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project LOGE("--- Delayed start timed out, status %d", lStatus); 93189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 93289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 93489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 93589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 93689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV_IF(lResult, "Tone started, time %d\n", (unsigned int)(systemTime()/1000000)); 93789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGW_IF(!lResult, "Tone start failed!!!, time %d\n", (unsigned int)(systemTime()/1000000)); 93889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 93989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lResult; 94089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 94189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 94289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 94389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 94489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::stopTone() 94589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 94689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Stops tone playback. 94789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 94889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 94989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 95089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 95189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 95289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 95389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 95489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 95589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::stopTone() { 95689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("stopTone"); 95789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 95889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 95989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) { 96089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_STOPPING; 96189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("waiting cond"); 96289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(1)); 96389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lStatus == NO_ERROR) { 96489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000)); 96589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 96689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("--- Stop timed out"); 96789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_IDLE; 96889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->stop(); 96989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 97089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 97189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 97389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 97589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 97689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- private methods --------------------------- 97889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 97989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 98289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 98389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 98489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::initAudioTrack() 98589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 98689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Allocates and configures AudioTrack used for PCM output. 98789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 98889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 98989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 99089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 99189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 99289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 99389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 99489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 99589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::initAudioTrack() { 99689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 99789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 99889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 99989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 100089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 100189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 100289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Open audio track in mono, PCM 16bit, default sampling rate, default buffer size 100389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack 100489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project = new AudioTrack(mStreamType, 0, AudioSystem::PCM_16_BIT, 1, 0, 0, audioCallback, this, 0); 100589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 100689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack == 0) { 100789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("AudioTrack allocation failed"); 100889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 100989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 101089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Create Track: %p\n", mpAudioTrack); 101189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack->initCheck() != NO_ERROR) { 101389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGE("AudioTrack->initCheck failed"); 101489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto initAudioTrack_exit; 101589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 101689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack->setVolume(mVolume, mVolume); 101889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 101989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mState = TONE_INIT; 102089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 102289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectinitAudioTrack_exit: 102489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 102589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Cleanup 102689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mpAudioTrack) { 102789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Delete Track I: %p\n", mpAudioTrack); 102889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project delete mpAudioTrack; 102989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpAudioTrack = 0; 103089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 103189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 103389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 103489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 103689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 103789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 103889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::audioCallback() 103989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: AudioTrack callback implementation. Generates a block of 104189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// PCM samples 104289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// and manages tone generator sequencer: tones pulses, tone duration... 104389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 104589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// user reference (pointer to our ToneGenerator) 104689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// info audio buffer descriptor 104789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 104889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 104989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: always true. 105089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 105189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 105289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::audioCallback(int event, void* user, void *info) { 10535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 105489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (event != AudioTrack::EVENT_MORE_DATA) return; 10555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 105689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project const AudioTrack::Buffer *buffer = static_cast<const AudioTrack::Buffer *>(info); 105789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); 105889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project short *lpOut = buffer->i16; 105989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lNumSmp = buffer->size/sizeof(short); 10600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; 106189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (buffer->size == 0) return; 106389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Clear output buffer: WaveGenerator accumulates into lpOut buffer 106689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project memset(lpOut, 0, buffer->size); 106789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 106889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (lNumSmp) { 106989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize; 107089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lGenSmp; 107189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT; 107289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project bool lSignal = false; 10735e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 107489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.lock(); 107589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 107689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update pcm frame count and end time (current time at the end of this process) 107789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mTotalSmp += lReqSmp; 10785e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 107989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Update tone gen state machine and select wave gen command 108089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 108189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_PLAYING: 108289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_CONT; 108389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 108489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 108589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Starting Cbk"); 10865e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 108789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_START; 108889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 108989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 109089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 109189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Stop/restart Cbk"); 10925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 109389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 109489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 109589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 109689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 109789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Extra Cbk"); 10988365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project // Force loop exit 10998365529381f6284f2d59dcc38e26f73adeec9c67The Android Open Source Project lNumSmp = 0; 110089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto audioCallback_EndLoop; 110189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11025e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11035e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 110489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Exit if tone sequence is over 11050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 110689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mState == TONE_PLAYING) { 11075e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mState = TONE_STOPPING; 110889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 110989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project goto audioCallback_EndLoop; 111089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11115e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) { 111389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Time to go to next sequence segment 11145e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("End Segment, time: %d\n", (unsigned int)(systemTime()/1000000)); 11165e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 111789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; 11180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If segment, ON -> OFF transition : ramp volume down 11200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 112189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 11220b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 11230b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 11240b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11250b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 11260b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 11270b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 11280b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 11290b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 113089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 113189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11320b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11335e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // check if we need to loop and loop for the reqd times 11345e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11355e0a3043af16bc71a4211ee00dc00724de6623a7David Krause if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 11365e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11375e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11385e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11395e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11405e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx; 11415e0a3043af16bc71a4211ee00dc00724de6623a7David Krause ++lpToneGen->mLoopCounter; 11425e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11435e0a3043af16bc71a4211ee00dc00724de6623a7David Krause // completed loop. go to next segment 11445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter = 0; 11455e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 11465e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11475e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11485e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11495e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11505e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11515e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } else { 11525e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment++; 11535e0a3043af16bc71a4211ee00dc00724de6623a7David Krause LOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 11545e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 11555e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mLoopCounter, 11565e0a3043af16bc71a4211ee00dc00724de6623a7David Krause lpToneGen->mCurSegment); 11575e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11585e0a3043af16bc71a4211ee00dc00724de6623a7David Krause } 11590b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11600b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Handle loop if last segment reached 11610b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 116289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Last Seg: %d\n", lpToneGen->mCurSegment); 11635e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 116489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Pre increment loop count and restart if total count not reached. Stop sequence otherwise 11650b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) { 116689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Repeating Count: %d\n", lpToneGen->mCurCount); 11675e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 11680b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lpToneGen->mCurSegment = lpToneDesc->repeatSegment; 11690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) { 11700b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 11710b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 11725e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 117389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 117489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 11755e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 117689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 11770b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 117889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("End repeat, time: %d\n", (unsigned int)(systemTime()/1000000)); 117989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 118089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 118189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 118289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 11830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 11840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // If next segment is not silent, OFF -> ON transition : reset wave generator 11850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 11860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 11870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent LOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 11880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 11890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lGenSmp = 0; 11900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 119189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 11925e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 119389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The 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 119489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mNextSegSmp 11950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000; 11965e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 119789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 119889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Inside a segment keep tone ON or OFF 11990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) { 120089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = 0; // If odd segment, tone is currently OFF 120189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 120289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lGenSmp = lReqSmp; // If event segment, tone is currently ON 120389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 120489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12055e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 120689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lGenSmp) { 120789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // If samples must be generated, call all active wave generators and acumulate waves in lpOut 12080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lFreqIdx = 0; 12090b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 12105e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 12110b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (lFrequency != 0) { 12120b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 121389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 12140b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 121589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 121689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12175e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 121889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp -= lReqSmp; 121989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpOut += lReqSmp; 12205e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectaudioCallback_EndLoop: 12225e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 122389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch (lpToneGen->mState) { 122489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_RESTARTING: 122589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Cbk restarting track\n"); 122689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lpToneGen->prepareWave()) { 122789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_STARTING; 1228c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent // must reload lpToneDesc as prepareWave() may change mpToneDesc 1229c38bb0614dc0b5dee682b9a1de47de5ae7d215d8Eric Laurent lpToneDesc = lpToneGen->mpToneDesc; 123089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 123189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGW("Cbk restarting prepareWave() failed\n"); 123289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_IDLE; 123389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 123489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 123589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 123689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 123789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 123889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 123989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STOPPING: 124089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_INIT; 124189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Cbk Stopping track\n"); 124289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 124389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 12445e0a3043af16bc71a4211ee00dc00724de6623a7David Krause 124589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Force loop exit 124689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lNumSmp = 0; 124789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 124889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case TONE_STARTING: 124989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Cbk starting track\n"); 125089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mState = TONE_PLAYING; 125189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lSignal = true; 125289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 125389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: 125489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 125589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 125689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 125789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (lSignal) 125889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mWaitCbkCond.signal(); 125989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lpToneGen->mLock.unlock(); 126089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 126189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 126289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 126389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 126489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 126589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 126689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::prepareWave() 126789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 126889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Prepare wave generators and reset tone sequencer state machine. 12690b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// mpNewToneDesc must have been initialized before calling this function. 127089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 127189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 127289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 127389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 127489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: true if wave generators have been created, false otherwise 127589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 127689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 127789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectbool ToneGenerator::prepareWave() { 12780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int segmentIdx = 0; 127989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!mpNewToneDesc) { 128189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 128289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 12830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 128489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Remove existing wave generators if any 128589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 128689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 128789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mpToneDesc = mpNewToneDesc; 128889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 12890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].duration) { 12900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Get total number of sine waves: needed to adapt sine wave gain. 12910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int lNumWaves = numWaves(segmentIdx); 12920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int freqIdx = 0; 12930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx]; 12940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (frequency) { 12950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent // Instantiate a wave generator if ot already done for this frequency 12960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) { 12970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent ToneGenerator::WaveGenerator *lpWaveGen = 12980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent new ToneGenerator::WaveGenerator((unsigned short)mSamplingRate, 12990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency, 13000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent TONEGEN_GAIN/lNumWaves); 13010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (lpWaveGen == 0) { 13020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent goto prepareWave_exit; 13030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.add(frequency, lpWaveGen); 13050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 13060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx]; 130789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13080b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent segmentIdx++; 130989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 131089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 131189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // Initialize tone sequencer 131289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mTotalSmp = 0; 131389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurSegment = 0; 131489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurCount = 0; 13155e0a3043af16bc71a4211ee00dc00724de6623a7David Krause mLoopCounter = 0; 13160b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[0].duration == TONEGEN_INF) { 13170b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = TONEGEN_INF; 13180b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else{ 13190b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000; 13200b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 132189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return true; 132389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectprepareWave_exit: 132589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project clearWaveGens(); 132789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 132889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return false; 132989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 133089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 133289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 133389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 133489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::numWaves() 133589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 13360b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF). 133789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 133889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 13390b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// segmentIdx tone segment index 134089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 134189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 134289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// returned value: nummber of sine waves 134389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 134489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 13450b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) { 134689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int lCnt = 0; 134789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13480b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mpToneDesc->segments[segmentIdx].duration) { 13490b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) { 13500b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent lCnt++; 13510b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 135289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lCnt++; 135389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 135489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return lCnt; 135689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 135789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 135989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 136089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 136189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: ToneGenerator::clearWaveGens() 136289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 136389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Removes all wave generators. 136489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 136589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 136689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 136789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 136889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 136989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 137089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 137189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 137289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::clearWaveGens() { 137389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("Clearing mWaveGens:"); 137489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 13750b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) { 13760b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent delete mWaveGens.valueAt(lIdx); 137789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 13780b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent mWaveGens.clear(); 13790b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent} 13800b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 13810b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 13820b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 13830b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Method: ToneGenerator::getToneForRegion() 13840b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 13850b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Description: Get correct ringtone type according to current region. 13860b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// The corrected ring tone type is the tone descriptor index in sToneDescriptors[]. 13870b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 13880b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Input: 13890b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 13900b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 13910b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// Output: 13920b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// none 13930b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent// 13940b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent//////////////////////////////////////////////////////////////////////////////// 13950b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurentint ToneGenerator::getToneForRegion(int toneType) { 13960b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent int regionTone; 13970b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 13980b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) { 13990b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = toneType; 14000b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } else { 14010b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent regionTone = sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE]; 14020b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent } 14030b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14040b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent LOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone); 14050b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent 14060b62e242d112d46e9357242b0a4e11c720c98ca0Eric Laurent return regionTone; 140789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 140889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 140989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 141189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// WaveGenerator::WaveGenerator class Implementation 141289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 141389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//---------------------------------- public methods ---------------------------- 141589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 141689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 141789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 141889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::WaveGenerator() 141989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Constructor. 142189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 142389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// samplingRate: Output sampling rate in Hz 142489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// frequency: Frequency of the sine wave to generate in Hz 142589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// volume: volume (0.0 to 1.0) 142689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 142789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 142889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 142989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 143089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 143189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::WaveGenerator(unsigned short samplingRate, 143289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned short frequency, float volume) { 143389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double d0; 143489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project double F_div_Fs; // frequency / samplingRate 143589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 143689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project F_div_Fs = frequency / (double)samplingRate; 143789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs); 143889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2_0 = (short)d0; 143989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = 0; 144089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = mS2_0; 144189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 144289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP); 144389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // take some margin for amplitude fluctuation 144489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mAmplitude_Q15 > 32500) 144589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mAmplitude_Q15 = 32500; 144689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 144789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos() 144889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (d0 > 32767) 144989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project d0 = 32767; 145089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14 = (short) d0; 145189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project LOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d\n", 145389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mA1_Q14, mS2_0, mAmplitude_Q15); 145489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 145589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 145689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 145789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 145889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::~WaveGenerator() 145989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Destructor. 146189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 146389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 146489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 146689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 146789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 146889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 146989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() { 147089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 147189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 147289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 147389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Method: WaveGenerator::getSamples() 147589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Description: Generates count samples of a sine wave and accumulates 147789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// result in outBuffer. 147889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 147989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Input: 148089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// outBuffer: Output buffer where to accumulate samples. 148189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// count: number of samples to produce. 148289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// command: special action requested (see enum gen_command). 148389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 148489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Output: 148589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// none 148689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// 148789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 148889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer, 148989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project unsigned int count, unsigned int command) { 149089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lS1, lS2; 149189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long lA1, lAmplitude; 149289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long Sample; // current sample 149389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 149489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // init local 149589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_START) { 149689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)0; 149789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2_0; 149889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 149989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = (long)mS1; 150089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = (long)mS2; 150189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 150289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lA1 = (long)mA1_Q14; 150389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude = (long)mAmplitude_Q15; 150489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 150589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (command == WAVEGEN_STOP) { 150689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude <<= 16; 150789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (count == 0) { 150889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return; 150989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 151089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project long dec = lAmplitude/count; 151189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 151289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 151389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 151489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 151589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 151689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 151789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lAmplitude>>16) * Sample) >> S_Q15; 151889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 151989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lAmplitude -= dec; 152089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 152189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 152289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // loop generation 152389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project while (count--) { 152489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 152589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // shift delay 152689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS2 = lS1; 152789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project lS1 = Sample; 152889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Sample = (lAmplitude * Sample) >> S_Q15; 152989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 153089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 153189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 153289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project // save status 153489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS1 = (short)lS1; 153589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mS2 = (short)lS2; 153689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 153789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 153889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} // end namespace android 153989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 1540