• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <string.h>
21 #include <stdlib.h>
22 
23 #include "impd_type_def.h"
24 #include "impd_error_standards.h"
25 #include "impd_apicmd_standards.h"
26 #include "impd_memory_standards.h"
27 
28 #include "impd_drc_bitbuffer.h"
29 #include "impd_drc_extr_delta_coded_info.h"
30 #include "impd_drc_common.h"
31 #include "impd_drc_struct.h"
32 #include "impd_drc_interface.h"
33 #include "impd_parametric_drc_dec.h"
34 #include "impd_drc_gain_dec.h"
35 #include "impd_drc_filter_bank.h"
36 #include "impd_drc_multi_band.h"
37 #include "impd_drc_process_audio.h"
38 #include "impd_drc_eq.h"
39 #include "impd_drc_gain_decoder.h"
40 #include "impd_drc_config_params.h"
41 #include "impd_drc_api_defs.h"
42 #include "impd_drc_definitions.h"
43 #include "impd_drc_hashdefines.h"
44 #include "impd_drc_peak_limiter.h"
45 
46 #include "impd_drc_selection_process.h"
47 #include "impd_drc_api_struct_def.h"
48 #include "impd_drc_error_codes.h"
49 
50 WORD32 impd_init_process_audio_main_qmf(ia_drc_api_struct *p_obj_drc);
51 WORD32 impd_init_process_audio_main_stft(ia_drc_api_struct *p_obj_drc);
52 WORD32 impd_init_process_audio_main_td_qmf(ia_drc_api_struct *p_obj_drc);
53 
54 IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd,
55                               WORD32 i_idx, pVOID pv_value);
56 
57 IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc);
58 
59 VOID impd_drc_set_default_config_params(ia_drc_config_struct *ptr_config);
60 
61 IA_ERRORCODE impd_drc_process_frame(ia_drc_api_struct *p_obj_drc);
62 IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc);
63 IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc);
64 IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc);
65 IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc);
66 
67 #define NUM_DRC_TABLES 4
68 #define SCRATCH_MEM_SIZE 1024 * 256 * 64
69 
ia_drc_dec_api(pVOID p_ia_drc_dec_obj,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)70 IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
71                             pVOID pv_value) {
72   ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj;
73   IA_ERRORCODE error_code = IA_NO_ERROR;
74   LOOPIDX i;
75 
76   pUWORD32 pui_value = pv_value;
77   pUWORD32 pus_value = pv_value;
78   pWORD8 pb_value = pv_value;
79   SIZE_T *ps_value = pv_value;
80 
81   switch (i_cmd) {
82     case IA_API_CMD_GET_MEM_INFO_SIZE:
83     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT:
84     case IA_API_CMD_GET_MEM_INFO_TYPE:
85     case IA_API_CMD_GET_MEM_INFO_PLACEMENT:
86     case IA_API_CMD_GET_MEM_INFO_PRIORITY:
87     case IA_API_CMD_SET_MEM_PTR:
88     case IA_API_CMD_SET_MEM_PLACEMENT: {
89       return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value);
90     }
91   };
92 
93   switch (i_cmd) {
94     case IA_API_CMD_GET_LIB_ID_STRINGS: {
95       switch (i_idx) {
96         case IA_CMD_TYPE_LIB_NAME: {
97           WORD8 lib_name[] = LIBNAME;
98           for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) {
99             pb_value[i] = lib_name[i];
100           }
101           break;
102         }
103         case IA_CMD_TYPE_LIB_VERSION: {
104           break;
105         }
106 
107         case IA_CMD_TYPE_API_VERSION: {
108         }
109         default: { return -1; }
110       };
111       break;
112     }
113     case IA_API_CMD_GET_API_SIZE: {
114       *pui_value = sizeof(ia_drc_api_struct) +
115                    (sizeof(ia_drc_state_struct) + 8) + 8080 * 1024;
116 
117       break;
118     }
119     case IA_API_CMD_INIT: {
120       switch (i_idx) {
121         case IA_CMD_TYPE_INIT_SET_BUFF_PTR: {
122           p_obj_drc->p_state->persistant_ptr =
123               p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX];
124           impd_drc_set_struct_pointer(p_obj_drc);
125 
126           break;
127         }
128         case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: {
129           impd_drc_set_default_config(p_obj_drc);
130           break;
131         }
132         case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: {
133           p_obj_drc->p_state =
134               (ia_drc_state_struct *)((SIZE_T)p_obj_drc + 8000 * 1024);
135           p_obj_drc->p_mem_info =
136               (ia_mem_info_struct *)((SIZE_T)p_obj_drc + 8002 * 1024);
137           p_obj_drc->pp_mem = (pVOID)((SIZE_T)p_obj_drc + 8006 * 1024);
138           impd_drc_fill_mem_tables(p_obj_drc);
139           break;
140         }
141         case IA_CMD_TYPE_INIT_PROCESS: {
142           IA_ERRORCODE Error = 0;
143 
144           if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) {
145             return (-1);
146           }
147 
148           Error = impd_drc_init(p_obj_drc);
149           if (Error) return Error;
150           p_obj_drc->p_state->ui_init_done = 1;
151           return Error;
152           break;
153         }
154         case IA_CMD_TYPE_INIT_DONE_QUERY: {
155           if (p_obj_drc->p_state->ui_init_done == 1) {
156             *pui_value = 1;
157           } else {
158             *pui_value = 0;
159           }
160           break;
161         }
162 
163         case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: {
164           *pui_value = p_obj_drc->str_bit_handler.cpy_over;
165           break;
166         }
167         case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: {
168           *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic;
169           break;
170         }
171 
172         case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: {
173           *pui_value = p_obj_drc->str_bit_handler.cpy_over_il;
174           break;
175         }
176         case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: {
177           *pui_value = p_obj_drc->str_bit_handler.cpy_over_in;
178           break;
179         }
180         case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: {
181           memcpy(p_obj_drc->str_bit_handler.it_bit_buf +
182                      p_obj_drc->str_bit_handler.num_bytes_bs,
183                  p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur);
184           p_obj_drc->str_bit_handler.num_bytes_bs =
185               p_obj_drc->str_bit_handler.num_bytes_bs +
186               p_obj_drc->str_bit_handler.num_byts_cur;
187           break;
188         }
189         case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: {
190           memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config +
191                      p_obj_drc->str_bit_handler.num_bytes_bs_drc_config,
192                  p_obj_drc->pp_mem[2],
193                  p_obj_drc->str_bit_handler.num_byts_cur_ic);
194           p_obj_drc->str_bit_handler.num_bytes_bs_drc_config =
195               p_obj_drc->str_bit_handler.num_bytes_bs_drc_config +
196               p_obj_drc->str_bit_handler.num_byts_cur_ic;
197           break;
198         }
199         case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: {
200           memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info +
201                      p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info,
202                  p_obj_drc->pp_mem[2],
203                  p_obj_drc->str_bit_handler.num_byts_cur_il);
204           p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info =
205               p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info +
206               p_obj_drc->str_bit_handler.num_byts_cur_il;
207           break;
208         }
209         case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: {
210           memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface +
211                      p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface,
212                  p_obj_drc->pp_mem[2],
213                  p_obj_drc->str_bit_handler.num_byts_cur_in);
214           p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface =
215               p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface +
216               p_obj_drc->str_bit_handler.num_byts_cur_in;
217           break;
218         }
219         default: { return -1; }
220       };
221       break;
222     }
223     case IA_API_CMD_GET_CONFIG_PARAM: {
224       switch (i_idx) {
225         case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
226           *pus_value = p_obj_drc->str_config.sampling_rate;
227           break;
228         }
229 
230         case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
231           *pus_value = p_obj_drc->str_config.num_ch_out;
232           break;
233         }
234         case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: {
235           *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output;
236           break;
237         }
238       }
239       break;
240     }
241     case IA_API_CMD_SET_CONFIG_PARAM: {
242       switch (i_idx) {
243         case IA_DRC_DEC_CONFIG_PARAM_DEC_TYPE: {
244           if (*pus_value == 1) {
245             p_obj_drc->str_config.dec_type = DEC_TYPE_TD_QMF64;
246             p_obj_drc->str_config.sub_band_domain_mode =
247                 SUBBAND_DOMAIN_MODE_QMF64;
248             p_obj_drc->str_config.sub_band_down_sampling_factor =
249                 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
250             p_obj_drc->str_config.sub_band_count =
251                 AUDIO_CODEC_SUBBAND_COUNT_QMF64;
252           } else if (*pus_value == 2) {
253             p_obj_drc->str_config.dec_type = DEC_TYPE_QMF64;
254             p_obj_drc->str_config.sub_band_domain_mode =
255                 SUBBAND_DOMAIN_MODE_QMF64;
256             p_obj_drc->str_config.sub_band_down_sampling_factor =
257                 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64;
258             p_obj_drc->str_config.sub_band_count =
259                 AUDIO_CODEC_SUBBAND_COUNT_QMF64;
260           } else if (*pus_value == 3) {
261             p_obj_drc->str_config.dec_type = DEC_TYPE_STFT256;
262             p_obj_drc->str_config.sub_band_domain_mode =
263                 SUBBAND_DOMAIN_MODE_STFT256;
264             p_obj_drc->str_config.sub_band_down_sampling_factor =
265                 AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256;
266             p_obj_drc->str_config.sub_band_count =
267                 AUDIO_CODEC_SUBBAND_COUNT_STFT256;
268           } else {
269             p_obj_drc->str_config.dec_type = DEC_TYPE_TD;
270             p_obj_drc->str_config.sub_band_domain_mode =
271                 SUBBAND_DOMAIN_MODE_OFF;
272           }
273 
274           if (*pus_value < 0 || *pus_value > 3) {
275             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE;
276           }
277           break;
278         }
279         case IA_DRC_DEC_CONFIG_PARAM_CTRL_PARAM: {
280           if (*pus_value < 1 || *pus_value > 39) {
281             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX;
282           }
283           p_obj_drc->str_config.control_parameter_index = *pus_value;
284           break;
285         }
286         case IA_DRC_DEC_CONFIG_PARAM_PEAK_LIMITER: {
287           if (*pus_value < 0 || *pus_value > 1) {
288             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG;
289           }
290           p_obj_drc->str_config.peak_limiter = *pus_value;
291           break;
292         }
293 
294         case IA_DRC_DEC_CONFIG_PARAM_VER_MODE: {
295           break;
296         }
297         case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: {
298           if (*pus_value < 8000 || *pus_value > 96000) {
299             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ;
300           }
301           p_obj_drc->str_config.sampling_rate = *pus_value;
302           break;
303         }
304         case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
305           p_obj_drc->str_config.num_ch_in = *pus_value;
306           if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) {
307             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS;
308           }
309           break;
310         }
311 
312         case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: {
313           if ((*pus_value != 16) && (*pus_value != 32)) {
314             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE;
315           }
316 
317           p_obj_drc->str_config.pcm_size = *pus_value;
318 
319           break;
320         }
321 
322         case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: {
323           if ((*pus_value != 1) && (*pus_value != 0)) {
324             return -1;
325           }
326           p_obj_drc->str_config.bitstream_file_format = *pus_value;
327 
328           break;
329         }
330         case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: {
331           if ((*pus_value != 1) && (*pus_value != 0)) {
332             return -1;
333           }
334           p_obj_drc->str_config.interface_bitstream_present = *pus_value;
335 
336           break;
337         }
338         case IA_DRC_DEC_CONFIG_PARAM_DELAY_MODE: {
339           if ((*pus_value != 1) && (*pus_value != 0)) {
340             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE;
341           }
342           p_obj_drc->str_config.delay_mode = *pus_value;
343 
344           break;
345         }
346         case IA_DRC_DEC_CONFIG_PARAM_GAIN_DELAY: {
347           if ((*pus_value > MAX_SIGNAL_DELAY) || (*pus_value < 0)) {
348             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY;
349           }
350 
351           p_obj_drc->str_config.gain_delay_samples = *pus_value;
352 
353           break;
354         }
355 
356         /*Sujith: introduce error*/
357         case IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY: {
358           break;
359         }
360         case IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE: {
361           if (*pus_value < 0 || *pus_value > 1) {
362             return IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE;
363           }
364           p_obj_drc->str_config.constant_delay_on = *pus_value;
365 
366           break;
367         }
368         case IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF: {
369           p_obj_drc->str_config.absorb_delay_on = *pus_value;
370 
371           break;
372         }
373         case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: {
374           if (*pus_value < 1 || *pus_value > 4096) {
375             return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE;
376           }
377 
378           p_obj_drc->str_config.frame_size = *pus_value;
379 
380           break;
381         }
382         case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: {
383           p_obj_drc->str_bit_handler.gain_stream_flag = *pus_value;
384           break;
385         }
386 
387         case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: {
388           p_obj_drc->str_config.effect_type = *pus_value;
389           break;
390         }
391         case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
392           p_obj_drc->str_config.target_loudness = *pus_value;
393           break;
394         }
395         case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: {
396           p_obj_drc->str_config.loud_norm_flag = *pus_value;
397           break;
398         }
399 
400         default: { return -1; }
401       }
402       break;
403     }
404     case IA_API_CMD_GET_MEMTABS_SIZE: {
405       break;
406     }
407     case IA_API_CMD_SET_MEMTABS_PTR: {
408       break;
409     }
410     case IA_API_CMD_GET_N_MEMTABS: {
411       *pui_value = NUM_DRC_TABLES;
412       break;
413     }
414     case IA_API_CMD_GET_N_TABLES: {
415       break;
416     }
417 
418     case IA_API_CMD_EXECUTE: {
419       switch (i_idx) {
420         case IA_CMD_TYPE_DO_EXECUTE: {
421           if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) {
422             error_code = impd_process_time_domain(p_obj_drc);
423           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) {
424             error_code = impd_init_process_audio_main_qmf(p_obj_drc);
425           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) {
426             error_code = impd_init_process_audio_main_stft(p_obj_drc);
427           } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) {
428             error_code = impd_init_process_audio_main_td_qmf(p_obj_drc);
429           }
430           break;
431         }
432         case IA_CMD_TYPE_DONE_QUERY: {
433           *pui_value = p_obj_drc->p_state->ui_exe_done;
434           break;
435         }
436         default: { return -1; }
437       };
438       break;
439     }
440     case IA_API_CMD_PUT_INPUT_QUERY: {
441       *pui_value = 1;
442       break;
443     }
444     case IA_API_CMD_GET_CURIDX_INPUT_BUF: {
445       UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size;
446       UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes;
447       *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size;
448       break;
449     }
450     case IA_API_CMD_SET_INPUT_BYTES: {
451       p_obj_drc->p_state->ui_in_bytes = *pui_value;
452       break;
453     }
454 
455     case IA_API_CMD_GET_OUTPUT_BYTES: {
456       *pui_value = p_obj_drc->p_state->ui_out_bytes;
457       break;
458     }
459     case IA_API_CMD_INPUT_OVER: {
460       p_obj_drc->p_state->ui_exe_done = 1;
461       break;
462     }
463     case IA_API_CMD_INPUT_OVER_BS: {
464       p_obj_drc->str_bit_handler.cpy_over = 1;
465       break;
466     }
467     case IA_API_CMD_INPUT_OVER_IC_BS: {
468       p_obj_drc->str_bit_handler.cpy_over_ic = 1;
469       break;
470     }
471     case IA_API_CMD_INPUT_OVER_IL_BS: {
472       p_obj_drc->str_bit_handler.cpy_over_il = 1;
473       break;
474     }
475     case IA_API_CMD_INPUT_OVER_IN_BS: {
476       p_obj_drc->str_bit_handler.cpy_over_in = 1;
477       break;
478     }
479     case IA_API_CMD_SET_INPUT_BYTES_BS: {
480       p_obj_drc->str_bit_handler.num_byts_cur = *pus_value;
481       break;
482     }
483     case IA_API_CMD_SET_INPUT_BYTES_IC_BS: {
484       p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value;
485       break;
486     }
487     case IA_API_CMD_SET_INPUT_BYTES_IL_BS: {
488       p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value;
489       break;
490     }
491     case IA_API_CMD_SET_INPUT_BYTES_IN_BS: {
492       p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value;
493       break;
494     }
495     default: { return -1; }
496   };
497   return error_code;
498 }
499 
impd_drc_mem_api(ia_drc_api_struct * p_obj_drc,WORD32 i_cmd,WORD32 i_idx,pVOID pv_value)500 IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd,
501                               WORD32 i_idx, pVOID pv_value) {
502   pUWORD32 pui_value = pv_value;
503 
504   switch (i_cmd) {
505     case IA_API_CMD_GET_MEM_INFO_SIZE: {
506       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size;
507       break;
508     }
509     case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: {
510       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment;
511       break;
512     }
513     case IA_API_CMD_GET_MEM_INFO_TYPE: {
514       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type;
515       break;
516     }
517     case IA_API_CMD_GET_MEM_INFO_PLACEMENT: {
518       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0];
519       *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1];
520       break;
521     }
522     case IA_API_CMD_GET_MEM_INFO_PRIORITY: {
523       *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority;
524       break;
525     }
526     case IA_API_CMD_SET_MEM_PTR: {
527       pWORD8 pbtemp;
528       UWORD32 sz;
529       if (pv_value == 0) {
530         return (-1);
531       }
532       if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) {
533         return (-1);
534       }
535       p_obj_drc->pp_mem[i_idx] = pv_value;
536       pbtemp = p_obj_drc->pp_mem[i_idx];
537       sz = p_obj_drc->p_mem_info[i_idx].ui_size;
538 
539       memset(pbtemp, 0, sz);
540     }
541     case IA_API_CMD_SET_MEM_PLACEMENT: {
542     }
543   };
544   return IA_NO_ERROR;
545 }
546 
impd_drc_fill_mem_tables(ia_drc_api_struct * p_obj_drc)547 IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) {
548   ia_mem_info_struct *p_mem_info;
549   {
550     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX];
551     p_mem_info->ui_size = 64 * 1024 * 1024;
552     p_mem_info->ui_alignment = 8;
553     p_mem_info->ui_type = IA_MEMTYPE_PERSIST;
554     p_mem_info->ui_placement[0] = 0;
555     p_mem_info->ui_placement[1] = 0;
556     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
557     p_mem_info->ui_placed[0] = 0;
558     p_mem_info->ui_placed[1] = 0;
559   }
560   {
561     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX];
562     p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
563                           (p_obj_drc->str_config.pcm_size >> 3) *
564                           p_obj_drc->str_config.num_ch_in;
565     p_mem_info->ui_alignment = 4;
566     p_mem_info->ui_type = IA_MEMTYPE_INPUT;
567     p_mem_info->ui_placement[0] = 0;
568     p_mem_info->ui_placement[1] = 0;
569     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
570     p_mem_info->ui_placed[0] = 0;
571     p_mem_info->ui_placed[1] = 0;
572   }
573   {
574     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX];
575     p_mem_info->ui_size = p_obj_drc->str_config.frame_size *
576                           (p_obj_drc->str_config.pcm_size >> 3) *
577                           p_obj_drc->str_config.num_ch_in;
578     p_mem_info->ui_alignment = 4;
579     p_mem_info->ui_type = IA_MEMTYPE_OUTPUT;
580     p_mem_info->ui_placement[0] = 0;
581     p_mem_info->ui_placement[1] = 0;
582     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
583     p_mem_info->ui_placed[0] = 0;
584     p_mem_info->ui_placed[1] = 0;
585   }
586   {
587     p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX];
588     p_mem_info->ui_size = SCRATCH_MEM_SIZE;
589     p_mem_info->ui_alignment = 8;
590     p_mem_info->ui_type = IA_MEMTYPE_SCRATCH;
591     p_mem_info->ui_placement[0] = 0;
592     p_mem_info->ui_placement[1] = 0;
593     p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE;
594     p_mem_info->ui_placed[0] = 0;
595     p_mem_info->ui_placed[1] = 0;
596   }
597   return IA_NO_ERROR;
598 }
599