bsp_effect.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872
  1. /*****************************************************************************
  2. * Copyright (c) 2023 Shenzhen Bluetrum Technology Co.,Ltd. All rights reserved.
  3. * File : bsp_effect.c
  4. * Function : 音乐音效模块
  5. * History :
  6. * Created by yutao on 2023-12-1.
  7. *****************************************************************************/
  8. #include "include.h"
  9. #if HLW_UI
  10. #include "hlw_func.h"
  11. #endif // HLW_UI
  12. #if BT_MUSIC_EFFECT_EN
  13. #define TRACE_EN 0
  14. #define DUMP_EN 0
  15. #if TRACE_EN
  16. #define TRACE(...) printf(__VA_ARGS__)
  17. #else
  18. #define TRACE(...)
  19. #endif
  20. void load_code_audio_comm(void);
  21. void huart_wait_txdone(void);
  22. int music_effect_set_state(MUSIC_EFFECT_ALG alg, u8 state);
  23. void bsp_set_effect_by_abt(void);
  24. void alg_user_effect_process(u8 *buf, u32 samples, u32 nch, u32 is_24bit, u32 pcm_info);
  25. void alg_user_effect_init(void);
  26. void music_dbb_audio_start_do(u8 is_def_level);
  27. void music_dbb_audio_stop_do(void);
  28. void music_spatial_audio_param_init(void);
  29. void music_spatial_audio_start_do(void);
  30. void music_spatial_audio_stop_do(void);
  31. void music_vbass_audio_param_init(void);
  32. void music_dyeq_audio_param_init(void);
  33. void music_dyeq_audio_start_do(void);
  34. void music_dyeq_audio_stop_do(void);
  35. void music_xdrc_audio_param_init(void);
  36. void music_xdrc_audio_start_do(void);
  37. void music_xdrc_audio_stop_do(void);
  38. void music_hrtf_rt_param_init(void);
  39. void music_hrtf_rt_start_do(void);
  40. void music_hrtf_rt_stop_do(void);
  41. void vbass_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits);
  42. void dynamic_eq_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits);
  43. void dynamic_eq_clear_cache(void);
  44. void xdrc_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits);
  45. void xdrc_clear_cache(void);
  46. extern const u16 dac_dvol_tbl_db[61];
  47. extern const u8 *dac_dvol_table;
  48. typedef struct {
  49. //音效状态机
  50. volatile u16 music_effect_state;
  51. u16 music_effect_state_set;
  52. volatile u8 process_flag;
  53. volatile u8 audio_comm_init_flag;
  54. //主频
  55. u8 sys_clk;
  56. //主线程process flag
  57. u32 func_process_flag;
  58. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  59. u8 spatial_audio_eq_state;
  60. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  61. #if BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN || BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  62. u8 spatial_audio_fix_eq;
  63. #endif
  64. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  65. volatile u8 hrtf_rt_angle_update_flag;
  66. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  67. u8 vol_direct_set_flag; //开始播放直接设置音量标志
  68. } music_effect_t;
  69. music_effect_t music_effect;
  70. #if DUMP_EN
  71. u32 music_dump_buffer[256 * 4] AT(.music_exbuff.dump);
  72. u32 music_tx_buffer[256 * 4] AT(.music_exbuff.dump);
  73. #endif // DUMP_EN
  74. //状态位
  75. #define DBB_STA_BIT BIT(MUSIC_EFFECT_DBB)
  76. #define SPATIAL_AUDIO_STA_BIT BIT(MUSIC_EFFECT_SPATIAL_AUDIO)
  77. #define VBASS_STA_BIT BIT(MUSIC_EFFECT_VBASS)
  78. #define DYEQ_STA_BIT BIT(MUSIC_EFFECT_DYEQ)
  79. #define XDRC_STA_BIT BIT(MUSIC_EFFECT_XDRC)
  80. #define ABP_STA_BIT BIT(MUSIC_EFFECT_ABP)
  81. #define HRTF_RT_STA_BIT BIT(MUSIC_EFFECT_HRTF_RT)
  82. #define USER_ALG_STA_BIT BIT(MUSIC_EFFECT_ALG_USER)
  83. #define DBB_EN(x) ((x) & (DBB_STA_BIT))
  84. #define SPATIAL_AUDIO_EN(x) ((x) & (SPATIAL_AUDIO_STA_BIT))
  85. #define VBASS_EN(x) ((x) & (VBASS_STA_BIT))
  86. #define DYEQ_EN(x) ((x) & (DYEQ_STA_BIT))
  87. #define XDRC_EN(x) ((x) & (XDRC_STA_BIT))
  88. #define ABP_STA_EN(x) ((x) & (ABP_STA_BIT))
  89. #define HRTF_RT_STA_EN(x) ((x) & (HRTF_RT_STA_BIT))
  90. #define USER_ALG_EN(x) ((x) & (USER_ALG_STA_BIT))
  91. //主频设置
  92. #define DBB_SYSCLK_SEL SYS_24M
  93. #define SPATIAL_AU_SYSCLK_SEL SYS_100M
  94. #define VBASS_SYSCLK_SEL SYS_48M
  95. #define DYEQ_SYSCLK_SEL (BT_MUSIC_EFFECT_DYEQ_VBASS_EN ? SYS_100M : SYS_60M)
  96. #define XDRC_SYSCLK_SEL SYS_100M
  97. #define ABP_SYSCLK_SEL SYS_48M
  98. #define HRTF_RT_SYSCLK_SEL SYS_160M
  99. #define USER_ALG_SYSCLK_SEL SYS_48M
  100. //主线程process flag bit
  101. #define PROC_FLAG_ALG_REINIT BIT(0)
  102. #define PROC_FLAG_ALG_SUSPEND BIT(1)
  103. #define EFFECT_COMM_START_CHECK() if (sco_is_connected()) {return;}
  104. #define EFFECT_COMM_STOP_CHECK() if (sco_is_connected()) {return;}
  105. ///音效算法处理函数
  106. AT(.com_text.codecs.pcm)
  107. void msc_pcm_effect_process(u8 *buf, u32 samples, u32 nch, u32 is_24bit, u32 pcm_info)
  108. {
  109. music_effect_t* cb = &music_effect;
  110. u16 state = cb->music_effect_state;
  111. // if (pcm_info & BIT(0)) {
  112. // //first frame
  113. // }
  114. #if DUMP_EN
  115. if (is_24bit) {
  116. s32* in = (s32*)buf;
  117. s32* out = (s32*)music_dump_buffer;
  118. for (int i = 0; i < samples; i++) {
  119. out[4 * i + 0] = in[2 * i + 0];
  120. out[4 * i + 1] = in[2 * i + 1];
  121. }
  122. } else {
  123. s16* in = (s16*)buf;
  124. s16* out = (s16*)music_dump_buffer;
  125. for (int i = 0; i < samples; i++) {
  126. out[4 * i + 0] = in[2 * i + 0];
  127. out[4 * i + 1] = in[2 * i + 1];
  128. }
  129. }
  130. #endif // DUMP_EN
  131. if (state) {
  132. cb->process_flag = 1;
  133. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  134. if (SPATIAL_AUDIO_EN(state)) {
  135. #if BT_TWS_EN
  136. u32 ch = sys_cb.tws_left_channel ? 0 : 1; //in_nch: 0->L, 1->R, 2->stereo
  137. #else
  138. u32 ch = 2;
  139. #endif // BT_TWS_EN
  140. if (pcm_info & BIT(0)) {
  141. v3d_clear_cache();
  142. #if BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  143. v3d_delay_buf_clear_cache();
  144. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  145. }
  146. v3d_frame_process((u32*)buf, samples, ch, is_24bit);
  147. }
  148. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  149. #if BT_MUSIC_EFFECT_TWS_ALG_EN
  150. u32 ch_idx = sys_cb.tws_left_channel ? 0 : 1; //in_nch: 0=L, 1=R, 2=(L+R)/2
  151. if (!bt_tws_is_connected()) {
  152. ch_idx = 2;
  153. }
  154. #if BT_MUSIC_EFFECT_VBASS_EN
  155. if (VBASS_EN(state)) { //只跑TWS单声道
  156. vbass_frame_process((u32*)buf, samples, ch_idx, is_24bit);
  157. }
  158. #endif // BT_MUSIC_EFFECT_VBASS_EN
  159. #if BT_MUSIC_EFFECT_DYEQ_EN
  160. if (DYEQ_EN(state)) { //只跑TWS单声道
  161. if (pcm_info & BIT(0)) {
  162. dynamic_eq_clear_cache();
  163. }
  164. dynamic_eq_frame_process((u32*)buf, samples, ch_idx, is_24bit);
  165. }
  166. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  167. #if BT_MUSIC_EFFECT_XDRC_EN
  168. if (XDRC_EN(state)) { //只跑TWS单声道
  169. if (pcm_info & BIT(0)) {
  170. xdrc_clear_cache();
  171. }
  172. xdrc_frame_process((u32*)buf, samples, ch_idx, is_24bit);
  173. }
  174. #endif // BT_MUSIC_EFFECT_XDRC_EN
  175. #endif // BT_MUSIC_EFFECT_TWS_ALG_EN
  176. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  177. if (HRTF_RT_STA_EN(state)) {
  178. hrtf_rt_audio_frame_process((u32*)buf, samples, 2, is_24bit);
  179. }
  180. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  181. #if BT_MUSIC_EFFECT_USER_EN
  182. if (USER_ALG_EN(state)) { //用户自定义的算法处理
  183. alg_user_effect_process(buf, samples, nch, is_24bit, pcm_info);
  184. }
  185. #endif // BT_MUSIC_EFFECT_USER_EN
  186. cb->process_flag = 0;
  187. }
  188. #if DUMP_EN
  189. if (is_24bit) {
  190. s32* in = (s32*)buf;
  191. s32* out = (s32*)music_dump_buffer;
  192. for (int i = 0; i < samples; i++) {
  193. out[4 * i + 2] = in[2 * i + 0];
  194. out[4 * i + 3] = in[2 * i + 1];
  195. }
  196. } else {
  197. s16* in = (s16*)buf;
  198. s16* out = (s16*)music_dump_buffer;
  199. for (int i = 0; i < samples; i++) {
  200. out[4 * i + 2] = in[2 * i + 0];
  201. out[4 * i + 3] = in[2 * i + 1];
  202. }
  203. }
  204. huart_wait_txdone();
  205. memcpy(music_tx_buffer, music_dump_buffer, samples * (is_24bit + 1) * 2 * 4);
  206. huart_tx(music_tx_buffer, samples * (is_24bit + 1) * 2 * 4);
  207. // huart_wait_txdone();
  208. // memcpy(music_dump_buffer, buf, samples * (is_24bit + 1) * 2 * 2);
  209. // huart_tx(music_dump_buffer, samples * (is_24bit + 1) * 2 * 2);
  210. #endif // DUMP_EN
  211. }
  212. ///音效部分公共接口
  213. //初始化
  214. void music_effect_init(void)
  215. {
  216. memset(&music_effect, 0, sizeof(music_effect_t));
  217. music_effect.sys_clk = SYS_24M;
  218. load_code_audio_comm();
  219. music_effect.audio_comm_init_flag = 1;
  220. #if ONEMORE_SPATIAL_AU
  221. //space audio init
  222. if(onemore_get_space_3d_effect_mode())
  223. {
  224. music_effect.music_effect_state_set |= SPATIAL_AUDIO_STA_BIT;
  225. }
  226. #endif // ONEMORE_SPATIAL_AU
  227. }
  228. #if ONEMORE_SPATIAL_AU
  229. //space audio open close
  230. void msc_effect_open_close_handle(u8 open_close)
  231. {
  232. printf("msc_effect_open_close_handle open_close %d\n", open_close);
  233. if(open_close)
  234. {
  235. music_spatial_audio_start();
  236. }
  237. else
  238. {
  239. music_spatial_audio_stop();
  240. }
  241. }
  242. #endif // ONEMORE_SPATIAL_AU
  243. //music线程开始播放
  244. void msc_pcm_out_start_callback(u8 codec)
  245. {
  246. TRACE("msc_pcm_out_start_callback %d\n", codec);
  247. music_effect_t* cb = &music_effect;
  248. if ((codec == 2) || (codec == 3)) { //LHDC LDAC
  249. cb->audio_comm_init_flag = 0;
  250. cb->music_effect_state &= DBB_STA_BIT; //只保留动态低音,其他关闭
  251. if (cb->music_effect_state_set) {
  252. cb->func_process_flag |= PROC_FLAG_ALG_SUSPEND;
  253. }
  254. } else if ((codec == 0) || (codec == 1)) { //AAC SBC
  255. if (cb->audio_comm_init_flag == 0) {
  256. cb->func_process_flag |= PROC_FLAG_ALG_REINIT;
  257. }
  258. #if BT_MUSIC_PAUSE_CLK_BACK_EN
  259. sys_clk_req(INDEX_KARAOK, cb->sys_clk);
  260. #endif // BT_MUSIC_PAUSE_CLK_BACK_EN
  261. }
  262. cb->vol_direct_set_flag = 1;
  263. }
  264. //music线程停止播放
  265. void msc_pcm_out_stop_callback(u8 codec)
  266. {
  267. #if BT_MUSIC_PAUSE_CLK_BACK_EN
  268. if ((codec == 0) || (codec == 1)) { //AAC SBC
  269. sys_clk_free(INDEX_KARAOK);
  270. }
  271. #endif // BT_MUSIC_PAUSE_CLK_BACK_EN
  272. TRACE("msc_pcm_out_stop_callback\n");
  273. }
  274. //进入通话
  275. void music_effect_sco_audio_init_do(void)
  276. {
  277. music_effect.audio_comm_init_flag = 0;
  278. music_effect_alg_suspend(MUSIC_EFFECT_SUSPEND_FOR_SCO);
  279. #if ABP_EN
  280. if (abp_is_playing()) {
  281. abp_stop();
  282. }
  283. #endif // ABP_EN
  284. }
  285. //退出通话
  286. void music_effect_sco_audio_exit_do(void)
  287. {
  288. music_effect_alg_reinit();
  289. music_effect_alg_restart();
  290. #if ABP_EN
  291. if (sys_cb.abp_mode) {
  292. bsp_abp_set_mode(sys_cb.abp_mode);
  293. }
  294. #endif // ABP_EN
  295. }
  296. //进出休眠
  297. void music_effect_sfunc_sleep_do(u8 enter)
  298. {
  299. if (enter == 0) { //退出休眠
  300. sys_clk_req(INDEX_KARAOK, music_effect.sys_clk);
  301. } else { //进入休眠
  302. }
  303. }
  304. //设置MUSIC EQ的总增益
  305. void music_effect_get_music_eq_total_gain(u32* gain)
  306. {
  307. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  308. if (SPATIAL_AUDIO_EN(music_effect.music_effect_state_set)) {
  309. s32 temp = (s32)*gain;
  310. s32 base_gain = (s32)(1.0f * (1 << 23));
  311. if (music_effect.spatial_audio_eq_state == 1) {
  312. base_gain = (s32)(1.3335f * (1 << 23)); //+2.5db
  313. } else if (music_effect.spatial_audio_eq_state == 2) {
  314. base_gain = (s32)(1.7782f * (1 << 23)); //+5db
  315. } else if (music_effect.spatial_audio_eq_state == 3) {
  316. base_gain = (s32)(2.3713f * (1 << 23)); //+7.5db
  317. } else if (music_effect.spatial_audio_eq_state == 4) {
  318. base_gain = (s32)(3.1622f * (1 << 23)); //+10db
  319. }
  320. // printf("base_gain: %08x\n", base_gain);
  321. s64 res = (s64)__builtin_muls(temp, base_gain);
  322. *gain = (u32)(res >> 23);
  323. }
  324. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  325. }
  326. //重新初始化算法的软件部分
  327. void music_effect_alg_reinit(void)
  328. {
  329. if (bt_decode_is_lhdc() || bt_decode_is_ldac()) {
  330. return;
  331. }
  332. if (music_effect.audio_comm_init_flag == 0) {
  333. load_code_audio_comm();
  334. music_effect.audio_comm_init_flag = 1;
  335. }
  336. printf("music_effect_alg_reinit 111 state %d\n", music_effect.music_effect_state_set);
  337. if (music_effect.music_effect_state_set == 0) {
  338. return;
  339. }
  340. printf("music_effect_alg_reinit 111\n");
  341. #if ASR_EN
  342. if (sys_cb.asr_enable) {
  343. bsp_asr_stop();
  344. sys_cb.asr_enable = 0;
  345. }
  346. #endif
  347. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  348. if (SPATIAL_AUDIO_EN(music_effect.music_effect_state_set)) {
  349. music_spatial_audio_param_init();
  350. }
  351. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  352. #if BT_MUSIC_EFFECT_VBASS_EN
  353. if (VBASS_EN(music_effect.music_effect_state_set)) {
  354. music_vbass_audio_param_init();
  355. }
  356. #endif // BT_MUSIC_EFFECT_VBASS_EN
  357. #if BT_MUSIC_EFFECT_DYEQ_EN
  358. if (DYEQ_EN(music_effect.music_effect_state_set)) {
  359. music_dyeq_audio_param_init();
  360. }
  361. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  362. #if BT_MUSIC_EFFECT_XDRC_EN
  363. if (XDRC_EN(music_effect.music_effect_state_set)) {
  364. music_xdrc_audio_param_init();
  365. }
  366. #endif // BT_MUSIC_EFFECT_XDRC_EN
  367. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  368. if (HRTF_RT_STA_EN(music_effect.music_effect_state_set)) {
  369. music_hrtf_rt_param_init();
  370. }
  371. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  372. #if BT_MUSIC_EFFECT_USER_EN
  373. if (USER_ALG_EN(music_effect.music_effect_state_set)) {
  374. alg_user_effect_init();
  375. }
  376. #endif // BT_MUSIC_EFFECT_USER_EN
  377. TRACE("%s\n", __func__);
  378. }
  379. //重启算法,打开算法硬件部分
  380. void music_effect_alg_restart(void)
  381. {
  382. if (music_effect.music_effect_state_set == 0) {
  383. return;
  384. }
  385. #if BT_MUSIC_EFFECT_DBB_EN
  386. if (DBB_EN(music_effect.music_effect_state_set)) {
  387. music_dbb_audio_start_do(0);
  388. music_effect_set_state(MUSIC_EFFECT_DBB, 1);
  389. }
  390. #endif // BT_MUSIC_EFFECT_DBB_EN
  391. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  392. if (SPATIAL_AUDIO_EN(music_effect.music_effect_state_set)) {
  393. music_spatial_audio_start_do();
  394. music_effect_set_state(MUSIC_EFFECT_SPATIAL_AUDIO, 1);
  395. }
  396. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  397. #if BT_MUSIC_EFFECT_VBASS_EN
  398. if (VBASS_EN(music_effect.music_effect_state_set)) {
  399. music_effect_set_state(MUSIC_EFFECT_VBASS, 1);
  400. }
  401. #endif // BT_MUSIC_EFFECT_VBASS_EN
  402. #if BT_MUSIC_EFFECT_DYEQ_EN
  403. if (DYEQ_EN(music_effect.music_effect_state_set)) {
  404. music_dyeq_audio_start_do();
  405. music_effect_set_state(MUSIC_EFFECT_DYEQ, 1);
  406. }
  407. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  408. #if BT_MUSIC_EFFECT_XDRC_EN
  409. if (XDRC_EN(music_effect.music_effect_state_set)) {
  410. music_xdrc_audio_start_do();
  411. music_effect_set_state(MUSIC_EFFECT_XDRC, 1);
  412. }
  413. #endif // BT_MUSIC_EFFECT_XDRC_EN
  414. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  415. if (HRTF_RT_STA_EN(music_effect.music_effect_state_set)) {
  416. music_hrtf_rt_start_do();
  417. music_effect_set_state(MUSIC_EFFECT_HRTF_RT, 1);
  418. }
  419. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  420. TRACE("%s sys_clk %d\n", __func__, music_effect.sys_clk);
  421. }
  422. //暂停算法,关闭算法硬件部分
  423. void music_effect_alg_suspend(u8 reason)
  424. {
  425. if (music_effect.music_effect_state_set == 0) {
  426. return;
  427. }
  428. #if BT_MUSIC_EFFECT_DBB_EN
  429. if (reason != MUSIC_EFFECT_SUSPEND_FOR_HIRES_DEC) {
  430. if (DBB_EN(music_effect.music_effect_state_set)) {
  431. music_effect_set_state(MUSIC_EFFECT_DBB, 0);
  432. music_dbb_audio_stop_do();
  433. }
  434. }
  435. #endif // BT_MUSIC_EFFECT_DBB_EN
  436. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  437. if (SPATIAL_AUDIO_EN(music_effect.music_effect_state_set)) {
  438. music_effect_set_state(MUSIC_EFFECT_SPATIAL_AUDIO, 0);
  439. music_spatial_audio_stop_do();
  440. }
  441. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  442. #if BT_MUSIC_EFFECT_VBASS_EN
  443. if (VBASS_EN(music_effect.music_effect_state_set)) {
  444. music_effect_set_state(MUSIC_EFFECT_VBASS, 0);
  445. }
  446. #endif // BT_MUSIC_EFFECT_VBASS_EN
  447. #if BT_MUSIC_EFFECT_DYEQ_EN
  448. if (DYEQ_EN(music_effect.music_effect_state_set)) {
  449. music_effect_set_state(MUSIC_EFFECT_DYEQ, 0);
  450. music_dyeq_audio_stop_do();
  451. }
  452. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  453. #if BT_MUSIC_EFFECT_XDRC_EN
  454. if (XDRC_EN(music_effect.music_effect_state_set)) {
  455. music_effect_set_state(MUSIC_EFFECT_XDRC, 0);
  456. music_xdrc_audio_stop_do();
  457. }
  458. #endif // BT_MUSIC_EFFECT_XDRC_EN
  459. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  460. if (HRTF_RT_STA_EN(music_effect.music_effect_state_set)) {
  461. music_effect_set_state(MUSIC_EFFECT_HRTF_RT, 0);
  462. music_hrtf_rt_stop_do();
  463. }
  464. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  465. TRACE("%s\n", __func__);
  466. }
  467. //主线程process
  468. AT(.com_text.effect)
  469. void music_effect_func_process(void)
  470. {
  471. music_effect_t* cb = &music_effect;
  472. if (cb->func_process_flag) {
  473. if (cb->func_process_flag & PROC_FLAG_ALG_REINIT) {
  474. cb->func_process_flag &= ~PROC_FLAG_ALG_REINIT;
  475. music_effect_alg_reinit();
  476. music_effect_alg_restart();
  477. }
  478. if (cb->func_process_flag & PROC_FLAG_ALG_SUSPEND) {
  479. cb->func_process_flag &= ~PROC_FLAG_ALG_SUSPEND;
  480. music_effect_alg_suspend(MUSIC_EFFECT_SUSPEND_FOR_HIRES_DEC);
  481. }
  482. }
  483. }
  484. //设置音效状态
  485. int music_effect_set_state(MUSIC_EFFECT_ALG alg, u8 state)
  486. {
  487. if (alg >= MUSIC_EFFECT_MAX) {
  488. return -1;
  489. }
  490. music_effect_t* cb = &music_effect;
  491. u8 delay_cnt = 0;
  492. u8 sys_clk_req_set = SYS_24M;
  493. u8 sys_clk_req_max = SYS_24M;
  494. u16 new_state = cb->music_effect_state;
  495. if (state) {
  496. if (new_state & BIT(alg)) {
  497. return -2;
  498. }
  499. new_state |= BIT(alg);
  500. } else {
  501. if ((new_state & BIT(alg)) == 0) {
  502. return -2;
  503. }
  504. new_state &= ~BIT(alg);
  505. }
  506. //调整音效的主频设置
  507. if (new_state) {
  508. for (int i = 0; i < MUSIC_EFFECT_MAX; i++) {
  509. if ((new_state & BIT(i)) == 0) {
  510. continue;
  511. }
  512. switch (i) {
  513. #if BT_MUSIC_EFFECT_DBB_EN
  514. case MUSIC_EFFECT_DBB:
  515. sys_clk_req_set = DBB_SYSCLK_SEL;
  516. break;
  517. #endif // BT_MUSIC_EFFECT_DBB_EN
  518. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  519. case MUSIC_EFFECT_SPATIAL_AUDIO:
  520. sys_clk_req_set = SPATIAL_AU_SYSCLK_SEL;
  521. break;
  522. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  523. #if BT_MUSIC_EFFECT_VBASS_EN
  524. case MUSIC_EFFECT_VBASS:
  525. sys_clk_req_set = VBASS_SYSCLK_SEL;
  526. break;
  527. #endif // BT_MUSIC_EFFECT_VBASS_EN
  528. #if BT_MUSIC_EFFECT_DYEQ_EN
  529. case MUSIC_EFFECT_DYEQ:
  530. sys_clk_req_set = DYEQ_SYSCLK_SEL;
  531. break;
  532. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  533. #if BT_MUSIC_EFFECT_XDRC_EN
  534. case MUSIC_EFFECT_XDRC:
  535. sys_clk_req_set = XDRC_SYSCLK_SEL;
  536. break;
  537. #endif // BT_MUSIC_EFFECT_XDRC_EN
  538. #if ABP_EN
  539. case MUSIC_EFFECT_ABP:
  540. sys_clk_req_set = ABP_SYSCLK_SEL;
  541. break;
  542. #endif // ABP_EN
  543. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  544. case MUSIC_EFFECT_HRTF_RT:
  545. sys_clk_req_set = HRTF_RT_SYSCLK_SEL;
  546. break;
  547. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  548. #if BT_MUSIC_EFFECT_USER_EN
  549. case MUSIC_EFFECT_ALG_USER:
  550. sys_clk_req_set = USER_ALG_SYSCLK_SEL;
  551. break;
  552. #endif // BT_MUSIC_EFFECT_USER_EN
  553. default:
  554. break;
  555. }
  556. if (sys_clk_req_max < sys_clk_req_set) {
  557. sys_clk_req_max = sys_clk_req_set;
  558. }
  559. }
  560. if (sys_clk_req_max > cb->sys_clk) {
  561. TRACE("music effect sys_clk_req %d %d\n", sys_clk_req_max, cb->sys_clk);
  562. sys_clk_req(INDEX_KARAOK, sys_clk_req_max);
  563. cb->sys_clk = sys_clk_req_max;
  564. }
  565. }
  566. //设置状态
  567. cb->music_effect_state = new_state;
  568. //释放音效的主频设置
  569. if (sys_clk_req_max < cb->sys_clk) {
  570. while (cb->process_flag) {
  571. WDT_CLR();
  572. delay_5ms(1);
  573. delay_cnt++;
  574. if (!codecs_pcm_is_start()) { //音乐播放结束就不等了
  575. break;
  576. }
  577. if (delay_cnt >= 200) {
  578. printf("music_effect_set_state time out!\n");
  579. return -3;
  580. }
  581. }
  582. if (new_state == 0) {
  583. sys_clk_free(INDEX_KARAOK);
  584. cb->sys_clk = SYS_24M;
  585. } else {
  586. TRACE("music effect sys_clk_req %d %d\n", sys_clk_req_max, cb->sys_clk);
  587. sys_clk_req(INDEX_KARAOK, sys_clk_req_max);
  588. cb->sys_clk = sys_clk_req_max;
  589. }
  590. }
  591. TRACE("music_effect_set_state 0x%x\n", new_state);
  592. return 0;
  593. }
  594. //获取音效是否已经设置打开(不包含因通话、提示音等暂停的状态)
  595. AT(.com_text.effect)
  596. bool music_effect_get_state(MUSIC_EFFECT_ALG alg)
  597. {
  598. music_effect_t* cb = &music_effect;
  599. return (bool)((cb->music_effect_state_set & BIT(alg)) > 0);
  600. }
  601. //获取音效实际的状态
  602. AT(.com_text.effect)
  603. bool music_effect_get_state_real(MUSIC_EFFECT_ALG alg)
  604. {
  605. music_effect_t* cb = &music_effect;
  606. return (bool)((cb->music_effect_state & BIT(alg)) > 0);
  607. }
  608. ///动态低音音效
  609. #if BT_MUSIC_EFFECT_DBB_EN
  610. #if BT_A2DP_VENDOR_AUDIO_EN //96K DAC
  611. const unsigned char dbb_coef_param[457] = {
  612. /*--------------------------------------------------------------------------------------------------
  613. [DAC Sample Rate] 88.2KHz/96KHz
  614. [Level Count] 11
  615. [Band Count] 1
  616. ----------------------------------------------------------------------------------------------------
  617. [Band] 1
  618. [Frequency] 50
  619. [Q] 0.75
  620. [Filter Type] peak
  621. [Gain of Level 0] -10
  622. [Gain of Level 1] -8
  623. [Gain of Level 2] -6
  624. [Gain of Level 3] -4
  625. [Gain of Level 4] -2
  626. [Gain of Level 5] 0
  627. [Gain of Level 6] 2
  628. [Gain of Level 7] 4
  629. [Gain of Level 8] 6
  630. [Gain of Level 9] 8
  631. [Gain of Level 10] 10
  632. --------------------------------------------------------------------------------------------------*/
  633. 0x04, 0x01, 0x0b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x90,
  634. 0x96, 0xfa, 0x07, 0x1b, 0x95, 0xf5, 0x07, 0x13, 0x26, 0xf0, 0x0f, 0xee, 0xd9, 0x0f, 0xf0, 0x56,
  635. 0xd4, 0x0f, 0xf8, 0xa2, 0xc0, 0xfb, 0x07, 0x35, 0x22, 0xf6, 0x07, 0x3e, 0xdd, 0xf1, 0x0f, 0xc3,
  636. 0x22, 0x0e, 0xf0, 0x2b, 0x1d, 0x0e, 0xf8, 0x8d, 0xdc, 0xfc, 0x07, 0x02, 0x8e, 0xf6, 0x07, 0xf6,
  637. 0x64, 0xf3, 0x0f, 0x0b, 0x9b, 0x0c, 0xf0, 0x72, 0x95, 0x0c, 0xf8, 0x0b, 0xee, 0xfd, 0x07, 0xe3,
  638. 0xd9, 0xf6, 0x07, 0x54, 0xc2, 0xf4, 0x0f, 0xad, 0x3d, 0x0b, 0xf0, 0x13, 0x38, 0x0b, 0xf8, 0xb0,
  639. 0xf8, 0xfe, 0x07, 0xd0, 0x06, 0xf7, 0x07, 0xe6, 0xf9, 0xf5, 0x0f, 0x1b, 0x06, 0x0a, 0xf0, 0x81,
  640. 0x00, 0x0a, 0xf8, 0x00, 0x00, 0x00, 0x08, 0x59, 0x15, 0xf7, 0x07, 0xbe, 0x0f, 0xf7, 0x0f, 0x43,
  641. 0xf0, 0x08, 0xf0, 0xa8, 0xea, 0x08, 0xf8, 0x72, 0x07, 0x01, 0x08, 0xa8, 0x05, 0xf7, 0x07, 0x7f,
  642. 0x07, 0xf8, 0x0f, 0x82, 0xf8, 0x07, 0xf0, 0xe7, 0xf2, 0x07, 0xf8, 0x7f, 0x12, 0x02, 0x08, 0x84,
  643. 0xd7, 0xf6, 0x07, 0x68, 0xe4, 0xf8, 0x0f, 0x99, 0x1b, 0x07, 0xf0, 0xfe, 0x15, 0x07, 0xf8, 0xae,
  644. 0x24, 0x03, 0x08, 0x4c, 0x8a, 0xf6, 0x07, 0x5f, 0xa9, 0xf9, 0x0f, 0xa2, 0x56, 0x06, 0xf0, 0x07,
  645. 0x51, 0x06, 0xf8, 0xa1, 0x41, 0x04, 0x08, 0xf5, 0x1c, 0xf6, 0x07, 0xfa, 0x58, 0xfa, 0x0f, 0x07,
  646. 0xa7, 0x05, 0xf0, 0x6b, 0xa1, 0x05, 0xf8, 0x1b, 0x6d, 0x05, 0x08, 0x0a, 0x8e, 0xf5, 0x07, 0x8a,
  647. 0xf5, 0xfa, 0x0f, 0x77, 0x0a, 0x05, 0xf0, 0xdc, 0x04, 0x05, 0xf8, 0x8f, 0x1c, 0xfa, 0x07, 0x40,
  648. 0xaa, 0xf4, 0x07, 0x2f, 0xc0, 0xee, 0x0f, 0xd2, 0x3f, 0x11, 0xf0, 0x32, 0x39, 0x11, 0xf8, 0xd5,
  649. 0x60, 0xfb, 0x07, 0xad, 0x43, 0xf5, 0x07, 0xe1, 0x9d, 0xf0, 0x0f, 0x20, 0x62, 0x0f, 0xf0, 0x80,
  650. 0x5b, 0x0f, 0xf8, 0xbd, 0x95, 0xfc, 0x07, 0xe3, 0xb8, 0xf5, 0x07, 0xfe, 0x47, 0xf2, 0x0f, 0x03,
  651. 0xb8, 0x0d, 0xf0, 0x62, 0xb1, 0x0d, 0xf8, 0x50, 0xbf, 0xfd, 0x07, 0x61, 0x0b, 0xf6, 0x07, 0x10,
  652. 0xc4, 0xf3, 0x0f, 0xf1, 0x3b, 0x0c, 0xf0, 0x50, 0x35, 0x0c, 0xf8, 0x77, 0xe1, 0xfe, 0x07, 0x33,
  653. 0x3c, 0xf6, 0x07, 0x08, 0x17, 0xf5, 0x0f, 0xf9, 0xe8, 0x0a, 0xf0, 0x57, 0xe2, 0x0a, 0xf8, 0x00,
  654. 0x00, 0x00, 0x08, 0xf5, 0x4b, 0xf6, 0x07, 0x52, 0x45, 0xf6, 0x0f, 0xaf, 0xba, 0x09, 0xf0, 0x0c,
  655. 0xb4, 0x09, 0xf8, 0xb1, 0x1e, 0x01, 0x08, 0xd5, 0x3a, 0xf6, 0x07, 0xe3, 0x52, 0xf7, 0x0f, 0x1e,
  656. 0xad, 0x08, 0xf0, 0x7b, 0xa6, 0x08, 0xf8, 0x52, 0x41, 0x02, 0x08, 0x93, 0x08, 0xf6, 0x07, 0x41,
  657. 0x43, 0xf8, 0x0f, 0xc0, 0xbc, 0x07, 0xf0, 0x1c, 0xb6, 0x07, 0xf8, 0xb9, 0x6b, 0x03, 0x08, 0x7e,
  658. 0xb4, 0xf5, 0x07, 0x93, 0x19, 0xf9, 0x0f, 0x6e, 0xe6, 0x06, 0xf0, 0xca, 0xdf, 0x06, 0xf8, 0xd8,
  659. 0xa1, 0x04, 0x08, 0x75, 0x3d, 0xf5, 0x07, 0xa9, 0xd8, 0xf9, 0x0f, 0x58, 0x27, 0x06, 0xf0, 0xb3,
  660. 0x20, 0x06, 0xf8, 0xca, 0xe7, 0x05, 0x08, 0xe2, 0xa1, 0xf4, 0x07, 0x07, 0x83, 0xfa, 0x0f, 0xfa,
  661. 0x7c, 0x05, 0xf0, 0x55, 0x76, 0x05, 0xf8, 0xb3, 0x7b,
  662. };
  663. #else //44.1K/48K DAC
  664. const u8 dbb_coef_param[453] = {
  665. /* 等级总数:11 */
  666. /* 滤波器类型:peak */
  667. /* 中心频率:50 */
  668. /* Q值:0.75 */
  669. /* 增益:-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, */
  670. 0x02, 0x0b, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0xcf, 0x37, 0xf5,
  671. 0x07, 0xc5, 0x3e, 0xeb, 0x07, 0x4c, 0x60, 0xe0, 0x0f, 0xb5, 0x9f, 0x1f, 0xf0, 0x6c, 0x89, 0x1f,
  672. 0xf8, 0xbe, 0x88, 0xf7, 0x07, 0xc9, 0x55, 0xec, 0x07, 0x39, 0xc8, 0xe3, 0x0f, 0xc8, 0x37, 0x1c,
  673. 0xf0, 0x7a, 0x21, 0x1c, 0xf8, 0x09, 0xbe, 0xf9, 0x07, 0xda, 0x2a, 0xed, 0x07, 0x90, 0xd2, 0xe6,
  674. 0x0f, 0x71, 0x2d, 0x19, 0xf0, 0x1f, 0x17, 0x19, 0xf8, 0xfc, 0xde, 0xfb, 0x07, 0x98, 0xc0, 0xed,
  675. 0x07, 0x3e, 0x89, 0xe9, 0x0f, 0xc3, 0x76, 0x16, 0xf0, 0x6d, 0x60, 0x16, 0xf8, 0xaa, 0xf2, 0xfd,
  676. 0x07, 0xd7, 0x18, 0xee, 0x07, 0x27, 0xf5, 0xeb, 0x0f, 0xda, 0x0a, 0x14, 0xf0, 0x80, 0xf4, 0x13,
  677. 0xf8, 0x00, 0x00, 0x00, 0x08, 0xa2, 0x34, 0xee, 0x07, 0x46, 0x1e, 0xee, 0x0f, 0xbb, 0xe1, 0x11,
  678. 0xf0, 0x5f, 0xcb, 0x11, 0xf8, 0xdd, 0x0d, 0x02, 0x08, 0x3e, 0x14, 0xee, 0x07, 0xbc, 0x0b, 0xf0,
  679. 0x0f, 0x45, 0xf4, 0x0f, 0xf0, 0xe6, 0xdd, 0x0f, 0xf8, 0x27, 0x23, 0x04, 0x08, 0x28, 0xb7, 0xed,
  680. 0x07, 0xed, 0xc3, 0xf1, 0x0f, 0x14, 0x3c, 0x0e, 0xf0, 0xb2, 0x25, 0x0e, 0xf8, 0xe0, 0x46, 0x06,
  681. 0x08, 0x13, 0x1c, 0xed, 0x07, 0x90, 0x4c, 0xf3, 0x0f, 0x71, 0xb3, 0x0c, 0xf0, 0x0e, 0x9d, 0x0c,
  682. 0xf8, 0x41, 0x80, 0x08, 0x08, 0xe4, 0x40, 0xec, 0x07, 0xbf, 0xaa, 0xf4, 0x0f, 0x42, 0x55, 0x0b,
  683. 0xf0, 0xdd, 0x3e, 0x0b, 0xf8, 0xcc, 0xd6, 0x0a, 0x08, 0xa7, 0x22, 0xeb, 0x07, 0x0c, 0xe3, 0xf5,
  684. 0x0f, 0xf5, 0x1c, 0x0a, 0xf0, 0x8e, 0x06, 0x0a, 0xf8, 0xc3, 0x45, 0xf4, 0x07, 0xd6, 0x6c, 0xe9,
  685. 0x07, 0x37, 0x98, 0xdd, 0x0f, 0xca, 0x67, 0x22, 0xf0, 0x68, 0x4d, 0x22, 0xf8, 0x84, 0xca, 0xf6,
  686. 0x07, 0xeb, 0x9b, 0xea, 0x07, 0x06, 0x4c, 0xe1, 0x0f, 0xfb, 0xb3, 0x1e, 0xf0, 0x92, 0x99, 0x1e,
  687. 0xf8, 0x4f, 0x31, 0xf9, 0x07, 0x57, 0x83, 0xeb, 0x07, 0x38, 0x9a, 0xe4, 0x0f, 0xc9, 0x65, 0x1b,
  688. 0xf0, 0x5b, 0x4b, 0x1b, 0xf8, 0x10, 0x82, 0xfb, 0x07, 0xf0, 0x25, 0xec, 0x07, 0x8d, 0x8d, 0xe7,
  689. 0x0f, 0x74, 0x72, 0x18, 0xf0, 0x01, 0x58, 0x18, 0xf8, 0x74, 0xc4, 0xfd, 0x07, 0xae, 0x85, 0xec,
  690. 0x07, 0xab, 0x2f, 0xea, 0x0f, 0x56, 0xd0, 0x15, 0xf0, 0xdf, 0xb5, 0x15, 0xf8, 0x00, 0x00, 0x00,
  691. 0x08, 0xb0, 0xa3, 0xec, 0x07, 0x35, 0x89, 0xec, 0x0f, 0xcc, 0x76, 0x13, 0xf0, 0x51, 0x5c, 0x13,
  692. 0xf8, 0x2c, 0x3c, 0x02, 0x08, 0x3d, 0x80, 0xec, 0x07, 0xeb, 0xa1, 0xee, 0x0f, 0x16, 0x5e, 0x11,
  693. 0xf0, 0x98, 0x43, 0x11, 0xf8, 0x77, 0x80, 0x04, 0x08, 0xc4, 0x1a, 0xec, 0x07, 0xb9, 0x80, 0xf0,
  694. 0x0f, 0x48, 0x7f, 0x0f, 0xf0, 0xc6, 0x64, 0x0f, 0xf8, 0x81, 0xd4, 0x06, 0x08, 0xd9, 0x71, 0xeb,
  695. 0x07, 0xd5, 0x2b, 0xf2, 0x0f, 0x2c, 0xd4, 0x0d, 0xf0, 0xa8, 0xb9, 0x0d, 0xf8, 0x22, 0x40, 0x09,
  696. 0x08, 0x2e, 0x83, 0xea, 0x07, 0xc9, 0xa8, 0xf3, 0x0f, 0x38, 0x57, 0x0c, 0xf0, 0xb1, 0x3c, 0x0c,
  697. 0xf8, 0x88, 0xcb, 0x0b, 0x08, 0x8d, 0x4b, 0xe9, 0x07, 0x8c, 0xfc, 0xf4, 0x0f, 0x75, 0x03, 0x0b,
  698. 0xf0, 0xec, 0xe8, 0x0a, 0xf8,
  699. };
  700. #endif
  701. void music_dbb_eq_index_init(u32* coef_l, u32* coef_r)
  702. {
  703. dbb_param_cb_t cb;
  704. cb.dbb_param = dbb_coef_param;
  705. cb.param_len = sizeof(dbb_coef_param);
  706. cb.coef_l = (s32*)coef_l;
  707. cb.coef_r = (s32*)coef_r;
  708. cb.dac_band_cnt = BT_MUSIC_EFFECT_DBB_BAND_CNT;
  709. music_dbb_init(&cb);
  710. }
  711. void music_dbb_audio_start_do(u8 is_def_level)
  712. {
  713. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  714. u8 bass_level = is_def_level ? BT_MUSIC_EFFECT_DBB_DEF_LEVEL : music_dbb_get_bass_level();
  715. if (vol_level > 60) {
  716. vol_level = 60;
  717. }
  718. music_dbb_update_param(vol_level, bass_level);
  719. music_set_eq_by_num(sys_cb.eq_mode);
  720. TRACE("%s\n", __func__);
  721. }
  722. void music_dbb_audio_stop_do(void)
  723. {
  724. music_dbb_stop();
  725. music_set_eq_by_num(sys_cb.eq_mode);
  726. TRACE("%s\n", __func__);
  727. }
  728. void music_dbb_audio_start(void)
  729. {
  730. EFFECT_COMM_START_CHECK();
  731. music_effect_t* cb = &music_effect;
  732. if (DBB_EN(cb->music_effect_state_set)) {
  733. return;
  734. }
  735. cb->music_effect_state_set |= DBB_STA_BIT;
  736. music_dbb_audio_start_do(1);
  737. music_effect_set_state(MUSIC_EFFECT_DBB, 1);
  738. TRACE("music_dbb_audio_start\n");
  739. }
  740. void music_dbb_audio_stop(void)
  741. {
  742. EFFECT_COMM_STOP_CHECK();
  743. music_effect_t* cb = &music_effect;
  744. if (DBB_EN(cb->music_effect_state_set) == 0) {
  745. return;
  746. }
  747. cb->music_effect_state_set &= ~DBB_STA_BIT;
  748. music_dbb_audio_stop_do();
  749. music_effect_set_state(MUSIC_EFFECT_DBB, 0);
  750. TRACE("music_dbb_audio_stop\n");
  751. }
  752. void music_dbb_audio_set_vol_do(u8 vol_level)
  753. {
  754. music_effect_t* cb = &music_effect;
  755. if ((DBB_EN(cb->music_effect_state_set) == 0) || (DBB_EN(cb->music_effect_state) == 0)) {
  756. return;
  757. }
  758. u8 bass_level = music_dbb_get_bass_level();
  759. int res = music_dbb_update_param(vol_level, bass_level);
  760. //0:不需要change eq,1:先change eq再调音量,2:先调音量再change eq
  761. if (res == 1) {
  762. music_set_eq_by_num(sys_cb.eq_mode);
  763. dac_vol_set(dac_dvol_tbl_db[vol_level]);
  764. } else if (res == 2) {
  765. dac_vol_set(dac_dvol_tbl_db[vol_level]);
  766. music_set_eq_by_num(sys_cb.eq_mode);
  767. } else {
  768. dac_vol_set(dac_dvol_tbl_db[vol_level]);
  769. }
  770. TRACE("bass_level: %d, vol: -%d dB\n", bass_level, vol_level);
  771. }
  772. void music_dbb_audio_set_bass_level(u8 bass_level)
  773. {
  774. music_effect_t* cb = &music_effect;
  775. if ((DBB_EN(cb->music_effect_state_set) == 0) || (DBB_EN(cb->music_effect_state) == 0)) {
  776. return;
  777. }
  778. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  779. if (vol_level > 60) {
  780. vol_level = 60;
  781. }
  782. music_dbb_update_param(vol_level, bass_level);
  783. music_set_eq_by_num(sys_cb.eq_mode);
  784. TRACE("bass_level: %d, vol: -%d dB\n", bass_level, vol_level);
  785. }
  786. #endif // BT_MUSIC_EFFECT_DBB_EN
  787. ///空间音效
  788. #if BT_MUSIC_EFFECT_SPATIAL_AU_EN
  789. #if BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  790. #define SPATIAL_AU_DL_SAMPLES_L 10
  791. #define SPATIAL_AU_DL_SAMPLES_R 10
  792. s16 spatial_audio_delay_buf_l[256 + SPATIAL_AU_DL_SAMPLES_L] AT(.music_exbuff.headset_v3d);
  793. s16 spatial_audio_delay_buf_r[256 + SPATIAL_AU_DL_SAMPLES_R] AT(.music_exbuff.headset_v3d);
  794. #if (SPATIAL_AU_DL_SAMPLES_L >= 256) || (SPATIAL_AU_DL_SAMPLES_R >= 256)
  795. #error "EFFECT: DL_SAMPLES overflow."
  796. #endif
  797. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  798. #if BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  799. u8 music_spatial_audio_get_fix_eq_sta(void)
  800. {
  801. return music_effect.spatial_audio_fix_eq;
  802. }
  803. #endif // BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  804. void music_spatial_audio_start_do(void)
  805. {
  806. #if BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  807. music_effect.spatial_audio_fix_eq = 1;
  808. #endif // BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  809. if (!codecs_pcm_is_start()) {
  810. music_effect.spatial_audio_eq_state = 4;
  811. #if ONEMORE_SPATIAL_AU
  812. hlw_cb.eq_spatital_gain_flag = true;
  813. onemore_3d_effect_eq_set_do();
  814. #else
  815. music_set_eq_by_num(sys_cb.eq_mode);
  816. #endif // ONEMORE_SPATIAL_AU
  817. } else {
  818. music_effect.spatial_audio_eq_state = 0;
  819. for (int i = 0; i < 4; i++) { //分四次增加增益
  820. music_effect.spatial_audio_eq_state++;
  821. #if !ONEMORE_SPATIAL_AU
  822. music_set_eq_by_num(sys_cb.eq_mode);
  823. #endif // ONEMORE_SPATIAL_AU
  824. // delay_5ms(4);
  825. }
  826. #if ONEMORE_SPATIAL_AU
  827. hlw_cb.eq_spatital_gain_flag = true;
  828. onemore_3d_effect_eq_set_do();
  829. #endif // ONEMORE_SPATIAL_AU
  830. }
  831. TRACE("%s\n", __func__);
  832. }
  833. void music_spatial_audio_stop_do(void)
  834. {
  835. #if BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  836. music_effect.spatial_audio_fix_eq = 0;
  837. #endif // BT_MUSIC_EFFECT_SPATIAL_AUEQ_EN
  838. if (!codecs_pcm_is_start()) {
  839. music_effect.spatial_audio_eq_state = 0;
  840. #if ONEMORE_SPATIAL_AU
  841. hlw_cb.eq_spatital_gain_flag = 0;
  842. onemore_set_eq_mode_do();
  843. #else
  844. music_set_eq_by_num(sys_cb.eq_mode);
  845. #endif // ONEMORE_SPATIAL_AU
  846. } else {
  847. music_effect.spatial_audio_eq_state = 4;
  848. for (int i = 0; i < 4; i++) { //分四次减小增益
  849. music_effect.spatial_audio_eq_state--;
  850. #if !ONEMORE_SPATIAL_AU
  851. music_set_eq_by_num(sys_cb.eq_mode);
  852. #endif // ONEMORE_SPATIAL_AU
  853. // delay_5ms(4);
  854. }
  855. #if ONEMORE_SPATIAL_AU
  856. hlw_cb.eq_spatital_gain_flag = 0;
  857. onemore_set_eq_mode_do();
  858. #endif // ONEMORE_SPATIAL_AU
  859. }
  860. TRACE("%s\n", __func__);
  861. }
  862. void music_spatial_audio_param_init(void)
  863. {
  864. v3d_init();
  865. #if BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  866. if (!v3d_delay_buf_init(spatial_audio_delay_buf_l, sizeof(spatial_audio_delay_buf_l), SPATIAL_AU_DL_SAMPLES_L,
  867. spatial_audio_delay_buf_r, sizeof(spatial_audio_delay_buf_r), SPATIAL_AU_DL_SAMPLES_R)) {
  868. printf("V3D delay buffer ERROR\n");
  869. }
  870. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_DLEN
  871. v3d_set_fade(0);
  872. TRACE("%s\n", __func__);
  873. }
  874. void music_spatial_audio_start(void)
  875. {
  876. EFFECT_COMM_START_CHECK();
  877. music_effect_t* cb = &music_effect;
  878. if (SPATIAL_AUDIO_EN(cb->music_effect_state_set)) {
  879. return;
  880. }
  881. cb->music_effect_state_set |= SPATIAL_AUDIO_STA_BIT;
  882. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  883. music_spatial_audio_param_init();
  884. music_effect_set_state(MUSIC_EFFECT_SPATIAL_AUDIO, 1);
  885. if (codecs_pcm_is_start()) {
  886. // delay_5ms(10);
  887. u16 delay_cnt = 10;
  888. while (delay_cnt) {
  889. WDT_CLR();
  890. bt_thread_check_trigger();
  891. delay_5ms(1);
  892. delay_cnt--;
  893. }
  894. }
  895. music_spatial_audio_start_do();
  896. }
  897. #if ONEMORE_SPATIAL_AU
  898. cb->func_process_flag |= PROC_FLAG_ALG_REINIT;
  899. #endif // ONEMORE_SPATIAL_AU
  900. TRACE("music_spatial_audio_start %d\n", music_effect.spatial_audio_eq_state);
  901. }
  902. void music_spatial_audio_stop(void)
  903. {
  904. EFFECT_COMM_STOP_CHECK();
  905. music_effect_t* cb = &music_effect;
  906. if (SPATIAL_AUDIO_EN(cb->music_effect_state_set) == 0) {
  907. return;
  908. }
  909. #if ONEMORE_SPATIAL_AU
  910. cb->func_process_flag |= PROC_FLAG_ALG_SUSPEND;
  911. #endif // ONEMORE_SPATIAL_AU
  912. v3d_set_fade(1);
  913. if (codecs_pcm_is_start()) {
  914. // delay_5ms(10);
  915. u16 delay_cnt = 10;
  916. while (delay_cnt) {
  917. WDT_CLR();
  918. bt_thread_check_trigger();
  919. delay_5ms(1);
  920. delay_cnt--;
  921. }
  922. }
  923. music_spatial_audio_stop_do();
  924. while (!v3d_fade_is_done(1)) {
  925. WDT_CLR();
  926. delay_5ms(1);
  927. bt_thread_check_trigger();
  928. if (!codecs_pcm_is_start()) { //音乐播放结束就不等了
  929. break;
  930. }
  931. }
  932. music_effect_set_state(MUSIC_EFFECT_SPATIAL_AUDIO, 0);
  933. cb->music_effect_state_set &= ~SPATIAL_AUDIO_STA_BIT;
  934. TRACE("music_spatial_audio_stop %d\n", music_effect.spatial_audio_eq_state);
  935. }
  936. #endif // BT_MUSIC_EFFECT_SPATIAL_AU_EN
  937. ///虚拟低音
  938. #if BT_MUSIC_EFFECT_VBASS_EN
  939. #define VBASS_CAL_INTENSITY(x,bits) ((s32)(.5+(0.01f * (x))*(((s32)1)<<(bits))))
  940. u8 vbass_cb[232] AT(.music_buff.vbass);
  941. AT(.audio_text.vbass)
  942. void vbass_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits)
  943. {
  944. int i;
  945. s16* pcm16 = (s16*)buf;
  946. s32* pcm32 = (s32*)buf;
  947. s16 tmp16;
  948. s32 tmp32;
  949. if (in_24bits) { //24bit转成16bit
  950. if (ch_idx == 0 || ch_idx == 1) {
  951. for (i = 0; i < samples; i++) {
  952. tmp16 = (s16)(pcm32[2*i+ch_idx] >> 8);
  953. tmp32 = vbass_process(vbass_cb, &tmp16);
  954. pcm32[2*i+0] = (s32)(tmp32 << 8);
  955. pcm32[2*i+1] = (s32)(tmp32 << 8);
  956. }
  957. } else if (ch_idx == 2) {
  958. for (i = 0; i < samples; i++) {
  959. tmp16 = (s16)((pcm32[2*i+0] + pcm32[2*i+1]) >> 9);
  960. tmp32 = vbass_process(vbass_cb, &tmp16);
  961. pcm32[2*i+0] = (s32)(tmp32 << 8);
  962. pcm32[2*i+1] = (s32)(tmp32 << 8);
  963. }
  964. }
  965. } else {
  966. if (ch_idx == 0 || ch_idx == 1) {
  967. for (i = 0; i < samples; i++) {
  968. tmp16 = pcm16[2*i+ch_idx];
  969. tmp32 = vbass_process(vbass_cb, &tmp16);
  970. pcm16[2*i+0] = (s16)tmp32;
  971. pcm16[2*i+1] = (s16)tmp32;
  972. }
  973. } else if (ch_idx == 2) {
  974. for (i = 0; i < samples; i++) {
  975. tmp16 = (s16)(((s32)pcm16[2*i+0] + pcm16[2*i+1]) >> 1);
  976. tmp32 = vbass_process(vbass_cb, &tmp16);
  977. pcm16[2*i+0] = (s16)tmp32;
  978. pcm16[2*i+1] = (s16)tmp32;
  979. }
  980. }
  981. }
  982. }
  983. void music_vbass_audio_param_init(void)
  984. {
  985. vbass_param_cb_t vbass_param_cb;
  986. vbass_param_cb.cutoff_frequency = 2;
  987. vbass_param_cb.intensity_set = 50;
  988. vbass_param_cb.vbass_high_frequency_set = 2;
  989. vbass_param_cb.pregain = 0.707 * (1 << 23); //-3db
  990. vbass_param_cb.intensity = VBASS_CAL_INTENSITY(vbass_param_cb.intensity_set, 15);
  991. vbass_init(vbass_cb, &vbass_param_cb);
  992. TRACE("%s\n", __func__);
  993. }
  994. void music_vbass_audio_start(void)
  995. {
  996. EFFECT_COMM_START_CHECK();
  997. music_effect_t* cb = &music_effect;
  998. if (VBASS_EN(cb->music_effect_state_set)) {
  999. return;
  1000. }
  1001. //MUTE一下去掉杂音
  1002. dac_fade_out();
  1003. dac_fade_wait();
  1004. cb->music_effect_state_set |= VBASS_STA_BIT;
  1005. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1006. music_vbass_audio_param_init();
  1007. music_effect_set_state(MUSIC_EFFECT_VBASS, 1);
  1008. }
  1009. //delay一下再淡入
  1010. delay_5ms(14);
  1011. dac_fade_in();
  1012. TRACE("music_vbass_audio_start\n");
  1013. }
  1014. void music_vbass_audio_stop(void)
  1015. {
  1016. EFFECT_COMM_STOP_CHECK();
  1017. music_effect_t* cb = &music_effect;
  1018. if (VBASS_EN(cb->music_effect_state_set) == 0) {
  1019. return;
  1020. }
  1021. //MUTE一下去掉杂音
  1022. dac_fade_out();
  1023. dac_fade_wait();
  1024. cb->music_effect_state_set &= ~VBASS_STA_BIT;
  1025. music_effect_set_state(MUSIC_EFFECT_VBASS, 0);
  1026. //delay一下再淡入
  1027. delay_5ms(8);
  1028. dac_fade_in();
  1029. TRACE("music_vbass_audio_stop\n");
  1030. }
  1031. void music_vbass_set_param(u32 cutoff_frequency, u32 intensity, u8 vbass_high_frequency_set, u32 pregain)
  1032. {
  1033. vbass_set_param(vbass_cb, cutoff_frequency, intensity, vbass_high_frequency_set, pregain);
  1034. TRACE("music_vbass_set_param %d %d %d\n", cutoff_frequency, intensity, vbass_high_frequency_set);
  1035. }
  1036. #endif // BT_MUSIC_EFFECT_VBASS_EN
  1037. ///动态EQ
  1038. #if BT_MUSIC_EFFECT_DYEQ_EN
  1039. #define VBASS_CAL_INTENSITY(x, bits) ((s32)(.5+(0.01f * (x))*(((s32)1)<<(bits))))
  1040. u8 dyeq_cb[200] AT(.music_buff.dyeq);
  1041. u8 dyeq_drc_cb[84] AT(.music_buff.dyeq);
  1042. soft_vol_t dyeq_soft_vol AT(.music_buff.dyeq);
  1043. #if BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1044. u8 dyeq_vbass_cb[232] AT(.music_buff.vbass);
  1045. #endif // BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1046. AT(.audio_text.dyeq)
  1047. ALWAYS_INLINE s32 dyeq_mono_process(s16 data)
  1048. {
  1049. s32 tmp32;
  1050. soft_vol_process_mono_one_sample(&dyeq_soft_vol, &data);
  1051. #if BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1052. tmp32 = vbass_process(dyeq_vbass_cb, &data);
  1053. #else
  1054. tmp32 = (s32)data;
  1055. #endif // BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1056. dynamic_eq_process(dyeq_cb, &tmp32);
  1057. tmp32 = dyeq_drc_v3_calc(tmp32, dyeq_drc_cb);
  1058. return tmp32;
  1059. }
  1060. AT(.audio_text.dyeq)
  1061. void dynamic_eq_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits)
  1062. {
  1063. int i;
  1064. s32 tmp32;
  1065. s16 tmp16;
  1066. s32 *pcm32 = (s32*)buf;
  1067. s16 *pcm16 = (s16*)buf;
  1068. if (in_24bits) {
  1069. if (ch_idx == 0 || ch_idx == 1) {
  1070. for (i = 0; i < samples; i++) {
  1071. tmp16 = (s16)(pcm32[2*i+ch_idx] >> 8);
  1072. tmp32 = dyeq_mono_process(tmp16);
  1073. pcm32[2*i+0] = (s32)(tmp32 << 8);
  1074. pcm32[2*i+1] = (s32)(tmp32 << 8);
  1075. }
  1076. } else if (ch_idx == 2) {
  1077. for (i = 0; i < samples; i++) {
  1078. tmp16 = (s16)((pcm32[2*i+0] + pcm32[2*i+1]) >> 9);
  1079. tmp32 = dyeq_mono_process(tmp16);
  1080. pcm32[2*i+0] = (s32)(tmp32 << 8);
  1081. pcm32[2*i+1] = (s32)(tmp32 << 8);
  1082. }
  1083. }
  1084. } else {
  1085. if (ch_idx == 0 || ch_idx == 1) {
  1086. for (i = 0; i < samples; i++) {
  1087. tmp16 = pcm16[2*i+ch_idx];
  1088. tmp32 = dyeq_mono_process(tmp16);
  1089. pcm16[2*i+0] = (s16)tmp32;
  1090. pcm16[2*i+1] = (s16)tmp32;
  1091. }
  1092. } else if (ch_idx == 2) {
  1093. for (i = 0; i < samples; i++) {
  1094. tmp16 = (s16)(((s32)pcm16[2*i+0] + pcm16[2*i+1]) >> 1);
  1095. tmp32 = dyeq_mono_process(tmp16);
  1096. pcm16[2*i+0] = (s16)tmp32;
  1097. pcm16[2*i+1] = (s16)tmp32;
  1098. }
  1099. }
  1100. }
  1101. }
  1102. void music_dyeq_audio_start_do(void)
  1103. {
  1104. dac_vol_set(DIG_N0DB);
  1105. TRACE("%s\n", __func__);
  1106. }
  1107. void music_dyeq_audio_stop_do(void)
  1108. {
  1109. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  1110. if (vol_level > 60) {
  1111. vol_level = 60;
  1112. }
  1113. dac_vol_set(dac_dvol_tbl_db[vol_level]);
  1114. TRACE("%s\n", __func__);
  1115. }
  1116. void music_dyeq_audio_param_init(void)
  1117. {
  1118. memset(dyeq_cb, 0, sizeof(dyeq_cb));
  1119. memset(dyeq_drc_cb, 0, sizeof(dyeq_drc_cb));
  1120. #if BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1121. memset(dyeq_vbass_cb, 0, sizeof(dyeq_vbass_cb));
  1122. #endif // BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1123. bsp_set_effect_by_abt();
  1124. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  1125. if (vol_level > 60) {
  1126. vol_level = 60;
  1127. }
  1128. soft_vol_init(&dyeq_soft_vol);
  1129. soft_vol_set_vol_param(&dyeq_soft_vol, dac_dvol_tbl_db[vol_level], 1);
  1130. TRACE("%s\n", __func__);
  1131. }
  1132. void music_dyeq_audio_start(void)
  1133. {
  1134. EFFECT_COMM_START_CHECK();
  1135. music_effect_t* cb = &music_effect;
  1136. if (DYEQ_EN(cb->music_effect_state_set)) {
  1137. return;
  1138. }
  1139. //MUTE一下去掉杂音
  1140. dac_fade_out();
  1141. dac_fade_wait();
  1142. cb->music_effect_state_set |= DYEQ_STA_BIT;
  1143. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1144. music_dyeq_audio_param_init();
  1145. music_dyeq_audio_start_do();
  1146. music_effect_set_state(MUSIC_EFFECT_DYEQ, 1);
  1147. }
  1148. //delay一下再淡入
  1149. delay_5ms(14);
  1150. dac_fade_in();
  1151. TRACE("music_dyeq_audio_start\n");
  1152. }
  1153. void music_dyeq_audio_stop(void)
  1154. {
  1155. EFFECT_COMM_STOP_CHECK();
  1156. music_effect_t* cb = &music_effect;
  1157. if (DYEQ_EN(cb->music_effect_state_set) == 0) {
  1158. return;
  1159. }
  1160. //MUTE一下去掉杂音
  1161. dac_fade_out();
  1162. dac_fade_wait();
  1163. cb->music_effect_state_set &= ~DYEQ_STA_BIT;
  1164. music_dyeq_audio_stop_do();
  1165. music_effect_set_state(MUSIC_EFFECT_DYEQ, 0);
  1166. //delay一下再淡入
  1167. delay_5ms(8);
  1168. dac_fade_in();
  1169. TRACE("music_dyeq_audio_stop\n");
  1170. }
  1171. void music_dyeq_set_param(u8 *buf)
  1172. {
  1173. dyeq_coef_update(dyeq_cb, buf);
  1174. }
  1175. void music_dyeq_drc_set_param(void *buf)
  1176. {
  1177. dyeq_drc_v3_set_param(buf, dyeq_drc_cb);
  1178. }
  1179. void music_dyeq_audio_set_vol_do(u8 vol_level)
  1180. {
  1181. if (vol_level > 60) {
  1182. vol_level = 60;
  1183. }
  1184. soft_vol_set_vol_param(&dyeq_soft_vol, dac_dvol_tbl_db[vol_level], music_effect.vol_direct_set_flag);
  1185. TRACE("music_dyeq_audio_set_vol_do %d %d\n", vol_level, music_effect.vol_direct_set_flag);
  1186. music_effect.vol_direct_set_flag = 0;
  1187. }
  1188. void music_dyeq_audio_set_vol_by_vol(u16 vol, u8 vol_direct_set)
  1189. {
  1190. soft_vol_set_vol_param(&dyeq_soft_vol, vol, vol_direct_set);
  1191. TRACE("music_dyeq_audio_set_vol_by_vol %d %d\n", vol, vol_direct_set);
  1192. }
  1193. AT(.audio_text.dyeq)
  1194. void dynamic_eq_clear_cache(void)
  1195. {
  1196. dyeq_clear_cache(dyeq_cb);
  1197. }
  1198. #if BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1199. void music_vbass_set_param(u32 cutoff_frequency, u32 intensity, u8 vbass_high_frequency_set, u32 pregain)
  1200. {
  1201. vbass_set_param(dyeq_vbass_cb, cutoff_frequency, intensity, vbass_high_frequency_set, pregain);
  1202. TRACE("music_vbass_set_param %d %d %d %d\n", cutoff_frequency, intensity, vbass_high_frequency_set, pregain);
  1203. }
  1204. #endif // BT_MUSIC_EFFECT_DYEQ_VBASS_EN
  1205. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  1206. ///2段DRC
  1207. #if BT_MUSIC_EFFECT_XDRC_EN
  1208. soft_vol_t xdrc_soft_vol AT(.music_buff.xdrc);
  1209. #if BT_MUSIC_EFFECT_XDRC_EQ_EN
  1210. s32 xdrc_preeq_cb[BT_MUSIC_EFFECT_XDRC_EQ_BAND*7 + 6] AT(.music_buff.xdrc); //*coef, *zpara, band, pre_gain, coef(5*BAND), calc_buf((BAND+1)*2)
  1211. #endif
  1212. #if BT_MUSIC_EFFECT_XDRC_DELAY_CNT
  1213. u8 xdrc_delay_cb[16] AT(.music_buff.xdrc);
  1214. s32 xdrc_delay_buf[256] AT(.music_buff.xdrc);
  1215. #endif
  1216. //lp_cb
  1217. s32 xdrc_lp_cb[1*7 + 6] AT(.music_buff.xdrc);
  1218. s32 xdrc_lp_cb2[1*7 + 6] AT(.music_buff.xdrc); //分频点过两次
  1219. //hp_cb
  1220. s32 xdrc_hp_cb[1*7 + 6] AT(.music_buff.xdrc);
  1221. s32 xdrc_hp_cb2[1*7 + 6] AT(.music_buff.xdrc); //分频点过两次
  1222. //lp_cb
  1223. s32 xdrc_lp_exp_cb[1*7 + 6] AT(.music_buff.xdrc);
  1224. //hp_cb
  1225. s32 xdrc_hp_exp_cb[1*7 + 6] AT(.music_buff.xdrc);
  1226. //drc_cb
  1227. u8 xdrc_drclp_cb[14 * 4] AT(.music_buff.xdrc);
  1228. //drc_cb
  1229. u8 xdrc_drchp_cb[14 * 4] AT(.music_buff.xdrc);
  1230. //drc_cb
  1231. u8 xdrc_drcall_cb[14 * 4] AT(.music_buff.xdrc);
  1232. AT(.audio_text.xdrc)
  1233. ALWAYS_INLINE s32 xdrc_process(s16 data)
  1234. {
  1235. s32 pcm32;
  1236. s32 pcm32_lp;
  1237. s32 pcm32_hp;
  1238. s32 pcm32_lp_exp, drc_gain_lp;
  1239. s32 pcm32_hp_exp, drc_gain_hp;
  1240. soft_vol_process_mono_one_sample(&xdrc_soft_vol, &data);
  1241. pcm32 = (s32)data;
  1242. #if BT_MUSIC_EFFECT_XDRC_EQ_EN
  1243. //软件EQ
  1244. pcm32 = xdrc_softeq_proc(xdrc_preeq_cb,pcm32);
  1245. #endif // BT_MUSIC_EFFECT_XDRC_EQ_EN
  1246. //LP/HP filter for DrcGain
  1247. pcm32_lp_exp = xdrc_softeq_proc(xdrc_lp_exp_cb, pcm32);
  1248. pcm32_hp_exp = xdrc_softeq_proc(xdrc_hp_exp_cb, pcm32);
  1249. //expand freq to get drc_gain
  1250. drc_gain_lp = xdrc_drc_process_gain(xdrc_drclp_cb, pcm32_lp_exp);
  1251. drc_gain_hp = xdrc_drc_process_gain(xdrc_drchp_cb, pcm32_hp_exp);
  1252. #if BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1253. pcm32 = pcmdelay_mono_s32(xdrc_delay_cb, pcm32);
  1254. #endif // BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1255. //全频pcm32 过 drc_gain
  1256. pcm32_lp = xdrc_drc_get_pcm32_s(pcm32, drc_gain_lp);
  1257. pcm32_hp = xdrc_drc_get_pcm32_s(pcm32, drc_gain_hp);
  1258. //LP/HP filter
  1259. pcm32_lp = xdrc_softeq_proc(xdrc_lp_cb, pcm32_lp);
  1260. pcm32_lp = xdrc_softeq_proc(xdrc_lp_cb2, pcm32_lp);
  1261. pcm32_hp = xdrc_softeq_proc(xdrc_hp_cb, pcm32_hp);
  1262. pcm32_hp = xdrc_softeq_proc(xdrc_hp_cb2, pcm32_hp);
  1263. //LP/HP mix
  1264. pcm32 = pcm32_lp + pcm32_hp;
  1265. //all DRC
  1266. pcm32 = xdrc_drc_process_s16(xdrc_drcall_cb, pcm32);
  1267. return pcm32;
  1268. }
  1269. AT(.audio_text.xdrc)
  1270. void xdrc_frame_process(u32* buf, u32 samples, u32 ch_idx, u32 in_24bits)
  1271. {
  1272. int i;
  1273. s16 tmp16;
  1274. s32 tmp32;
  1275. s16 *pcm16 = (s16*)buf;
  1276. s32 *pcm32 = (s32*)buf;
  1277. if (in_24bits) {
  1278. if (ch_idx == 0 || ch_idx == 1) {
  1279. for (i = 0; i < samples; i++) {
  1280. tmp16 = (s16)(pcm32[2*i+ch_idx] >> 8);
  1281. tmp32 = xdrc_process(tmp16);
  1282. pcm32[2*i+0] = (s32)(tmp32 << 8);
  1283. pcm32[2*i+1] = (s32)(tmp32 << 8);
  1284. }
  1285. } else if (ch_idx == 2) {
  1286. for (i = 0; i < samples; i++) {
  1287. tmp16 = (s16)((pcm32[2*i+0] + pcm32[2*i+1]) >> 9);
  1288. tmp32 = xdrc_process(tmp16);
  1289. pcm32[2*i+0] = (s32)(tmp32 << 8);
  1290. pcm32[2*i+1] = (s32)(tmp32 << 8);
  1291. }
  1292. }
  1293. } else {
  1294. if (ch_idx == 0 || ch_idx == 1) {
  1295. for (i = 0; i < samples; i++) {
  1296. tmp16 = pcm16[2*i+ch_idx];
  1297. tmp32 = xdrc_process(tmp16);
  1298. pcm16[2*i+0] = (s16)tmp32;
  1299. pcm16[2*i+1] = (s16)tmp32;
  1300. }
  1301. } else if (ch_idx == 2) {
  1302. for (i = 0; i < samples; i++) {
  1303. tmp16 = (s16)(((s32)pcm16[2*i+0] + pcm16[2*i+1]) >> 1);
  1304. tmp32 = xdrc_process(tmp16);
  1305. pcm16[2*i+0] = (s16)tmp32;
  1306. pcm16[2*i+1] = (s16)tmp32;
  1307. }
  1308. }
  1309. }
  1310. }
  1311. void music_xdrc_audio_start_do(void)
  1312. {
  1313. dac_vol_set(DIG_N0DB);
  1314. TRACE("%s\n", __func__);
  1315. }
  1316. void music_xdrc_audio_stop_do(void)
  1317. {
  1318. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  1319. dac_vol_set(dac_dvol_tbl_db[vol_level]);
  1320. TRACE("%s\n", __func__);
  1321. }
  1322. void music_xdrc_audio_param_init(void)
  1323. {
  1324. #if BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1325. pcmdelay_init(xdrc_delay_cb, xdrc_delay_buf,sizeof(xdrc_delay_buf), 4, BT_MUSIC_EFFECT_XDRC_DELAY_CNT);
  1326. #endif // BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1327. #if BT_MUSIC_EFFECT_XDRC_EQ_EN
  1328. memset(xdrc_preeq_cb, 0, sizeof(xdrc_preeq_cb));
  1329. #endif // BT_MUSIC_EFFECT_XDRC_EQ_EN
  1330. memset(xdrc_lp_cb, 0, sizeof(xdrc_lp_cb));
  1331. memset(xdrc_lp_cb2, 0, sizeof(xdrc_lp_cb2));
  1332. memset(xdrc_hp_cb, 0, sizeof(xdrc_hp_cb));
  1333. memset(xdrc_hp_cb2, 0, sizeof(xdrc_hp_cb2));
  1334. memset(xdrc_lp_exp_cb, 0, sizeof(xdrc_lp_exp_cb));
  1335. memset(xdrc_hp_exp_cb, 0, sizeof(xdrc_hp_exp_cb));
  1336. memset(xdrc_drclp_cb, 0, sizeof(xdrc_drclp_cb));
  1337. memset(xdrc_drchp_cb, 0, sizeof(xdrc_drchp_cb));
  1338. memset(xdrc_drcall_cb, 0, sizeof(xdrc_drcall_cb));
  1339. bsp_set_effect_by_abt();
  1340. u8 vol_level = dac_dvol_table[sys_cb.vol] + sys_cb.gain_offset;
  1341. if (vol_level > 60) {
  1342. vol_level = 60;
  1343. }
  1344. soft_vol_init(&xdrc_soft_vol);
  1345. soft_vol_set_vol_param(&xdrc_soft_vol, dac_dvol_tbl_db[vol_level], 1);
  1346. TRACE("%s\n", __func__);
  1347. }
  1348. void music_xdrc_audio_start(void)
  1349. {
  1350. EFFECT_COMM_START_CHECK();
  1351. music_effect_t* cb = &music_effect;
  1352. if (XDRC_EN(cb->music_effect_state_set)) {
  1353. return;
  1354. }
  1355. //MUTE一下去掉杂音
  1356. dac_fade_out();
  1357. dac_fade_wait();
  1358. cb->music_effect_state_set |= XDRC_STA_BIT;
  1359. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1360. music_xdrc_audio_param_init();
  1361. music_xdrc_audio_start_do();
  1362. music_effect_set_state(MUSIC_EFFECT_XDRC, 1);
  1363. }
  1364. //delay一下再淡入
  1365. delay_5ms(14);
  1366. dac_fade_in();
  1367. TRACE("music_xdrc_start\n");
  1368. }
  1369. void music_xdrc_audio_stop(void)
  1370. {
  1371. EFFECT_COMM_STOP_CHECK();
  1372. music_effect_t* cb = &music_effect;
  1373. if (XDRC_EN(cb->music_effect_state_set) == 0) {
  1374. return;
  1375. }
  1376. //MUTE一下去掉杂音
  1377. dac_fade_out();
  1378. dac_fade_wait();
  1379. cb->music_effect_state_set &= ~XDRC_STA_BIT;
  1380. music_xdrc_audio_stop_do();
  1381. music_effect_set_state(MUSIC_EFFECT_XDRC, 0);
  1382. //delay一下再淡入
  1383. delay_5ms(8);
  1384. dac_fade_in();
  1385. TRACE("music_xdrc_stop\n");
  1386. }
  1387. void music_xdrc_audio_set_vol_do(u8 vol_level)
  1388. {
  1389. if (vol_level > 60) {
  1390. vol_level = 60;
  1391. }
  1392. soft_vol_set_vol_param(&xdrc_soft_vol, dac_dvol_tbl_db[vol_level], 0);
  1393. TRACE("music_xdrc_audio_set_vol_do %d\n", vol_level);
  1394. }
  1395. void music_xdrc_audio_set_vol_by_vol(u16 vol, u8 vol_direct_set)
  1396. {
  1397. soft_vol_set_vol_param(&xdrc_soft_vol, vol, vol_direct_set);
  1398. TRACE("music_xdrc_audio_set_vol_by_vol %d %d\n", vol, vol_direct_set);
  1399. }
  1400. AT(.audio_text.xdrc)
  1401. void xdrc_clear_cache(void)
  1402. {
  1403. #if BT_MUSIC_EFFECT_XDRC_EQ_EN
  1404. xdrc_softeq_clear_cache(xdrc_preeq_cb);
  1405. #endif // BT_MUSIC_EFFECT_XDRC_EQ_EN
  1406. xdrc_softeq_clear_cache(xdrc_lp_cb);
  1407. xdrc_softeq_clear_cache(xdrc_lp_cb2);
  1408. xdrc_softeq_clear_cache(xdrc_lp_exp_cb);
  1409. xdrc_softeq_clear_cache(xdrc_hp_cb);
  1410. xdrc_softeq_clear_cache(xdrc_hp_cb2);
  1411. xdrc_softeq_clear_cache(xdrc_hp_exp_cb);
  1412. }
  1413. #if BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1414. void music_xdrc_set_delay(u16 delay_samples)
  1415. {
  1416. pcmdelay_coef_update(xdrc_delay_cb, delay_samples);
  1417. TRACE("music_xdrc_set_delay %d\n", delay_samples);
  1418. }
  1419. #endif // BT_MUSIC_EFFECT_XDRC_DELAY_EN
  1420. #endif // BT_MUSIC_EFFECT_XDRC_EN
  1421. ///舒适噪声(alpha波、beta波、pink)
  1422. #if ABP_EN
  1423. void music_effect_abp_start(void)
  1424. {
  1425. music_effect_t* cb = &music_effect;
  1426. if (ABP_STA_EN(cb->music_effect_state_set)) {
  1427. return;
  1428. }
  1429. cb->music_effect_state_set |= ABP_STA_BIT;
  1430. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1431. music_effect_set_state(MUSIC_EFFECT_ABP, 1);
  1432. }
  1433. TRACE("music_effect_abp_start\n");
  1434. }
  1435. void music_effect_abp_stop(void)
  1436. {
  1437. music_effect_t* cb = &music_effect;
  1438. if (ABP_STA_EN(cb->music_effect_state_set) == 0) {
  1439. return;
  1440. }
  1441. cb->music_effect_state_set &= ~ABP_STA_BIT;
  1442. music_effect_set_state(MUSIC_EFFECT_ABP, 0);
  1443. TRACE("music_effect_abp_stop\n");
  1444. }
  1445. #endif // ABP_EN
  1446. ///动态空间音频
  1447. #if BT_MUSIC_EFFECT_HRTF_RT_EN
  1448. void music_hrtf_rt_param_init(void)
  1449. {
  1450. hrtf_rt_cb_t hrtf_rt_cb;
  1451. hrtf_rt_cb.decay_factor = 32767;
  1452. hrtf_rt_init(&hrtf_rt_cb);
  1453. #if BT_MUSIC_EFFECT_HRTF_RT_RST_EN
  1454. hrtf_rt_angle_filter_init(300, 10, 2);
  1455. #endif // BT_MUSIC_EFFECT_HRTF_RT_RST_EN
  1456. hrtf_rt_update_angle_process(0, 90);
  1457. TRACE("%s\n", __func__);
  1458. }
  1459. #if BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1460. u8 music_hrtf_rt_get_fix_eq_sta(void)
  1461. {
  1462. return music_effect.spatial_audio_fix_eq;
  1463. }
  1464. #endif // BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1465. void music_hrtf_rt_start_do(void)
  1466. {
  1467. #if BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1468. music_effect.spatial_audio_fix_eq = 1;
  1469. music_set_eq_by_res(RES_BUF_EQ_SPATIAL_AUDIO_EQ, RES_LEN_EQ_SPATIAL_AUDIO_EQ);
  1470. #endif // BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1471. TRACE("%s\n", __func__);
  1472. }
  1473. void music_hrtf_rt_start(void)
  1474. {
  1475. EFFECT_COMM_START_CHECK();
  1476. music_effect_t* cb = &music_effect;
  1477. if (HRTF_RT_STA_EN(cb->music_effect_state_set)) {
  1478. return;
  1479. }
  1480. //MUTE一下去掉杂音
  1481. dac_fade_out();
  1482. dac_fade_wait();
  1483. cb->music_effect_state_set |= HRTF_RT_STA_BIT;
  1484. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1485. music_hrtf_rt_param_init();
  1486. music_hrtf_rt_start_do();
  1487. music_effect_set_state(MUSIC_EFFECT_HRTF_RT, 1);
  1488. }
  1489. //delay一下再淡入
  1490. delay_5ms(14);
  1491. dac_fade_in();
  1492. TRACE("music_hrtf_rt_start\n");
  1493. }
  1494. void music_hrtf_rt_stop_do(void)
  1495. {
  1496. #if BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1497. music_effect.spatial_audio_fix_eq = 0;
  1498. music_set_eq_by_num(sys_cb.eq_mode);
  1499. #endif // BT_MUSIC_EFFECT_HRTF_RT_EQ_EN
  1500. music_effect_t* cb = &music_effect;
  1501. u16 delay_cnt = 100; //10ms
  1502. while (cb->hrtf_rt_angle_update_flag && delay_cnt) {
  1503. delay_us(100);
  1504. WDT_CLR();
  1505. delay_cnt--;
  1506. }
  1507. TRACE("%s\n", __func__);
  1508. }
  1509. void music_hrtf_rt_stop(void)
  1510. {
  1511. EFFECT_COMM_STOP_CHECK();
  1512. music_effect_t* cb = &music_effect;
  1513. if (HRTF_RT_STA_EN(cb->music_effect_state_set) == 0) {
  1514. return;
  1515. }
  1516. //MUTE一下去掉杂音
  1517. dac_fade_out();
  1518. dac_fade_wait();
  1519. cb->music_effect_state_set &= ~HRTF_RT_STA_BIT;
  1520. music_hrtf_rt_stop_do();
  1521. music_effect_set_state(MUSIC_EFFECT_HRTF_RT, 0);
  1522. //delay一下再淡入
  1523. delay_5ms(14);
  1524. dac_fade_in();
  1525. TRACE("music_hrtf_rt_stop\n");
  1526. }
  1527. void music_hrtf_rt_update_angle(s16 az, s16 el)
  1528. {
  1529. if (music_effect_get_state_real(MUSIC_EFFECT_HRTF_RT)) {
  1530. music_effect_t* cb = &music_effect;
  1531. cb->hrtf_rt_angle_update_flag = 1;
  1532. #if !BT_MUSIC_EFFECT_HRTF_RT_AC_EN
  1533. if (az < 0) {
  1534. az += 360;
  1535. }
  1536. // az = 360 - az; //取对应的组角输入算法
  1537. // printf("X:%d ", az);
  1538. #if BT_MUSIC_EFFECT_HRTF_RT_RST_EN
  1539. az = hrtf_rt_angle_filter(az);
  1540. #endif // BT_MUSIC_EFFECT_HRTF_RT_RST_EN
  1541. // el = el + 120;
  1542. // if (el > 180) {
  1543. // el -= 180;
  1544. // }
  1545. // printf("X:%d Y:%d\n", az, el);
  1546. // printf("Y:%d\n", az);
  1547. // hrtf_rt_update_angle_process(az, el);
  1548. hrtf_rt_update_angle_process(az, 90);
  1549. #else
  1550. static s16 test = 0;
  1551. test++;
  1552. if (test >= 360) {
  1553. test = 0;
  1554. }
  1555. // printf("X:%d\n", test);
  1556. hrtf_rt_update_angle_process(test, 90);
  1557. #endif
  1558. cb->hrtf_rt_angle_update_flag = 0;
  1559. }
  1560. }
  1561. #endif // BT_MUSIC_EFFECT_HRTF_RT_EN
  1562. ///用户自定义音效算法
  1563. #if BT_MUSIC_EFFECT_USER_EN
  1564. AT(.audio_text.user)
  1565. void alg_user_effect_process(u8 *buf, u32 samples, u32 nch, u32 is_24bit, u32 pcm_info)
  1566. {
  1567. //用户自定义音效算法处理示例函数
  1568. //算法中用到的函数可以放在audio_text段或者com_text段,以提高算法效率
  1569. //算法中用到的buffer需要放到music_buff段或者music_exbuff段
  1570. }
  1571. void alg_user_effect_init(void)
  1572. {
  1573. //用户自定义音效算法初始化示例函数
  1574. printf("alg_user_effect_init\n");
  1575. }
  1576. void music_effect_alg_user_start(void)
  1577. {
  1578. EFFECT_COMM_START_CHECK();
  1579. music_effect_t* cb = &music_effect;
  1580. if (USER_ALG_EN(cb->music_effect_state_set)) {
  1581. return;
  1582. }
  1583. cb->music_effect_state_set |= USER_ALG_STA_BIT;
  1584. if (cb->audio_comm_init_flag) { //已初始化audio comm,直接开启
  1585. alg_user_effect_init();
  1586. music_effect_set_state(MUSIC_EFFECT_ALG_USER, 1);
  1587. }
  1588. TRACE("music_effect_alg_user_start\n");
  1589. }
  1590. void music_effect_alg_user_stop(void)
  1591. {
  1592. EFFECT_COMM_STOP_CHECK();
  1593. music_effect_t* cb = &music_effect;
  1594. if (USER_ALG_EN(cb->music_effect_state_set) == 0) {
  1595. return;
  1596. }
  1597. cb->music_effect_state_set &= ~USER_ALG_STA_BIT;
  1598. music_effect_set_state(MUSIC_EFFECT_ALG_USER, 0);
  1599. TRACE("music_effect_alg_user_stop\n");
  1600. }
  1601. #endif // BT_MUSIC_EFFECT_USER_EN
  1602. #endif // BT_MUSIC_EFFECT_EN