bsp_karaok.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #include "include.h"
  2. #if SYS_KARAOK_EN
  3. karaok_vol_t karaok_vol;
  4. #if SYS_ECHO_EN
  5. static s16 echo_cache_buf[0x2800] AT(.echo_buf);
  6. #if BT_HFP_CALL_KARAOK_EN
  7. static s16 bt_echo_cache_buf[0x2400] AT(.sco_echo_buf);
  8. #endif
  9. #endif // SYS_ECHO_EN
  10. #if SYS_MAGIC_VOICE_EN
  11. static s16 buf_1[2048] AT(.mav_cache);
  12. static s16 buf_2[128] AT(.mav_cache);
  13. static s16 buf_3[128] AT(.mav_cache);
  14. static s16 buf_4[512] AT(.mav_cache);
  15. static s16 buf_5[64] AT(.mav_cache);
  16. static s16 buf_6[64] AT(.mav_cache);
  17. static char buf_7[512] AT(.mav_cache);
  18. #if BT_HFP_CALL_KARAOK_EN
  19. static s16 buf_11[2048] AT(.sco_mav_cache);
  20. static s16 buf_21[128] AT(.sco_mav_cache);
  21. static s16 buf_31[128] AT(.sco_mav_cache);
  22. static s16 buf_41[512] AT(.sco_mav_cache);
  23. static s16 buf_51[64] AT(.sco_mav_cache);
  24. static s16 buf_61[64] AT(.sco_mav_cache);
  25. static char buf_71[512] AT(.sco_mav_cache);
  26. #endif
  27. #endif
  28. AT(.text.bsp.dac.table)
  29. const u16 karaok_dvol_table_12[12 + 1] = {
  30. DIG_N60DB, DIG_N43DB, DIG_N32DB, DIG_N26DB, DIG_N22DB, DIG_N18DB, DIG_N14DB, DIG_N12DB, DIG_N10DB,
  31. DIG_N6DB, DIG_N4DB, DIG_N2DB, DIG_N0DB,
  32. };
  33. AT(.text.bsp.dac.table)
  34. const u16 karaok_dvol_table_16[16 + 1] = {
  35. DIG_N60DB, DIG_N43DB, DIG_N32DB, DIG_N26DB, DIG_N24DB, DIG_N22DB, DIG_N20DB, DIG_N18DB, DIG_N16DB,
  36. DIG_N14DB, DIG_N12DB, DIG_N10DB, DIG_N8DB, DIG_N6DB, DIG_N4DB, DIG_N2DB, DIG_N0DB,
  37. };
  38. //低通滤波器参数, 3KHz截至频率
  39. const s32 echo_filter_coef[2][8] = {
  40. { //44.1KHz 3K
  41. //分子
  42. FIX_BIT(0.006644395788557),
  43. FIX_BIT(0.019933187365671),
  44. FIX_BIT(0.019933187365671),
  45. FIX_BIT(0.006644395788557),
  46. //分母
  47. FIX_BIT(1.000000000000000),
  48. FIX_BIT(-2.150944711976045),
  49. FIX_BIT(1.626545208636282),
  50. FIX_BIT(-0.422445330351779),
  51. }, {//48KHz
  52. //分子
  53. FIX_BIT(0.005300409794526),
  54. FIX_BIT(0.015901229383577),
  55. FIX_BIT(0.015901229383577),
  56. FIX_BIT(0.005300409794526),
  57. //分母
  58. FIX_BIT(1.000000000000000),
  59. FIX_BIT(-2.219168618311665),
  60. FIX_BIT(1.715117830033402),
  61. FIX_BIT(-0.453545933365530),
  62. }
  63. };
  64. ////低通滤波器参数, 4KHz截至频率
  65. //const s32 echo_filter_coef[2][8] = {
  66. // { //44.1KHz 4K
  67. // //分子
  68. // FIX_BIT(0.014099708769044),
  69. // FIX_BIT(0.042299126307133),
  70. // FIX_BIT(0.042299126307133),
  71. // FIX_BIT(0.014099708769044),
  72. // //分母
  73. // FIX_BIT(1.000000000000000),
  74. // FIX_BIT(-1.873027248422390),
  75. // FIX_BIT(1.300326954651049),
  76. // FIX_BIT(-0.314502036076304),
  77. // }, {//48KHz
  78. // //分子
  79. // FIX_BIT(0.011324865405187),
  80. // FIX_BIT(0.033974596215561),
  81. // FIX_BIT(0.033974596215561),
  82. // FIX_BIT(0.011324865405187),
  83. // //分母
  84. // FIX_BIT(1.000000000000000),
  85. // FIX_BIT(-1.962990915244728),
  86. // FIX_BIT(1.400000000000000),
  87. // FIX_BIT(-0.346410161513776),
  88. // }
  89. //};
  90. #if SYS_ECHO_EN
  91. //混响间隔:(echo_delay[0, 87] * 128 / 44100)ms
  92. const u16 echo_delay_12[12 + 1] = {
  93. 0,
  94. 30, 35, 38, 40,
  95. 45, 48, 55, 60,
  96. 75, 80, 85, 87,
  97. };
  98. //混响间隔:(echo_delay[0, 87] * 128 / 44100)ms
  99. const u16 echo_delay_16[16 + 1] = {
  100. 0,
  101. 3, 5, 10, 15,
  102. 20, 25, 40, 48,
  103. 55, 60, 65, 70,
  104. 74, 78, 83, 87,
  105. };
  106. #endif
  107. #if SYS_MAGIC_VOICE_EN
  108. mav_cfg_t mav_cfg = {
  109. .res[0] = 0,
  110. .res[1] = 0,
  111. .buf_1 = buf_1,
  112. .buf_2 = buf_2,
  113. .buf_3 = buf_3,
  114. .buf_4 = buf_4,
  115. .buf_5 = buf_5,
  116. .buf_6 = buf_6,
  117. .buf_7 = buf_7,
  118. };
  119. #endif
  120. kara_cfg_t kara_cfg = {
  121. .lp_coef = &echo_filter_coef,
  122. #if SYS_MAGIC_VOICE_EN
  123. .mav = &mav_cfg,
  124. #endif
  125. .res[0] = 0,
  126. .res[1] = 0,
  127. .echo_en = SYS_ECHO_EN,
  128. .hifi4_echo_en = HIFI4_ECHO_EN,
  129. .reverb_en = HIFI4_REVERB_EN,
  130. .mic_dnr = MIC_DNR_EN,
  131. .rec_en = KARAOK_REC_EN,
  132. .magic_voice = SYS_MAGIC_VOICE_EN,
  133. .howling_en = SYS_HOWLING_EN,
  134. .hifi_howling_en = HIFI4_HOWLING_EN,
  135. .pitch_shift = HIFI4_PITCH_SHIFT_EN,
  136. .bass_treble = HIFI4_BASS_TREBLE_EN,
  137. .drc_en = HIFI4_MIC_DRC_EN,
  138. };
  139. #if SYS_ECHO_EN
  140. AT(.text.bsp.karaok)
  141. void bsp_echo_set_level(void)
  142. {
  143. echo_set_level(karaok_vol.echo_level_gain[sys_cb.echo_level]);
  144. }
  145. AT(.text.bsp.karaok)
  146. void bsp_echo_set_delay(void)
  147. {
  148. echo_set_delay(karaok_vol.echo_delay[sys_cb.echo_delay]);
  149. }
  150. #endif
  151. AT(.text.bsp.karaok)
  152. void bsp_karaok_set_mic_volume(void)
  153. {
  154. karaok_set_mic_volume(karaok_vol.micvol_table[sys_cb.mic_vol]);
  155. }
  156. AT(.text.bsp.karaok)
  157. void bsp_karaok_set_music_volume(void)
  158. {
  159. karaok_set_music_volume(karaok_vol.dvol_table[sys_cb.music_vol]);
  160. }
  161. void bsp_karaok_music_vol_adjust(u8 up)
  162. {
  163. if (up) {
  164. if (sys_cb.music_vol < USER_KEY_KNOB_LEVEL -1) {
  165. sys_cb.music_vol++;
  166. } else {
  167. sys_cb.music_vol = USER_KEY_KNOB_LEVEL -1;
  168. }
  169. } else {
  170. if (sys_cb.music_vol > 0) {
  171. sys_cb.music_vol--;
  172. }
  173. }
  174. printf("karaok music_vol = %d\n", sys_cb.music_vol);
  175. bsp_karaok_set_music_volume();
  176. }
  177. void bsp_karaok_mic_vol_adjust(u8 up)
  178. {
  179. if (up) {
  180. if (sys_cb.mic_vol < USER_KEY_KNOB_LEVEL -1) {
  181. sys_cb.mic_vol++;
  182. } else {
  183. sys_cb.mic_vol = USER_KEY_KNOB_LEVEL -1;
  184. }
  185. } else {
  186. if (sys_cb.mic_vol > 0) {
  187. sys_cb.mic_vol--;
  188. }
  189. }
  190. printf("karaok mic_vol = %d\n", sys_cb.mic_vol);
  191. bsp_karaok_set_mic_volume();
  192. }
  193. AT(.text.bsp.karaok)
  194. void bsp_karaok_echo_reset_buf(u8 func)
  195. {
  196. if (func == FUNC_NULL) {
  197. return;
  198. }
  199. #if SYS_ECHO_EN
  200. if (func == FUNC_BT || func == FUNC_BTHID || BT_BACKSTAGE_EN) {
  201. #if BT_HFP_CALL_KARAOK_EN
  202. if (sys_cb.hfp_karaok_en) {
  203. if (kara_cfg.echo_cache == bt_echo_cache_buf) {
  204. return;
  205. }
  206. kara_cfg.echo_cache = bt_echo_cache_buf;
  207. kara_cfg.echo_cache_size = sizeof(bt_echo_cache_buf) / 2;
  208. } else
  209. #endif
  210. {
  211. if (kara_cfg.echo_cache == echo_cache_buf) {
  212. return;
  213. }
  214. kara_cfg.echo_cache = echo_cache_buf;
  215. kara_cfg.echo_cache_size = sizeof(echo_cache_buf) / 2;
  216. }
  217. } else {
  218. if (kara_cfg.echo_cache == echo_cache_buf) {
  219. return;
  220. }
  221. kara_cfg.echo_cache = echo_cache_buf;
  222. kara_cfg.echo_cache_size = sizeof(echo_cache_buf) / 2;
  223. }
  224. #endif
  225. karaok_reset_buf(&kara_cfg);
  226. #if SYS_ECHO_EN
  227. echo_set_delay(karaok_vol.echo_delay[sys_cb.echo_delay]);
  228. echo_set_level(karaok_vol.echo_level_gain[sys_cb.echo_level]);
  229. #endif
  230. }
  231. AT(.text.bsp.karaok)
  232. void bsp_karaok_init(u8 path, u8 func)
  233. {
  234. // printf("%s %d\n", __func__, func);
  235. if (sys_cb.karaok_init) {
  236. return;
  237. }
  238. if (func == FUNC_NULL) {
  239. return;
  240. }
  241. #if SYS_ECHO_EN
  242. kara_cfg.echo_cache = echo_cache_buf;
  243. kara_cfg.echo_cache_size = sizeof(echo_cache_buf) / 2;
  244. kara_cfg.echo_cache1 = NULL;
  245. kara_cfg.echo_cache_size1 = 0;
  246. #endif
  247. if (func == FUNC_BT || func == FUNC_BTHID) {
  248. #if SYS_MAGIC_VOICE_EN
  249. #if BT_HFP_CALL_KARAOK_EN
  250. if (sys_cb.hfp_karaok_en) {
  251. mav_cfg.buf_1 = buf_11;
  252. mav_cfg.buf_2 = buf_21;
  253. mav_cfg.buf_3 = buf_31;
  254. mav_cfg.buf_4 = buf_41;
  255. mav_cfg.buf_5 = buf_51;
  256. mav_cfg.buf_6 = buf_61;
  257. mav_cfg.buf_7 = buf_71;
  258. } else
  259. #endif
  260. {
  261. mav_cfg.buf_1 = buf_1;
  262. mav_cfg.buf_2 = buf_2;
  263. mav_cfg.buf_3 = buf_3;
  264. mav_cfg.buf_4 = buf_4;
  265. mav_cfg.buf_5 = buf_5;
  266. mav_cfg.buf_6 = buf_6;
  267. mav_cfg.buf_7 = buf_7;
  268. }
  269. #endif
  270. #if BT_HFP_CALL_KARAOK_EN && SYS_ECHO_EN
  271. if (sys_cb.hfp_karaok_en) {
  272. kara_cfg.echo_cache = bt_echo_cache_buf;
  273. kara_cfg.echo_cache_size = sizeof(bt_echo_cache_buf) / 2;
  274. }
  275. #endif
  276. }
  277. if (kara_cfg.rec_en) {
  278. sys_clk_req(INDEX_KARAOK, SYS_160M);
  279. } else {
  280. sys_clk_req(INDEX_KARAOK, SYS_120M);
  281. }
  282. sys_cb.echo_delay = SYS_ECHO_DELAY;
  283. #if (USER_KEY_KNOB_LEVEL == 12)
  284. #if SYS_ECHO_EN
  285. karaok_vol.echo_delay = echo_delay_12;
  286. karaok_vol.echo_level_gain = echo_level_gain_12;
  287. #endif // SYS_ECHO_EN
  288. karaok_vol.dvol_table = karaok_dvol_table_12;
  289. karaok_vol.micvol_table = karaok_dvol_table_12;
  290. #elif (USER_KEY_KNOB_LEVEL == 16)
  291. #if SYS_ECHO_EN
  292. karaok_vol.echo_delay = echo_delay_16;
  293. karaok_vol.echo_level_gain = echo_level_gain_16;
  294. #endif // SYS_ECHO_EN
  295. karaok_vol.dvol_table = karaok_dvol_table_16;
  296. karaok_vol.micvol_table = karaok_dvol_table_16;
  297. #endif
  298. audio_path_init(path);
  299. karaok_init(&kara_cfg);
  300. plugin_karaok_init();
  301. karaok_bufmode(SYS_KARAOK_BUFMODE); //使用降采样来加倍混响深度
  302. #if HIFI4_MIC_DRC_EN
  303. hifi4_drc_set_param_by_res(RES_BUF_EQ_KARA_MIC0_DRC, RES_LEN_EQ_KARA_MIC0_DRC, 0);
  304. hifi4_drc_set_param_by_res(RES_BUF_EQ_KARA_MIC1_DRC, RES_LEN_EQ_KARA_MIC1_DRC, 1);
  305. #endif
  306. #if MIC_DNR_EN
  307. mic_dnr_init(2, 500, 100, 1000); //10ms检测一次 //连续超过2次大于500就认为有声,连续超过100次低于 1000 就认为无声
  308. #endif
  309. //karaok_enable_mic_first(65535/10); //(数字音量最大值为0xFFFF_65535)
  310. //mic_first_init(2, 700, 30, 1200); //连续超过2次大于700 就开启mic_first,连续超过 100 次低于 1200 就关闭mic_first
  311. //karaok_mic_first_music_vol_fade_enable(100, 1000); //淡入步进100, 淡出步进1000. (数字音量最大值为0xFFFF_65535)
  312. #if SYS_ECHO_EN
  313. echo_set_delay(karaok_vol.echo_delay[sys_cb.echo_delay]);
  314. echo_set_level(karaok_vol.echo_level_gain[sys_cb.echo_level]);
  315. #endif
  316. karaok_set_mic_volume(karaok_vol.micvol_table[sys_cb.mic_vol]);
  317. karaok_set_music_volume(karaok_vol.dvol_table[sys_cb.music_vol]);
  318. #if MIC_DETECT_EN
  319. if (!dev_is_online(DEV_MIC)) {
  320. karaok_mic_mute();
  321. }
  322. #endif
  323. audio_path_start(path);
  324. #if SYS_MAGIC_VOICE_EN
  325. karaok_set_mav(sys_cb.magic_type, sys_cb.magic_level);
  326. #endif
  327. sys_cb.karaok_init = 1;
  328. }
  329. AT(.text.bsp.karaok)
  330. void bsp_karaok_exit(u8 path)
  331. {
  332. if (sys_cb.karaok_init == 0) {
  333. return;
  334. }
  335. karaok_exit();
  336. audio_path_exit(path);
  337. sys_clk_free(INDEX_KARAOK);
  338. sys_cb.karaok_init = 0;
  339. }
  340. #if KARAOK_REC_EN
  341. AT(.text.bsp.karaok)
  342. void bsp_karaok_rec_init(void)
  343. {
  344. rec_src.spr = SPR_44100;
  345. if (DACDIGCON0 & BIT(1)) {
  346. rec_src.spr = SPR_48000;
  347. }
  348. rec_src.nchannel = 0x01;
  349. rec_src.source_start = karaok_rec_start;
  350. rec_src.source_stop = karaok_rec_stop;
  351. karaok_rec_init(rec_cb.src->nchannel & 0x03);
  352. }
  353. AT(.text.bsp.karaok)
  354. void bsp_karaok_rec_exit(void)
  355. {
  356. // bsp_karaok_echo_reset_buf(func_cb.sta);
  357. }
  358. #endif
  359. #endif
  360. bool bt_sco_karaok_is_en(u8 enter)
  361. {
  362. #if SYS_KARAOK_EN
  363. if (enter) {
  364. bsp_karaok_exit(AUDIO_PATH_KARAOK);
  365. sys_cb.hfp_karaok_en = BT_HFP_CALL_KARAOK_EN; //通话是否支持KARAOK
  366. plugin_hfp_karaok_configure();
  367. if (sys_cb.hfp_karaok_en) {
  368. bsp_karaok_init(AUDIO_PATH_BTMIC, FUNC_BT);
  369. kara_sco_start();
  370. return true;
  371. } else {
  372. return false;
  373. }
  374. } else {
  375. if (sys_cb.hfp_karaok_en) {
  376. kara_sco_stop();
  377. bsp_karaok_exit(AUDIO_PATH_BTMIC);
  378. sys_cb.hfp_karaok_en = 0;
  379. return true;
  380. } else {
  381. return false;
  382. }
  383. }
  384. #else
  385. return false;
  386. #endif
  387. }