bsp_audio.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "include.h"
  2. void bt_aec_process(u8 *ptr, u32 samples, int ch_mode);
  3. void bt_sco_process(u8 *ptr, u32 samples, int ch_mode);
  4. void bt_alc_process(u8 *ptr, u32 samples, int ch_mode);
  5. void bt_adc_process(u8 *ptr, u32 samples, int ch_mode);
  6. void voice_assistant_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
  7. void aux_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
  8. void speaker_sdadc_process(u8 *ptr,u32 samples,int ch_mode);
  9. void bt_sco_mav_process(u8 *ptr, u32 samples);
  10. void bt_adc_process_fix(u8 *ptr, u32 samples, int ch_mode);
  11. #if FUNC_AUX_EN
  12. #define aux_sdadc_callback aux_sdadc_process
  13. #else
  14. #define aux_sdadc_callback sdadc_dummy
  15. #endif // FUNC_AUX_EN
  16. #if FUNC_SPEAKER_EN
  17. #define speaker_sdadc_callback speaker_sdadc_process
  18. #else
  19. #define speaker_sdadc_callback sdadc_dummy
  20. #endif // FUNC_SPEAKER_EN
  21. #if BT_AEC_EN
  22. #define bt_sdadc_callback bt_aec_process
  23. #elif BT_ALC_EN
  24. #define bt_sdadc_callback bt_alc_process
  25. #else
  26. #define bt_sdadc_callback bt_sco_process
  27. #endif //BT_AEC_EN
  28. //MIC analog gain: 0~13(共14级), step 3DB (3db ~ +42db)
  29. //adadc digital gain: 0~63, step 0.5 DB, 保存在gain的低6bit
  30. const sdadc_cfg_t rec_cfg_tbl[] = {
  31. /* 通道, 采样率, 增益, 通路控制, 保留, 样点数, 回调函数*/
  32. {AUX_CHANNEL_CFG, SPR_44100, (2 << 6), ADC2DAC_EN, 0, 256, aux_sdadc_callback}, /* AUX */
  33. {MIC_CHANNEL_CFG, SPR_8000, (12 << 6), ADC2DAC_EN, 0, 256, bt_sdadc_callback}, /* BTMIC */
  34. {MIC_CHANNEL_CFG, SPR_8000, (12 << 6), ADC2DAC_EN, 0, 128, sdadc_dummy}, /* BTMIC test */
  35. {MIC_CHANNEL_CFG, SPR_16000, (10 << 6), ADC2DAC_EN, 0, 160, sdadc_dummy},
  36. {MIC_CHANNEL_CFG, SPR_16000, (12 << 6), ADC2DAC_EN, 0, 256, speaker_sdadc_callback},
  37. };
  38. void audio_path_init(u8 path_idx)
  39. {
  40. sdadc_cfg_t cfg;
  41. memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
  42. #if FUNC_AUX_EN
  43. if (path_idx == AUDIO_PATH_AUX) {
  44. cfg.channel = get_aux_channel_cfg();
  45. cfg.gain = ((u16)xcfg_cb.aux_anl_gain << 6);
  46. }
  47. #endif // FUNC_AUX_EN
  48. if (path_idx == AUDIO_PATH_BTMIC) {
  49. cfg.gain = ((u16)BT_ANL_GAIN << 6) | BT_DIG_GAIN;
  50. #if BT_AEC_EN || BT_ALC_EN
  51. if (xcfg_cb.bt_aec_en) {
  52. cfg.callback = bt_aec_process;
  53. }
  54. #if BT_ALC_EN
  55. else if (xcfg_cb.bt_alc_en) {
  56. cfg.callback = bt_alc_process;
  57. }
  58. #endif // BT_ALC_EN
  59. else {
  60. #if 1
  61. cfg.callback = bt_adc_process; //不过AEC及ALC,可以过近端降噪
  62. #else
  63. cfg.callback = bt_adc_process_fix; //修正关通话算法后,无声的问题,不打开的原因是不想占用公共区
  64. #endif
  65. }
  66. #endif // BT_AEC_EN
  67. if (bt_sco_is_msbc() || cfg_bt_sco_dnn_en) { //如果开了msbc或dnn,则采样率设为16k
  68. cfg.sample_rate = SPR_16000;
  69. }
  70. }
  71. if (path_idx == AUDIO_PATH_VA || path_idx == AUDIO_PATH_SPEAKER) {
  72. cfg.gain = ((u16)BT_ANL_GAIN << 6) | BT_DIG_GAIN;
  73. }
  74. sdadc_init(&cfg);
  75. if (path_idx == AUDIO_PATH_BTMIC) {
  76. if (!bt_sco_is_msbc() && cfg_bt_sco_dnn_en) { //dnn: 走窄带通话时,ADC为16K,DAC为8K
  77. dac_spr_set(SPR_8000);
  78. }
  79. }
  80. }
  81. void audio_path_start(u8 path_idx)
  82. {
  83. sdadc_cfg_t cfg;
  84. memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
  85. #if FUNC_AUX_EN
  86. if (path_idx == AUDIO_PATH_AUX) {
  87. cfg.channel = get_aux_channel_cfg();
  88. }
  89. #endif // FUNC_AUX_EN
  90. sdadc_start(cfg.channel);
  91. }
  92. void audio_path_exit(u8 path_idx)
  93. {
  94. sdadc_cfg_t cfg;
  95. memcpy(&cfg, &rec_cfg_tbl[path_idx], sizeof(sdadc_cfg_t));
  96. #if FUNC_AUX_EN
  97. if (path_idx == AUDIO_PATH_AUX) {
  98. cfg.channel = get_aux_channel_cfg();
  99. }
  100. #endif // FUNC_AUX_EN
  101. sdadc_exit(cfg.channel);
  102. if (!sys_cb.anc_start) {
  103. adpll_spr_set(DAC_OUT_SPR);
  104. }
  105. }
  106. AT(.rodata.aux)
  107. const u8 cfg_aux_ch_tbl[4] = {
  108. 0, CH_AUXL_PB3, CH_AUXL_PE7, CH_AUXL_PA7,
  109. };
  110. u8 get_aux_channel_cfg(void)
  111. {
  112. #if FUNC_AUX_EN
  113. return cfg_aux_ch_tbl[xcfg_cb.auxl_sel]; //工具配置AUX通路
  114. #else
  115. return 0;
  116. #endif // FUNC_AUX_EN
  117. }