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