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