Int16 aerAlgo_Create() { tint num_bufs_req_by_aer; const ecomemBuffer_t *bufs_req_by_aer; ecomemBuffer_t bufs_aloc_by_siu[SIU_NUM_AER_BUFFS]; aerCreateConfig_t aer_create_cfg; aerSizeConfig_t aer_size_cfg; aerNewConfig_t aer_new_cfg; aer_create_cfg.config_bitfield = 0x0; aer_create_cfg.debugInfo = NULL; // todo: set callback aer_create_cfg.eventOut = NULL; // todo: set callback aer_create_cfg.max_sampling_rate = aer_SRATE_16K; aerError = aerCreate(&aer_create_cfg); if (aerError != aer_NOERR) { return aerError; } // Call aerGetSizes() to get memory requirements aer_size_cfg.max_tail_length = 1600; aer_size_cfg.max_y2x_delay = 80; aer_size_cfg.config_bitfield = aer_SIZE_FDNLP_REQ; /* use FDNLP for HF */ aerError = aerGetSizes(&num_bufs_req_by_aer, &bufs_req_by_aer, &aer_size_cfg); if (aerError != aer_NOERR) { return aerError; } printf("AER required buffers for hands free:\n"); printBufferUsage(bufs_req_by_aer, num_bufs_req_by_aer); // Create instance for handsfree // allocate memory according to the requirements returned by aerGetSizes() aerError = allocAerBuffers(bufs_req_by_aer, bufs_aloc_by_siu, num_bufs_req_by_aer, aer_PHM_HF, 0, FALSE); if (aerError != aer_NOERR) { return aerError; } printf("Buffers allocated for hands-free AER:\n"); printBufferUsage(bufs_aloc_by_siu, num_bufs_req_by_aer); // Call aerNew() to create instance aer_new_cfg.handle = NULL; // todo: id which is passed to dbg and event callbacks -> see aer_create_cfg //aer_new_cfg.handle = (void *) siuMakeID( // (SIU_MID_AER | AER_HF0_ID), 0); aer_new_cfg.sizeCfg = aer_size_cfg; aerInst = NULL; aerError = aerNew(&aerInst, num_bufs_req_by_aer, bufs_aloc_by_siu, &aer_new_cfg); if (aerError != aer_NOERR) { return aerError; } return aer_NOERR; } Int16 aerAlgo_Open() { aerConfig_t aerCfg; aerCfg.y2x_delay = 40; aerCfg.srate_bitfield = aer_SRATE_RXIN_16K | aer_SRATE_TXOUT_16K | aer_SRATE_RXOUT_TXIN_16K; aerCfg.tail_length = 800; aerCfg.delay_tx_ag_chg = 160; // für agc adaption aerCfg.delay_rx_ag_chg = 160; // für agc adaption aerCfg.num_samp_interp = 5; // für agc adaption aerCfg.phone_mode = aer_PHM_HF; aerCfg.reset_bitfield = aer_RESET_FULL; aerCfg.valid_bitfield = aer_CFG_VALID_BITS_ALL_1; aerError = aerOpen(aerInst, &aerCfg); if (aerError != aer_NOERR) { return aerError; } aerError = aerActivate(aerInst, NULL); // todo: needed???? if (aerError != aer_NOERR) { return aerError; } return aer_NOERR; } Int16 aerAlgo_ConfigParams() { /* valid bitfield 0 */ aer_ctl.valid_bitfield_0 = aer_CTL_VALID0_MODES_CTL0 | aer_CTL_VALID0_MODES_CTL1 | aer_CTL_VALID0_MODES_CTL2 | aer_CTL_VALID0_Y2X_DELAY | aer_CTL_VALID0_SAMPLING_RATES | aer_CTL_VALID0_TAIL_LENGTH | aer_CTL_VALID0_TX_AG_CHG_DELAY | aer_CTL_VALID0_RX_AG_CHG_DELAY | aer_CTL_VALID0_TX_AG_CHG_INTERP | aer_CTL_VALID0_PHONE_MODE | aer_CTL_VALID0_RX_ANALOG | aer_CTL_VALID0_TX_ANALOG | aer_CTL_VALID0_RX_DIGITAL | aer_CTL_VALID0_TX_DIGITAL | aer_CTL_VALID0_RX_EQ_PARAMS | aer_CTL_VALID0_TX_EQ_PARAMS; aer_ctl.modes_0.mask = 0xffff; aer_ctl.modes_0.value = 0x008F; // default 0x0086 aer_ctl.modes_1.mask = 0xffff; aer_ctl.modes_1.value = 0x0000; // default 0x0000 aer_ctl.modes_2.mask = 0xffff; aer_ctl.modes_2.value = 0x0000; // default 0x0000 aer_ctl.y2x_delay = 40; // no default aer_ctl.srate_bitfield = aer_SRATE_RXIN_16K | aer_SRATE_TXOUT_16K // no default | aer_SRATE_RXOUT_TXIN_16K; aer_ctl.tail_length = 800; /* 800 = 100msec/125usec */ // no default aer_ctl.delay_tx_ag_chg = 160; // no default aer_ctl.delay_rx_ag_chg = 160; // no default aer_ctl.num_samp_interp = 5; // no default aer_ctl.phone_mode = aer_PHM_HF; // no default aer_ctl.gain_rx_analog = 0; // no default aer_ctl.gain_tx_analog = 0; // no default aer_ctl.gain_rx_digital = 0; // default 0 aer_ctl.gain_tx_digital = 0; // default 0 aer_ctl.rxeq_params = (aerEqConfig_t *) &sampleEqBqParamsRx; // no default aer_ctl.txeq_params = (aerEqConfig_t *) &sampleEqBqParamsTx; // no default /* valid bitfield 1 */ aer_ctl.valid_bitfield_1 = aer_CTL_VALID1_NLP_CLOSS_TARGET | aer_CTL_VALID1_NLP_TX_CLIPAGG | aer_CTL_VALID1_NLP_LINATTN_MAX_ERLE | aer_CTL_VALID1_NLP_CLIPPER_MAX_ERLE | aer_CTL_VALID1_NLP_TOTAL_LINATTN_MIN | aer_CTL_VALID1_NLP_RX_LINATTN_MIN | aer_CTL_VALID1_NLP_RX_LINATTN_MAX | aer_CTL_VALID1_NLP_TX_LINATTN_MIN | aer_CTL_VALID1_NLP_TX_LINATTN_MAX | aer_CTL_VALID1_NLP_TX_IN_TC | aer_CTL_VALID1_NLP_TX_OUT_TC | aer_CTL_VALID1_NLP_RX_IN_TC | aer_CTL_VALID1_NLP_RX_OUT_TC | aer_CTL_VALID1_GAIN_SPLIT_TC | aer_CTL_VALID1_CNG_RX_LEVEL | aer_CTL_VALID1_CNG_TX_LEVEL; aer_ctl.nlp_combloss_target = 327; // default 327 aer_ctl.nlp_clip_agg_l2 = 7; // default 7 aer_ctl.nlp_linattn_max_erle = 21; // default 21 aer_ctl.nlp_clipper_max_erle = 21; // default 21 aer_ctl.nlp_total_linattn_min = 0; // default 0 aer_ctl.nlp_rx_linattn_min = 0; // default 0 aer_ctl.nlp_rx_linattn_max = 32767; // default 32767 aer_ctl.nlp_tx_linattn_min = 0; // default 0 aer_ctl.nlp_tx_linattn_max = 32767; // default 32767 aer_ctl.nlp_tx_in_tc = 1; // default 1 aer_ctl.nlp_tx_out_tc = 1; // default 1 aer_ctl.nlp_rx_in_tc = 1; // default 1 aer_ctl.nlp_rx_out_tc = 1; // default 1 aer_ctl.gain_split_tc = 5; // default 5 aer_ctl.cng_rx_level = -65; // default -65 aer_ctl.cng_tx_level = -65; // default -65 /* valid bitfield 2 */ aer_ctl.valid_bitfield_2 = aer_CTL_VALID2_TX_FDNLP_MSEC_DELAY | aer_CTL_VALID2_TX_FDNLP_BIN_LO1 | aer_CTL_VALID2_TX_FDNLP_BIN_LO2 | aer_CTL_VALID2_TX_FDNLP_BIN_HI1 | aer_CTL_VALID2_TX_FDNLP_BIN_HI2 | aer_CTL_VALID2_TX_FDNLP_CNG_MAX | aer_CTL_VALID2_NR_FBIN1_LIM | aer_CTL_VALID2_NR_FBIN2_LIM | aer_CTL_VALID2_NR_FBAND1_MAX_ATTEN | aer_CTL_VALID2_NR_FBAND2_MAX_ATTEN | aer_CTL_VALID2_NR_FBAND3_MAX_ATTEN | aer_CTL_VALID2_NR_SIG_UPD_RATE_MAX | aer_CTL_VALID2_NR_SIG_UPD_RATE_MIN | aer_CTL_VALID2_NR_NOISE_THRESH | aer_CTL_VALID2_NR_NOISE_HANGOVER; aer_ctl.txfdnlp_msec_delay = 5; // default 5 aer_ctl.txfdnlp_bin_lo1 = 1; // default 1 aer_ctl.txfdnlp_bin_lo2 = 6; // default 6 aer_ctl.txfdnlp_bin_hi1 = 56; // default 56 aer_ctl.txfdnlp_bin_hi2 = 60; // default 60 aer_ctl.txfdnlp_cng_max = -60; // default -60 aer_ctl.nr_fbin1_lim = 10; // default 10 aer_ctl.nr_fbin2_lim = 32; // default 32 aer_ctl.nr_fband1_max_atten = 9; // default 9 aer_ctl.nr_fband2_max_atten = 9; // default 9 aer_ctl.nr_fband3_max_atten = 9; // default 9 aer_ctl.nr_sig_upd_rate_max = 31129; // default 31129 aer_ctl.nr_sig_upd_rate_min = 29818; // default 29818 aer_ctl.nr_noise_thresh = -75; // default -75 aer_ctl.nr_noise_hangover = 150; // default 150 /* valid bitfield 3 */ aer_ctl.valid_bitfield_3 = aer_CTL_VALID3_COH_HANGOVER | aer_CTL_VALID3_COH_RATIO_THRESH | aer_CTL_VALID3_COH_CNT_THRESH | aer_CTL_VALID3_HLC_THRESHOLD | aer_CTL_VALID3_HLC_RAMP_OUT_TC | aer_CTL_VALID3_HLC_POWER_TC | aer_CTL_VALID3_THRESH_RX_NLD | aer_CTL_VALID3_THRESH_NOISE_RX | aer_CTL_VALID3_THRESH_NOISE_TX | aer_CTL_VALID3_HANGOVER_RXTOTX | aer_CTL_VALID3_HANGOVER_TXTORX | aer_CTL_VALID3_TX_SLIM_MODE | aer_CTL_VALID3_RX_SLIM_MODE | aer_CTL_VALID3_NG_HANGOVER | aer_CTL_VALID3_NG_RAMPIN_PERIOD | aer_CTL_VALID3_NG_NOISE_LEVEL; aer_ctl.coh_hangover = 600; // default 600 aer_ctl.coh_ratio_thresh = 6554; // default 6554 aer_ctl.coh_cnt_thresh = 30; // default 30 aer_ctl.thresh_hlc = 0; // default 0 aer_ctl.ramp_out_tc_hlc = 700; // default 700 aer_ctl.power_tc_hlc = 1; // default 1 aer_ctl.thresh_rx_nld = 32000; // default 32000 aer_ctl.thresh_rx_noise = 5380; // default 5380 aer_ctl.thresh_tx_noise = 5380; // default 5380 aer_ctl.hangover_rx_to_tx = 30; // default 30 aer_ctl.hangover_tx_to_rx = 10; // default 10 aer_ctl.tx_slim_mode = 0; // default 0 aer_ctl.rx_slim_mode = 0; // default 0 aer_ctl.hangover_ng = 1000; // default 1000 aer_ctl.rampin_period_ng = 800; // default 800 aer_ctl.noise_level_ng = -75; // default -75 /*== AER valid bitfield 4 ==*/ aer_ctl.valid_bitfield_4 = aer_CTL_VALID4_DT_THRESH | aer_CTL_VALID4_CLIP_SCALE | aer_CTL_VALID4_DT_HANGOVER; aer_ctl.dt_thresh = 96; // default 96 aer_ctl.clip_scale_curve = 0x28404080; // default 0x28404080 aer_ctl.dt_hangover = 10; // default 10 aerError = aerControl(aerInst, &aer_ctl); if (aerError != aer_NOERR) { return aerError; } return aer_NOERR; } /* aer_sim_test_api */