1*3f1979aaSAndroid Build Coastguard Worker /*
2*3f1979aaSAndroid Build Coastguard Worker This software is part of pffft/pfdsp, a set of simple DSP routines.
3*3f1979aaSAndroid Build Coastguard Worker
4*3f1979aaSAndroid Build Coastguard Worker Copyright (c) 2014, Andras Retzler <[email protected]>
5*3f1979aaSAndroid Build Coastguard Worker Copyright (c) 2020 Hayati Ayguen <[email protected]>
6*3f1979aaSAndroid Build Coastguard Worker All rights reserved.
7*3f1979aaSAndroid Build Coastguard Worker
8*3f1979aaSAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without
9*3f1979aaSAndroid Build Coastguard Worker modification, are permitted provided that the following conditions are met:
10*3f1979aaSAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright
11*3f1979aaSAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer.
12*3f1979aaSAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above copyright
13*3f1979aaSAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer in the
14*3f1979aaSAndroid Build Coastguard Worker documentation and/or other materials provided with the distribution.
15*3f1979aaSAndroid Build Coastguard Worker * Neither the name of the copyright holder nor the
16*3f1979aaSAndroid Build Coastguard Worker names of its contributors may be used to endorse or promote products
17*3f1979aaSAndroid Build Coastguard Worker derived from this software without specific prior written permission.
18*3f1979aaSAndroid Build Coastguard Worker
19*3f1979aaSAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*3f1979aaSAndroid Build Coastguard Worker ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*3f1979aaSAndroid Build Coastguard Worker WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*3f1979aaSAndroid Build Coastguard Worker DISCLAIMED. IN NO EVENT SHALL ANDRAS RETZLER BE LIABLE FOR ANY
23*3f1979aaSAndroid Build Coastguard Worker DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*3f1979aaSAndroid Build Coastguard Worker (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*3f1979aaSAndroid Build Coastguard Worker LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26*3f1979aaSAndroid Build Coastguard Worker ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*3f1979aaSAndroid Build Coastguard Worker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*3f1979aaSAndroid Build Coastguard Worker SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*3f1979aaSAndroid Build Coastguard Worker */
30*3f1979aaSAndroid Build Coastguard Worker
31*3f1979aaSAndroid Build Coastguard Worker /* include own header first, to see missing includes */
32*3f1979aaSAndroid Build Coastguard Worker #include "pf_cic.h"
33*3f1979aaSAndroid Build Coastguard Worker #include "fmv.h"
34*3f1979aaSAndroid Build Coastguard Worker
35*3f1979aaSAndroid Build Coastguard Worker #include <math.h>
36*3f1979aaSAndroid Build Coastguard Worker #include <stdlib.h>
37*3f1979aaSAndroid Build Coastguard Worker #include <string.h>
38*3f1979aaSAndroid Build Coastguard Worker #include <limits.h>
39*3f1979aaSAndroid Build Coastguard Worker
40*3f1979aaSAndroid Build Coastguard Worker
41*3f1979aaSAndroid Build Coastguard Worker /*
42*3f1979aaSAndroid Build Coastguard Worker ____ ___ ____ ____ ____ ____
43*3f1979aaSAndroid Build Coastguard Worker / ___|_ _/ ___| | _ \| _ \ / ___|
44*3f1979aaSAndroid Build Coastguard Worker | | | | | | | | | | | | |
45*3f1979aaSAndroid Build Coastguard Worker | |___ | | |___ | |_| | |_| | |___
46*3f1979aaSAndroid Build Coastguard Worker \____|___\____| |____/|____/ \____|
47*3f1979aaSAndroid Build Coastguard Worker */
48*3f1979aaSAndroid Build Coastguard Worker
49*3f1979aaSAndroid Build Coastguard Worker #define SINESHIFT 12
50*3f1979aaSAndroid Build Coastguard Worker #define SINESIZE (1<<SINESHIFT)
51*3f1979aaSAndroid Build Coastguard Worker typedef int64_t cic_dt; // data type used for integrators and combs
52*3f1979aaSAndroid Build Coastguard Worker typedef struct {
53*3f1979aaSAndroid Build Coastguard Worker int factor;
54*3f1979aaSAndroid Build Coastguard Worker uint64_t phase;
55*3f1979aaSAndroid Build Coastguard Worker float gain;
56*3f1979aaSAndroid Build Coastguard Worker cic_dt ig0a, ig0b, ig1a, ig1b;
57*3f1979aaSAndroid Build Coastguard Worker cic_dt comb0a, comb0b, comb1a, comb1b;
58*3f1979aaSAndroid Build Coastguard Worker int16_t *sinetable;
59*3f1979aaSAndroid Build Coastguard Worker } cicddc_t;
60*3f1979aaSAndroid Build Coastguard Worker
cicddc_init(int factor)61*3f1979aaSAndroid Build Coastguard Worker void *cicddc_init(int factor) {
62*3f1979aaSAndroid Build Coastguard Worker int i;
63*3f1979aaSAndroid Build Coastguard Worker int sinesize2 = SINESIZE * 5/4; // 25% extra to get cosine from the same table
64*3f1979aaSAndroid Build Coastguard Worker cicddc_t *s;
65*3f1979aaSAndroid Build Coastguard Worker s = (cicddc_t *)malloc(sizeof(cicddc_t));
66*3f1979aaSAndroid Build Coastguard Worker memset(s, 0, sizeof(cicddc_t));
67*3f1979aaSAndroid Build Coastguard Worker
68*3f1979aaSAndroid Build Coastguard Worker float sineamp = 32767.0f;
69*3f1979aaSAndroid Build Coastguard Worker s->factor = factor;
70*3f1979aaSAndroid Build Coastguard Worker s->gain = 1.0f / SHRT_MAX / sineamp / factor / factor / factor; // compensate for gain of 3 integrators
71*3f1979aaSAndroid Build Coastguard Worker
72*3f1979aaSAndroid Build Coastguard Worker s->sinetable = (int16_t *)malloc(sinesize2 * sizeof(*s->sinetable));
73*3f1979aaSAndroid Build Coastguard Worker double f = 2.0*M_PI / (double)SINESIZE;
74*3f1979aaSAndroid Build Coastguard Worker for(i = 0; i < sinesize2; i++) {
75*3f1979aaSAndroid Build Coastguard Worker s->sinetable[i] = sineamp * cos(f * i);
76*3f1979aaSAndroid Build Coastguard Worker }
77*3f1979aaSAndroid Build Coastguard Worker return s;
78*3f1979aaSAndroid Build Coastguard Worker }
79*3f1979aaSAndroid Build Coastguard Worker
cicddc_free(void * state)80*3f1979aaSAndroid Build Coastguard Worker void cicddc_free(void *state) {
81*3f1979aaSAndroid Build Coastguard Worker cicddc_t *s = (cicddc_t *)state;
82*3f1979aaSAndroid Build Coastguard Worker free(s->sinetable);
83*3f1979aaSAndroid Build Coastguard Worker free(s);
84*3f1979aaSAndroid Build Coastguard Worker }
85*3f1979aaSAndroid Build Coastguard Worker
86*3f1979aaSAndroid Build Coastguard Worker
87*3f1979aaSAndroid Build Coastguard Worker PF_TARGET_CLONES
cicddc_s16_c(void * state,int16_t * input,complexf * output,int outsize,float rate)88*3f1979aaSAndroid Build Coastguard Worker void cicddc_s16_c(void *state, int16_t *input, complexf *output, int outsize, float rate) {
89*3f1979aaSAndroid Build Coastguard Worker cicddc_t *s = (cicddc_t *)state;
90*3f1979aaSAndroid Build Coastguard Worker int k;
91*3f1979aaSAndroid Build Coastguard Worker int factor = s->factor;
92*3f1979aaSAndroid Build Coastguard Worker cic_dt ig0a = s->ig0a, ig0b = s->ig0b, ig1a = s->ig1a, ig1b = s->ig1b;
93*3f1979aaSAndroid Build Coastguard Worker cic_dt comb0a = s->comb0a, comb0b = s->comb0b, comb1a = s->comb1a, comb1b = s->comb1b;
94*3f1979aaSAndroid Build Coastguard Worker uint64_t phase = s->phase, freq;
95*3f1979aaSAndroid Build Coastguard Worker int16_t *sinetable = s->sinetable;
96*3f1979aaSAndroid Build Coastguard Worker float gain = s->gain;
97*3f1979aaSAndroid Build Coastguard Worker
98*3f1979aaSAndroid Build Coastguard Worker freq = rate * ((float)(1ULL << 63) * 2);
99*3f1979aaSAndroid Build Coastguard Worker
100*3f1979aaSAndroid Build Coastguard Worker int16_t *inp = input;
101*3f1979aaSAndroid Build Coastguard Worker for(k = 0; k < outsize; k++) {
102*3f1979aaSAndroid Build Coastguard Worker int i;
103*3f1979aaSAndroid Build Coastguard Worker cic_dt out0a, out0b, out1a, out1b;
104*3f1979aaSAndroid Build Coastguard Worker cic_dt ig2a = 0, ig2b = 0; // last integrator and first comb replaced simply by sum
105*3f1979aaSAndroid Build Coastguard Worker for(i = 0; i < factor; i++) {
106*3f1979aaSAndroid Build Coastguard Worker cic_dt in_a, in_b;
107*3f1979aaSAndroid Build Coastguard Worker int sinep = phase >> (64-SINESHIFT);
108*3f1979aaSAndroid Build Coastguard Worker in_a = (int32_t)inp[i] * (int32_t)sinetable[sinep + (1<<(SINESHIFT-2))];
109*3f1979aaSAndroid Build Coastguard Worker in_b = (int32_t)inp[i] * (int32_t)sinetable[sinep];
110*3f1979aaSAndroid Build Coastguard Worker phase += freq;
111*3f1979aaSAndroid Build Coastguard Worker /* integrators:
112*3f1979aaSAndroid Build Coastguard Worker The calculations are ordered so that each integrator
113*3f1979aaSAndroid Build Coastguard Worker takes a result from previous loop iteration
114*3f1979aaSAndroid Build Coastguard Worker to make the code more "pipeline-friendly". */
115*3f1979aaSAndroid Build Coastguard Worker ig2a += ig1a; ig2b += ig1b;
116*3f1979aaSAndroid Build Coastguard Worker ig1a += ig0a; ig1b += ig0b;
117*3f1979aaSAndroid Build Coastguard Worker ig0a += in_a; ig0b += in_b;
118*3f1979aaSAndroid Build Coastguard Worker }
119*3f1979aaSAndroid Build Coastguard Worker inp += factor;
120*3f1979aaSAndroid Build Coastguard Worker // comb filters:
121*3f1979aaSAndroid Build Coastguard Worker out0a = ig2a - comb0a; out0b = ig2b - comb0b;
122*3f1979aaSAndroid Build Coastguard Worker comb0a = ig2a; comb0b = ig2b;
123*3f1979aaSAndroid Build Coastguard Worker out1a = out0a - comb1a; out1b = out0b - comb1b;
124*3f1979aaSAndroid Build Coastguard Worker comb1a = out0a; comb1b = out0b;
125*3f1979aaSAndroid Build Coastguard Worker
126*3f1979aaSAndroid Build Coastguard Worker output[k].i = (float)out1a * gain;
127*3f1979aaSAndroid Build Coastguard Worker output[k].q = (float)out1b * gain;
128*3f1979aaSAndroid Build Coastguard Worker }
129*3f1979aaSAndroid Build Coastguard Worker
130*3f1979aaSAndroid Build Coastguard Worker s->ig0a = ig0a; s->ig0b = ig0b;
131*3f1979aaSAndroid Build Coastguard Worker s->ig1a = ig1a; s->ig1b = ig1b;
132*3f1979aaSAndroid Build Coastguard Worker s->comb0a = comb0a; s->comb0b = comb0b;
133*3f1979aaSAndroid Build Coastguard Worker s->comb1a = comb1a; s->comb1b = comb1b;
134*3f1979aaSAndroid Build Coastguard Worker s->phase = phase;
135*3f1979aaSAndroid Build Coastguard Worker }
136*3f1979aaSAndroid Build Coastguard Worker
137*3f1979aaSAndroid Build Coastguard Worker PF_TARGET_CLONES
cicddc_cs16_c(void * state,int16_t * input,complexf * output,int outsize,float rate)138*3f1979aaSAndroid Build Coastguard Worker void cicddc_cs16_c(void *state, int16_t *input, complexf *output, int outsize, float rate) {
139*3f1979aaSAndroid Build Coastguard Worker cicddc_t *s = (cicddc_t *)state;
140*3f1979aaSAndroid Build Coastguard Worker int k;
141*3f1979aaSAndroid Build Coastguard Worker int factor = s->factor;
142*3f1979aaSAndroid Build Coastguard Worker cic_dt ig0a = s->ig0a, ig0b = s->ig0b, ig1a = s->ig1a, ig1b = s->ig1b;
143*3f1979aaSAndroid Build Coastguard Worker cic_dt comb0a = s->comb0a, comb0b = s->comb0b, comb1a = s->comb1a, comb1b = s->comb1b;
144*3f1979aaSAndroid Build Coastguard Worker uint64_t phase = s->phase, freq;
145*3f1979aaSAndroid Build Coastguard Worker int16_t *sinetable = s->sinetable;
146*3f1979aaSAndroid Build Coastguard Worker float gain = s->gain;
147*3f1979aaSAndroid Build Coastguard Worker
148*3f1979aaSAndroid Build Coastguard Worker freq = rate * ((float)(1ULL << 63) * 2);
149*3f1979aaSAndroid Build Coastguard Worker
150*3f1979aaSAndroid Build Coastguard Worker int16_t *inp = input;
151*3f1979aaSAndroid Build Coastguard Worker for(k = 0; k < outsize; k++) {
152*3f1979aaSAndroid Build Coastguard Worker int i;
153*3f1979aaSAndroid Build Coastguard Worker cic_dt out0a, out0b, out1a, out1b;
154*3f1979aaSAndroid Build Coastguard Worker cic_dt ig2a = 0, ig2b = 0; // last integrator and first comb replaced simply by sum
155*3f1979aaSAndroid Build Coastguard Worker for(i = 0; i < factor; i++) {
156*3f1979aaSAndroid Build Coastguard Worker cic_dt in_a, in_b;
157*3f1979aaSAndroid Build Coastguard Worker int32_t m_a, m_b, m_c, m_d;
158*3f1979aaSAndroid Build Coastguard Worker int sinep = phase >> (64-SINESHIFT);
159*3f1979aaSAndroid Build Coastguard Worker m_a = inp[2*i];
160*3f1979aaSAndroid Build Coastguard Worker m_b = inp[2*i+1];
161*3f1979aaSAndroid Build Coastguard Worker m_c = (int32_t)sinetable[sinep + (1<<(SINESHIFT-2))];
162*3f1979aaSAndroid Build Coastguard Worker m_d = (int32_t)sinetable[sinep];
163*3f1979aaSAndroid Build Coastguard Worker // complex multiplication:
164*3f1979aaSAndroid Build Coastguard Worker in_a = m_a*m_c - m_b*m_d;
165*3f1979aaSAndroid Build Coastguard Worker in_b = m_a*m_d + m_b*m_c;
166*3f1979aaSAndroid Build Coastguard Worker phase += freq;
167*3f1979aaSAndroid Build Coastguard Worker /* integrators:
168*3f1979aaSAndroid Build Coastguard Worker The calculations are ordered so that each integrator
169*3f1979aaSAndroid Build Coastguard Worker takes a result from previous loop iteration
170*3f1979aaSAndroid Build Coastguard Worker to make the code more "pipeline-friendly". */
171*3f1979aaSAndroid Build Coastguard Worker ig2a += ig1a; ig2b += ig1b;
172*3f1979aaSAndroid Build Coastguard Worker ig1a += ig0a; ig1b += ig0b;
173*3f1979aaSAndroid Build Coastguard Worker ig0a += in_a; ig0b += in_b;
174*3f1979aaSAndroid Build Coastguard Worker }
175*3f1979aaSAndroid Build Coastguard Worker inp += 2*factor;
176*3f1979aaSAndroid Build Coastguard Worker // comb filters:
177*3f1979aaSAndroid Build Coastguard Worker out0a = ig2a - comb0a; out0b = ig2b - comb0b;
178*3f1979aaSAndroid Build Coastguard Worker comb0a = ig2a; comb0b = ig2b;
179*3f1979aaSAndroid Build Coastguard Worker out1a = out0a - comb1a; out1b = out0b - comb1b;
180*3f1979aaSAndroid Build Coastguard Worker comb1a = out0a; comb1b = out0b;
181*3f1979aaSAndroid Build Coastguard Worker
182*3f1979aaSAndroid Build Coastguard Worker output[k].i = (float)out1a * gain;
183*3f1979aaSAndroid Build Coastguard Worker output[k].q = (float)out1b * gain;
184*3f1979aaSAndroid Build Coastguard Worker }
185*3f1979aaSAndroid Build Coastguard Worker
186*3f1979aaSAndroid Build Coastguard Worker s->ig0a = ig0a; s->ig0b = ig0b;
187*3f1979aaSAndroid Build Coastguard Worker s->ig1a = ig1a; s->ig1b = ig1b;
188*3f1979aaSAndroid Build Coastguard Worker s->comb0a = comb0a; s->comb0b = comb0b;
189*3f1979aaSAndroid Build Coastguard Worker s->comb1a = comb1a; s->comb1b = comb1b;
190*3f1979aaSAndroid Build Coastguard Worker s->phase = phase;
191*3f1979aaSAndroid Build Coastguard Worker }
192*3f1979aaSAndroid Build Coastguard Worker
193*3f1979aaSAndroid Build Coastguard Worker
194*3f1979aaSAndroid Build Coastguard Worker /* This is almost copy paste from cicddc_cs16_c.
195*3f1979aaSAndroid Build Coastguard Worker I'm afraid this is going to be annoying to maintain... */
196*3f1979aaSAndroid Build Coastguard Worker PF_TARGET_CLONES
cicddc_cu8_c(void * state,uint8_t * input,complexf * output,int outsize,float rate)197*3f1979aaSAndroid Build Coastguard Worker void cicddc_cu8_c(void *state, uint8_t *input, complexf *output, int outsize, float rate) {
198*3f1979aaSAndroid Build Coastguard Worker cicddc_t *s = (cicddc_t *)state;
199*3f1979aaSAndroid Build Coastguard Worker int k;
200*3f1979aaSAndroid Build Coastguard Worker int factor = s->factor;
201*3f1979aaSAndroid Build Coastguard Worker cic_dt ig0a = s->ig0a, ig0b = s->ig0b, ig1a = s->ig1a, ig1b = s->ig1b;
202*3f1979aaSAndroid Build Coastguard Worker cic_dt comb0a = s->comb0a, comb0b = s->comb0b, comb1a = s->comb1a, comb1b = s->comb1b;
203*3f1979aaSAndroid Build Coastguard Worker uint64_t phase = s->phase, freq;
204*3f1979aaSAndroid Build Coastguard Worker int16_t *sinetable = s->sinetable;
205*3f1979aaSAndroid Build Coastguard Worker float gain = s->gain;
206*3f1979aaSAndroid Build Coastguard Worker
207*3f1979aaSAndroid Build Coastguard Worker freq = rate * ((float)(1ULL << 63) * 2);
208*3f1979aaSAndroid Build Coastguard Worker
209*3f1979aaSAndroid Build Coastguard Worker uint8_t *inp = input;
210*3f1979aaSAndroid Build Coastguard Worker for(k = 0; k < outsize; k++) {
211*3f1979aaSAndroid Build Coastguard Worker int i;
212*3f1979aaSAndroid Build Coastguard Worker cic_dt out0a, out0b, out1a, out1b;
213*3f1979aaSAndroid Build Coastguard Worker cic_dt ig2a = 0, ig2b = 0; // last integrator and first comb replaced simply by sum
214*3f1979aaSAndroid Build Coastguard Worker for(i = 0; i < factor; i++) {
215*3f1979aaSAndroid Build Coastguard Worker cic_dt in_a, in_b;
216*3f1979aaSAndroid Build Coastguard Worker int32_t m_a, m_b, m_c, m_d;
217*3f1979aaSAndroid Build Coastguard Worker int sinep = phase >> (64-SINESHIFT);
218*3f1979aaSAndroid Build Coastguard Worker // subtract 127.4 (good for rtl-sdr)
219*3f1979aaSAndroid Build Coastguard Worker m_a = (((int32_t)inp[2*i]) << 8) - 32614;
220*3f1979aaSAndroid Build Coastguard Worker m_b = (((int32_t)inp[2*i+1]) << 8) - 32614;
221*3f1979aaSAndroid Build Coastguard Worker m_c = (int32_t)sinetable[sinep + (1<<(SINESHIFT-2))];
222*3f1979aaSAndroid Build Coastguard Worker m_d = (int32_t)sinetable[sinep];
223*3f1979aaSAndroid Build Coastguard Worker // complex multiplication:
224*3f1979aaSAndroid Build Coastguard Worker in_a = m_a*m_c - m_b*m_d;
225*3f1979aaSAndroid Build Coastguard Worker in_b = m_a*m_d + m_b*m_c;
226*3f1979aaSAndroid Build Coastguard Worker phase += freq;
227*3f1979aaSAndroid Build Coastguard Worker /* integrators:
228*3f1979aaSAndroid Build Coastguard Worker The calculations are ordered so that each integrator
229*3f1979aaSAndroid Build Coastguard Worker takes a result from previous loop iteration
230*3f1979aaSAndroid Build Coastguard Worker to make the code more "pipeline-friendly". */
231*3f1979aaSAndroid Build Coastguard Worker ig2a += ig1a; ig2b += ig1b;
232*3f1979aaSAndroid Build Coastguard Worker ig1a += ig0a; ig1b += ig0b;
233*3f1979aaSAndroid Build Coastguard Worker ig0a += in_a; ig0b += in_b;
234*3f1979aaSAndroid Build Coastguard Worker }
235*3f1979aaSAndroid Build Coastguard Worker inp += 2*factor;
236*3f1979aaSAndroid Build Coastguard Worker // comb filters:
237*3f1979aaSAndroid Build Coastguard Worker out0a = ig2a - comb0a; out0b = ig2b - comb0b;
238*3f1979aaSAndroid Build Coastguard Worker comb0a = ig2a; comb0b = ig2b;
239*3f1979aaSAndroid Build Coastguard Worker out1a = out0a - comb1a; out1b = out0b - comb1b;
240*3f1979aaSAndroid Build Coastguard Worker comb1a = out0a; comb1b = out0b;
241*3f1979aaSAndroid Build Coastguard Worker
242*3f1979aaSAndroid Build Coastguard Worker output[k].i = (float)out1a * gain;
243*3f1979aaSAndroid Build Coastguard Worker output[k].q = (float)out1b * gain;
244*3f1979aaSAndroid Build Coastguard Worker }
245*3f1979aaSAndroid Build Coastguard Worker
246*3f1979aaSAndroid Build Coastguard Worker s->ig0a = ig0a; s->ig0b = ig0b;
247*3f1979aaSAndroid Build Coastguard Worker s->ig1a = ig1a; s->ig1b = ig1b;
248*3f1979aaSAndroid Build Coastguard Worker s->comb0a = comb0a; s->comb0b = comb0b;
249*3f1979aaSAndroid Build Coastguard Worker s->comb1a = comb1a; s->comb1b = comb1b;
250*3f1979aaSAndroid Build Coastguard Worker s->phase = phase;
251*3f1979aaSAndroid Build Coastguard Worker }
252*3f1979aaSAndroid Build Coastguard Worker
253