sfunc_bt_call.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. #include "include.h"
  2. #include "func.h"
  3. #include "func_bt.h"
  4. #if HLW_UI
  5. #include "hlw_func.h"
  6. #endif
  7. static call_cfg_t call_cfg AT(.sco_data);
  8. #if ANC_ALG_EN
  9. static u8 sco_anc_alg_en AT(.sco_data);
  10. #endif // ANC_ALG_EN
  11. #if ASR_EN
  12. static u8 bt_asr_sta;
  13. #endif
  14. bool mic_eq_test_get_status(void);
  15. #if BT_SCO_DBG_EN
  16. void sco_audio_set_param(u8 type, u16 value)
  17. {
  18. // aec_cfg_t *aec = &call_cfg.aec;
  19. // nr_cb_t *nr = &call_cfg.nr;
  20. //printf("set param[%d]:%d\n", type, value);
  21. if (type == AEC_PARAM_NOISE) {
  22. // xcfg_cb.bt_noise_threshoid = value;
  23. // nr->threshoid = value;
  24. } else if (type == AEC_PARAM_LEVEL) {
  25. xcfg_cb.bt_echo_level = value;
  26. // aec->echo_level = value;
  27. } else if (type == AEC_PARAM_OFFSET) {
  28. // aec->far_offset = value;
  29. } else if (type == AEC_PARAM_MIC_ANL_GAIN) {
  30. xcfg_cb.mic0_anl_gain = value;
  31. // set_mic_analog_gain(value, (CHANNEL_0 | CHANNEL_1 | CHANNEL_2));
  32. } else if (type == AEC_PARAM_MIC_DIG_GAIN) {
  33. xcfg_cb.bt_mic0_dig_gain = value;
  34. // sdadc_set_digital_gain((CHANNEL_1 | CHANNEL_2 | CHANNEL_3), (value&0x3f));
  35. } else if (type == AEC_PARAM_MIC_POST_GAIN) {
  36. xcfg_cb.bt_sco_post_gain = value & 0x0f;
  37. }
  38. }
  39. #endif
  40. static void bt_sco_eq_init(call_cfg_t *p)
  41. {
  42. #if BT_MIC_DRC_EN
  43. u8 *mic_drc_addr;
  44. u32 mic_drc_len;
  45. #endif
  46. #if SDADC_EQ_EN
  47. u32 micl_soft_eq_addr, micl_soft_eq_len;
  48. u32 micr_soft_eq_addr, micr_soft_eq_len;
  49. #endif
  50. u32 mic_eq_addr, mic_eq_len;
  51. if (bt_sco_is_msbc()) {
  52. mic_eq_addr = RES_BUF_EQ_BT_MIC_16K_EQ;
  53. mic_eq_len = RES_LEN_EQ_BT_MIC_16K_EQ;
  54. #if SDADC_EQ_EN
  55. micl_soft_eq_addr = RES_BUF_EQ_SDADCL_16K_EQ;
  56. micl_soft_eq_len = RES_LEN_EQ_SDADCL_16K_EQ;
  57. micr_soft_eq_addr = RES_BUF_EQ_SDADCR_16K_EQ;
  58. micr_soft_eq_len = RES_LEN_EQ_SDADCR_16K_EQ;
  59. #endif
  60. #if BT_MIC_DRC_EN
  61. mic_drc_addr = (u8 *)RES_BUF_EQ_BT_MIC_16K_DRC;
  62. mic_drc_len = RES_LEN_EQ_BT_MIC_16K_DRC;
  63. #endif
  64. } else {
  65. mic_eq_addr = RES_BUF_EQ_BT_MIC_8K_EQ;
  66. mic_eq_len = RES_LEN_EQ_BT_MIC_8K_EQ;
  67. #if SDADC_EQ_EN
  68. micl_soft_eq_addr = RES_BUF_EQ_SDADCL_8K_EQ;
  69. micl_soft_eq_len = RES_LEN_EQ_SDADCL_8K_EQ;
  70. micr_soft_eq_addr = RES_BUF_EQ_SDADCR_8K_EQ;
  71. micr_soft_eq_len = RES_LEN_EQ_SDADCR_8K_EQ;
  72. #endif
  73. #if BT_MIC_DRC_EN
  74. mic_drc_addr = (u8 *)RES_BUF_EQ_BT_MIC_8K_DRC;
  75. mic_drc_len = RES_LEN_EQ_BT_MIC_8K_DRC;
  76. #endif
  77. }
  78. #if SDADC_EQ_EN
  79. sdadcl_set_soft_eq_by_res(micl_soft_eq_addr, micl_soft_eq_len);
  80. sdadcr_set_soft_eq_by_res(micr_soft_eq_addr, micr_soft_eq_len);
  81. #endif
  82. p->post_gain = (mic_gain_tbl[xcfg_cb.bt_sco_post_gain] >> 8);
  83. if (mic_set_eq_by_res(mic_eq_addr, mic_eq_len)) {
  84. call_cfg.mic_eq_en = 1;
  85. }
  86. #if BT_MIC_DRC_EN
  87. mic_set_drc_by_res((u32)mic_drc_addr, mic_drc_len);
  88. #endif
  89. mic_set_post_gain(mic_gain_tbl[xcfg_cb.bt_sco_post_gain]);
  90. #ifdef RES_BUF_EQ_CALL_NORMAL_EQ
  91. music_set_eq_by_res(RES_BUF_EQ_CALL_NORMAL_EQ, RES_LEN_EQ_CALL_NORMAL_EQ);
  92. #else
  93. music_eq_off();
  94. #endif
  95. #if DAC_DRC_EN
  96. music_drc_off();
  97. #endif
  98. }
  99. static void bt_sco_eq_exit(void)
  100. {
  101. #if BT_MIC_DRC_EN
  102. mic_drc_off();
  103. #endif
  104. mic_eq_off();
  105. music_set_eq_by_num(sys_cb.eq_mode);
  106. if(app_eq_set() == 0){
  107. music_set_eq_by_num(sys_cb.eq_mode);
  108. }
  109. #if DAC_DRC_EN
  110. music_drc_on();
  111. #endif
  112. }
  113. static void bt_call_alg_init(void)
  114. {
  115. u8 sysclk = SYS_24M;
  116. memset(&call_cfg, 0, sizeof(call_cfg_t));
  117. sys_clk_req(INDEX_VOICE, SYS_100M);
  118. ///AEC初始化
  119. bt_sco_aec_init(&sysclk, &call_cfg.aec, &call_cfg.alc);
  120. ///通话MIC端降噪算法初始化
  121. bt_sco_nr_init(&sysclk, &call_cfg.nr);
  122. ///通话DAC端降噪算法初始化
  123. bt_sco_far_nr_init(&sysclk, &call_cfg.nr);
  124. ///DAC、MIC EQ初始化
  125. bt_sco_eq_init(&call_cfg);
  126. if (SYS_100M != sysclk) {
  127. sys_clk_req(INDEX_VOICE, sysclk);
  128. }
  129. bt_call_init(&call_cfg);
  130. }
  131. static void bt_call_alg_exit(void)
  132. {
  133. bt_sco_nr_exit();
  134. bt_call_exit();
  135. bt_sco_eq_exit();
  136. sys_clk_free(INDEX_VOICE);
  137. }
  138. ALIGNED(64)
  139. void sco_set_incall_flag(u8 bit)
  140. {
  141. GLOBAL_INT_DISABLE();
  142. sys_cb.incall_flag |= bit;
  143. GLOBAL_INT_RESTORE();
  144. }
  145. ALIGNED(128)
  146. bool sco_clr_incall_flag(u8 bit)
  147. {
  148. bool ret = false;
  149. GLOBAL_INT_DISABLE();
  150. if(sys_cb.incall_flag == INCALL_FLAG_FADE) {
  151. ret = true;
  152. }
  153. sys_cb.incall_flag &= ~bit;
  154. GLOBAL_INT_RESTORE();
  155. return ret;
  156. }
  157. #if FUNC_BT_EN
  158. void sco_audio_init(void)
  159. {
  160. fot_update_pause();
  161. #if DAC_DNC_EN
  162. msg_queue_detach(EVT_DNC_START, 0);
  163. msg_queue_detach(EVT_DNC_STOP, 0);
  164. msg_enqueue(EVT_DNC_STOP);
  165. #endif
  166. #if ASR_EN
  167. bt_asr_sta = bsp_asr_get_statue();
  168. bsp_asr_stop();
  169. #endif
  170. #if TINY_TRANSPARENCY_EN
  171. bsp_ttp_stop();
  172. #endif
  173. #if ANC_ALG_EN
  174. sco_anc_alg_en = sys_cb.anc_alg_en;
  175. sys_cb.anc_alg_type_bak = bsp_anc_alg_get_type();
  176. bsp_anc_alg_stop();
  177. anc_alg_enter_critical();
  178. #endif // ANC_ALG_EN
  179. #if BT_MUSIC_EFFECT_EN
  180. music_effect_sco_audio_init_do();
  181. #endif // BT_MUSIC_EFFECT_EN
  182. sco_set_incall_flag(INCALL_FLAG_SCO);
  183. if (!bt_sco_karaok_is_en(1)) {
  184. bt_call_alg_init();
  185. dac_set_anl_offset(1);
  186. #if IIS_RX2SCO_EN
  187. bsp_iis_sco_init();
  188. iis_start();
  189. #else
  190. audio_path_init(AUDIO_PATH_BTMIC);
  191. audio_path_start(AUDIO_PATH_BTMIC);
  192. #endif
  193. bsp_change_volume(bsp_bt_get_hfp_vol(sys_cb.hfp_vol));
  194. //printf("sco audio init 11\n");
  195. dac_fade_in();
  196. //printf("sco audio init 22\n");
  197. }
  198. #if ANC_ALG_EN
  199. anc_alg_exit_critical();
  200. #endif // ANC_ALG_EN
  201. }
  202. void sco_audio_exit(void)
  203. {
  204. sco_clr_incall_flag(INCALL_FLAG_SCO);
  205. if (!bt_sco_karaok_is_en(0)) {
  206. dac_fade_out();
  207. dac_aubuf_clr();
  208. dac_set_anl_offset(0);
  209. bsp_change_volume(sys_cb.vol);
  210. #if IIS_RX2SCO_EN
  211. iis_stop();
  212. #else
  213. audio_path_exit(AUDIO_PATH_BTMIC);
  214. #endif
  215. }
  216. bt_call_alg_exit();
  217. #if SYS_KARAOK_EN
  218. bsp_karaok_init(AUDIO_PATH_KARAOK, FUNC_BT);
  219. #endif
  220. #if TINY_TRANSPARENCY_EN
  221. bsp_ttp_init();
  222. if(!sco_is_connected()){
  223. bsp_ttp_start();
  224. }
  225. #endif
  226. #if BT_MUSIC_EFFECT_EN
  227. music_effect_sco_audio_exit_do();
  228. #endif // BT_MUSIC_EFFECT_EN
  229. #if ANC_ALG_EN
  230. if (sco_anc_alg_en) {
  231. bsp_anc_alg_start(sys_cb.anc_alg_type_bak);
  232. sys_cb.anc_alg_type_bak = 0;
  233. }
  234. #endif // ANC_ALG_EN
  235. fot_update_continue();
  236. #if DAC_DNC_EN
  237. msg_queue_detach(EVT_DNC_START, 0);
  238. msg_queue_detach(EVT_DNC_STOP, 0);
  239. msg_enqueue(EVT_DNC_START);
  240. #endif
  241. #if ASR_EN
  242. if (bt_asr_sta) {
  243. bsp_asr_start();
  244. bt_asr_sta = 0;
  245. }
  246. #endif
  247. }
  248. static void sfunc_bt_call_process(void)
  249. {
  250. func_process();
  251. #if BT_TWS_MS_SWITCH_EN
  252. if (xcfg_cb.bt_tswi_sco_en && bt_tws_need_switch(0)) {
  253. printf("AUDIO SWITCH\n");
  254. bt_tws_switch();
  255. }
  256. #endif
  257. func_bt_sub_process();
  258. func_bt_status();
  259. }
  260. static void sfunc_bt_call_enter(void)
  261. {
  262. #if HLW_UI
  263. printf("%s\n", __func__);
  264. #endif
  265. sco_set_incall_flag(INCALL_FLAG_CALL);
  266. if(sys_cb.incall_flag == INCALL_FLAG_FADE) {
  267. bsp_change_volume(bsp_bt_get_hfp_vol(sys_cb.hfp_vol));
  268. dac_fade_in();
  269. }
  270. }
  271. static void sfunc_bt_call_exit(void)
  272. {
  273. bool vol_change = sco_clr_incall_flag(INCALL_FLAG_CALL);
  274. if(vol_change) {
  275. bsp_change_volume(sys_cb.vol);
  276. }
  277. #if HLW_UI
  278. hlw_cb.hfp_kill = 0;
  279. printf("%s\n", __func__);
  280. #endif
  281. }
  282. AT(.text.func.bt)
  283. void sfunc_bt_call(void)
  284. {
  285. printf("%s\n", __func__);
  286. sfunc_bt_call_enter();
  287. while ((f_bt.disp_status >= BT_STA_OUTGOING) && (func_cb.sta == FUNC_BT)) {
  288. //printf("calling calling calling\n");
  289. sfunc_bt_call_process();
  290. sfunc_bt_call_message(msg_dequeue());
  291. func_bt_display();
  292. #if HLW_UI
  293. hlw_bt_disconnect_process();
  294. #endif
  295. }
  296. sfunc_bt_call_exit();
  297. }
  298. #else
  299. void sco_audio_init(void){}
  300. void sco_audio_exit(void){}
  301. #endif //FUNC_BT_EN