1 /******************************************************************************
2 *
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <math.h>
23 #include <string.h>
24
25 #include "impd_type_def.h"
26 #include "impd_drc_extr_delta_coded_info.h"
27 #include "impd_drc_common.h"
28 #include "impd_drc_struct.h"
29 #include "impd_drc_filter_bank.h"
30 #include "impd_drc_multi_band.h"
31 #include "impd_drc_gain_dec.h"
32 #include "impd_drc_process_audio.h"
33
impd_apply_gains_and_add(ia_drc_instructions_struct * pstr_drc_instruction_arr,const WORD32 drc_instructions_index,ia_drc_params_struct * ia_drc_params_struct,ia_gain_buffer_struct * pstr_gain_buf,shape_filter_block shape_filter_block[],FLOAT32 * deinterleaved_audio[],FLOAT32 * channel_audio[],WORD32 impd_apply_gains)34 WORD32 impd_apply_gains_and_add(
35 ia_drc_instructions_struct* pstr_drc_instruction_arr,
36 const WORD32 drc_instructions_index,
37 ia_drc_params_struct* ia_drc_params_struct,
38 ia_gain_buffer_struct* pstr_gain_buf,
39 shape_filter_block shape_filter_block[], FLOAT32* deinterleaved_audio[],
40
41 FLOAT32* channel_audio[], WORD32 impd_apply_gains) {
42 WORD32 c, b, g, i;
43 WORD32 offset = 0, signalIndex = 0;
44 WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX];
45 WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT];
46 FLOAT32* lpcm_gains;
47 FLOAT32 sum;
48 FLOAT32 drc_gain_last, gainThr;
49 WORD32 iEnd, iStart;
50 ia_drc_instructions_struct* str_drc_instruction_str =
51 &(pstr_drc_instruction_arr[drc_instructions_index]);
52
53 if (drc_instructions_index >= 0) {
54 str_drc_instruction_str =
55 &(pstr_drc_instruction_arr[drc_instructions_index]);
56 {
57 if (str_drc_instruction_str->drc_set_id > 0) {
58 if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) {
59 offset = ia_drc_params_struct->drc_frame_size;
60 }
61 gainIndexForGroup[0] = 0;
62 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) {
63 gainIndexForGroup[g + 1] =
64 gainIndexForGroup[g] +
65 str_drc_instruction_str->band_count_of_ch_group[g];
66 }
67 signalIndexForChannel[0] = 0;
68 for (c = 0; c < str_drc_instruction_str->audio_num_chan - 1; c++) {
69 if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) {
70 signalIndexForChannel[c + 1] =
71 signalIndexForChannel[c] +
72 str_drc_instruction_str->band_count_of_ch_group
73 [str_drc_instruction_str->channel_group_of_ch[c]];
74 } else {
75 signalIndexForChannel[c + 1] = signalIndexForChannel[c] + 1;
76 }
77 }
78
79 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) {
80 for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g];
81 b++) {
82 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) {
83 lpcm_gains =
84 pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
85 .lpcm_gains +
86 MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples -
87 ia_drc_params_struct->audio_delay_samples + offset;
88 } else {
89 lpcm_gains =
90 pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
91 .lpcm_gains +
92 MAX_SIGNAL_DELAY +
93 str_drc_instruction_str
94 ->parametric_drc_look_ahead_samples[g] -
95 ia_drc_params_struct->audio_delay_samples;
96 }
97 iEnd = 0;
98 iStart = 0;
99 while (iEnd < ia_drc_params_struct->drc_frame_size) {
100 if (shape_filter_block[g].shape_flter_block_flag) {
101 drc_gain_last = shape_filter_block[g].drc_gain_last;
102 gainThr = 0.0001f * drc_gain_last;
103 while ((iEnd < ia_drc_params_struct->drc_frame_size) &&
104 (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr))
105 iEnd++;
106 } else {
107 iEnd = ia_drc_params_struct->drc_frame_size;
108 }
109
110 for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
111
112 {
113 if (g == str_drc_instruction_str->channel_group_of_ch[c]) {
114 signalIndex = signalIndexForChannel[c] + b;
115
116 if (impd_apply_gains == 1) {
117 impd_shape_filt_block_time_process(
118 &shape_filter_block[g], &lpcm_gains[0], signalIndex,
119 &deinterleaved_audio[signalIndex][0], iStart, iEnd);
120
121 } else {
122 for (i = iStart; i < iEnd; i++) {
123 deinterleaved_audio[signalIndex][i] = lpcm_gains[i];
124 }
125 }
126 }
127 }
128 if ((iEnd < ia_drc_params_struct->drc_frame_size) &&
129 (shape_filter_block[g].shape_flter_block_flag)) {
130 impd_shape_filt_block_adapt(lpcm_gains[iEnd],
131 &shape_filter_block[g]);
132 }
133 iStart = iEnd;
134 }
135 }
136 }
137 }
138 }
139 }
140
141 signalIndex = 0;
142
143 if (str_drc_instruction_str->drc_set_id > 0) {
144 for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
145
146 {
147 g = str_drc_instruction_str->channel_group_of_ch[c];
148 if (g >= 0) {
149 for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
150 sum = 0.0f;
151 for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g];
152 b++) {
153 sum += deinterleaved_audio[signalIndex + b][i];
154 }
155
156 channel_audio[c][i] = sum;
157 }
158 signalIndex += str_drc_instruction_str->band_count_of_ch_group[g];
159 } else {
160 for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
161 channel_audio[c][i] = deinterleaved_audio[signalIndex][i];
162 }
163 signalIndex++;
164 }
165 }
166 } else {
167 for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
168
169 {
170 for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
171 channel_audio[c][i] = deinterleaved_audio[c][i];
172 }
173 }
174 }
175
176 return (0);
177 }
178
179 /* subband-domain DRC: in-place application of DRC gains to audio frame */
180 WORD32
impd_apply_gains_subband(ia_drc_instructions_struct * pstr_drc_instruction_arr,const WORD32 drc_instructions_index,ia_drc_params_struct * ia_drc_params_struct,ia_gain_buffer_struct * pstr_gain_buf,ia_overlap_params_struct * pstr_overlap_params,FLOAT32 * deinterleaved_audio_delayed_re[],FLOAT32 * deinterleaved_audio_delayed_im[],FLOAT32 * deinterleaved_audio_re[],FLOAT32 * deinterleaved_audio_im[])181 impd_apply_gains_subband(ia_drc_instructions_struct* pstr_drc_instruction_arr,
182 const WORD32 drc_instructions_index,
183 ia_drc_params_struct* ia_drc_params_struct,
184 ia_gain_buffer_struct* pstr_gain_buf,
185 ia_overlap_params_struct* pstr_overlap_params,
186 FLOAT32* deinterleaved_audio_delayed_re[],
187 FLOAT32* deinterleaved_audio_delayed_im[],
188 FLOAT32* deinterleaved_audio_re[],
189 FLOAT32* deinterleaved_audio_im[]) {
190 WORD32 c, b, g, m, s;
191 WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX];
192 FLOAT32* lpcm_gains;
193 FLOAT32 gainSb, gainLr;
194 ia_drc_instructions_struct* str_drc_instruction_str;
195 WORD32 offset = 0, signalIndex = 0;
196 WORD32 drc_frame_sizeSb = 0;
197 WORD32 nDecoderSubbands = 0;
198 WORD32 L = 0; /* L: downsampling factor */
199 WORD32 analysisDelay = 0;
200 switch (ia_drc_params_struct->sub_band_domain_mode) {
201 case SUBBAND_DOMAIN_MODE_QMF64:
202 nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF64;
203 L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
204 analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF64;
205 break;
206 case SUBBAND_DOMAIN_MODE_QMF71:
207 nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF71;
208 L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71;
209 analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF71;
210 break;
211 case SUBBAND_DOMAIN_MODE_STFT256:
212 nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_STFT256;
213 L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
214 analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_STFT256;
215 break;
216 default:
217 return -1;
218 break;
219 }
220 drc_frame_sizeSb = ia_drc_params_struct->drc_frame_size / L;
221
222 if (drc_instructions_index >= 0) {
223 str_drc_instruction_str =
224 &(pstr_drc_instruction_arr[drc_instructions_index]);
225 {
226 if (str_drc_instruction_str->drc_set_id > 0) {
227 if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) {
228 offset = ia_drc_params_struct->drc_frame_size;
229 }
230 gainIndexForGroup[0] = 0;
231 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) {
232 gainIndexForGroup[g + 1] =
233 gainIndexForGroup[g] +
234 str_drc_instruction_str
235 ->band_count_of_ch_group[g]; /* index of first gain sequence
236 in channel group */
237 }
238
239 for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
240
241 {
242 g = str_drc_instruction_str->channel_group_of_ch[c];
243 if (g >= 0) {
244 for (m = 0; m < drc_frame_sizeSb; m++) {
245 if (str_drc_instruction_str->band_count_of_ch_group[g] >
246 1) { /* multiband DRC */
247 for (s = 0; s < nDecoderSubbands; s++) {
248 gainSb = 0.0f;
249 for (b = 0;
250 b < str_drc_instruction_str->band_count_of_ch_group[g];
251 b++) {
252 if (str_drc_instruction_str
253 ->ch_group_parametric_drc_flag[g] == 0) {
254 lpcm_gains =
255 pstr_gain_buf
256 ->buf_interpolation[gainIndexForGroup[g] + b]
257 .lpcm_gains +
258 MAX_SIGNAL_DELAY -
259 ia_drc_params_struct->gain_delay_samples -
260 ia_drc_params_struct->audio_delay_samples + offset;
261 } else {
262 lpcm_gains =
263 pstr_gain_buf
264 ->buf_interpolation[gainIndexForGroup[g] + b]
265 .lpcm_gains +
266 MAX_SIGNAL_DELAY +
267 str_drc_instruction_str
268 ->parametric_drc_look_ahead_samples[g] -
269 ia_drc_params_struct->audio_delay_samples +
270 analysisDelay;
271 }
272 /* get gain for this timeslot by downsampling */
273 gainLr = lpcm_gains[(m * L + (L - 1) / 2)];
274 gainSb += pstr_overlap_params->str_group_overlap_params[g]
275 .str_band_overlap_params[b]
276 .overlap_weight[s] *
277 gainLr;
278 }
279 deinterleaved_audio_re[signalIndex][m * nDecoderSubbands +
280 s] =
281 gainSb *
282 deinterleaved_audio_delayed_re[signalIndex]
283 [m * nDecoderSubbands + s];
284 if (ia_drc_params_struct->sub_band_domain_mode ==
285 SUBBAND_DOMAIN_MODE_STFT256) { /* For STFT filterbank, the
286 real value of the
287 nyquist band is stored
288 at the imag value of the
289 first band */
290 if (s != 0)
291 deinterleaved_audio_im[signalIndex][m * nDecoderSubbands +
292 s] =
293 gainSb *
294 deinterleaved_audio_delayed_im[signalIndex]
295 [m * nDecoderSubbands +
296 s];
297 if (s == (nDecoderSubbands - 1))
298 deinterleaved_audio_im[signalIndex][m * nDecoderSubbands +
299 0] =
300 gainSb *
301 deinterleaved_audio_delayed_im[signalIndex]
302 [m * nDecoderSubbands +
303 0];
304 } else {
305 deinterleaved_audio_im[signalIndex][m * nDecoderSubbands +
306 s] =
307 gainSb *
308 deinterleaved_audio_delayed_im[signalIndex]
309 [m * nDecoderSubbands +
310 s];
311 }
312 }
313 } else { /* single-band DRC */
314 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] ==
315 0) {
316 lpcm_gains =
317 pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]]
318 .lpcm_gains +
319 MAX_SIGNAL_DELAY -
320 ia_drc_params_struct->gain_delay_samples -
321 ia_drc_params_struct->audio_delay_samples + offset;
322 } else {
323 lpcm_gains =
324 pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]]
325 .lpcm_gains +
326 MAX_SIGNAL_DELAY +
327 str_drc_instruction_str
328 ->parametric_drc_look_ahead_samples[g] -
329 ia_drc_params_struct->audio_delay_samples + analysisDelay;
330 }
331 /* get gain for this timeslot by downsampling */
332 gainSb = lpcm_gains[(m * L + (L - 1) / 2)];
333 for (s = 0; s < nDecoderSubbands; s++) {
334 deinterleaved_audio_re[signalIndex][m * nDecoderSubbands +
335 s] =
336 gainSb *
337 deinterleaved_audio_delayed_re[signalIndex]
338 [m * nDecoderSubbands + s];
339 deinterleaved_audio_im[signalIndex][m * nDecoderSubbands +
340 s] =
341 gainSb *
342 deinterleaved_audio_delayed_im[signalIndex]
343 [m * nDecoderSubbands + s];
344 }
345 }
346 }
347 }
348 signalIndex++;
349 }
350 }
351 }
352 }
353 return (0);
354 }
355
356 WORD32
impd_filter_banks_process(ia_drc_instructions_struct * pstr_drc_instruction_arr,const WORD32 drc_instructions_index,ia_drc_params_struct * ia_drc_params_struct,FLOAT32 * audio_io_buf[],ia_audio_band_buffer_struct * audio_band_buffer,ia_filter_banks_struct * ia_filter_banks_struct,const WORD32 passThru)357 impd_filter_banks_process(ia_drc_instructions_struct* pstr_drc_instruction_arr,
358 const WORD32 drc_instructions_index,
359 ia_drc_params_struct* ia_drc_params_struct,
360 FLOAT32* audio_io_buf[],
361 ia_audio_band_buffer_struct* audio_band_buffer,
362 ia_filter_banks_struct* ia_filter_banks_struct,
363 const WORD32 passThru) {
364 WORD32 c, g, e, i, num_bands;
365 // WORD32 err = 0;
366 FLOAT32* audio_in;
367 FLOAT32** audio_out;
368 ia_drc_filter_bank_struct* str_drc_filter_bank;
369 ia_drc_instructions_struct* str_drc_instruction_str;
370 WORD32 drc_frame_size = ia_drc_params_struct->drc_frame_size;
371
372 if (drc_instructions_index >= 0) {
373 str_drc_instruction_str =
374 &(pstr_drc_instruction_arr[drc_instructions_index]);
375 } else {
376 return -1;
377 }
378
379 e = 0;
380
381 for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
382
383 {
384 str_drc_filter_bank = NULL;
385
386 audio_in = audio_io_buf[c];
387
388 audio_out = &(audio_band_buffer->non_interleaved_audio[e]);
389 if ((passThru == 0) && (drc_instructions_index >= 0)) {
390 if (str_drc_instruction_str->drc_set_id < 0) {
391 num_bands = 1;
392 } else {
393 g = str_drc_instruction_str->channel_group_of_ch[c];
394 if (g == -1) {
395 num_bands = 1;
396 // if (ia_filter_banks_struct->str_drc_filter_bank != NULL)
397 //{
398 str_drc_filter_bank =
399 &(ia_filter_banks_struct->str_drc_filter_bank
400 [str_drc_instruction_str->num_drc_ch_groups]);
401 //}
402 } else {
403 num_bands = str_drc_instruction_str->band_count_of_ch_group[g];
404 // if (ia_filter_banks_struct->str_drc_filter_bank != NULL)
405 //{
406 str_drc_filter_bank =
407 &(ia_filter_banks_struct->str_drc_filter_bank[g]);
408 //}
409 }
410 // if (ia_filter_banks_struct->str_drc_filter_bank != NULL)
411 //{
412 // if (&str_drc_filter_bank->str_all_pass_cascade != NULL)
413 //{
414 impd_all_pass_cascade_process(
415 &str_drc_filter_bank->str_all_pass_cascade, c, drc_frame_size,
416 audio_in);
417 //}
418 //}
419 }
420 } else {
421 num_bands = 1;
422 }
423 switch (num_bands) {
424 case 1:
425 for (i = 0; i < drc_frame_size; i++) {
426 audio_out[0][i] = audio_in[i];
427 }
428 e++;
429 break;
430 case 2:
431 impd_two_band_filter_process(&str_drc_filter_bank->str_two_band_bank, c,
432 drc_frame_size, audio_in, audio_out);
433 e += 2;
434 break;
435 case 3:
436 impd_three_band_filter_process(
437 &str_drc_filter_bank->str_three_band_bank, c, drc_frame_size,
438 audio_in, audio_out);
439 e += 3;
440 break;
441 case 4:
442 impd_four_band_filter_process(&str_drc_filter_bank->str_four_band_bank,
443 c, drc_frame_size, audio_in, audio_out);
444 e += 4;
445 break;
446 default:
447 return (PARAM_ERROR);
448 break;
449 }
450 }
451
452 return (0);
453 }
454
455 WORD32
impd_store_audio_io_buffer_time(FLOAT32 * audio_in_out_buf[],ia_audio_in_out_buf * audio_io_buf_internal)456 impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[],
457 ia_audio_in_out_buf* audio_io_buf_internal) {
458 WORD32 i, j;
459
460 if (audio_io_buf_internal->audio_delay_samples) {
461 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
462 for (j = 0; j < audio_io_buf_internal->frame_size; j++) {
463 audio_io_buf_internal->audio_io_buffer_delayed
464 [i][audio_io_buf_internal->audio_delay_samples + j] =
465 audio_in_out_buf[i][j];
466 }
467 }
468 } else {
469 audio_io_buf_internal->audio_io_buffer_delayed = audio_in_out_buf;
470 audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf;
471 }
472
473 return 0;
474 }
475
476 WORD32
impd_store_audio_io_buffer_freq(FLOAT32 * audio_real_buff[],FLOAT32 * audio_imag_buff[],ia_audio_in_out_buf * audio_io_buf_internal)477 impd_store_audio_io_buffer_freq(FLOAT32* audio_real_buff[],
478 FLOAT32* audio_imag_buff[],
479 ia_audio_in_out_buf* audio_io_buf_internal) {
480 WORD32 i, j;
481
482 if (audio_io_buf_internal->audio_delay_sub_band_samples) {
483 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
484 for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size *
485 audio_io_buf_internal->audio_sub_band_count;
486 j++) {
487 audio_io_buf_internal->audio_buffer_delayed_real
488 [i][audio_io_buf_internal->audio_delay_sub_band_samples *
489 audio_io_buf_internal->audio_sub_band_count +
490 j] = audio_real_buff[i][j];
491 audio_io_buf_internal->audio_buffer_delayed_imag
492 [i][audio_io_buf_internal->audio_delay_sub_band_samples *
493 audio_io_buf_internal->audio_sub_band_count +
494 j] = audio_imag_buff[i][j];
495 }
496 }
497 } else {
498 audio_io_buf_internal->audio_buffer_delayed_real = audio_real_buff;
499 audio_io_buf_internal->audio_buffer_delayed_imag = audio_imag_buff;
500 audio_io_buf_internal->audio_real_buff = audio_real_buff;
501 audio_io_buf_internal->audio_imag_buff = audio_imag_buff;
502 }
503
504 return 0;
505 }
506
507 WORD32
impd_retrieve_audio_io_buffer_time(FLOAT32 * audio_in_out_buf[],ia_audio_in_out_buf * audio_io_buf_internal)508 impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[],
509 ia_audio_in_out_buf* audio_io_buf_internal) {
510 WORD32 i, j;
511
512 if (audio_io_buf_internal->audio_delay_samples) {
513 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
514 for (j = 0; j < audio_io_buf_internal->frame_size; j++) {
515 audio_in_out_buf[i][j] =
516 audio_io_buf_internal->audio_io_buffer_delayed[i][j];
517 }
518 }
519 }
520
521 return 0;
522 }
523
524 WORD32
impd_retrieve_audio_buffer_freq(FLOAT32 * audio_real_buff[],FLOAT32 * audio_imag_buff[],ia_audio_in_out_buf * audio_io_buf_internal)525 impd_retrieve_audio_buffer_freq(FLOAT32* audio_real_buff[],
526 FLOAT32* audio_imag_buff[],
527 ia_audio_in_out_buf* audio_io_buf_internal) {
528 WORD32 i, j;
529
530 if (audio_io_buf_internal->audio_delay_sub_band_samples) {
531 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
532 for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size *
533 audio_io_buf_internal->audio_sub_band_count;
534 j++) {
535 audio_real_buff[i][j] =
536 audio_io_buf_internal->audio_buffer_delayed_real
537 [i][audio_io_buf_internal->audio_sub_band_count + j];
538 audio_imag_buff[i][j] =
539 audio_io_buf_internal->audio_buffer_delayed_imag
540 [i][audio_io_buf_internal->audio_sub_band_count + j];
541 }
542 }
543 }
544
545 return 0;
546 }
547
548 WORD32
impd_advance_audio_io_buffer_time(ia_audio_in_out_buf * audio_io_buf_internal)549 impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal) {
550 WORD32 i;
551 if (audio_io_buf_internal->audio_delay_samples) {
552 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
553 memmove(
554 audio_io_buf_internal->audio_io_buffer_delayed[i],
555 &audio_io_buf_internal
556 ->audio_io_buffer_delayed[i][audio_io_buf_internal->frame_size],
557 sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_samples);
558 }
559 }
560
561 return 0;
562 }
563
564 WORD32
impd_advance_audio_buff_freq(ia_audio_in_out_buf * audio_io_buf_internal)565 impd_advance_audio_buff_freq(ia_audio_in_out_buf* audio_io_buf_internal) {
566 WORD32 i;
567 if (audio_io_buf_internal->audio_delay_sub_band_samples) {
568 for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) {
569 memmove(audio_io_buf_internal->audio_buffer_delayed_real[i],
570 &audio_io_buf_internal->audio_buffer_delayed_real
571 [i][audio_io_buf_internal->audio_sub_band_frame_size *
572 audio_io_buf_internal->audio_sub_band_count],
573 sizeof(FLOAT32) *
574 audio_io_buf_internal->audio_delay_sub_band_samples *
575 audio_io_buf_internal->audio_sub_band_count);
576 memmove(audio_io_buf_internal->audio_buffer_delayed_imag[i],
577 &audio_io_buf_internal->audio_buffer_delayed_imag
578 [i][audio_io_buf_internal->audio_sub_band_frame_size *
579 audio_io_buf_internal->audio_sub_band_count],
580 sizeof(FLOAT32) *
581 audio_io_buf_internal->audio_delay_sub_band_samples *
582 audio_io_buf_internal->audio_sub_band_count);
583 }
584 }
585 return 0;
586 }
587