19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "ToneGenerator" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/resource.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/RefBase.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Timers.h> 27f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent#include <cutils/properties.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "media/ToneGenerator.h" 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details) 35f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurentconst ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { 36b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, 37b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 38f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 39f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_0 40b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, 41b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 42f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 43f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_1 44b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, 45b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 46f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 47f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_2 48b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, 49b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 50f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 51f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_3 52b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, 53b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 54f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 55f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_4 56b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, 57b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 58f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 59f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_5 60b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, 61b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 62f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 63f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_6 64b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, 65b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 66f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 67f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_7 68b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, 69b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 70f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 71f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_8 72b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, 73b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 74f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 75f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_9 76b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, 77b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 78f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 79f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_S 80b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, 81b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 82f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 83f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_P 84b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, 85b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 86f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 87f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_A 88b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, 89b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 90f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 91f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_B 92b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, 93b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 94f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 95f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_C 96b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, 97b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 98f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 99f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_DTMF_D 100b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, 101b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 102f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 103f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_DIAL 104b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, 105b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0}, 106b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 107f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 108f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_BUSY 109b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 110b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 111b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 112f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 113f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION 114b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 115b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 116f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 0, 117f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_ACK 118b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, 119b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0}, 120b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 121f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 2, 122f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_RADIO_NOTAVAIL 123b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, 124b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0}, 125b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 126f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 127f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_ERROR 128b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 129b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 600, waveFreq: { 0 }, 0, 0 }, 130b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, 131b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 132b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 133f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 134f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_CALL_WAITING 135b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, 136b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 137b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 138f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 139f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_RINGTONE 140b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 141b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 142f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 0, 143f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP 144b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, 145b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 146b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 147f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 1, 148f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_PROP_ACK 149b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, 150b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 151f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 0, 152f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_PROP_NACK 153b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, 154b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 155f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 0, 156f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_PROP_PROMPT 157b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 158b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 159b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, 160b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 161f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 0, 162f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_PROP_BEEP2 163b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 164b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 165b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0 }}, 166f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 167f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT 168b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 169b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 170b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 171f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 7, 172f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_INTERCEPT_ABBREV 173b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 174b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 175b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 176f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 7, 177f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONGESTION_ABBREV 178b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 179b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 180b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 181f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 2, 182f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_CONFIRM 183b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 184b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 185b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 186f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: 3, 187f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_SUP_PIP 188b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, 189b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 190b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 191b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_DIAL_TONE_LITE 192b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 193b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 194b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 195b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 196b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_USA_RINGBACK 197b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 198b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 199b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 200b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 201b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_INTERCEPT 202b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, 203b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, 204b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 205b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 206b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_INTERCEPT 207b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 208b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 209b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 210b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 211b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_REORDER 212b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 213b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 214b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 215b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 7, 216b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_REORDER 217b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 218b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 219b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 220b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 221b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY 222b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, 223b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 224b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 225b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 2, 226b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CONFIRM 2276c84d7313eb42d31449446cfb86ff71ee4a02bf5Naveen Kalla { segments: { { duration: 500, waveFreq: { 660, 1000, 0 }, 0, 0 }, 2286c84d7313eb42d31449446cfb86ff71ee4a02bf5Naveen Kalla { duration: 0 , waveFreq: { 0 }, 0, 0}}, 229b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 230b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ANSWER 231b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 232b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 233b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 234b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_CALLWAITING 235b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, 236b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 237b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 238b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 3, 239b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_PIP 240b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 241b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 242b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0}, 19, 0}, 243b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0}, 244b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 48, waveFreq: { 2556, 0}, 0, 0}, 245b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0}, 246b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0}}, 247b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 248b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL 249b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 250b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 0 }, 251b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 252b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 253b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 254b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0}, 7, 4 }, 255b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 256b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 257b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 258b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 259b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP 260b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 261b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 0 }, 262b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 263b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 264b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, 265b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0}, 3, 4 }, 266b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, 267b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 268b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 269b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 270b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI 271b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 272b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 273b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 274b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 }, 275b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 64, waveFreq: { 2556, 0 }, 4, 0 }, 276b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 20, waveFreq: { 2091, 0 }, 0, 0 }, 277b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 } , 0, 0 } }, 278b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 279b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING 280b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 281b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 282b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 283b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 284b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 285b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 286b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0} }, 287b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 288b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 289b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 290b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 291b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 39, 0 }, 292b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 293b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 294b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 295b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_L 296b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 297b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 39, 0 }, 298b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 299b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 300b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 301b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_L 302b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 303b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 39, 0 }, 304b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 305b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 306b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 307b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_L 308b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 309b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 0 }, 310b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 311b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 312b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 313b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS 314b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 315b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 0 }, 316b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 317b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 318b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 319b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS 320b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 321b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 0 }, 322b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 400, waveFreq: { 0 }, 0, 0 }, 323b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 324b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 325b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS 326b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 327b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 328b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 329b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 330b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 331b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 332b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 333b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 334b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 335b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 336b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 337b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SSL 338b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 339b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 340b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 341b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 342b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 343b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 344b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 345b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 346b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 347b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 348b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 349b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SSL 350b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 351b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 352b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 353b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 354b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 355b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 356b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 357b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 358b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 359b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 360b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 361b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SSL 362b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 363b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 364b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 365b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 366b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 367b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 368b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 369b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 370b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SS_2 371b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 372b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 373b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 374b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 375b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 376b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 377b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 378b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 379b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SS_2 380b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 381b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 382b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 383b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 384b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 385b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 386b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 387b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 388b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SS_2 389b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 390b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 391b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 392b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 393b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, 394b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 395b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 396b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 397b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 398b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 399b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 400b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_SLS 401b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 402b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 403b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 404b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 405b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, 406b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 407b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 408b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 409b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 410b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 411b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 412b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_SLS 413b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 414b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 415b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 416b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 417b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, 418b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 419b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 420b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 421b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 3000, waveFreq: { 0 }, 0, 0 }, 422b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 423b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 424b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_SLS 425b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 426b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, 427b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 428b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 429b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 3 }, 430b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 431b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 432b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, 433b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 434b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 435b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 9, 9 }, 436b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 437b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 438b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 439b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_S_X4 440b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 441b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, 442b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 443b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 444b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 3 }, 445b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 446b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 447b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, 448b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 449b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 450b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 9, 9 }, 451b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 452b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 453b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 454b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_S_X4 455b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 456b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, 457b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 458b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 459b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 3 }, 460b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 461b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 462b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, 463b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 464b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 465b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 9, 9 }, 466b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2500, waveFreq: { 0 }, 0, 0 }, 467b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 468b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 469b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_S_X4 470b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 471b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, 472b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 473b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 474b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 475b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_L 476b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 477b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, 478b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 479b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 480b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 481b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_L 482b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 483b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, 484b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 485b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 486b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 487b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_L 488b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 489b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 490b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 491b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 492b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 493b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 494b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 495b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 496b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SS 497b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 498b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 499b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 500b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 501b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 502b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 503b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 504b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 505b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SS 506b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 507b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 508b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 509b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 510b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 511b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 512b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 513b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 514b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SS 515b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 516b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 517b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 518b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 519b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 520b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 521b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 522b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, 523b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 524b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 525b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 526b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SSL 527b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 528b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 529b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 530b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 531b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 532b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 533b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 534b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, 535b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 536b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 537b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 538b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SSL 539b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 540b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 541b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 542b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 543b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 544b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 545b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 546b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, 547b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 548b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 549b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 550b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SSL 551b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 552b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 553b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 554b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 555b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 15, 3 }, 556b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 557b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 558b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 559b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 560b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 561b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 562b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_SLS 563b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 564b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 565b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 566b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 567b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 15, 3 }, 568b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 569b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 570b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 571b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 572b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 573b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 574b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_SLS 575b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 576b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 577b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 578b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 579b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 15, 3 }, 580b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 581b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 582b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 583b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 1000, waveFreq: { 0 }, 0, 0 }, 584b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 585b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 586b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_SLS 587b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 588b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, 589b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 590b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 591b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, 592b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 593b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 594b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, 595b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 596b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, 597b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 4000, 0 }, 7, 9 }, 598b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 599b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 600b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 601b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_HIGH_PBX_S_X4 602b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 603b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, 604b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 605b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 606b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, 607b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 608b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 609b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, 610b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 611b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, 612b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 2900, 0 }, 7, 9 }, 613b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 614b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 615b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 616b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_MED_PBX_S_X4 617b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 618b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, 619b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 620b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 621b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, 622b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 623b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 624b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, 625b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 200, waveFreq: { 0 }, 0, 0 }, 626b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, 627b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 25, waveFreq: { 1450, 0 }, 7, 9 }, 628b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 800, waveFreq: { 0 }, 0, 0 }, 629b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 630b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 631b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_LOW_PBX_S_X4 632b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 633b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 634b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 635b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 740, 0 }, 0, 0 }, 636b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 622, 0 }, 0, 0 }, 637b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 638b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 639b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 640b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_NETWORK_LITE 641b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 642b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 659, 0 }, 2, 0 }, 643b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, 644b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 645b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 646b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_AUTOREDIAL_LITE 647b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 }, 648b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 649b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 650b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ONE_MIN_BEEP 651b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 }, 652b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 653b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 654b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE 655b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 }, 656b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 125, waveFreq: { 1175, 0 }, 0, 0 }, 657b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 658b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 659b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_PRESSHOLDKEY_LITE 660b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 }, 661b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 662b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 663b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 664b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, 665b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 666b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, 667b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, 668b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 669b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 670b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_INCALL_LITE 671b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 }, 672b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 10, waveFreq: { 0 }, 2, 0 }, 673b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4990, waveFreq: { 0 }, 0, 0 }, 674b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 675b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: ToneGenerator::TONEGEN_INF, 676b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_EMERGENCY_RINGBACK 677b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 }, 678b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 125, waveFreq: { 0 }, 0, 0 }, 679b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 680b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 2, 681b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ALERT_CALL_GUARD 682b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 }, 683b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 125, waveFreq: { 370, 0 }, 0, 0 }, 684b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 685b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 686b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_SOFT_ERROR_LITE 687b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 }, 688b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 125, waveFreq: { 1397, 0 }, 0, 0 }, 689b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 125, waveFreq: { 784, 0 }, 0, 0 }, 690b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 } }, 691b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 692b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_CALLDROP_LITE 693b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 694b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 }, 695b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 696b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 697b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 698b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_NETWORK_BUSY_ONE_SHOT 699b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 }, 700b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0, waveFreq: { 0 }, 0, 0 }}, 701b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 702b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_ABBR_ALERT 703b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }}, 704b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatCnt: 0, 705b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause repeatSegment: 0 }, // TONE_CDMA_SIGNAL_OFF 706b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 707b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 }, 708b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 709f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 710f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_ANSI_DIAL 711b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, 712b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 713b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 714f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 715f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_ANSI_BUSY 716b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, 717b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 250, waveFreq: { 0 }, 0, 0 }, 718b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 719f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 720f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_ANSI_CONGESTION 721b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, 722b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 9700, waveFreq: { 0 }, 0, 0 }, 723b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 724b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 0 }, 0, 0 }, 725b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, 726b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 727f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 728f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 1 }, // TONE_ANSI_CALL_WAITING 729b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, 730b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 4000, waveFreq: { 0 }, 0, 0 }, 731b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 732f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 733f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_ANSI_RINGTONE 734b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 }, 735b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 736f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 737f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_DIAL 738b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 }, 739b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 500, waveFreq: { 0 }, 0, 0 }, 740b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 741f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 742f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_BUSY 743b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 }, 744b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 2000, waveFreq: { 0 }, 0, 0 }, 745b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause { duration: 0 , waveFreq: { 0 }, 0, 0}}, 746f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatCnt: ToneGenerator::TONEGEN_INF, 747f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent repeatSegment: 0 }, // TONE_JAPAN_RADIO_ACK 748b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 749b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 750b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 751f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent}; 752f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 753f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type 754f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// to actual tone for current region. 755f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurentconst unsigned char ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = { 756f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent { // ANSI 757f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_ANSI_DIAL, // TONE_SUP_DIAL 758f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_ANSI_BUSY, // TONE_SUP_BUSY 759f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_ANSI_CONGESTION, // TONE_SUP_CONGESTION 760f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK 761f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 762f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 763f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_ANSI_CALL_WAITING, // TONE_SUP_CALL_WAITING 764f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_ANSI_RINGTONE // TONE_SUP_RINGTONE 765f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent }, 766f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent { // JAPAN 767f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_JAPAN_DIAL, // TONE_SUP_DIAL 768f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_JAPAN_BUSY, // TONE_SUP_BUSY 769f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION 770f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_JAPAN_RADIO_ACK, // TONE_SUP_RADIO_ACK 771f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL 772f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_ERROR, // TONE_SUP_ERROR 773f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING 774f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONE_SUP_RINGTONE // TONE_SUP_RINGTONE 775f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 776f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent}; 777f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ToneGenerator class Implementation 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//---------------------------------- public methods ---------------------------- 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::ToneGenerator() 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Constructor. Initializes the tone sequencer, intantiates required sine wave 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// generators, instantiates output audio track. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// streamType: Type of stream used for tone playback (enum AudioTrack::stream_type) 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// volume: volume applied to tone (0.0 to 1.0) 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 802bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric LaurentToneGenerator::ToneGenerator(int streamType, float volume, bool threadCanCallJava) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator constructor: streamType=%d, volume=%f\n", streamType, volume); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_IDLE; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (AudioSystem::getOutputSamplingRate(&mSamplingRate, streamType) != NO_ERROR) { 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unable to marshal AudioFlinger"); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 812bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent mThreadCanCallJava = threadCanCallJava; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStreamType = streamType; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVolume = volume; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack = 0; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpToneDesc = 0; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpNewToneDesc = 0; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Generate tone by chunks of 20 ms to keep cadencing precision 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessSize = (mSamplingRate * 20) / 1000; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 821f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent char value[PROPERTY_VALUE_MAX]; 822f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent property_get("gsm.operator.iso-country", value, ""); 823f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (strcmp(value,"us") == 0 || 824f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent strcmp(value,"ca") == 0) { 825f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mRegion = ANSI; 826f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } else if (strcmp(value,"jp") == 0) { 827f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mRegion = JAPAN; 828f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } else { 829f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mRegion = CEPT; 830f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 831f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (initAudioTrack()) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator INIT OK, time: %d\n", (unsigned int)(systemTime()/1000000)); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("!!!ToneGenerator INIT FAILED!!!\n"); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::~ToneGenerator() 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Destructor. Stop sound playback and delete audio track if 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// needed and delete sine wave generators. 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectToneGenerator::~ToneGenerator() { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ToneGenerator destructor\n"); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mpAudioTrack) { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stopTone(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Delete Track: %p\n", mpAudioTrack); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete mpAudioTrack; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::startTone() 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Starts tone playback. 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 87396c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent// toneType: Type of tone generated (values in enum tone_type) 87496c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent// durationMs: The tone duration in milliseconds. If the tone is limited in time by definition, 87596c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent// the actual duration will be the minimum of durationMs and the defined tone duration. 87696c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent// Ommiting or setting durationMs to -1 does not limit tone duration. 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 88296c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurentbool ToneGenerator::startTone(int toneType, int durationMs) { 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool lResult = false; 88462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent status_t lStatus; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8864c9224709862c38a97c51853a93d284f55d6135dDave Sparks if ((toneType < 0) || (toneType >= NUM_TONES)) 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lResult; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState == TONE_IDLE) { 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("startTone: try to re-init AudioTrack"); 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!initAudioTrack()) { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lResult; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("startTone\n"); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.lock(); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Get descriptor for requested tone 901f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent toneType = getToneForRegion(toneType); 902f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mpNewToneDesc = &sToneDescriptors[toneType]; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent mDurationMs = durationMs; 90562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 90662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent if (mState == TONE_STOPPED) { 90762443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent LOGV("Start waiting for previous tone to stop"); 908dd28d56368441537ec5eb42150516416fdbf10adEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 90962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent if (lStatus != NO_ERROR) { 91062443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent LOGE("--- start wait for stop timed out, status %d", lStatus); 91162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent mState = TONE_IDLE; 912dd28d56368441537ec5eb42150516416fdbf10adEric Laurent mLock.unlock(); 91362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent return lResult; 91496c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent } 91596c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent } 91696c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState == TONE_INIT) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (prepareWave()) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Immediate start, time %d\n", (unsigned int)(systemTime()/1000000)); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lResult = true; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_STARTING; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.unlock(); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack->start(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.lock(); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState == TONE_STARTING) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Wait for start callback"); 927dd28d56368441537ec5eb42150516416fdbf10adEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 928b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (lStatus != NO_ERROR) { 929b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project LOGE("--- Immediate start timed out, status %d", lStatus); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_IDLE; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lResult = false; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 935c4e58c0f31c5044cfab0ffe80251df209844e9ccEric Laurent mState = TONE_IDLE; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Delayed start\n"); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_RESTARTING; 940dd28d56368441537ec5eb42150516416fdbf10adEric Laurent lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 941b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (lStatus == NO_ERROR) { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState != TONE_IDLE) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lResult = true; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("cond received"); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 947b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project LOGE("--- Delayed start timed out, status %d", lStatus); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_IDLE; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.unlock(); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV_IF(lResult, "Tone started, time %d\n", (unsigned int)(systemTime()/1000000)); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW_IF(!lResult, "Tone start failed!!!, time %d\n", (unsigned int)(systemTime()/1000000)); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lResult; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::stopTone() 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Stops tone playback. 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ToneGenerator::stopTone() { 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("stopTone"); 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.lock(); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_STOPPING; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("waiting cond"); 979dd28d56368441537ec5eb42150516416fdbf10adEric Laurent status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3)); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lStatus == NO_ERROR) { 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000)); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("--- Stop timed out"); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_IDLE; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack->stop(); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWaveGens(); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLock.unlock(); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//---------------------------------- private methods --------------------------- 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::initAudioTrack() 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Allocates and configures AudioTrack used for PCM output. 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ToneGenerator::initAudioTrack() { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mpAudioTrack) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete mpAudioTrack; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack = 0; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Open audio track in mono, PCM 16bit, default sampling rate, default buffer size 1020bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent mpAudioTrack = new AudioTrack(); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mpAudioTrack == 0) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("AudioTrack allocation failed"); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto initAudioTrack_exit; 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Create Track: %p\n", mpAudioTrack); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1027bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent mpAudioTrack->set(mStreamType, 1028bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 0, 1029bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent AudioSystem::PCM_16_BIT, 1030bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent AudioSystem::CHANNEL_OUT_MONO, 1031bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 0, 1032bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 0, 1033bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent audioCallback, 1034bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent this, 1035bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 0, 1036bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 0, 1037bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent mThreadCanCallJava); 1038bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mpAudioTrack->initCheck() != NO_ERROR) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("AudioTrack->initCheck failed"); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto initAudioTrack_exit; 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack->setVolume(mVolume, mVolume); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mState = TONE_INIT; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectinitAudioTrack_exit: 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cleanup 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mpAudioTrack) { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Delete Track I: %p\n", mpAudioTrack); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete mpAudioTrack; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpAudioTrack = 0; 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::audioCallback() 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: AudioTrack callback implementation. Generates a block of 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// PCM samples 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// and manages tone generator sequencer: tones pulses, tone duration... 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// user reference (pointer to our ToneGenerator) 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// info audio buffer descriptor 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// returned value: always true. 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ToneGenerator::audioCallback(int event, void* user, void *info) { 1080b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event != AudioTrack::EVENT_MORE_DATA) return; 1082b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 1083af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short *lpOut = buffer->i16; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int lNumSmp = buffer->size/sizeof(short); 1087f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer->size == 0) return; 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear output buffer: WaveGenerator accumulates into lpOut buffer 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(lpOut, 0, buffer->size); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (lNumSmp) { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int lReqSmp = lNumSmp < lpToneGen->mProcessSize*2 ? lNumSmp : lpToneGen->mProcessSize; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int lGenSmp; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool lSignal = false; 1100b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mLock.lock(); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1103dd28d56368441537ec5eb42150516416fdbf10adEric Laurent 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update pcm frame count and end time (current time at the end of this process) 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mTotalSmp += lReqSmp; 1106b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update tone gen state machine and select wave gen command 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (lpToneGen->mState) { 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_PLAYING: 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_CONT; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_STARTING: 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Starting Cbk"); 1114b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_START; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_STOPPING: 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_RESTARTING: 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Stop/restart Cbk"); 1120b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1124af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent case TONE_STOPPED: 1125af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent LOGV("Stopped Cbk"); 1126af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent goto audioCallback_EndLoop; 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Extra Cbk"); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto audioCallback_EndLoop; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1131b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Exit if tone sequence is over 113396c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0 || 113496c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent lpToneGen->mTotalSmp > lpToneGen->mMaxSmp) { 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen->mState == TONE_PLAYING) { 1136b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mState = TONE_STOPPING; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 113896c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 113996c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent goto audioCallback_EndLoop; 114096c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent } 1141af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent // fade out before stopping if maximum duration reached 114296c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_STOP; 114396c08a69ea0b95d1d8a8edb67f73bd9548e09f16Eric Laurent lpToneGen->mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1145b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen->mTotalSmp > lpToneGen->mNextSegSmp) { 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Time to go to next sequence segment 1148b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("End Segment, time: %d\n", (unsigned int)(systemTime()/1000000)); 1150b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lGenSmp = lReqSmp; 1152f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1153f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent // If segment, ON -> OFF transition : ramp volume down 1154f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lWaveCmd = WaveGenerator::WAVEGEN_STOP; 1156f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int lFreqIdx = 0; 1157f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 1158f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1159f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent while (lFrequency != 0) { 1160f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 1161f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 1162f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 1163f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1166f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1167b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause // check if we need to loop and loop for the reqd times 1168b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause if (lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 1169b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause if (lpToneGen->mLoopCounter < lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt) { 1170b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause LOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 1171b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 1172b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mLoopCounter, 1173b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment); 1174b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment = lpToneDesc->segments[lpToneGen->mCurSegment].loopIndx; 1175b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause ++lpToneGen->mLoopCounter; 1176b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause } else { 1177b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause // completed loop. go to next segment 1178b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mLoopCounter = 0; 1179b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment++; 1180b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause LOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 1181b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 1182b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mLoopCounter, 1183b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment); 1184b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause } 1185b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause } else { 1186b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment++; 1187b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause LOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d) \n", 1188b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneDesc->segments[lpToneGen->mCurSegment].loopCnt, 1189b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mLoopCounter, 1190b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause lpToneGen->mCurSegment); 1191b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 1192b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause } 1193f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1194f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent // Handle loop if last segment reached 1195f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].duration == 0) { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Last Seg: %d\n", lpToneGen->mCurSegment); 1197b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pre increment loop count and restart if total count not reached. Stop sequence otherwise 1199f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (++lpToneGen->mCurCount <= lpToneDesc->repeatCnt) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Repeating Count: %d\n", lpToneGen->mCurCount); 1201b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 1202f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lpToneGen->mCurSegment = lpToneDesc->repeatSegment; 1203f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpToneDesc->segments[lpToneDesc->repeatSegment].waveFreq[0] != 0) { 1204f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 1205f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 1206b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 1209b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1211f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lGenSmp = 0; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("End repeat, time: %d\n", (unsigned int)(systemTime()/1000000)); 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("New segment %d, Next Time: %d\n", lpToneGen->mCurSegment, 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (lpToneGen->mNextSegSmp*1000)/lpToneGen->mSamplingRate); 1217f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) { 1218f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent // If next segment is not silent, OFF -> ON transition : reset wave generator 1219f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lWaveCmd = WaveGenerator::WAVEGEN_START; 1220f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1221f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent LOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d\n", lGenSmp, lReqSmp); 1222f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } else { 1223f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lGenSmp = 0; 1224f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1226b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The 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 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mNextSegSmp 1229f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent += (lpToneDesc->segments[lpToneGen->mCurSegment].duration * lpToneGen->mSamplingRate) / 1000; 1230b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inside a segment keep tone ON or OFF 1233f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] == 0) { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lGenSmp = 0; // If odd segment, tone is currently OFF 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lGenSmp = lReqSmp; // If event segment, tone is currently ON 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lGenSmp) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If samples must be generated, call all active wave generators and acumulate waves in lpOut 1242f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int lFreqIdx = 0; 1243f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx]; 1244b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 1245f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent while (lFrequency != 0) { 1246f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency); 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd); 1248f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[++lFreqIdx]; 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1251b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lNumSmp -= lReqSmp; 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpOut += lReqSmp; 1254b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectaudioCallback_EndLoop: 1256b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (lpToneGen->mState) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_RESTARTING: 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Cbk restarting track\n"); 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lpToneGen->prepareWave()) { 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mState = TONE_STARTING; 12625964e73774b381748013b91d04dfb6fc60f533eeEric Laurent // must reload lpToneDesc as prepareWave() may change mpToneDesc 12635964e73774b381748013b91d04dfb6fc60f533eeEric Laurent lpToneDesc = lpToneGen->mpToneDesc; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Cbk restarting prepareWave() failed\n"); 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mState = TONE_IDLE; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force loop exit 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lNumSmp = 0; 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSignal = true; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_STOPPING: 1274af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent LOGV("Cbk Stopping\n"); 1275af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent lpToneGen->mState = TONE_STOPPED; 1276af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent // Force loop exit 1277af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent lNumSmp = 0; 1278af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent break; 1279af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent case TONE_STOPPED: 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mState = TONE_INIT; 1281af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent LOGV("Cbk Stopped track\n"); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mpAudioTrack->stop(); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Force loop exit 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lNumSmp = 0; 1285af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent buffer->size = 0; 1286af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent lSignal = true; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TONE_STARTING: 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Cbk starting track\n"); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mState = TONE_PLAYING; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lSignal = true; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1293af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent case TONE_PLAYING: 1294af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent break; 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1296af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent // Force loop exit 1297af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent lNumSmp = 0; 1298af141d529f76a3e3bccf67de798f13568e37f3cfEric Laurent buffer->size = 0; 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lSignal) 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mWaitCbkCond.signal(); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lpToneGen->mLock.unlock(); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::prepareWave() 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Prepare wave generators and reset tone sequencer state machine. 1314f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// mpNewToneDesc must have been initialized before calling this function. 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// returned value: true if wave generators have been created, false otherwise 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool ToneGenerator::prepareWave() { 1323f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int segmentIdx = 0; 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mpNewToneDesc) { 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1328f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove existing wave generators if any 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWaveGens(); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mpToneDesc = mpNewToneDesc; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent if (mDurationMs == -1) { 133562443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent mMaxSmp = TONEGEN_INF; 133662443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent } else { 133762443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent if (mDurationMs > (int)(TONEGEN_INF / mSamplingRate)) { 133862443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent mMaxSmp = (mDurationMs / 1000) * mSamplingRate; 133962443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent } else { 134062443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent mMaxSmp = (mDurationMs * mSamplingRate) / 1000; 134162443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent } 134262443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent LOGV("prepareWave, duration limited to %d ms", mDurationMs); 134362443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent } 134462443f5f4517ba17d911975e695f1ab75bfdbf77Eric Laurent 1345f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent while (mpToneDesc->segments[segmentIdx].duration) { 1346f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent // Get total number of sine waves: needed to adapt sine wave gain. 1347f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int lNumWaves = numWaves(segmentIdx); 1348f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int freqIdx = 0; 1349f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx]; 1350f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent while (frequency) { 1351f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent // Instantiate a wave generator if ot already done for this frequency 1352f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) { 1353f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent ToneGenerator::WaveGenerator *lpWaveGen = 1354f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent new ToneGenerator::WaveGenerator((unsigned short)mSamplingRate, 1355f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent frequency, 1356f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent TONEGEN_GAIN/lNumWaves); 1357f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (lpWaveGen == 0) { 1358f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent goto prepareWave_exit; 1359f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 1360f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mWaveGens.add(frequency, lpWaveGen); 1361f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 1362f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx]; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1364f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent segmentIdx++; 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Initialize tone sequencer 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalSmp = 0; 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurSegment = 0; 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurCount = 0; 1371b6d90ca1292ffab015d5068f9e184b1dc84b7233David Krause mLoopCounter = 0; 1372f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (mpToneDesc->segments[0].duration == TONEGEN_INF) { 1373f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mNextSegSmp = TONEGEN_INF; 1374f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } else{ 1375f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mNextSegSmp = (mpToneDesc->segments[0].duration * mSamplingRate) / 1000; 1376f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectprepareWave_exit: 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearWaveGens(); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::numWaves() 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 1392f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Description: Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF). 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 1395f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// segmentIdx tone segment index 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// returned value: nummber of sine waves 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 1401f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurentunsigned int ToneGenerator::numWaves(unsigned int segmentIdx) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int lCnt = 0; 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1404f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (mpToneDesc->segments[segmentIdx].duration) { 1405f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) { 1406f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent lCnt++; 1407f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lCnt++; 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lCnt; 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: ToneGenerator::clearWaveGens() 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Removes all wave generators. 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ToneGenerator::clearWaveGens() { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Clearing mWaveGens:"); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1431f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) { 1432f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent delete mWaveGens.valueAt(lIdx); 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1434f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent mWaveGens.clear(); 1435f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent} 1436f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1437f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent//////////////////////////////////////////////////////////////////////////////// 1438f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// 1439f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Method: ToneGenerator::getToneForRegion() 1440f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// 1441f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Description: Get correct ringtone type according to current region. 1442f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// The corrected ring tone type is the tone descriptor index in sToneDescriptors[]. 1443f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// 1444f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Input: 1445f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// none 1446f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// 1447f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// Output: 1448f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// none 1449f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent// 1450f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent//////////////////////////////////////////////////////////////////////////////// 1451f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurentint ToneGenerator::getToneForRegion(int toneType) { 1452f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent int regionTone; 1453f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1454f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) { 1455f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent regionTone = toneType; 1456f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } else { 1457f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent regionTone = sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE]; 1458f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent } 1459f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1460f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent LOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone); 1461f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent 1462f3af740bdfc261b1cb25c0799af780d3753d4518Eric Laurent return regionTone; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// WaveGenerator::WaveGenerator class Implementation 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//---------------------------------- public methods ---------------------------- 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: WaveGenerator::WaveGenerator() 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Constructor. 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// samplingRate: Output sampling rate in Hz 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// frequency: Frequency of the sine wave to generate in Hz 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// volume: volume (0.0 to 1.0) 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectToneGenerator::WaveGenerator::WaveGenerator(unsigned short samplingRate, 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned short frequency, float volume) { 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double d0; 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double F_div_Fs; // frequency / samplingRate 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project F_div_Fs = frequency / (double)samplingRate; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs); 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mS2_0 = (short)d0; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mS1 = 0; 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mS2 = mS2_0; 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // take some margin for amplitude fluctuation 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAmplitude_Q15 > 32500) 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAmplitude_Q15 = 32500; 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos() 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d0 > 32767) 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d0 = 32767; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mA1_Q14 = (short) d0; 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d\n", 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mA1_Q14, mS2_0, mAmplitude_Q15); 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: WaveGenerator::~WaveGenerator() 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Destructor. 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectToneGenerator::WaveGenerator::~WaveGenerator() { 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Method: WaveGenerator::getSamples() 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Description: Generates count samples of a sine wave and accumulates 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// result in outBuffer. 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Input: 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// outBuffer: Output buffer where to accumulate samples. 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// count: number of samples to produce. 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// command: special action requested (see enum gen_command). 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Output: 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// none 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//////////////////////////////////////////////////////////////////////////////// 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid ToneGenerator::WaveGenerator::getSamples(short *outBuffer, 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned int count, unsigned int command) { 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lS1, lS2; 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long lA1, lAmplitude; 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long Sample; // current sample 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // init local 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (command == WAVEGEN_START) { 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS1 = (long)0; 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS2 = (long)mS2_0; 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS1 = (long)mS1; 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS2 = (long)mS2; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lA1 = (long)mA1_Q14; 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lAmplitude = (long)mAmplitude_Q15; 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (command == WAVEGEN_STOP) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lAmplitude <<= 16; 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count == 0) { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long dec = lAmplitude/count; 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // loop generation 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count--) { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shift delay 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS2 = lS1; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS1 = Sample; 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sample = ((lAmplitude>>16) * Sample) >> S_Q15; 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lAmplitude -= dec; 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // loop generation 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count--) { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sample = ((lA1 * lS1) >> S_Q14) - lS2; 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shift delay 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS2 = lS1; 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lS1 = Sample; 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sample = (lAmplitude * Sample) >> S_Q15; 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *(outBuffer++) += (short)Sample; // put result in buffer 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save status 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mS1 = (short)lS1; 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mS2 = (short)lS2; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // end namespace android 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1596