123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #include "include.h"
- void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
- void bt_sco_process(u8 *ptr, u32 samples, int ch_mode);
- void bt_alc_process(u8 *ptr, u32 samples, int ch_mode);
- void bt_adc_process(u8 *ptr, u32 samples, int ch_mode);
- void voice_assistant_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
- void aux_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
- void speaker_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
- void bt_sco_mav_process(u8 *ptr, u32 samples);
- void bt_adc_process_fix(u8 *ptr, u32 samples, int ch_mode);
- #if FUNC_AUX_EN
- #define aux_sdadc_callback aux_sdadc_process
- #else
- #define aux_sdadc_callback sdadc_dummy
- #endif // FUNC_AUX_EN
- #if FUNC_SPEAKER_EN
- #define speaker_sdadc_callback speaker_sdadc_process
- #else
- #define speaker_sdadc_callback sdadc_dummy
- #endif // FUNC_SPEAKER_EN
- #if BT_AEC_EN
- #define bt_sdadc_callback bt_aec_process
- #elif BT_ALC_EN
- #define bt_sdadc_callback bt_alc_process
- #else
- #define bt_sdadc_callback bt_sco_process
- #endif //BT_AEC_EN
- //MIC analog gain: 0~13(共14级), step 3DB (3db ~ +42db)
- //adadc digital gain: 0~63, step 0.5 DB, 保存在gain的低6bit
- const sdadc_cfg_t rec_cfg_tbl[] = {
- /* 通道, 采样率, 增益, 通路控制, 保留, 样点数, 回调函数*/
- {AUX_CHANNEL_CFG, SPR_44100, (2 << 6), ADC2DAC_EN, 0, 256, aux_sdadc_callback}, /* AUX */
- {MIC_CHANNEL_CFG, SPR_8000, (12 << 6), ADC2DAC_EN, 0, 256, bt_sdadc_callback}, /* BTMIC */
- {MIC_CHANNEL_CFG, SPR_8000, (12 << 6), ADC2DAC_EN, 0, 128, sdadc_dummy}, /* BTMIC test */
- {MIC_CHANNEL_CFG, SPR_16000, (10 << 6), ADC2DAC_EN, 0, 160, sdadc_dummy},
- {MIC_CHANNEL_CFG, SPR_16000, (12 << 6), ADC2DAC_EN, 0, 256, speaker_sdadc_callback},
- };
- void audio_path_init(u8 path_idx)
- {
- sdadc_cfg_t cfg;
- memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
- #if FUNC_AUX_EN
- if (path_idx == AUDIO_PATH_AUX) {
- cfg.channel = get_aux_channel_cfg();
- cfg.gain = ((u16)xcfg_cb.aux_anl_gain << 6);
- }
- #endif // FUNC_AUX_EN
- if (path_idx == AUDIO_PATH_BTMIC) {
- cfg.gain = ((u16)BT_ANL_GAIN << 6) | BT_DIG_GAIN;
- #if BT_AEC_EN || BT_ALC_EN
- if (xcfg_cb.bt_aec_en) {
- cfg.callback = bt_aec_process;
- }
- #if BT_ALC_EN
- else if (xcfg_cb.bt_alc_en) {
- cfg.callback = bt_alc_process;
- }
- #endif // BT_ALC_EN
- else {
- #if 1
- cfg.callback = bt_adc_process; //不过AEC及ALC,可以过近端降噪
- #else
- cfg.callback = bt_adc_process_fix; //修正关通话算法后,无声的问题,不打开的原因是不想占用公共区
- #endif
- }
- #endif // BT_AEC_EN
- if (bt_sco_is_msbc() || cfg_bt_sco_dnn_en) { //如果开了msbc或dnn,则采样率设为16k
- cfg.sample_rate = SPR_16000;
- }
- }
- if (path_idx == AUDIO_PATH_VA || path_idx == AUDIO_PATH_SPEAKER) {
- cfg.gain = ((u16)BT_ANL_GAIN << 6) | BT_DIG_GAIN;
- }
- sdadc_init(&cfg);
- if (path_idx == AUDIO_PATH_BTMIC) {
- if (!bt_sco_is_msbc() && cfg_bt_sco_dnn_en) { //dnn: 走窄带通话时,ADC为16K,DAC为8K
- dac_spr_set(SPR_8000);
- }
- }
- }
- void audio_path_start(u8 path_idx)
- {
- sdadc_cfg_t cfg;
- memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
- #if FUNC_AUX_EN
- if (path_idx == AUDIO_PATH_AUX) {
- cfg.channel = get_aux_channel_cfg();
- }
- #endif // FUNC_AUX_EN
- sdadc_start(cfg.channel);
- }
- void audio_path_exit(u8 path_idx)
- {
- sdadc_cfg_t cfg;
- memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
- #if FUNC_AUX_EN
- if (path_idx == AUDIO_PATH_AUX) {
- cfg.channel = get_aux_channel_cfg();
- }
- #endif // FUNC_AUX_EN
- sdadc_exit(cfg.channel);
- if (!sys_cb.anc_start) {
- adpll_spr_set(DAC_OUT_SPR);
- }
- }
- AT(.rodata.aux)
- const u8 cfg_aux_ch_tbl[4] = {
- 0, CH_AUXL_PB3, CH_AUXL_PE7, CH_AUXL_PA7,
- };
- u8 get_aux_channel_cfg(void)
- {
- #if FUNC_AUX_EN
- return cfg_aux_ch_tbl[xcfg_cb.auxl_sel]; //工具配置AUX通路
- #else
- return 0;
- #endif // FUNC_AUX_EN
- }
|