xref: /aosp_15_r20/frameworks/av/media/libaudioclient/ToneGenerator.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ToneGenerator"
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utility>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <math.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
26*ec779b8eSAndroid Build Coastguard Worker #include "media/ToneGenerator.h"
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker namespace android {
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker using android::content::AttributionSourceState;
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker // Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details)
34*ec779b8eSAndroid Build Coastguard Worker const ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = {
35*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 941, 0 }, 0, 0},
36*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
37*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
38*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_0
39*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 697, 0 }, 0, 0 },
40*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
41*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
42*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_1
43*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 697, 0 }, 0, 0 },
44*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
45*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
46*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_2
47*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 697, 0 }, 0, 0 },
48*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
49*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
50*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_3
51*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 770, 0 }, 0, 0 },
52*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
53*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
54*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_4
55*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 770, 0 }, 0, 0 },
56*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
57*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
58*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_5
59*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 770, 0 }, 0, 0 },
60*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
61*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
62*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_6
63*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 852, 0 }, 0, 0 },
64*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
65*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
66*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_7
67*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 852, 0 }, 0, 0 },
68*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
69*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
70*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_8
71*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 852, 0 }, 0, 0 },
72*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
73*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
74*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_9
75*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 941, 0 }, 0, 0 },
76*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
77*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
78*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_S
79*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 941, 0 }, 0, 0 },
80*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
81*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
82*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_P
83*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 697, 0 }, 0, 0 },
84*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
85*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
86*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_A
87*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 770, 0 }, 0, 0 },
88*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
89*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
90*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_DTMF_B
91*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 852, 0 }, 0, 0 },
92*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
93*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
94*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_C
95*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 941, 0 }, 0, 0 },
96*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
97*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
98*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_DTMF_D
99*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0 },
100*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
101*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
102*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_DIAL
103*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500 , .waveFreq = { 425, 0 }, 0, 0},
104*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0},
105*ec779b8eSAndroid Build Coastguard Worker                            { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
106*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
107*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_BUSY
108*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
109*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
110*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
111*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
112*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_CONGESTION
113*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
114*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
115*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
116*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_RADIO_ACK
117*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0},
118*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0},
119*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
120*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 2,
121*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_RADIO_NOTAVAIL
122*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 330, .waveFreq = { 950, 1400, 1800, 0 }, 0, 0},
123*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0},
124*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
125*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
126*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_ERROR
127*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
128*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 600, .waveFreq = { 0 }, 0, 0 },
129*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
130*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
131*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
132*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
133*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_CALL_WAITING
134*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 1000, .waveFreq = { 425, 0 }, 0, 0 },
135*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
136*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
137*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
138*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_RINGTONE
139*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
140*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
141*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
142*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_PROP_BEEP
143*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 100, .waveFreq = { 1200, 0 }, 0, 0 },
144*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0  },
145*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
146*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 1,
147*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_PROP_ACK
148*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 300, 400, 500, 0 }, 0, 0 },
149*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
150*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
151*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_PROP_NACK
152*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 400, 1200, 0 }, 0, 0 },
153*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
154*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
155*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_PROP_PROMPT
156*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
157*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
158*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 },
159*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
160*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
161*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_PROP_BEEP2
162*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
163*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
164*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0 }},
165*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
166*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_INTERCEPT
167*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
168*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
169*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
170*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 7,
171*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_SUP_INTERCEPT_ABBREV
172*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
173*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
174*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
175*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 7,
176*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_SUP_CONGESTION_ABBREV
177*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 },
178*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
179*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
180*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 2,
181*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_SUP_CONFIRM
182*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 },
183*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
184*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
185*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 3,
186*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SUP_PIP
187*ec779b8eSAndroid Build Coastguard Worker         { .segments = {{ .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0},
188*ec779b8eSAndroid Build Coastguard Worker                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
189*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
190*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_DIAL_TONE_LITE
191*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 },
192*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
193*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
194*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
195*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_USA_RINGBACK
196*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
197*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
198*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
199*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt =  ToneGenerator::TONEGEN_INF,
200*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_INTERCEPT
201*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 },
202*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 },
203*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
204*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt =  0,
205*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_ABBR_INTERCEPT
206*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
207*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
208*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
209*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
210*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_REORDER
211*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
212*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
213*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
214*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 7,
215*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_ABBR_REORDER
216*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
217*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
218*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
219*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
220*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_BUSY
221*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 },
222*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
223*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
224*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 2,
225*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_CONFIRM
226*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 660, 1000, 0 }, 0, 0 },
227*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
228*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
229*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_ANSWER
230*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 },
231*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
232*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
233*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_CALLWAITING
234*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 },
235*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
236*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
237*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 3,
238*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_PIP
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
241*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64, .waveFreq = { 2556, 0}, 19, 0},
242*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 32, .waveFreq = { 2091, 0}, 0, 0},
243*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 48, .waveFreq = { 2556, 0}, 0, 0},
244*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0},
245*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,  .waveFreq = { 0 }, 0, 0}},
246*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
247*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL
248*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
249*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64, .waveFreq = { 2556, 0}, 7, 0 },
250*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
251*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 0 }, 0, 0 },
252*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 },
253*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64,  .waveFreq = { 2556, 0}, 7, 4 },
254*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 },
255*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
256*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,    .waveFreq = { 0 }, 0, 0 } },
257*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
258*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP
259*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
260*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64, .waveFreq = { 2556, 0}, 3, 0 },
261*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 },
262*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 },     0, 0 },
263*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 },
264*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64, .waveFreq = { 2556, 0}, 3, 4 },
265*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 },
266*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 },     0, 0 },
267*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },     0, 0 } },
268*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
269*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI
270*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
271*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
272*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3
273*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 32, .waveFreq = { 2091, 0 }, 0, 0 },
274*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 64, .waveFreq = { 2556, 0 }, 4, 0 },
275*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 20, .waveFreq = { 2091, 0 }, 0, 0 },
276*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,  .waveFreq = { 0 }      , 0, 0 } },
277*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
278*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING
279*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
280*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
281*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5
282*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
283*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
284*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6
285*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} },
286*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
287*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7
288*ec779b8eSAndroid Build Coastguard Worker 
289*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
290*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 39, 0 },
291*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 },     0, 0 },
292*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
293*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
294*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_L
295*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
296*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 39, 0 },
297*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 },     0, 0 },
298*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
299*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
300*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_L
301*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
302*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 39, 0 },
303*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 },     0, 0 },
304*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
305*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
306*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_L
307*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
308*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 15, 0 },
309*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 0 }, 0, 0 },
310*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 } },
311*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
312*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS
313*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
314*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 15, 0 },
315*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 0 }, 0, 0 },
316*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
317*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
318*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_SS
319*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
320*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 15, 0 },
321*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 0 }, 0, 0 },
322*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
323*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
324*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS
325*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
326*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
327*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
328*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
329*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
330*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
331*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
332*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 },
333*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
334*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
335*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
336*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SSL
337*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
338*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
339*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
340*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
341*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
342*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
343*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
344*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 },
345*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
346*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
347*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
348*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_SSL
349*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
350*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
351*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
352*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
353*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
354*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
355*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
356*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 },
357*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
358*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
359*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
360*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_SSL
361*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
362*ec779b8eSAndroid Build Coastguard Worker                           { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 },
363*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
364*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
365*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 },
366*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
367*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
368*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
369*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS_2
370*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
371*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 },
372*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
373*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
374*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 },
375*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
376*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
377*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
378*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_SS_2
379*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
380*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 },
381*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
382*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
383*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 },
384*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
385*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
386*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
387*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS_2
388*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
389*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 },
390*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
391*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
392*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 },
393*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
394*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
395*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 },
396*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
397*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
398*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
399*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SLS
400*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
401*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 },
402*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
403*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
404*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 },
405*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
406*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
407*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 },
408*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
409*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
410*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
411*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_SLS
412*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
413*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 },
414*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
415*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
416*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 },
417*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
418*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
419*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 },
420*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
421*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
422*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
423*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_SLS
424*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
425*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 },
426*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
427*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
428*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 3 },
429*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
430*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
431*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 },
432*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
433*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
434*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 9, 9 },
435*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
436*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
437*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
438*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_S_X4
439*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
440*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 },
441*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
442*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
443*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 3 },
444*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
445*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
446*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 },
447*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
448*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
449*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 9, 9 },
450*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
451*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
452*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
453*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_S_X4
454*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
455*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 },
456*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
457*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
458*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 3 },
459*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
460*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
461*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 },
462*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
463*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
464*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 9, 9 },
465*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2500, .waveFreq = { 0 }, 0, 0 },
466*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
467*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
468*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_S_X4
469*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
470*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 },
471*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
472*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
473*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
474*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_L
475*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
476*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 },
477*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
478*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
479*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
480*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_L
481*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
482*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 },
483*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
484*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
485*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
486*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_L
487*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
488*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
489*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
490*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
491*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
492*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
493*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
494*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
495*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SS
496*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
497*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
498*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
499*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
500*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
501*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
502*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
503*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
504*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SS
505*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
506*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
507*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
508*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
509*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
510*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
511*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
512*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
513*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SS
514*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
515*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
516*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
517*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
518*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
519*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
520*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
521*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 },
522*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
523*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
524*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
525*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SSL
526*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
527*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
528*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
529*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
530*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
531*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
532*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
533*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 },
534*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
535*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
536*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
537*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SSL
538*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
539*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
540*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
541*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
542*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
543*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
544*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
545*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 },
546*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
547*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
548*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
549*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SSL
550*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
551*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
552*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
553*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
554*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 15, 3 },
555*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
556*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
557*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 },
558*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
559*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
560*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
561*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SLS
562*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
563*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
564*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
565*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
566*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 15, 3 },
567*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
568*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
569*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 },
570*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
571*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
572*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
573*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SLS
574*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
575*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
576*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
577*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
578*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 15, 3 },
579*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
580*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
581*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 },
582*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 1000, .waveFreq = { 0 }, 0, 0 },
583*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
584*ec779b8eSAndroid Build Coastguard Worker            .repeatCnt = ToneGenerator::TONEGEN_INF,
585*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SLS
586*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
587*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 },
588*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
589*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
590*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 },
591*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
592*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
593*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 },
594*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
595*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 },
596*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 4000, 0 }, 7, 9 },
597*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 800, .waveFreq = { 0 }, 0, 0 },
598*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
599*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
600*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_S_X4
601*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
602*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 },
603*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
604*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
605*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 },
606*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
607*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
608*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 },
609*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
610*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 },
611*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 2900, 0 }, 7, 9 },
612*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 800, .waveFreq = { 0 }, 0, 0 },
613*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
614*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
615*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_S_X4
616*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
617*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 },
618*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
619*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
620*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 },
621*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
622*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
623*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 },
624*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
625*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 },
626*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 25, .waveFreq = { 1450, 0 }, 7, 9 },
627*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 800, .waveFreq = { 0 }, 0, 0 },
628*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
629*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
630*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_S_X4
631*ec779b8eSAndroid Build Coastguard Worker 
632*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
633*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 784, 0 },  0, 0 },
634*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 740, 0 },  0, 0 },
635*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 622, 0 },  0, 0 },
636*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
637*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,  .waveFreq = { 0 },       0, 0 } },
638*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
639*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_ALERT_NETWORK_LITE
640*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 },
641*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 659, 0 },  2, 0 },
642*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 },
643*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,  .waveFreq = { 0 },       0, 0 } },
644*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
645*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_ALERT_AUTOREDIAL_LITE
646*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 1150, 770, 0 }, 0, 0 },
647*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },            0, 0 } },
648*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
649*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_ONE_MIN_BEEP
650*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 120, .waveFreq = { 941, 1477, 0 }, 0, 0 },
651*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },            0, 0 } },
652*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
653*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE
654*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 375, .waveFreq = { 587, 0 }, 0, 0 },
655*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 125, .waveFreq = { 1175, 0 }, 0, 0 },
656*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
657*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
658*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_PRESSHOLDKEY_LITE
659*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 62, .waveFreq = { 587, 0 }, 0, 0 },
660*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
661*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 },
662*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
663*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 },
664*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
665*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 },
666*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 },
667*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,  .waveFreq = { 0 },      0, 0 } },
668*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
669*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_CDMA_ALERT_INCALL_LITE
670*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 125, .waveFreq = { 941, 0 }, 0, 0 },
671*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 10,  .waveFreq = { 0 },      2, 0 },
672*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4990, .waveFreq = { 0 },     0, 0 },
673*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,    .waveFreq = { 0 },     0, 0 } },
674*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
675*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_EMERGENCY_RINGBACK
676*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 125, .waveFreq = { 1319, 0 }, 0, 0 },
677*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 125, .waveFreq = { 0 },       0, 0 },
678*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
679*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 2,
680*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_ALERT_CALL_GUARD
681*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 125, .waveFreq = { 1047, 0 }, 0, 0 },
682*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 125, .waveFreq = { 370,  0 }, 0, 0 },
683*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
684*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
685*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_SOFT_ERROR_LITE
686*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 125, .waveFreq = { 1480, 0 }, 0, 0 },
687*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 125, .waveFreq = { 1397, 0 }, 0, 0 },
688*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 125, .waveFreq = { 784, 0 },  0, 0 },
689*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0,   .waveFreq = { 0 },       0, 0 } },
690*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
691*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_CALLDROP_LITE
692*ec779b8eSAndroid Build Coastguard Worker 
693*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 425, 0 }, 0, 0 },
694*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
695*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
696*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
697*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_NETWORK_BUSY_ONE_SHOT
698*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 1150, 770 }, 0, 0 },
699*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
700*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
701*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                           // TONE_CDMA_ABBR_ALERT
702*ec779b8eSAndroid Build Coastguard Worker           { .segments = { { .duration = 0, .waveFreq = { 0 }, 0, 0 }},
703*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 0,
704*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                            // TONE_CDMA_SIGNAL_OFF
705*ec779b8eSAndroid Build Coastguard Worker 
706*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 350, 440, 0 }, 0, 0 },
707*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
708*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
709*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_ANSI_DIAL
710*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
711*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
712*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
713*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
714*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_ANSI_BUSY
715*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 },
716*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
717*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
718*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
719*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_ANSI_CONGESTION
720*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 },
721*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 9700, .waveFreq = { 0 }, 0, 0 },
722*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 },
723*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
724*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 },
725*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
726*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
727*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 1 },                              // TONE_ANSI_CALL_WAITING
728*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 },
729*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4000, .waveFreq = { 0 }, 0, 0 },
730*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
731*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
732*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_ANSI_RINGTONE
733*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 400, 0 }, 0, 0 },
734*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
735*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
736*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_JAPAN_DIAL
737*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 400, 0 }, 0, 0 },
738*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
739*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
740*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
741*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_JAPAN_BUSY
742*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 1000, .waveFreq = { 400, 0 }, 0, 0 },
743*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
744*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
745*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
746*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_JAPAN_RADIO_ACK
747*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 1000, .waveFreq = { 400, 0 }, 0, 0 },
748*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
749*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
750*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
751*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_JAPAN_RINGTONE
752*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 375, .waveFreq = { 400, 0 }, 0, 0 },
753*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 375, .waveFreq = { 0 }, 0, 0 },
754*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
755*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
756*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_GB_BUSY
757*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 400, 0 }, 0, 0 },
758*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 350, .waveFreq = { 0 }, 0, 0 },
759*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 225, .waveFreq = { 400, 0 }, 0, 0 },
760*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 525, .waveFreq = { 0 }, 0, 0 },
761*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
762*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
763*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_GB_CONGESTION
764*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
765*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
766*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
767*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0},
768*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0}},
769*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
770*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_GB_RINGTONE
771*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 400, 425, 450, 0 }, 0, 0 },
772*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
773*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
774*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_AUSTRALIA_DIAL
775*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
776*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
777*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
778*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0},
779*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0}},
780*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
781*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_AUSTRALIA_RINGTONE
782*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 375, .waveFreq = { 425, 0 }, 0, 0 },
783*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 375, .waveFreq = { 0 }, 0, 0 },
784*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
785*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
786*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_AUSTRALIA_BUSY
787*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
788*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
789*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
790*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4400, .waveFreq = { 0 }, 0, 0 },
791*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
792*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
793*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_AUSTRALIA_CALL_WAITING
794*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 375, .waveFreq = { 425, 0 }, 0, 0 },
795*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 375, .waveFreq = { 0 }, 0, 0 },
796*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
797*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
798*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_AUSTRALIA_CONGESTION
799*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 750, .waveFreq = { 425, 0 }, 0, 0 },
800*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 750, .waveFreq = { 0 }, 0, 0 },
801*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
802*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
803*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SG_BUSY
804*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 401, 425, 449, 0 }, 0, 0 },
805*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
806*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 401, 425, 449, 0 }, 0, 0 },
807*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
808*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
809*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
810*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_SG_RINGTONE
811*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
812*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 500, .waveFreq = { 0 }, 0, 0 },
813*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
814*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
815*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_HK_BUSY
816*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 440, 480, 0 }, 0, 0 },
817*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
818*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 440, 480, 0 }, 0, 0 },
819*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
820*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
821*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
822*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_HK_RINGTONE
823*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
824*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
825*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
826*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0},
827*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0}},
828*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
829*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_IE_RINGTONE
830*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 180, .waveFreq = { 425, 0 }, 0, 0 },
831*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
832*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 },
833*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 4500, .waveFreq = { 0 }, 0, 0 },
834*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
835*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
836*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_IE_CALL_WAITING
837*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
838*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
839*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
840*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_INDIA_DIAL
841*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 750, .waveFreq = { 400, 0 }, 0, 0 },
842*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 750, .waveFreq = { 0 }, 0, 0 },
843*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
844*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
845*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                               // TONE_INDIA_BUSY
846*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 250, .waveFreq = { 400, 0 }, 0, 0 },
847*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
848*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
849*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
850*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_INDIA_CONGESTION
851*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
852*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 100, .waveFreq = { 0 }, 0, 0 },
853*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
854*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 7500, .waveFreq = { 0 }, 0, 0 },
855*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
856*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
857*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_INDIA_CALL_WAITING
858*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
859*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 200, .waveFreq = { 0 }, 0, 0 },
860*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 400, .waveFreq = { 375, 400, 425, 0 }, 0, 0 },
861*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
862*ec779b8eSAndroid Build Coastguard Worker                       { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
863*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
864*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                               // TONE_INDIA_RINGTONE
865*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 1000, .waveFreq = { 440, 480, 0 }, 0, 0 },
866*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
867*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
868*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
869*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                               // TONE_TW_RINGTONE
870*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 200, .waveFreq = { 400, 0 }, 0, 0 },
871*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
872*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
873*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = 3,
874*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                              // TONE_NZ_CALL_WAITING
875*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 500, .waveFreq = { 425, 0 }, 0, 0 },
876*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 250, .waveFreq = { 0 }, 0, 0 },
877*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
878*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
879*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 },                             // TONE_MY_CONGESTION
880*ec779b8eSAndroid Build Coastguard Worker         { .segments = { { .duration = 400, .waveFreq = { 425, 0 }, 0, 0 },
881*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 200, .waveFreq = { 0 }, 0, 0 },
882*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 400, .waveFreq = { 425, 0 }, 0, 0 },
883*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 2000, .waveFreq = { 0 }, 0, 0},
884*ec779b8eSAndroid Build Coastguard Worker                         { .duration = 0, .waveFreq = { 0 }, 0, 0}},
885*ec779b8eSAndroid Build Coastguard Worker           .repeatCnt = ToneGenerator::TONEGEN_INF,
886*ec779b8eSAndroid Build Coastguard Worker           .repeatSegment = 0 }                              // TONE_MY_RINGTONE
887*ec779b8eSAndroid Build Coastguard Worker };
888*ec779b8eSAndroid Build Coastguard Worker 
889*ec779b8eSAndroid Build Coastguard Worker // Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
890*ec779b8eSAndroid Build Coastguard Worker // to actual tone for current region.
891*ec779b8eSAndroid Build Coastguard Worker const unsigned char /*tone_type*/ ToneGenerator::sToneMappingTable[NUM_REGIONS-1][NUM_SUP_TONES] = {
892*ec779b8eSAndroid Build Coastguard Worker         {   // ANSI
893*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_DIAL,             // TONE_SUP_DIAL
894*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_BUSY,             // TONE_SUP_BUSY
895*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_CONGESTION,       // TONE_SUP_CONGESTION
896*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,         // TONE_SUP_RADIO_ACK
897*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,    // TONE_SUP_RADIO_NOTAVAIL
898*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,             // TONE_SUP_ERROR
899*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_CALL_WAITING,     // TONE_SUP_CALL_WAITING
900*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_RINGTONE          // TONE_SUP_RINGTONE
901*ec779b8eSAndroid Build Coastguard Worker         },
902*ec779b8eSAndroid Build Coastguard Worker         {   // JAPAN
903*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_DIAL,             // TONE_SUP_DIAL
904*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_BUSY,             // TONE_SUP_BUSY
905*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
906*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_RADIO_ACK,        // TONE_SUP_RADIO_ACK
907*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
908*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
909*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
910*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_RINGTONE          // TONE_SUP_RINGTONE
911*ec779b8eSAndroid Build Coastguard Worker         },
912*ec779b8eSAndroid Build Coastguard Worker         {   // GB
913*ec779b8eSAndroid Build Coastguard Worker             TONE_ANSI_DIAL,              // TONE_SUP_DIAL
914*ec779b8eSAndroid Build Coastguard Worker             TONE_GB_BUSY,                // TONE_SUP_BUSY
915*ec779b8eSAndroid Build Coastguard Worker             TONE_GB_CONGESTION,          // TONE_SUP_CONGESTION
916*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
917*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
918*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
919*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
920*ec779b8eSAndroid Build Coastguard Worker             TONE_GB_RINGTONE             // TONE_SUP_RINGTONE
921*ec779b8eSAndroid Build Coastguard Worker         },
922*ec779b8eSAndroid Build Coastguard Worker         {   // AUSTRALIA
923*ec779b8eSAndroid Build Coastguard Worker             TONE_AUSTRALIA_DIAL,        // TONE_SUP_DIAL
924*ec779b8eSAndroid Build Coastguard Worker             TONE_AUSTRALIA_BUSY,        // TONE_SUP_BUSY
925*ec779b8eSAndroid Build Coastguard Worker             TONE_AUSTRALIA_CONGESTION,  // TONE_SUP_CONGESTION
926*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,         // TONE_SUP_RADIO_ACK
927*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,    // TONE_SUP_RADIO_NOTAVAIL
928*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,             // TONE_SUP_ERROR
929*ec779b8eSAndroid Build Coastguard Worker             TONE_AUSTRALIA_CALL_WAITING,// TONE_SUP_CALL_WAITING
930*ec779b8eSAndroid Build Coastguard Worker             TONE_AUSTRALIA_RINGTONE     // TONE_SUP_RINGTONE
931*ec779b8eSAndroid Build Coastguard Worker         },
932*ec779b8eSAndroid Build Coastguard Worker         {   // SINGAPORE
933*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_DIAL,               // TONE_SUP_DIAL
934*ec779b8eSAndroid Build Coastguard Worker             TONE_SG_BUSY,                // TONE_SUP_BUSY
935*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
936*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
937*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
938*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
939*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
940*ec779b8eSAndroid Build Coastguard Worker             TONE_SG_RINGTONE             // TONE_SUP_RINGTONE
941*ec779b8eSAndroid Build Coastguard Worker         },
942*ec779b8eSAndroid Build Coastguard Worker         {   // HONGKONG
943*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_DIAL,               // TONE_SUP_DIAL
944*ec779b8eSAndroid Build Coastguard Worker             TONE_HK_BUSY,                // TONE_SUP_BUSY
945*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
946*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
947*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
948*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
949*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
950*ec779b8eSAndroid Build Coastguard Worker             TONE_HK_RINGTONE             // TONE_SUP_RINGTONE
951*ec779b8eSAndroid Build Coastguard Worker         },
952*ec779b8eSAndroid Build Coastguard Worker         {   // IRELAND
953*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_DIAL,               // TONE_SUP_DIAL
954*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_BUSY,               // TONE_SUP_BUSY
955*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
956*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
957*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
958*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
959*ec779b8eSAndroid Build Coastguard Worker             TONE_IE_CALL_WAITING,        // TONE_SUP_CALL_WAITING
960*ec779b8eSAndroid Build Coastguard Worker             TONE_IE_RINGTONE             // TONE_SUP_RINGTONE
961*ec779b8eSAndroid Build Coastguard Worker         },
962*ec779b8eSAndroid Build Coastguard Worker         {   // INDIA
963*ec779b8eSAndroid Build Coastguard Worker             TONE_INDIA_DIAL,             // TONE_SUP_DIAL
964*ec779b8eSAndroid Build Coastguard Worker             TONE_INDIA_BUSY,             // TONE_SUP_BUSY
965*ec779b8eSAndroid Build Coastguard Worker             TONE_INDIA_CONGESTION,       // TONE_SUP_CONGESTION
966*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
967*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
968*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
969*ec779b8eSAndroid Build Coastguard Worker             TONE_INDIA_CALL_WAITING,     // TONE_SUP_CALL_WAITING
970*ec779b8eSAndroid Build Coastguard Worker             TONE_INDIA_RINGTONE          // TONE_SUP_RINGTONE
971*ec779b8eSAndroid Build Coastguard Worker         },
972*ec779b8eSAndroid Build Coastguard Worker         {   // TAIWAN
973*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_DIAL,               // TONE_SUP_DIAL
974*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_BUSY,               // TONE_SUP_BUSY
975*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,         // TONE_SUP_CONGESTION
976*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,          // TONE_SUP_RADIO_ACK
977*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,     // TONE_SUP_RADIO_NOTAVAIL
978*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,              // TONE_SUP_ERROR
979*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,       // TONE_SUP_CALL_WAITING
980*ec779b8eSAndroid Build Coastguard Worker             TONE_TW_RINGTONE             // TONE_SUP_RINGTONE
981*ec779b8eSAndroid Build Coastguard Worker         },
982*ec779b8eSAndroid Build Coastguard Worker         {   // NEW ZEALAND
983*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_DIAL,              // TONE_SUP_DIAL
984*ec779b8eSAndroid Build Coastguard Worker             TONE_JAPAN_BUSY,              // TONE_SUP_BUSY
985*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CONGESTION,          // TONE_SUP_CONGESTION
986*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,           // TONE_SUP_RADIO_ACK
987*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,      // TONE_SUP_RADIO_NOTAVAIL
988*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,               // TONE_SUP_ERROR
989*ec779b8eSAndroid Build Coastguard Worker             TONE_NZ_CALL_WAITING,         // TONE_SUP_CALL_WAITING
990*ec779b8eSAndroid Build Coastguard Worker             TONE_GB_RINGTONE              // TONE_SUP_RINGTONE
991*ec779b8eSAndroid Build Coastguard Worker         },
992*ec779b8eSAndroid Build Coastguard Worker         {   // MALAYSIA
993*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_DIAL,                // TONE_SUP_DIAL
994*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_BUSY,                // TONE_SUP_BUSY
995*ec779b8eSAndroid Build Coastguard Worker             TONE_MY_CONGESTION,           // TONE_SUP_CONGESTION
996*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_ACK,           // TONE_SUP_RADIO_ACK
997*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_RADIO_NOTAVAIL,      // TONE_SUP_RADIO_NOTAVAIL
998*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_ERROR,               // TONE_SUP_ERROR
999*ec779b8eSAndroid Build Coastguard Worker             TONE_SUP_CALL_WAITING,        // TONE_SUP_CALL_WAITING
1000*ec779b8eSAndroid Build Coastguard Worker             TONE_MY_RINGTONE              // TONE_SUP_RINGTONE
1001*ec779b8eSAndroid Build Coastguard Worker         }
1002*ec779b8eSAndroid Build Coastguard Worker };
1003*ec779b8eSAndroid Build Coastguard Worker 
1004*ec779b8eSAndroid Build Coastguard Worker 
1005*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1006*ec779b8eSAndroid Build Coastguard Worker //                           ToneGenerator class Implementation
1007*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1008*ec779b8eSAndroid Build Coastguard Worker 
1009*ec779b8eSAndroid Build Coastguard Worker 
1010*ec779b8eSAndroid Build Coastguard Worker //---------------------------------- public methods ----------------------------
1011*ec779b8eSAndroid Build Coastguard Worker 
1012*ec779b8eSAndroid Build Coastguard Worker 
1013*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1014*ec779b8eSAndroid Build Coastguard Worker //
1015*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::ToneGenerator()
1016*ec779b8eSAndroid Build Coastguard Worker //
1017*ec779b8eSAndroid Build Coastguard Worker //    Description:    Constructor. Initializes the tone sequencer, intantiates required sine wave
1018*ec779b8eSAndroid Build Coastguard Worker //        generators, does not initialize output audio track.
1019*ec779b8eSAndroid Build Coastguard Worker //
1020*ec779b8eSAndroid Build Coastguard Worker //    Input:
1021*ec779b8eSAndroid Build Coastguard Worker //        streamType:        Type of stream used for tone playback
1022*ec779b8eSAndroid Build Coastguard Worker //        volume:            volume applied to tone (0.0 to 1.0)
1023*ec779b8eSAndroid Build Coastguard Worker //
1024*ec779b8eSAndroid Build Coastguard Worker //    Output:
1025*ec779b8eSAndroid Build Coastguard Worker //        none
1026*ec779b8eSAndroid Build Coastguard Worker //
1027*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
ToneGenerator(audio_stream_type_t streamType,float volume,bool threadCanCallJava,std::string opPackageName)1028*ec779b8eSAndroid Build Coastguard Worker ToneGenerator::ToneGenerator(audio_stream_type_t streamType, float volume, bool threadCanCallJava,
1029*ec779b8eSAndroid Build Coastguard Worker         std::string opPackageName)
1030*ec779b8eSAndroid Build Coastguard Worker         : mOpPackageName(std::move(opPackageName)) {
1031*ec779b8eSAndroid Build Coastguard Worker 
1032*ec779b8eSAndroid Build Coastguard Worker     ALOGV("ToneGenerator constructor: streamType=%d, volume=%f", streamType, volume);
1033*ec779b8eSAndroid Build Coastguard Worker 
1034*ec779b8eSAndroid Build Coastguard Worker     mState = TONE_IDLE;
1035*ec779b8eSAndroid Build Coastguard Worker 
1036*ec779b8eSAndroid Build Coastguard Worker     mThreadCanCallJava = threadCanCallJava;
1037*ec779b8eSAndroid Build Coastguard Worker     mStreamType = streamType;
1038*ec779b8eSAndroid Build Coastguard Worker     mVolume = volume;
1039*ec779b8eSAndroid Build Coastguard Worker     mpToneDesc = NULL;
1040*ec779b8eSAndroid Build Coastguard Worker     mpNewToneDesc = NULL;
1041*ec779b8eSAndroid Build Coastguard Worker 
1042*ec779b8eSAndroid Build Coastguard Worker     char value[PROPERTY_VALUE_MAX];
1043*ec779b8eSAndroid Build Coastguard Worker     if (property_get("gsm.operator.iso-country", value, "") == 0) {
1044*ec779b8eSAndroid Build Coastguard Worker         property_get("gsm.sim.operator.iso-country", value, "");
1045*ec779b8eSAndroid Build Coastguard Worker     }
1046*ec779b8eSAndroid Build Coastguard Worker     // If dual sim device has two SIM cards inserted and is not registered to any network,
1047*ec779b8eSAndroid Build Coastguard Worker     // "," is set to "gsm.operator.iso-country" prop.
1048*ec779b8eSAndroid Build Coastguard Worker     // In this case, "gsm.sim.operator.iso-country" prop should be used.
1049*ec779b8eSAndroid Build Coastguard Worker     if (strlen(value) == 1 && strstr(value, ",") != NULL) {
1050*ec779b8eSAndroid Build Coastguard Worker         property_get("gsm.sim.operator.iso-country", value, "");
1051*ec779b8eSAndroid Build Coastguard Worker     }
1052*ec779b8eSAndroid Build Coastguard Worker 
1053*ec779b8eSAndroid Build Coastguard Worker     if (strstr(value, "us") != NULL ||
1054*ec779b8eSAndroid Build Coastguard Worker         strstr(value, "ca") != NULL) {
1055*ec779b8eSAndroid Build Coastguard Worker         mRegion = ANSI;
1056*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "jp") != NULL) {
1057*ec779b8eSAndroid Build Coastguard Worker         mRegion = JAPAN;
1058*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "gb") != NULL) {
1059*ec779b8eSAndroid Build Coastguard Worker         mRegion = GB;
1060*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "au") != NULL) {
1061*ec779b8eSAndroid Build Coastguard Worker         mRegion = AUSTRALIA;
1062*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "sg") != NULL) {
1063*ec779b8eSAndroid Build Coastguard Worker         mRegion = SINGAPORE;
1064*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "hk") != NULL) {
1065*ec779b8eSAndroid Build Coastguard Worker         mRegion = HONGKONG;
1066*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "ie") != NULL) {
1067*ec779b8eSAndroid Build Coastguard Worker         mRegion = IRELAND;
1068*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "in") != NULL) {
1069*ec779b8eSAndroid Build Coastguard Worker         mRegion = INDIA;
1070*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "tw") != NULL) {
1071*ec779b8eSAndroid Build Coastguard Worker         mRegion = TAIWAN;
1072*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "nz") != NULL) {
1073*ec779b8eSAndroid Build Coastguard Worker         mRegion = NZ;
1074*ec779b8eSAndroid Build Coastguard Worker     } else if (strstr(value, "my") != NULL) {
1075*ec779b8eSAndroid Build Coastguard Worker         mRegion = MY;
1076*ec779b8eSAndroid Build Coastguard Worker     } else {
1077*ec779b8eSAndroid Build Coastguard Worker         mRegion = CEPT;
1078*ec779b8eSAndroid Build Coastguard Worker     }
1079*ec779b8eSAndroid Build Coastguard Worker 
1080*ec779b8eSAndroid Build Coastguard Worker }
1081*ec779b8eSAndroid Build Coastguard Worker 
1082*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1083*ec779b8eSAndroid Build Coastguard Worker //
1084*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::onFirstRef()
1085*ec779b8eSAndroid Build Coastguard Worker //
1086*ec779b8eSAndroid Build Coastguard Worker //    Description:  Called upon first RefBase reference. Initializes audio track
1087*ec779b8eSAndroid Build Coastguard Worker //                  with weak pointer to self as the registered callback.
1088*ec779b8eSAndroid Build Coastguard Worker //    Input:
1089*ec779b8eSAndroid Build Coastguard Worker //        none
1090*ec779b8eSAndroid Build Coastguard Worker //
1091*ec779b8eSAndroid Build Coastguard Worker //    Output:
1092*ec779b8eSAndroid Build Coastguard Worker //        none
1093*ec779b8eSAndroid Build Coastguard Worker //
1094*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1095*ec779b8eSAndroid Build Coastguard Worker 
onFirstRef()1096*ec779b8eSAndroid Build Coastguard Worker void ToneGenerator::onFirstRef() {
1097*ec779b8eSAndroid Build Coastguard Worker     if (initAudioTrack()) {
1098*ec779b8eSAndroid Build Coastguard Worker         ALOGV("ToneGenerator INIT OK, time: %d", (unsigned int)(systemTime()/1000000));
1099*ec779b8eSAndroid Build Coastguard Worker     } else {
1100*ec779b8eSAndroid Build Coastguard Worker         ALOGV("!!!ToneGenerator INIT FAILED!!!");
1101*ec779b8eSAndroid Build Coastguard Worker     }
1102*ec779b8eSAndroid Build Coastguard Worker }
1103*ec779b8eSAndroid Build Coastguard Worker 
1104*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1105*ec779b8eSAndroid Build Coastguard Worker //
1106*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::~ToneGenerator()
1107*ec779b8eSAndroid Build Coastguard Worker //
1108*ec779b8eSAndroid Build Coastguard Worker //    Description:    Destructor. Stop sound playback and delete audio track if
1109*ec779b8eSAndroid Build Coastguard Worker //      needed and delete sine wave generators.
1110*ec779b8eSAndroid Build Coastguard Worker //
1111*ec779b8eSAndroid Build Coastguard Worker //    Input:
1112*ec779b8eSAndroid Build Coastguard Worker //        none
1113*ec779b8eSAndroid Build Coastguard Worker //
1114*ec779b8eSAndroid Build Coastguard Worker //    Output:
1115*ec779b8eSAndroid Build Coastguard Worker //        none
1116*ec779b8eSAndroid Build Coastguard Worker //
1117*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
~ToneGenerator()1118*ec779b8eSAndroid Build Coastguard Worker ToneGenerator::~ToneGenerator() {
1119*ec779b8eSAndroid Build Coastguard Worker     ALOGV("ToneGenerator destructor");
1120*ec779b8eSAndroid Build Coastguard Worker 
1121*ec779b8eSAndroid Build Coastguard Worker     if (mpAudioTrack != 0) {
1122*ec779b8eSAndroid Build Coastguard Worker         stopTone();
1123*ec779b8eSAndroid Build Coastguard Worker         ALOGV("Delete Track: %p", mpAudioTrack.get());
1124*ec779b8eSAndroid Build Coastguard Worker         mpAudioTrack.clear();
1125*ec779b8eSAndroid Build Coastguard Worker     }
1126*ec779b8eSAndroid Build Coastguard Worker     clearWaveGens();
1127*ec779b8eSAndroid Build Coastguard Worker }
1128*ec779b8eSAndroid Build Coastguard Worker 
1129*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1130*ec779b8eSAndroid Build Coastguard Worker //
1131*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::startTone()
1132*ec779b8eSAndroid Build Coastguard Worker //
1133*ec779b8eSAndroid Build Coastguard Worker //    Description:    Starts tone playback.
1134*ec779b8eSAndroid Build Coastguard Worker //
1135*ec779b8eSAndroid Build Coastguard Worker //    Input:
1136*ec779b8eSAndroid Build Coastguard Worker //        toneType:        Type of tone generated (values in enum tone_type)
1137*ec779b8eSAndroid Build Coastguard Worker //        durationMs:      The tone duration in milliseconds. If the tone is limited in time by definition,
1138*ec779b8eSAndroid Build Coastguard Worker //              the actual duration will be the minimum of durationMs and the defined tone duration.
1139*ec779b8eSAndroid Build Coastguard Worker //              Ommiting or setting durationMs to -1 does not limit tone duration.
1140*ec779b8eSAndroid Build Coastguard Worker //
1141*ec779b8eSAndroid Build Coastguard Worker //    Output:
1142*ec779b8eSAndroid Build Coastguard Worker //        none
1143*ec779b8eSAndroid Build Coastguard Worker //
1144*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
startTone(tone_type toneType,int durationMs)1145*ec779b8eSAndroid Build Coastguard Worker bool ToneGenerator::startTone(tone_type toneType, int durationMs) {
1146*ec779b8eSAndroid Build Coastguard Worker     bool lResult = false;
1147*ec779b8eSAndroid Build Coastguard Worker     status_t lStatus;
1148*ec779b8eSAndroid Build Coastguard Worker 
1149*ec779b8eSAndroid Build Coastguard Worker     if (toneType >= NUM_TONES)
1150*ec779b8eSAndroid Build Coastguard Worker         return lResult;
1151*ec779b8eSAndroid Build Coastguard Worker 
1152*ec779b8eSAndroid Build Coastguard Worker     toneType = getToneForRegion(toneType);
1153*ec779b8eSAndroid Build Coastguard Worker     if (toneType == TONE_CDMA_SIGNAL_OFF) {
1154*ec779b8eSAndroid Build Coastguard Worker         return true;
1155*ec779b8eSAndroid Build Coastguard Worker     }
1156*ec779b8eSAndroid Build Coastguard Worker 
1157*ec779b8eSAndroid Build Coastguard Worker     if (mState == TONE_IDLE) {
1158*ec779b8eSAndroid Build Coastguard Worker         ALOGV("startTone: try to re-init AudioTrack");
1159*ec779b8eSAndroid Build Coastguard Worker         if (!initAudioTrack()) {
1160*ec779b8eSAndroid Build Coastguard Worker             return lResult;
1161*ec779b8eSAndroid Build Coastguard Worker         }
1162*ec779b8eSAndroid Build Coastguard Worker     }
1163*ec779b8eSAndroid Build Coastguard Worker 
1164*ec779b8eSAndroid Build Coastguard Worker     ALOGV("startTone toneType %d", toneType);
1165*ec779b8eSAndroid Build Coastguard Worker 
1166*ec779b8eSAndroid Build Coastguard Worker     mLock.lock();
1167*ec779b8eSAndroid Build Coastguard Worker 
1168*ec779b8eSAndroid Build Coastguard Worker     // Get descriptor for requested tone
1169*ec779b8eSAndroid Build Coastguard Worker     mpNewToneDesc = &sToneDescriptors[toneType];
1170*ec779b8eSAndroid Build Coastguard Worker 
1171*ec779b8eSAndroid Build Coastguard Worker     mDurationMs = durationMs;
1172*ec779b8eSAndroid Build Coastguard Worker 
1173*ec779b8eSAndroid Build Coastguard Worker     if (mState == TONE_STOPPED) {
1174*ec779b8eSAndroid Build Coastguard Worker         ALOGV("Start waiting for previous tone to stop");
1175*ec779b8eSAndroid Build Coastguard Worker         lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
1176*ec779b8eSAndroid Build Coastguard Worker         if (lStatus != NO_ERROR) {
1177*ec779b8eSAndroid Build Coastguard Worker             ALOGE("--- start wait for stop timed out, status %d", lStatus);
1178*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_IDLE;
1179*ec779b8eSAndroid Build Coastguard Worker             mLock.unlock();
1180*ec779b8eSAndroid Build Coastguard Worker             return lResult;
1181*ec779b8eSAndroid Build Coastguard Worker         }
1182*ec779b8eSAndroid Build Coastguard Worker     }
1183*ec779b8eSAndroid Build Coastguard Worker 
1184*ec779b8eSAndroid Build Coastguard Worker     if (mState == TONE_INIT) {
1185*ec779b8eSAndroid Build Coastguard Worker         if (prepareWave()) {
1186*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Immediate start, time %d", (unsigned int)(systemTime()/1000000));
1187*ec779b8eSAndroid Build Coastguard Worker             lResult = true;
1188*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_STARTING;
1189*ec779b8eSAndroid Build Coastguard Worker             if (clock_gettime(CLOCK_MONOTONIC, &mStartTime) != 0) {
1190*ec779b8eSAndroid Build Coastguard Worker                 mStartTime.tv_sec = 0;
1191*ec779b8eSAndroid Build Coastguard Worker             }
1192*ec779b8eSAndroid Build Coastguard Worker             mLock.unlock();
1193*ec779b8eSAndroid Build Coastguard Worker             mpAudioTrack->start();
1194*ec779b8eSAndroid Build Coastguard Worker             mLock.lock();
1195*ec779b8eSAndroid Build Coastguard Worker             if (mState == TONE_STARTING) {
1196*ec779b8eSAndroid Build Coastguard Worker                 ALOGV("Wait for start callback");
1197*ec779b8eSAndroid Build Coastguard Worker                 lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
1198*ec779b8eSAndroid Build Coastguard Worker                 if (lStatus != NO_ERROR) {
1199*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("--- Immediate start timed out, status %d", lStatus);
1200*ec779b8eSAndroid Build Coastguard Worker                     mState = TONE_IDLE;
1201*ec779b8eSAndroid Build Coastguard Worker                     lResult = false;
1202*ec779b8eSAndroid Build Coastguard Worker                 }
1203*ec779b8eSAndroid Build Coastguard Worker             }
1204*ec779b8eSAndroid Build Coastguard Worker         } else {
1205*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_IDLE;
1206*ec779b8eSAndroid Build Coastguard Worker         }
1207*ec779b8eSAndroid Build Coastguard Worker     } else {
1208*ec779b8eSAndroid Build Coastguard Worker         ALOGV("Delayed start");
1209*ec779b8eSAndroid Build Coastguard Worker         mState = TONE_RESTARTING;
1210*ec779b8eSAndroid Build Coastguard Worker         mStartTime.tv_sec = 0;
1211*ec779b8eSAndroid Build Coastguard Worker         lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
1212*ec779b8eSAndroid Build Coastguard Worker         if (lStatus == NO_ERROR) {
1213*ec779b8eSAndroid Build Coastguard Worker             if (mState != TONE_IDLE) {
1214*ec779b8eSAndroid Build Coastguard Worker                 lResult = true;
1215*ec779b8eSAndroid Build Coastguard Worker             }
1216*ec779b8eSAndroid Build Coastguard Worker             ALOGV("cond received");
1217*ec779b8eSAndroid Build Coastguard Worker         } else {
1218*ec779b8eSAndroid Build Coastguard Worker             ALOGE("--- Delayed start timed out, status %d", lStatus);
1219*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_IDLE;
1220*ec779b8eSAndroid Build Coastguard Worker         }
1221*ec779b8eSAndroid Build Coastguard Worker     }
1222*ec779b8eSAndroid Build Coastguard Worker     mLock.unlock();
1223*ec779b8eSAndroid Build Coastguard Worker 
1224*ec779b8eSAndroid Build Coastguard Worker     ALOGV_IF(lResult, "Tone started, time %d", (unsigned int)(systemTime()/1000000));
1225*ec779b8eSAndroid Build Coastguard Worker     ALOGW_IF(!lResult, "Tone start failed!!!, time %d", (unsigned int)(systemTime()/1000000));
1226*ec779b8eSAndroid Build Coastguard Worker 
1227*ec779b8eSAndroid Build Coastguard Worker     return lResult;
1228*ec779b8eSAndroid Build Coastguard Worker }
1229*ec779b8eSAndroid Build Coastguard Worker 
1230*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1231*ec779b8eSAndroid Build Coastguard Worker //
1232*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::stopTone()
1233*ec779b8eSAndroid Build Coastguard Worker //
1234*ec779b8eSAndroid Build Coastguard Worker //    Description:    Stops tone playback.
1235*ec779b8eSAndroid Build Coastguard Worker //
1236*ec779b8eSAndroid Build Coastguard Worker //    Input:
1237*ec779b8eSAndroid Build Coastguard Worker //        none
1238*ec779b8eSAndroid Build Coastguard Worker //
1239*ec779b8eSAndroid Build Coastguard Worker //    Output:
1240*ec779b8eSAndroid Build Coastguard Worker //        none
1241*ec779b8eSAndroid Build Coastguard Worker //
1242*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
stopTone()1243*ec779b8eSAndroid Build Coastguard Worker void ToneGenerator::stopTone() {
1244*ec779b8eSAndroid Build Coastguard Worker     ALOGV("stopTone");
1245*ec779b8eSAndroid Build Coastguard Worker 
1246*ec779b8eSAndroid Build Coastguard Worker     mLock.lock();
1247*ec779b8eSAndroid Build Coastguard Worker     if (mState != TONE_IDLE && mState != TONE_INIT) {
1248*ec779b8eSAndroid Build Coastguard Worker         if (mState == TONE_PLAYING || mState == TONE_STARTING || mState == TONE_RESTARTING) {
1249*ec779b8eSAndroid Build Coastguard Worker             struct timespec stopTime;
1250*ec779b8eSAndroid Build Coastguard Worker             // If the start time is valid, make sure that the number of audio samples produced
1251*ec779b8eSAndroid Build Coastguard Worker             // corresponds at least to the time between the start and stop commands.
1252*ec779b8eSAndroid Build Coastguard Worker             // This is needed in case of cold start of the output stream.
1253*ec779b8eSAndroid Build Coastguard Worker             if ((mStartTime.tv_sec != 0) && (clock_gettime(CLOCK_MONOTONIC, &stopTime) == 0)) {
1254*ec779b8eSAndroid Build Coastguard Worker                 time_t sec = stopTime.tv_sec - mStartTime.tv_sec;
1255*ec779b8eSAndroid Build Coastguard Worker                 auto nsec = stopTime.tv_nsec - mStartTime.tv_nsec;
1256*ec779b8eSAndroid Build Coastguard Worker                 if (nsec < 0) {
1257*ec779b8eSAndroid Build Coastguard Worker                     --sec;
1258*ec779b8eSAndroid Build Coastguard Worker                     nsec += 1000000000;
1259*ec779b8eSAndroid Build Coastguard Worker                 }
1260*ec779b8eSAndroid Build Coastguard Worker 
1261*ec779b8eSAndroid Build Coastguard Worker                 const uint64_t msec = static_cast<uint64_t>(sec) * 1000 + nsec / 1'000'000;
1262*ec779b8eSAndroid Build Coastguard Worker                 mMaxSmp = std::min(static_cast<uint64_t>(TONEGEN_INF - 1),
1263*ec779b8eSAndroid Build Coastguard Worker                         msec * mSamplingRate / 1000);
1264*ec779b8eSAndroid Build Coastguard Worker 
1265*ec779b8eSAndroid Build Coastguard Worker                 ALOGV("stopTone() forcing mMaxSmp to %d, total for far %" PRIu64, mMaxSmp,
1266*ec779b8eSAndroid Build Coastguard Worker                       mTotalSmp);
1267*ec779b8eSAndroid Build Coastguard Worker             } else {
1268*ec779b8eSAndroid Build Coastguard Worker                 mState = TONE_STOPPING;
1269*ec779b8eSAndroid Build Coastguard Worker             }
1270*ec779b8eSAndroid Build Coastguard Worker         }
1271*ec779b8eSAndroid Build Coastguard Worker         ALOGV("waiting cond");
1272*ec779b8eSAndroid Build Coastguard Worker         status_t lStatus = mWaitCbkCond.waitRelative(mLock, seconds(3));
1273*ec779b8eSAndroid Build Coastguard Worker         if (lStatus == NO_ERROR) {
1274*ec779b8eSAndroid Build Coastguard Worker             // If the tone was restarted exit now before calling clearWaveGens();
1275*ec779b8eSAndroid Build Coastguard Worker             if (mState != TONE_INIT) {
1276*ec779b8eSAndroid Build Coastguard Worker                 mLock.unlock();
1277*ec779b8eSAndroid Build Coastguard Worker                 return;
1278*ec779b8eSAndroid Build Coastguard Worker             }
1279*ec779b8eSAndroid Build Coastguard Worker             ALOGV("track stop complete, time %d", (unsigned int)(systemTime()/1000000));
1280*ec779b8eSAndroid Build Coastguard Worker         } else {
1281*ec779b8eSAndroid Build Coastguard Worker             ALOGE("--- Stop timed out");
1282*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_IDLE;
1283*ec779b8eSAndroid Build Coastguard Worker             mpAudioTrack->stop();
1284*ec779b8eSAndroid Build Coastguard Worker         }
1285*ec779b8eSAndroid Build Coastguard Worker         clearWaveGens();
1286*ec779b8eSAndroid Build Coastguard Worker     }
1287*ec779b8eSAndroid Build Coastguard Worker 
1288*ec779b8eSAndroid Build Coastguard Worker     mLock.unlock();
1289*ec779b8eSAndroid Build Coastguard Worker }
1290*ec779b8eSAndroid Build Coastguard Worker 
1291*ec779b8eSAndroid Build Coastguard Worker //---------------------------------- private methods ---------------------------
1292*ec779b8eSAndroid Build Coastguard Worker 
1293*ec779b8eSAndroid Build Coastguard Worker 
1294*ec779b8eSAndroid Build Coastguard Worker 
1295*ec779b8eSAndroid Build Coastguard Worker 
1296*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1297*ec779b8eSAndroid Build Coastguard Worker //
1298*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::initAudioTrack()
1299*ec779b8eSAndroid Build Coastguard Worker //
1300*ec779b8eSAndroid Build Coastguard Worker //    Description:    Allocates and configures AudioTrack used for PCM output.
1301*ec779b8eSAndroid Build Coastguard Worker //
1302*ec779b8eSAndroid Build Coastguard Worker //    Input:
1303*ec779b8eSAndroid Build Coastguard Worker //        none
1304*ec779b8eSAndroid Build Coastguard Worker //
1305*ec779b8eSAndroid Build Coastguard Worker //    Output:
1306*ec779b8eSAndroid Build Coastguard Worker //        none
1307*ec779b8eSAndroid Build Coastguard Worker //
1308*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
initAudioTrack()1309*ec779b8eSAndroid Build Coastguard Worker bool ToneGenerator::initAudioTrack() {
1310*ec779b8eSAndroid Build Coastguard Worker     // Open audio track in mono, PCM 16bit, default sampling rate.
1311*ec779b8eSAndroid Build Coastguard Worker     // TODO b/182392769: use attribution source util
1312*ec779b8eSAndroid Build Coastguard Worker     AttributionSourceState attributionSource = AttributionSourceState();
1313*ec779b8eSAndroid Build Coastguard Worker     attributionSource.packageName = mOpPackageName;
1314*ec779b8eSAndroid Build Coastguard Worker     attributionSource.token = sp<BBinder>::make();
1315*ec779b8eSAndroid Build Coastguard Worker     mpAudioTrack = new AudioTrack(attributionSource);
1316*ec779b8eSAndroid Build Coastguard Worker     ALOGV("AudioTrack(%p) created", mpAudioTrack.get());
1317*ec779b8eSAndroid Build Coastguard Worker 
1318*ec779b8eSAndroid Build Coastguard Worker 
1319*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attr;
1320*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t streamType = mStreamType;
1321*ec779b8eSAndroid Build Coastguard Worker     if (mStreamType == AUDIO_STREAM_VOICE_CALL || mStreamType == AUDIO_STREAM_BLUETOOTH_SCO) {
1322*ec779b8eSAndroid Build Coastguard Worker         streamType = AUDIO_STREAM_DTMF;
1323*ec779b8eSAndroid Build Coastguard Worker     }
1324*ec779b8eSAndroid Build Coastguard Worker     attr = AudioSystem::streamTypeToAttributes(streamType);
1325*ec779b8eSAndroid Build Coastguard Worker     attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_LOW_LATENCY);
1326*ec779b8eSAndroid Build Coastguard Worker 
1327*ec779b8eSAndroid Build Coastguard Worker     status_t status = mpAudioTrack->set(
1328*ec779b8eSAndroid Build Coastguard Worker             AUDIO_STREAM_DEFAULT,
1329*ec779b8eSAndroid Build Coastguard Worker             0,    // sampleRate
1330*ec779b8eSAndroid Build Coastguard Worker             AUDIO_FORMAT_PCM_16_BIT,
1331*ec779b8eSAndroid Build Coastguard Worker             AUDIO_CHANNEL_OUT_MONO,
1332*ec779b8eSAndroid Build Coastguard Worker             0,    // frameCount
1333*ec779b8eSAndroid Build Coastguard Worker             AUDIO_OUTPUT_FLAG_NONE,
1334*ec779b8eSAndroid Build Coastguard Worker             wp<AudioTrack::IAudioTrackCallback>::fromExisting(this),
1335*ec779b8eSAndroid Build Coastguard Worker             0,    // notificationFrames
1336*ec779b8eSAndroid Build Coastguard Worker             0,    // sharedBuffer
1337*ec779b8eSAndroid Build Coastguard Worker             mThreadCanCallJava,
1338*ec779b8eSAndroid Build Coastguard Worker             AUDIO_SESSION_ALLOCATE,
1339*ec779b8eSAndroid Build Coastguard Worker             AudioTrack::TRANSFER_CALLBACK,
1340*ec779b8eSAndroid Build Coastguard Worker             nullptr,
1341*ec779b8eSAndroid Build Coastguard Worker             attributionSource,
1342*ec779b8eSAndroid Build Coastguard Worker             &attr);
1343*ec779b8eSAndroid Build Coastguard Worker     // Set caller name so it can be logged in destructor.
1344*ec779b8eSAndroid Build Coastguard Worker     // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_TONEGENERATOR
1345*ec779b8eSAndroid Build Coastguard Worker     mpAudioTrack->setCallerName("tonegenerator");
1346*ec779b8eSAndroid Build Coastguard Worker     if (status != NO_ERROR) {
1347*ec779b8eSAndroid Build Coastguard Worker         ALOGE("AudioTrack(%p) set failed with error %d", mpAudioTrack.get(), status);
1348*ec779b8eSAndroid Build Coastguard Worker         mpAudioTrack.clear();
1349*ec779b8eSAndroid Build Coastguard Worker         return false;
1350*ec779b8eSAndroid Build Coastguard Worker     }
1351*ec779b8eSAndroid Build Coastguard Worker 
1352*ec779b8eSAndroid Build Coastguard Worker     mSamplingRate = mpAudioTrack->getSampleRate();
1353*ec779b8eSAndroid Build Coastguard Worker     // Generate tone by chunks of 20 ms to keep cadencing precision
1354*ec779b8eSAndroid Build Coastguard Worker     mProcessSize = (mSamplingRate * 20) / 1000;
1355*ec779b8eSAndroid Build Coastguard Worker 
1356*ec779b8eSAndroid Build Coastguard Worker     mpAudioTrack->setVolume(mVolume);
1357*ec779b8eSAndroid Build Coastguard Worker     mState = TONE_INIT;
1358*ec779b8eSAndroid Build Coastguard Worker     return true;
1359*ec779b8eSAndroid Build Coastguard Worker }
1360*ec779b8eSAndroid Build Coastguard Worker 
1361*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1362*ec779b8eSAndroid Build Coastguard Worker //
1363*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::onMoreData()
1364*ec779b8eSAndroid Build Coastguard Worker //
1365*ec779b8eSAndroid Build Coastguard Worker //    Description:    AudioTrack callback implementation. Generates a block of
1366*ec779b8eSAndroid Build Coastguard Worker //        PCM samples
1367*ec779b8eSAndroid Build Coastguard Worker //        and manages tone generator sequencer: tones pulses, tone duration...
1368*ec779b8eSAndroid Build Coastguard Worker //
1369*ec779b8eSAndroid Build Coastguard Worker //    Input:
1370*ec779b8eSAndroid Build Coastguard Worker //        buffer  An buffer object containing a pointer which we will fill with
1371*ec779b8eSAndroid Build Coastguard Worker //                buffer.size() bytes.
1372*ec779b8eSAndroid Build Coastguard Worker //
1373*ec779b8eSAndroid Build Coastguard Worker //    Output:
1374*ec779b8eSAndroid Build Coastguard Worker //        The number of bytes we successfully wrote.
1375*ec779b8eSAndroid Build Coastguard Worker //
1376*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
onMoreData(const AudioTrack::Buffer & buffer)1377*ec779b8eSAndroid Build Coastguard Worker size_t ToneGenerator::onMoreData(const AudioTrack::Buffer& buffer) {
1378*ec779b8eSAndroid Build Coastguard Worker 
1379*ec779b8eSAndroid Build Coastguard Worker     int16_t *lpOut = reinterpret_cast<int16_t*>(buffer.data());
1380*ec779b8eSAndroid Build Coastguard Worker     uint32_t lNumSmp = (buffer.size() / sizeof(int16_t) < UINT32_MAX) ?
1381*ec779b8eSAndroid Build Coastguard Worker             buffer.size() / sizeof(int16_t) : UINT32_MAX;
1382*ec779b8eSAndroid Build Coastguard Worker     if (buffer.size() == 0) return 0;
1383*ec779b8eSAndroid Build Coastguard Worker     // We will write to the entire buffer unless we are stopped, then we return
1384*ec779b8eSAndroid Build Coastguard Worker     // 0 at loop end
1385*ec779b8eSAndroid Build Coastguard Worker     size_t bytesWritten = lNumSmp * sizeof(int16_t);
1386*ec779b8eSAndroid Build Coastguard Worker 
1387*ec779b8eSAndroid Build Coastguard Worker     // Clear output buffer: WaveGenerator accumulates into lpOut buffer
1388*ec779b8eSAndroid Build Coastguard Worker     memset(lpOut, 0, buffer.size());
1389*ec779b8eSAndroid Build Coastguard Worker 
1390*ec779b8eSAndroid Build Coastguard Worker     while (lNumSmp) {
1391*ec779b8eSAndroid Build Coastguard Worker         unsigned int lReqSmp = lNumSmp < mProcessSize*2 ? lNumSmp : mProcessSize;
1392*ec779b8eSAndroid Build Coastguard Worker         unsigned int lGenSmp;
1393*ec779b8eSAndroid Build Coastguard Worker         unsigned int lWaveCmd = WaveGenerator::WAVEGEN_CONT;
1394*ec779b8eSAndroid Build Coastguard Worker         bool lSignal = false;
1395*ec779b8eSAndroid Build Coastguard Worker 
1396*ec779b8eSAndroid Build Coastguard Worker         mLock.lock();
1397*ec779b8eSAndroid Build Coastguard Worker 
1398*ec779b8eSAndroid Build Coastguard Worker 
1399*ec779b8eSAndroid Build Coastguard Worker         // Update pcm frame count and end time (current time at the end of this process)
1400*ec779b8eSAndroid Build Coastguard Worker         mTotalSmp += lReqSmp;
1401*ec779b8eSAndroid Build Coastguard Worker 
1402*ec779b8eSAndroid Build Coastguard Worker         // Update tone gen state machine and select wave gen command
1403*ec779b8eSAndroid Build Coastguard Worker         switch (mState) {
1404*ec779b8eSAndroid Build Coastguard Worker         case TONE_PLAYING:
1405*ec779b8eSAndroid Build Coastguard Worker             lWaveCmd = WaveGenerator::WAVEGEN_CONT;
1406*ec779b8eSAndroid Build Coastguard Worker             break;
1407*ec779b8eSAndroid Build Coastguard Worker         case TONE_STARTING:
1408*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Starting Cbk");
1409*ec779b8eSAndroid Build Coastguard Worker 
1410*ec779b8eSAndroid Build Coastguard Worker             lWaveCmd = WaveGenerator::WAVEGEN_START;
1411*ec779b8eSAndroid Build Coastguard Worker             break;
1412*ec779b8eSAndroid Build Coastguard Worker         case TONE_STOPPING:
1413*ec779b8eSAndroid Build Coastguard Worker         case TONE_RESTARTING:
1414*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Stop/restart Cbk");
1415*ec779b8eSAndroid Build Coastguard Worker 
1416*ec779b8eSAndroid Build Coastguard Worker             lWaveCmd = WaveGenerator::WAVEGEN_STOP;
1417*ec779b8eSAndroid Build Coastguard Worker             mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
1418*ec779b8eSAndroid Build Coastguard Worker             break;
1419*ec779b8eSAndroid Build Coastguard Worker         case TONE_STOPPED:
1420*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Stopped Cbk");
1421*ec779b8eSAndroid Build Coastguard Worker             goto audioCallback_EndLoop;
1422*ec779b8eSAndroid Build Coastguard Worker         default:
1423*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Extra Cbk");
1424*ec779b8eSAndroid Build Coastguard Worker             goto audioCallback_EndLoop;
1425*ec779b8eSAndroid Build Coastguard Worker         }
1426*ec779b8eSAndroid Build Coastguard Worker 
1427*ec779b8eSAndroid Build Coastguard Worker         // Exit if tone sequence is over
1428*ec779b8eSAndroid Build Coastguard Worker         if (mpToneDesc->segments[mCurSegment].duration == 0 ||
1429*ec779b8eSAndroid Build Coastguard Worker             mTotalSmp > mMaxSmp) {
1430*ec779b8eSAndroid Build Coastguard Worker             if (mState == TONE_PLAYING) {
1431*ec779b8eSAndroid Build Coastguard Worker                 mState = TONE_STOPPING;
1432*ec779b8eSAndroid Build Coastguard Worker             }
1433*ec779b8eSAndroid Build Coastguard Worker             if (mpToneDesc->segments[mCurSegment].duration == 0) {
1434*ec779b8eSAndroid Build Coastguard Worker                 goto audioCallback_EndLoop;
1435*ec779b8eSAndroid Build Coastguard Worker             }
1436*ec779b8eSAndroid Build Coastguard Worker             // fade out before stopping if maximum duration reached
1437*ec779b8eSAndroid Build Coastguard Worker             lWaveCmd = WaveGenerator::WAVEGEN_STOP;
1438*ec779b8eSAndroid Build Coastguard Worker             mNextSegSmp = TONEGEN_INF; // forced to skip state machine management below
1439*ec779b8eSAndroid Build Coastguard Worker         }
1440*ec779b8eSAndroid Build Coastguard Worker 
1441*ec779b8eSAndroid Build Coastguard Worker         if (mTotalSmp > mNextSegSmp && mNextSegSmp != TONEGEN_INF) {
1442*ec779b8eSAndroid Build Coastguard Worker             // Time to go to next sequence segment
1443*ec779b8eSAndroid Build Coastguard Worker 
1444*ec779b8eSAndroid Build Coastguard Worker             ALOGV("End Segment, time: %d", (unsigned int)(systemTime()/1000000));
1445*ec779b8eSAndroid Build Coastguard Worker 
1446*ec779b8eSAndroid Build Coastguard Worker             lGenSmp = lReqSmp;
1447*ec779b8eSAndroid Build Coastguard Worker 
1448*ec779b8eSAndroid Build Coastguard Worker             // If segment,  ON -> OFF transition : ramp volume down
1449*ec779b8eSAndroid Build Coastguard Worker             if (mpToneDesc->segments[mCurSegment].waveFreq[0] != 0) {
1450*ec779b8eSAndroid Build Coastguard Worker                 lWaveCmd = WaveGenerator::WAVEGEN_STOP;
1451*ec779b8eSAndroid Build Coastguard Worker                 unsigned int lFreqIdx = 0;
1452*ec779b8eSAndroid Build Coastguard Worker                 uint16_t lFrequency = mpToneDesc->segments[mCurSegment].waveFreq[lFreqIdx];
1453*ec779b8eSAndroid Build Coastguard Worker 
1454*ec779b8eSAndroid Build Coastguard Worker                 while (lFrequency != 0) {
1455*ec779b8eSAndroid Build Coastguard Worker                     WaveGenerator *lpWaveGen = mWaveGens.valueFor(lFrequency);
1456*ec779b8eSAndroid Build Coastguard Worker                     lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd);
1457*ec779b8eSAndroid Build Coastguard Worker                     lFrequency = mpToneDesc->segments[mCurSegment].waveFreq[++lFreqIdx];
1458*ec779b8eSAndroid Build Coastguard Worker                 }
1459*ec779b8eSAndroid Build Coastguard Worker                 ALOGV("ON->OFF, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp);
1460*ec779b8eSAndroid Build Coastguard Worker             }
1461*ec779b8eSAndroid Build Coastguard Worker 
1462*ec779b8eSAndroid Build Coastguard Worker             // check if we need to loop and loop for the reqd times
1463*ec779b8eSAndroid Build Coastguard Worker             if (mpToneDesc->segments[mCurSegment].loopCnt) {
1464*ec779b8eSAndroid Build Coastguard Worker                 if (mLoopCounter < mpToneDesc->segments[mCurSegment].loopCnt) {
1465*ec779b8eSAndroid Build Coastguard Worker                     ALOGV ("in if loop loopCnt(%d) loopctr(%d), CurSeg(%d)",
1466*ec779b8eSAndroid Build Coastguard Worker                           mpToneDesc->segments[mCurSegment].loopCnt,
1467*ec779b8eSAndroid Build Coastguard Worker                           mLoopCounter,
1468*ec779b8eSAndroid Build Coastguard Worker                           mCurSegment);
1469*ec779b8eSAndroid Build Coastguard Worker                     mCurSegment = mpToneDesc->segments[mCurSegment].loopIndx;
1470*ec779b8eSAndroid Build Coastguard Worker                     ++mLoopCounter;
1471*ec779b8eSAndroid Build Coastguard Worker                 } else {
1472*ec779b8eSAndroid Build Coastguard Worker                     // completed loop. go to next segment
1473*ec779b8eSAndroid Build Coastguard Worker                     mLoopCounter = 0;
1474*ec779b8eSAndroid Build Coastguard Worker                     mCurSegment++;
1475*ec779b8eSAndroid Build Coastguard Worker                     ALOGV ("in else loop loopCnt(%d) loopctr(%d), CurSeg(%d)",
1476*ec779b8eSAndroid Build Coastguard Worker                           mpToneDesc->segments[mCurSegment].loopCnt,
1477*ec779b8eSAndroid Build Coastguard Worker                           mLoopCounter,
1478*ec779b8eSAndroid Build Coastguard Worker                           mCurSegment);
1479*ec779b8eSAndroid Build Coastguard Worker                 }
1480*ec779b8eSAndroid Build Coastguard Worker             } else {
1481*ec779b8eSAndroid Build Coastguard Worker                 mCurSegment++;
1482*ec779b8eSAndroid Build Coastguard Worker                 ALOGV ("Goto next seg loopCnt(%d) loopctr(%d), CurSeg(%d)",
1483*ec779b8eSAndroid Build Coastguard Worker                       mpToneDesc->segments[mCurSegment].loopCnt,
1484*ec779b8eSAndroid Build Coastguard Worker                       mLoopCounter,
1485*ec779b8eSAndroid Build Coastguard Worker                       mCurSegment);
1486*ec779b8eSAndroid Build Coastguard Worker 
1487*ec779b8eSAndroid Build Coastguard Worker             }
1488*ec779b8eSAndroid Build Coastguard Worker 
1489*ec779b8eSAndroid Build Coastguard Worker             // Handle loop if last segment reached
1490*ec779b8eSAndroid Build Coastguard Worker             if (mpToneDesc->segments[mCurSegment].duration == 0) {
1491*ec779b8eSAndroid Build Coastguard Worker                 ALOGV("Last Seg: %d", mCurSegment);
1492*ec779b8eSAndroid Build Coastguard Worker 
1493*ec779b8eSAndroid Build Coastguard Worker                 // Pre increment loop count and restart if total count not reached. Stop sequence otherwise
1494*ec779b8eSAndroid Build Coastguard Worker                 if (++mCurCount <= mpToneDesc->repeatCnt) {
1495*ec779b8eSAndroid Build Coastguard Worker                     ALOGV("Repeating Count: %d", mCurCount);
1496*ec779b8eSAndroid Build Coastguard Worker 
1497*ec779b8eSAndroid Build Coastguard Worker                     mCurSegment = mpToneDesc->repeatSegment;
1498*ec779b8eSAndroid Build Coastguard Worker                     if (mpToneDesc->segments[mpToneDesc->repeatSegment].waveFreq[0] != 0) {
1499*ec779b8eSAndroid Build Coastguard Worker                         lWaveCmd = WaveGenerator::WAVEGEN_START;
1500*ec779b8eSAndroid Build Coastguard Worker                     }
1501*ec779b8eSAndroid Build Coastguard Worker 
1502*ec779b8eSAndroid Build Coastguard Worker                     ALOGV("New segment %d, Next Time: %lld", mCurSegment,
1503*ec779b8eSAndroid Build Coastguard Worker                             ((long long)(mNextSegSmp)*1000)/mSamplingRate);
1504*ec779b8eSAndroid Build Coastguard Worker 
1505*ec779b8eSAndroid Build Coastguard Worker 
1506*ec779b8eSAndroid Build Coastguard Worker                 } else {
1507*ec779b8eSAndroid Build Coastguard Worker                     lGenSmp = 0;
1508*ec779b8eSAndroid Build Coastguard Worker                     ALOGV("End repeat, time: %d", (unsigned int)(systemTime()/1000000));
1509*ec779b8eSAndroid Build Coastguard Worker                 }
1510*ec779b8eSAndroid Build Coastguard Worker             } else {
1511*ec779b8eSAndroid Build Coastguard Worker                 ALOGV("New segment %d, Next Time: %lld", mCurSegment,
1512*ec779b8eSAndroid Build Coastguard Worker                         ((long long)(mNextSegSmp)*1000)/mSamplingRate);
1513*ec779b8eSAndroid Build Coastguard Worker 
1514*ec779b8eSAndroid Build Coastguard Worker                 if (mpToneDesc->segments[mCurSegment].waveFreq[0] != 0) {
1515*ec779b8eSAndroid Build Coastguard Worker                     // If next segment is not silent,  OFF -> ON transition : reset wave generator
1516*ec779b8eSAndroid Build Coastguard Worker                     lWaveCmd = WaveGenerator::WAVEGEN_START;
1517*ec779b8eSAndroid Build Coastguard Worker 
1518*ec779b8eSAndroid Build Coastguard Worker                     ALOGV("OFF->ON, lGenSmp: %d, lReqSmp: %d", lGenSmp, lReqSmp);
1519*ec779b8eSAndroid Build Coastguard Worker                 } else {
1520*ec779b8eSAndroid Build Coastguard Worker                     lGenSmp = 0;
1521*ec779b8eSAndroid Build Coastguard Worker                 }
1522*ec779b8eSAndroid Build Coastguard Worker             }
1523*ec779b8eSAndroid Build Coastguard Worker 
1524*ec779b8eSAndroid Build Coastguard Worker             // Update next segment transition position. No harm to do it also for last segment as
1525*ec779b8eSAndroid Build Coastguard Worker             // mNextSegSmp won't be used any more.
1526*ec779b8eSAndroid Build Coastguard Worker             // Handle 32 bit wraparound gracefully.
1527*ec779b8eSAndroid Build Coastguard Worker             const uint64_t res = static_cast<uint64_t>(mNextSegSmp) +
1528*ec779b8eSAndroid Build Coastguard Worker                     (mpToneDesc->segments[mCurSegment].duration * mSamplingRate) / 1000;
1529*ec779b8eSAndroid Build Coastguard Worker             mNextSegSmp = static_cast<uint32_t>(std::min<uint64_t>(TONEGEN_INF, res));
1530*ec779b8eSAndroid Build Coastguard Worker 
1531*ec779b8eSAndroid Build Coastguard Worker         } else {
1532*ec779b8eSAndroid Build Coastguard Worker             // Inside a segment keep tone ON or OFF
1533*ec779b8eSAndroid Build Coastguard Worker             if (mpToneDesc->segments[mCurSegment].waveFreq[0] == 0) {
1534*ec779b8eSAndroid Build Coastguard Worker                 lGenSmp = 0;  // If odd segment, tone is currently OFF
1535*ec779b8eSAndroid Build Coastguard Worker             } else {
1536*ec779b8eSAndroid Build Coastguard Worker                 lGenSmp = lReqSmp;  // If event segment, tone is currently ON
1537*ec779b8eSAndroid Build Coastguard Worker             }
1538*ec779b8eSAndroid Build Coastguard Worker         }
1539*ec779b8eSAndroid Build Coastguard Worker 
1540*ec779b8eSAndroid Build Coastguard Worker         if (lGenSmp) {
1541*ec779b8eSAndroid Build Coastguard Worker             // If samples must be generated, call all active wave generators and acumulate waves in lpOut
1542*ec779b8eSAndroid Build Coastguard Worker             unsigned int lFreqIdx = 0;
1543*ec779b8eSAndroid Build Coastguard Worker             uint16_t lFrequency = mpToneDesc->segments[mCurSegment].waveFreq[lFreqIdx];
1544*ec779b8eSAndroid Build Coastguard Worker 
1545*ec779b8eSAndroid Build Coastguard Worker             while (lFrequency != 0) {
1546*ec779b8eSAndroid Build Coastguard Worker                 WaveGenerator *lpWaveGen = mWaveGens.valueFor(lFrequency);
1547*ec779b8eSAndroid Build Coastguard Worker                 lpWaveGen->getSamples(lpOut, lGenSmp, lWaveCmd);
1548*ec779b8eSAndroid Build Coastguard Worker                 lFrequency = mpToneDesc->segments[mCurSegment].waveFreq[++lFreqIdx];
1549*ec779b8eSAndroid Build Coastguard Worker             }
1550*ec779b8eSAndroid Build Coastguard Worker         }
1551*ec779b8eSAndroid Build Coastguard Worker 
1552*ec779b8eSAndroid Build Coastguard Worker         lNumSmp -= lReqSmp;
1553*ec779b8eSAndroid Build Coastguard Worker         lpOut += lReqSmp;
1554*ec779b8eSAndroid Build Coastguard Worker 
1555*ec779b8eSAndroid Build Coastguard Worker audioCallback_EndLoop:
1556*ec779b8eSAndroid Build Coastguard Worker         switch (mState) {
1557*ec779b8eSAndroid Build Coastguard Worker         case TONE_RESTARTING:
1558*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Cbk restarting track");
1559*ec779b8eSAndroid Build Coastguard Worker             if (prepareWave()) {
1560*ec779b8eSAndroid Build Coastguard Worker                 mState = TONE_STARTING;
1561*ec779b8eSAndroid Build Coastguard Worker                 if (clock_gettime(CLOCK_MONOTONIC, &mStartTime) != 0) {
1562*ec779b8eSAndroid Build Coastguard Worker                     mStartTime.tv_sec = 0;
1563*ec779b8eSAndroid Build Coastguard Worker                 }
1564*ec779b8eSAndroid Build Coastguard Worker                 // must reload mpToneDesc as prepareWave() may change mpToneDesc
1565*ec779b8eSAndroid Build Coastguard Worker             } else {
1566*ec779b8eSAndroid Build Coastguard Worker                 ALOGW("Cbk restarting prepareWave() failed");
1567*ec779b8eSAndroid Build Coastguard Worker                 mState = TONE_IDLE;
1568*ec779b8eSAndroid Build Coastguard Worker                 mpAudioTrack->stop();
1569*ec779b8eSAndroid Build Coastguard Worker                 // Force loop exit
1570*ec779b8eSAndroid Build Coastguard Worker                 lNumSmp = 0;
1571*ec779b8eSAndroid Build Coastguard Worker             }
1572*ec779b8eSAndroid Build Coastguard Worker             lSignal = true;
1573*ec779b8eSAndroid Build Coastguard Worker             break;
1574*ec779b8eSAndroid Build Coastguard Worker         case TONE_STOPPING:
1575*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Cbk Stopping");
1576*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_STOPPED;
1577*ec779b8eSAndroid Build Coastguard Worker             // Force loop exit
1578*ec779b8eSAndroid Build Coastguard Worker             lNumSmp = 0;
1579*ec779b8eSAndroid Build Coastguard Worker             break;
1580*ec779b8eSAndroid Build Coastguard Worker         case TONE_STOPPED:
1581*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_INIT;
1582*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Cbk Stopped track");
1583*ec779b8eSAndroid Build Coastguard Worker             mpAudioTrack->stop();
1584*ec779b8eSAndroid Build Coastguard Worker             // Force loop exit
1585*ec779b8eSAndroid Build Coastguard Worker             lNumSmp = 0;
1586*ec779b8eSAndroid Build Coastguard Worker             bytesWritten = 0;
1587*ec779b8eSAndroid Build Coastguard Worker             lSignal = true;
1588*ec779b8eSAndroid Build Coastguard Worker             break;
1589*ec779b8eSAndroid Build Coastguard Worker         case TONE_STARTING:
1590*ec779b8eSAndroid Build Coastguard Worker             ALOGV("Cbk starting track");
1591*ec779b8eSAndroid Build Coastguard Worker             mState = TONE_PLAYING;
1592*ec779b8eSAndroid Build Coastguard Worker             lSignal = true;
1593*ec779b8eSAndroid Build Coastguard Worker             break;
1594*ec779b8eSAndroid Build Coastguard Worker         case TONE_PLAYING:
1595*ec779b8eSAndroid Build Coastguard Worker             break;
1596*ec779b8eSAndroid Build Coastguard Worker         default:
1597*ec779b8eSAndroid Build Coastguard Worker             // Force loop exit
1598*ec779b8eSAndroid Build Coastguard Worker             lNumSmp = 0;
1599*ec779b8eSAndroid Build Coastguard Worker             bytesWritten = 0;
1600*ec779b8eSAndroid Build Coastguard Worker             break;
1601*ec779b8eSAndroid Build Coastguard Worker         }
1602*ec779b8eSAndroid Build Coastguard Worker 
1603*ec779b8eSAndroid Build Coastguard Worker         if (lSignal)
1604*ec779b8eSAndroid Build Coastguard Worker             mWaitCbkCond.broadcast();
1605*ec779b8eSAndroid Build Coastguard Worker         mLock.unlock();
1606*ec779b8eSAndroid Build Coastguard Worker     }
1607*ec779b8eSAndroid Build Coastguard Worker     return bytesWritten;
1608*ec779b8eSAndroid Build Coastguard Worker }
1609*ec779b8eSAndroid Build Coastguard Worker 
1610*ec779b8eSAndroid Build Coastguard Worker 
1611*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1612*ec779b8eSAndroid Build Coastguard Worker //
1613*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::prepareWave()
1614*ec779b8eSAndroid Build Coastguard Worker //
1615*ec779b8eSAndroid Build Coastguard Worker //    Description:    Prepare wave generators and reset tone sequencer state machine.
1616*ec779b8eSAndroid Build Coastguard Worker //      mpNewToneDesc must have been initialized before calling this function.
1617*ec779b8eSAndroid Build Coastguard Worker //    Input:
1618*ec779b8eSAndroid Build Coastguard Worker //        none
1619*ec779b8eSAndroid Build Coastguard Worker //
1620*ec779b8eSAndroid Build Coastguard Worker //    Output:
1621*ec779b8eSAndroid Build Coastguard Worker //        returned value:   true if wave generators have been created, false otherwise
1622*ec779b8eSAndroid Build Coastguard Worker //
1623*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
prepareWave()1624*ec779b8eSAndroid Build Coastguard Worker bool ToneGenerator::prepareWave() {
1625*ec779b8eSAndroid Build Coastguard Worker     unsigned int segmentIdx = 0;
1626*ec779b8eSAndroid Build Coastguard Worker 
1627*ec779b8eSAndroid Build Coastguard Worker     if (mpNewToneDesc == NULL) {
1628*ec779b8eSAndroid Build Coastguard Worker         return false;
1629*ec779b8eSAndroid Build Coastguard Worker     }
1630*ec779b8eSAndroid Build Coastguard Worker 
1631*ec779b8eSAndroid Build Coastguard Worker     // Remove existing wave generators if any
1632*ec779b8eSAndroid Build Coastguard Worker     clearWaveGens();
1633*ec779b8eSAndroid Build Coastguard Worker 
1634*ec779b8eSAndroid Build Coastguard Worker     mpToneDesc = mpNewToneDesc;
1635*ec779b8eSAndroid Build Coastguard Worker 
1636*ec779b8eSAndroid Build Coastguard Worker     if (mDurationMs < 0) {  // mDurationMs is signed, treat all neg numbers as INF.
1637*ec779b8eSAndroid Build Coastguard Worker         mMaxSmp = TONEGEN_INF;
1638*ec779b8eSAndroid Build Coastguard Worker     } else {
1639*ec779b8eSAndroid Build Coastguard Worker         mMaxSmp = std::min(static_cast<uint64_t>(TONEGEN_INF - 1),
1640*ec779b8eSAndroid Build Coastguard Worker                 static_cast<uint64_t>(mDurationMs) * mSamplingRate / 1000);
1641*ec779b8eSAndroid Build Coastguard Worker         ALOGV("prepareWave, duration limited to %d ms", mDurationMs);
1642*ec779b8eSAndroid Build Coastguard Worker     }
1643*ec779b8eSAndroid Build Coastguard Worker 
1644*ec779b8eSAndroid Build Coastguard Worker     while (mpToneDesc->segments[segmentIdx].duration) {
1645*ec779b8eSAndroid Build Coastguard Worker         // Get total number of sine waves: needed to adapt sine wave gain.
1646*ec779b8eSAndroid Build Coastguard Worker         unsigned int lNumWaves = numWaves(segmentIdx);
1647*ec779b8eSAndroid Build Coastguard Worker         unsigned int freqIdx = 0;
1648*ec779b8eSAndroid Build Coastguard Worker         unsigned int frequency = mpToneDesc->segments[segmentIdx].waveFreq[freqIdx];
1649*ec779b8eSAndroid Build Coastguard Worker         while (frequency) {
1650*ec779b8eSAndroid Build Coastguard Worker             // Instantiate a wave generator if  ot already done for this frequency
1651*ec779b8eSAndroid Build Coastguard Worker             if (mWaveGens.indexOfKey(frequency) == NAME_NOT_FOUND) {
1652*ec779b8eSAndroid Build Coastguard Worker                 ToneGenerator::WaveGenerator *lpWaveGen =
1653*ec779b8eSAndroid Build Coastguard Worker                         new ToneGenerator::WaveGenerator(mSamplingRate,
1654*ec779b8eSAndroid Build Coastguard Worker                                 frequency,
1655*ec779b8eSAndroid Build Coastguard Worker                                 TONEGEN_GAIN/lNumWaves);
1656*ec779b8eSAndroid Build Coastguard Worker                 mWaveGens.add(frequency, lpWaveGen);
1657*ec779b8eSAndroid Build Coastguard Worker             }
1658*ec779b8eSAndroid Build Coastguard Worker             frequency = mpNewToneDesc->segments[segmentIdx].waveFreq[++freqIdx];
1659*ec779b8eSAndroid Build Coastguard Worker         }
1660*ec779b8eSAndroid Build Coastguard Worker         segmentIdx++;
1661*ec779b8eSAndroid Build Coastguard Worker     }
1662*ec779b8eSAndroid Build Coastguard Worker 
1663*ec779b8eSAndroid Build Coastguard Worker     // Initialize tone sequencer
1664*ec779b8eSAndroid Build Coastguard Worker     mTotalSmp = 0;
1665*ec779b8eSAndroid Build Coastguard Worker     mCurSegment = 0;
1666*ec779b8eSAndroid Build Coastguard Worker     mCurCount = 0;
1667*ec779b8eSAndroid Build Coastguard Worker     mLoopCounter = 0;
1668*ec779b8eSAndroid Build Coastguard Worker     if (mpToneDesc->segments[0].duration == TONEGEN_INF) {
1669*ec779b8eSAndroid Build Coastguard Worker         mNextSegSmp = TONEGEN_INF;
1670*ec779b8eSAndroid Build Coastguard Worker     } else{
1671*ec779b8eSAndroid Build Coastguard Worker         mNextSegSmp = std::min(static_cast<uint64_t>(TONEGEN_INF - 1),
1672*ec779b8eSAndroid Build Coastguard Worker                 static_cast<uint64_t>(mpToneDesc->segments[0].duration) * mSamplingRate / 1000);
1673*ec779b8eSAndroid Build Coastguard Worker     }
1674*ec779b8eSAndroid Build Coastguard Worker 
1675*ec779b8eSAndroid Build Coastguard Worker     return true;
1676*ec779b8eSAndroid Build Coastguard Worker }
1677*ec779b8eSAndroid Build Coastguard Worker 
1678*ec779b8eSAndroid Build Coastguard Worker 
1679*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1680*ec779b8eSAndroid Build Coastguard Worker //
1681*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::numWaves()
1682*ec779b8eSAndroid Build Coastguard Worker //
1683*ec779b8eSAndroid Build Coastguard Worker //    Description:    Count number of sine waves needed to generate a tone segment (e.g 2 for DTMF).
1684*ec779b8eSAndroid Build Coastguard Worker //
1685*ec779b8eSAndroid Build Coastguard Worker //    Input:
1686*ec779b8eSAndroid Build Coastguard Worker //        segmentIdx        tone segment index
1687*ec779b8eSAndroid Build Coastguard Worker //
1688*ec779b8eSAndroid Build Coastguard Worker //    Output:
1689*ec779b8eSAndroid Build Coastguard Worker //        returned value:    nummber of sine waves
1690*ec779b8eSAndroid Build Coastguard Worker //
1691*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
numWaves(unsigned int segmentIdx)1692*ec779b8eSAndroid Build Coastguard Worker unsigned int ToneGenerator::numWaves(unsigned int segmentIdx) {
1693*ec779b8eSAndroid Build Coastguard Worker     unsigned int lCnt = 0;
1694*ec779b8eSAndroid Build Coastguard Worker 
1695*ec779b8eSAndroid Build Coastguard Worker     if (mpToneDesc->segments[segmentIdx].duration) {
1696*ec779b8eSAndroid Build Coastguard Worker         while (mpToneDesc->segments[segmentIdx].waveFreq[lCnt]) {
1697*ec779b8eSAndroid Build Coastguard Worker             lCnt++;
1698*ec779b8eSAndroid Build Coastguard Worker         }
1699*ec779b8eSAndroid Build Coastguard Worker         lCnt++;
1700*ec779b8eSAndroid Build Coastguard Worker     }
1701*ec779b8eSAndroid Build Coastguard Worker 
1702*ec779b8eSAndroid Build Coastguard Worker     return lCnt;
1703*ec779b8eSAndroid Build Coastguard Worker }
1704*ec779b8eSAndroid Build Coastguard Worker 
1705*ec779b8eSAndroid Build Coastguard Worker 
1706*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1707*ec779b8eSAndroid Build Coastguard Worker //
1708*ec779b8eSAndroid Build Coastguard Worker //    Method:        ToneGenerator::clearWaveGens()
1709*ec779b8eSAndroid Build Coastguard Worker //
1710*ec779b8eSAndroid Build Coastguard Worker //    Description:    Removes all wave generators.
1711*ec779b8eSAndroid Build Coastguard Worker //
1712*ec779b8eSAndroid Build Coastguard Worker //    Input:
1713*ec779b8eSAndroid Build Coastguard Worker //        none
1714*ec779b8eSAndroid Build Coastguard Worker //
1715*ec779b8eSAndroid Build Coastguard Worker //    Output:
1716*ec779b8eSAndroid Build Coastguard Worker //        none
1717*ec779b8eSAndroid Build Coastguard Worker //
1718*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
clearWaveGens()1719*ec779b8eSAndroid Build Coastguard Worker void ToneGenerator::clearWaveGens() {
1720*ec779b8eSAndroid Build Coastguard Worker     ALOGV("Clearing mWaveGens:");
1721*ec779b8eSAndroid Build Coastguard Worker 
1722*ec779b8eSAndroid Build Coastguard Worker     for (size_t lIdx = 0; lIdx < mWaveGens.size(); lIdx++) {
1723*ec779b8eSAndroid Build Coastguard Worker         delete mWaveGens.valueAt(lIdx);
1724*ec779b8eSAndroid Build Coastguard Worker     }
1725*ec779b8eSAndroid Build Coastguard Worker     mWaveGens.clear();
1726*ec779b8eSAndroid Build Coastguard Worker }
1727*ec779b8eSAndroid Build Coastguard Worker 
1728*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1729*ec779b8eSAndroid Build Coastguard Worker //
1730*ec779b8eSAndroid Build Coastguard Worker //    Method:       ToneGenerator::getToneForRegion()
1731*ec779b8eSAndroid Build Coastguard Worker //
1732*ec779b8eSAndroid Build Coastguard Worker //    Description:  Get correct ringtone type according to current region.
1733*ec779b8eSAndroid Build Coastguard Worker //      The corrected ring tone type is the tone descriptor index in sToneDescriptors[].
1734*ec779b8eSAndroid Build Coastguard Worker //
1735*ec779b8eSAndroid Build Coastguard Worker //    Input:
1736*ec779b8eSAndroid Build Coastguard Worker //        none
1737*ec779b8eSAndroid Build Coastguard Worker //
1738*ec779b8eSAndroid Build Coastguard Worker //    Output:
1739*ec779b8eSAndroid Build Coastguard Worker //        none
1740*ec779b8eSAndroid Build Coastguard Worker //
1741*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
getToneForRegion(tone_type toneType)1742*ec779b8eSAndroid Build Coastguard Worker ToneGenerator::tone_type ToneGenerator::getToneForRegion(tone_type toneType) {
1743*ec779b8eSAndroid Build Coastguard Worker     tone_type regionTone;
1744*ec779b8eSAndroid Build Coastguard Worker 
1745*ec779b8eSAndroid Build Coastguard Worker     if (mRegion == CEPT || toneType < FIRST_SUP_TONE || toneType > LAST_SUP_TONE) {
1746*ec779b8eSAndroid Build Coastguard Worker         regionTone = toneType;
1747*ec779b8eSAndroid Build Coastguard Worker     } else {
1748*ec779b8eSAndroid Build Coastguard Worker         regionTone = (tone_type) sToneMappingTable[mRegion][toneType - FIRST_SUP_TONE];
1749*ec779b8eSAndroid Build Coastguard Worker     }
1750*ec779b8eSAndroid Build Coastguard Worker 
1751*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getToneForRegion, tone %d, region %d, regionTone %d", toneType, mRegion, regionTone);
1752*ec779b8eSAndroid Build Coastguard Worker 
1753*ec779b8eSAndroid Build Coastguard Worker     return regionTone;
1754*ec779b8eSAndroid Build Coastguard Worker }
1755*ec779b8eSAndroid Build Coastguard Worker 
1756*ec779b8eSAndroid Build Coastguard Worker 
1757*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1758*ec779b8eSAndroid Build Coastguard Worker //                WaveGenerator::WaveGenerator class    Implementation
1759*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1760*ec779b8eSAndroid Build Coastguard Worker 
1761*ec779b8eSAndroid Build Coastguard Worker //---------------------------------- public methods ----------------------------
1762*ec779b8eSAndroid Build Coastguard Worker 
1763*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1764*ec779b8eSAndroid Build Coastguard Worker //
1765*ec779b8eSAndroid Build Coastguard Worker //    Method:        WaveGenerator::WaveGenerator()
1766*ec779b8eSAndroid Build Coastguard Worker //
1767*ec779b8eSAndroid Build Coastguard Worker //    Description:    Constructor.
1768*ec779b8eSAndroid Build Coastguard Worker //
1769*ec779b8eSAndroid Build Coastguard Worker //    Input:
1770*ec779b8eSAndroid Build Coastguard Worker //        samplingRate:    Output sampling rate in Hz
1771*ec779b8eSAndroid Build Coastguard Worker //        frequency:       Frequency of the sine wave to generate in Hz
1772*ec779b8eSAndroid Build Coastguard Worker //        volume:          volume (0.0 to 1.0)
1773*ec779b8eSAndroid Build Coastguard Worker //
1774*ec779b8eSAndroid Build Coastguard Worker //    Output:
1775*ec779b8eSAndroid Build Coastguard Worker //        none
1776*ec779b8eSAndroid Build Coastguard Worker //
1777*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
WaveGenerator(uint32_t samplingRate,uint16_t frequency,float volume)1778*ec779b8eSAndroid Build Coastguard Worker ToneGenerator::WaveGenerator::WaveGenerator(uint32_t samplingRate,
1779*ec779b8eSAndroid Build Coastguard Worker         uint16_t frequency, float volume) {
1780*ec779b8eSAndroid Build Coastguard Worker     double d0;
1781*ec779b8eSAndroid Build Coastguard Worker     double F_div_Fs;  // frequency / samplingRate
1782*ec779b8eSAndroid Build Coastguard Worker 
1783*ec779b8eSAndroid Build Coastguard Worker     F_div_Fs = frequency / (double)samplingRate;
1784*ec779b8eSAndroid Build Coastguard Worker     d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs);
1785*ec779b8eSAndroid Build Coastguard Worker     mS2_0 = (int16_t)d0;
1786*ec779b8eSAndroid Build Coastguard Worker     mS1 = 0;
1787*ec779b8eSAndroid Build Coastguard Worker     mS2 = mS2_0;
1788*ec779b8eSAndroid Build Coastguard Worker 
1789*ec779b8eSAndroid Build Coastguard Worker     mAmplitude_Q15 = (int16_t)(32767. * 32767. * volume / GEN_AMP);
1790*ec779b8eSAndroid Build Coastguard Worker     // take some margin for amplitude fluctuation
1791*ec779b8eSAndroid Build Coastguard Worker     if (mAmplitude_Q15 > 32500)
1792*ec779b8eSAndroid Build Coastguard Worker         mAmplitude_Q15 = 32500;
1793*ec779b8eSAndroid Build Coastguard Worker 
1794*ec779b8eSAndroid Build Coastguard Worker     d0 = 32768.0 * cos(2 * M_PI * F_div_Fs);  // Q14*2*cos()
1795*ec779b8eSAndroid Build Coastguard Worker     if (d0 > 32767)
1796*ec779b8eSAndroid Build Coastguard Worker         d0 = 32767;
1797*ec779b8eSAndroid Build Coastguard Worker     mA1_Q14 = (int16_t) d0;
1798*ec779b8eSAndroid Build Coastguard Worker 
1799*ec779b8eSAndroid Build Coastguard Worker     ALOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d",
1800*ec779b8eSAndroid Build Coastguard Worker             mA1_Q14, mS2_0, mAmplitude_Q15);
1801*ec779b8eSAndroid Build Coastguard Worker }
1802*ec779b8eSAndroid Build Coastguard Worker 
1803*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1804*ec779b8eSAndroid Build Coastguard Worker //
1805*ec779b8eSAndroid Build Coastguard Worker //    Method:        WaveGenerator::~WaveGenerator()
1806*ec779b8eSAndroid Build Coastguard Worker //
1807*ec779b8eSAndroid Build Coastguard Worker //    Description:    Destructor.
1808*ec779b8eSAndroid Build Coastguard Worker //
1809*ec779b8eSAndroid Build Coastguard Worker //    Input:
1810*ec779b8eSAndroid Build Coastguard Worker //        none
1811*ec779b8eSAndroid Build Coastguard Worker //
1812*ec779b8eSAndroid Build Coastguard Worker //    Output:
1813*ec779b8eSAndroid Build Coastguard Worker //        none
1814*ec779b8eSAndroid Build Coastguard Worker //
1815*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
~WaveGenerator()1816*ec779b8eSAndroid Build Coastguard Worker ToneGenerator::WaveGenerator::~WaveGenerator() {
1817*ec779b8eSAndroid Build Coastguard Worker }
1818*ec779b8eSAndroid Build Coastguard Worker 
1819*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
1820*ec779b8eSAndroid Build Coastguard Worker //
1821*ec779b8eSAndroid Build Coastguard Worker //    Method:        WaveGenerator::getSamples()
1822*ec779b8eSAndroid Build Coastguard Worker //
1823*ec779b8eSAndroid Build Coastguard Worker //    Description:    Generates count samples of a sine wave and accumulates
1824*ec779b8eSAndroid Build Coastguard Worker //        result in outBuffer.
1825*ec779b8eSAndroid Build Coastguard Worker //
1826*ec779b8eSAndroid Build Coastguard Worker //    Input:
1827*ec779b8eSAndroid Build Coastguard Worker //        outBuffer:      Output buffer where to accumulate samples.
1828*ec779b8eSAndroid Build Coastguard Worker //        count:          number of samples to produce.
1829*ec779b8eSAndroid Build Coastguard Worker //        command:        special action requested (see enum gen_command).
1830*ec779b8eSAndroid Build Coastguard Worker //
1831*ec779b8eSAndroid Build Coastguard Worker //    Output:
1832*ec779b8eSAndroid Build Coastguard Worker //        none
1833*ec779b8eSAndroid Build Coastguard Worker //
1834*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
getSamples(int16_t * outBuffer,unsigned int count,unsigned int command)1835*ec779b8eSAndroid Build Coastguard Worker void ToneGenerator::WaveGenerator::getSamples(int16_t *outBuffer,
1836*ec779b8eSAndroid Build Coastguard Worker         unsigned int count, unsigned int command) {
1837*ec779b8eSAndroid Build Coastguard Worker     long lS1, lS2;
1838*ec779b8eSAndroid Build Coastguard Worker     long lA1, lAmplitude;
1839*ec779b8eSAndroid Build Coastguard Worker     long Sample;  // current sample
1840*ec779b8eSAndroid Build Coastguard Worker 
1841*ec779b8eSAndroid Build Coastguard Worker     // init local
1842*ec779b8eSAndroid Build Coastguard Worker     if (command == WAVEGEN_START) {
1843*ec779b8eSAndroid Build Coastguard Worker         lS1 = (long)0;
1844*ec779b8eSAndroid Build Coastguard Worker         lS2 = (long)mS2_0;
1845*ec779b8eSAndroid Build Coastguard Worker     } else {
1846*ec779b8eSAndroid Build Coastguard Worker         lS1 = mS1;
1847*ec779b8eSAndroid Build Coastguard Worker         lS2 = mS2;
1848*ec779b8eSAndroid Build Coastguard Worker     }
1849*ec779b8eSAndroid Build Coastguard Worker     lA1 = (long)mA1_Q14;
1850*ec779b8eSAndroid Build Coastguard Worker     lAmplitude = (long)mAmplitude_Q15;
1851*ec779b8eSAndroid Build Coastguard Worker 
1852*ec779b8eSAndroid Build Coastguard Worker     if (command == WAVEGEN_STOP) {
1853*ec779b8eSAndroid Build Coastguard Worker         lAmplitude <<= 16;
1854*ec779b8eSAndroid Build Coastguard Worker         if (count == 0) {
1855*ec779b8eSAndroid Build Coastguard Worker             return;
1856*ec779b8eSAndroid Build Coastguard Worker         }
1857*ec779b8eSAndroid Build Coastguard Worker         long dec = lAmplitude/count;
1858*ec779b8eSAndroid Build Coastguard Worker         // loop generation
1859*ec779b8eSAndroid Build Coastguard Worker         while (count) {
1860*ec779b8eSAndroid Build Coastguard Worker             count--;
1861*ec779b8eSAndroid Build Coastguard Worker             Sample = ((lA1 * lS1) >> S_Q14) - lS2;
1862*ec779b8eSAndroid Build Coastguard Worker             // shift delay
1863*ec779b8eSAndroid Build Coastguard Worker             lS2 = lS1;
1864*ec779b8eSAndroid Build Coastguard Worker             lS1 = Sample;
1865*ec779b8eSAndroid Build Coastguard Worker             Sample = ((lAmplitude>>16) * Sample) >> S_Q15;
1866*ec779b8eSAndroid Build Coastguard Worker             *(outBuffer++) += (int16_t)Sample;  // put result in buffer
1867*ec779b8eSAndroid Build Coastguard Worker             lAmplitude -= dec;
1868*ec779b8eSAndroid Build Coastguard Worker         }
1869*ec779b8eSAndroid Build Coastguard Worker     } else {
1870*ec779b8eSAndroid Build Coastguard Worker         // loop generation
1871*ec779b8eSAndroid Build Coastguard Worker         while (count) {
1872*ec779b8eSAndroid Build Coastguard Worker             count--;
1873*ec779b8eSAndroid Build Coastguard Worker             Sample = ((lA1 * lS1) >> S_Q14) - lS2;
1874*ec779b8eSAndroid Build Coastguard Worker             // shift delay
1875*ec779b8eSAndroid Build Coastguard Worker             lS2 = lS1;
1876*ec779b8eSAndroid Build Coastguard Worker             lS1 = Sample;
1877*ec779b8eSAndroid Build Coastguard Worker             Sample = (lAmplitude * Sample) >> S_Q15;
1878*ec779b8eSAndroid Build Coastguard Worker             *(outBuffer++) += (int16_t)Sample;  // put result in buffer
1879*ec779b8eSAndroid Build Coastguard Worker         }
1880*ec779b8eSAndroid Build Coastguard Worker     }
1881*ec779b8eSAndroid Build Coastguard Worker 
1882*ec779b8eSAndroid Build Coastguard Worker     // save status
1883*ec779b8eSAndroid Build Coastguard Worker     mS1 = lS1;
1884*ec779b8eSAndroid Build Coastguard Worker     mS2 = lS2;
1885*ec779b8eSAndroid Build Coastguard Worker }
1886*ec779b8eSAndroid Build Coastguard Worker 
1887*ec779b8eSAndroid Build Coastguard Worker }  // end namespace android
1888