#include "app_config.h" #include "icsd_anc_user.h" #include "audio_codec_clock.h" #include "asm/clock.h" #include "audio_enc.h" #include "asm/audio_adc.h" #include "tone_player.h" #include "avctp_user.h" #include "asm/audio_src_base.h" #if TCFG_USER_TWS_ENABLE #include "bt_tws.h" #endif #include "app_main.h" #if TCFG_AUDIO_ANC_ENABLE #include "audio_anc.h" struct audio_mic_hdl { struct audio_adc_output_hdl adc_output; struct adc_mic_ch mic_ch; s16 *adc_buf; //align 2Bytes u16 dump_packet; }; static struct audio_mic_hdl *audio_mic = NULL; extern struct audio_dac_hdl dac_hdl; extern struct audio_adc_hdl adc_hdl; extern s16 esco_adc_buf[]; //align 2Bytes extern void tws_tx_unsniff_req(void); extern void tws_tx_sniff_req(void); extern void set_tws_t_sniff(u16 slot); extern void bt_sniff_set_enable(u8 en); int audio_mic_en(u8 en, audio_mic_param_t *mic_param, void (*data_handler)(void *priv, s16 *data, int len)) { printf("audio_mic_en : %d", en); if (en) { if (audio_mic) { printf("audio_mic re-malloc error\n"); return -1; } audio_mic = zalloc(sizeof(struct audio_mic_hdl)); if (audio_mic == NULL) { printf("audio mic zalloc failed\n"); return -1; } u16 mic_ch = mic_param->mic_ch_sel; u16 sr = mic_param->sample_rate; u8 gain0 = mic_param->mic0_gain; u8 gain1 = mic_param->mic1_gain; u8 gain2 = mic_param->mic2_gain; u8 gain3 = mic_param->mic3_gain; u8 mic_num = 0; /*打开mic电压*/ audio_mic_pwr_ctl(MIC_PWR_ON); /*打开mic0*/ if (mic_ch & BIT(0)) { printf("adc_mic0 open, sr:%d, gain:%d\n", sr, gain0); audio_adc_mic_open(&audio_mic->mic_ch, mic_ch, &adc_hdl); audio_adc_mic_set_gain(&audio_mic->mic_ch, gain0); mic_num ++; } /*打开mic1*/ if (mic_ch & BIT(1)) { printf("adc_mic1 open, sr:%d, gain:%d\n", sr, gain1); audio_adc_mic1_open(&audio_mic->mic_ch, mic_ch, &adc_hdl); audio_adc_mic1_set_gain(&audio_mic->mic_ch, gain1); mic_num ++; } /*打开mic2*/ if (mic_ch & BIT(2)) { printf("adc_mic2 open, sr:%d, gain:%d\n", sr, gain2); audio_adc_mic2_open(&audio_mic->mic_ch, mic_ch, &adc_hdl); audio_adc_mic2_set_gain(&audio_mic->mic_ch, gain2); mic_num ++; } /*打开mic3*/ if (mic_ch & BIT(3)) { printf("adc_mic3 open, sr:%d, gain:%d\n", sr, gain3); audio_adc_mic3_open(&audio_mic->mic_ch, mic_ch, &adc_hdl); audio_adc_mic3_set_gain(&audio_mic->mic_ch, gain3); mic_num ++; } int adc_buf_size = mic_param->adc_irq_points * 2 * mic_param->adc_buf_num * mic_num; printf("adc irq points %d, adc_buf_size : %d", mic_param->adc_irq_points, adc_buf_size); audio_mic->adc_buf = esco_adc_buf; /* audio_mic->adc_buf = zalloc(adc_buf_size); */ if (audio_mic->adc_buf == NULL) { printf("audio->adc_buf mic zalloc failed\n"); audio_mic_pwr_ctl(MIC_PWR_OFF); free(audio_mic); audio_mic = NULL; return -1; } audio_adc_mic_set_sample_rate(&audio_mic->mic_ch, sr); audio_adc_mic_set_buffs(&audio_mic->mic_ch, audio_mic->adc_buf, mic_param->adc_irq_points * 2, mic_param->adc_buf_num); audio_mic->adc_output.handler = data_handler; audio_adc_add_output_handler(&adc_hdl, &audio_mic->adc_output); audio_adc_mic_start(&audio_mic->mic_ch); } else { if (audio_mic) { /*设置fb mic为复用mic*/ #if TCFG_AUDIO_ANC_ENABLE audio_anc_mic_mana_fb_mult_set(1); #endif audio_adc_mic_close(&audio_mic->mic_ch); audio_adc_del_output_handler(&adc_hdl, &audio_mic->adc_output); if (audio_mic->adc_buf) { /* free(audio_mic->adc_buf); */ } /*清除fb mic为复用mic的标志*/ #if TCFG_AUDIO_ANC_ENABLE audio_anc_mic_mana_fb_mult_set(0); if (anc_status_get() == 0) #endif { audio_mic_pwr_ctl(MIC_PWR_OFF); } free(audio_mic); audio_mic = NULL; } } return 0; } static char *tone_index_to_name(u8 index) { char *file_name = NULL; switch (index) { case ICSD_ADT_TONE_NUM0 : file_name = TONE_NUM_0; break; case ICSD_ADT_TONE_NUM1 : file_name = TONE_NUM_1; break; case ICSD_ADT_TONE_NUM2 : file_name = TONE_NUM_2; break; case ICSD_ADT_TONE_NUM3 : file_name = TONE_NUM_3; break; case ICSD_ADT_TONE_NUM4 : file_name = TONE_NUM_4; break; case ICSD_ADT_TONE_NUM5 : file_name = TONE_NUM_5; break; case ICSD_ADT_TONE_NUM6 : file_name = TONE_NUM_6; break; case ICSD_ADT_TONE_NUM7 : file_name = TONE_NUM_7; break; case ICSD_ADT_TONE_NUM8 : file_name = TONE_NUM_8; break; case ICSD_ADT_TONE_NUM9 : file_name = TONE_NUM_9; break; case ICSD_ADT_TONE_NORMAL : /* file_name = (char *)get_tone_files()->normal; */ break; case ICSD_ADT_TONE_SPKCHAT_ON : file_name = TONE_SPKCHAT_ON; break; case ICSD_ADT_TONE_SPKCHAT_OFF : file_name = TONE_SPKCHAT_OFF; break; case ICSD_ADT_TONE_WCLICK_ON : file_name = TONE_WCLICK_ON; break; case ICSD_ADT_TONE_WCLICK_OFF : file_name = TONE_WCLICK_OFF; break; case ICSD_ADT_TONE_WINDDET_ON : file_name = TONE_WINDDET_ON; break; case ICSD_ADT_TONE_WINDDET_OFF : file_name = TONE_WINDDET_OFF; break; } return file_name; } int icsd_adt_tone_play_callback(u8 index, void (*evt_handler)(void *priv), void *priv) { int ret = 0; char *file_name = tone_index_to_name(index); if (index == ICSD_ADT_TONE_NORMAL) { ret = tone_play_index_with_callback(index, 0, evt_handler, priv); } else { ret = tone_play_with_callback(file_name, 0, evt_handler, priv); } return ret; } int icsd_adt_tone_play(u8 index) { int ret = 0; char *file_name = tone_index_to_name(index); if (index == ICSD_ADT_TONE_NORMAL) { ret = tone_play_index(IDEX_TONE_NORMAL, 0); } else { ret = tone_play(file_name, 0); } return ret; } static void icsd_adt_clock_add() { /* clock_refurbish(); */ audio_codec_clock_set(SPEAK_TO_CHAT_MODE, AUDIO_CODING_PCM, 0); } static void icsd_adt_clock_del() { audio_codec_clock_del(SPEAK_TO_CHAT_MODE); } void icsd_set_clk() { clk_set_sys_lock(128 * (1000000L), 0); /* clock_alloc("icsd_adt", 128 * 1000000L); */ } static void icsd_anc_fade_set(int gain) { #if TCFG_AUDIO_ANC_ENABLE audio_anc_fade_ctr_set(ANC_FADE_MODE_WIND_NOISE, AUDIO_ANC_FDAE_CH_ALL, gain); #endif } u8 esco_player_runing() { return bt_phone_dec_is_running(); } u8 bt_get_call_status() { return get_call_status(); } u8 bt_a2dp_get_status() { return a2dp_get_status(); } void bt_cmd_prepare(u8 cmd, u16 param_len, u8 *param) { user_send_cmd_prepare(cmd, param_len, param); } void *icsd_adt_src_init(int in_rate, int out_rate, int (*handler)(void *, void *, int)) { void *src_hdl = audio_resample_hw_open(1, in_rate, out_rate, 1); audio_resample_hw_set_output_handler(src_hdl, 0, handler); return src_hdl; /* void *src_hdl = zalloc(sizeof(struct audio_src_handle)); */ /* audio_hw_src_open(src_hdl, 1, 1); */ /* audio_hw_src_set_rate(src_hdl, in_rate, out_rate); */ /* audio_src_set_output_handler(src_hdl, 0, handler); */ /* return src_hdl; */ } void icsd_adt_src_write(void *data, int len, void *resample) { audio_resample_hw_write(resample, data, len); /* audio_src_resample_write(resample, data, len); */ } void icsd_adt_src_push(void *resample) { audio_resample_hw_push_data_out(resample); /* audio_src_push_data_out((struct audio_src_handle *)resample); */ } void icsd_adt_src_close(void *resample) { audio_resample_hw_close(resample); /* audio_hw_src_close(resample); */ /* free(resample); */ resample = NULL; } void icsd_adt_tx_unsniff_req() { #if TCFG_USER_TWS_ENABLE tws_tx_unsniff_req(); #endif } void icsd_bt_sniff_set_enable(u8 en) { bt_sniff_set_enable(en); } void icsd_set_tws_t_sniff(u16 slot) { #if TCFG_USER_TWS_ENABLE set_tws_t_sniff(slot); #endif } u8 icsd_get_talk_mic_ch(void) { return app_var.talk_mic_ch; } u8 icsd_get_ref_mic_ch(void) { return BIT(TCFG_AUDIO_ANCL_FF_MIC); } u8 icsd_get_fb_mic_ch(void) { return BIT(TCFG_AUDIO_ANCL_FB_MIC); } u8 icsd_get_esco_mic_en_map(void) { return TCFG_AUDIO_ADC_MIC_CHA; } u8 audio_adc_file_get_esco_mic_num(void) { u8 mic_num = 0; for (int i = 0; i < 4; i++) { if (TCFG_AUDIO_ADC_MIC_CHA & BIT(i)) { mic_num++; } } return mic_num; } #endif /*TCFG_AUDIO_ANC_ENABLE*/