bsp_dac.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #include "include.h"
  2. #include "bsp_dac.h"
  3. uint16_t cfg_pcm_out_format = 0;
  4. uint8_t cfg_dac_out_spr = 0;
  5. const u8 *dac_dvol_table;
  6. //数字音量DB音量表
  7. AT(.rodata.dac)
  8. const u16 dac_dvol_tbl_db[61] = {
  9. DIG_N0DB, DIG_N1DB, DIG_N2DB, DIG_N3DB, DIG_N4DB, DIG_N5DB, DIG_N6DB, DIG_N7DB,
  10. DIG_N8DB, DIG_N9DB, DIG_N10DB, DIG_N11DB, DIG_N12DB, DIG_N13DB, DIG_N14DB, DIG_N15DB,
  11. DIG_N16DB, DIG_N17DB, DIG_N18DB, DIG_N19DB, DIG_N20DB, DIG_N21DB, DIG_N22DB, DIG_N23DB,
  12. DIG_N24DB, DIG_N25DB, DIG_N26DB, DIG_N27DB, DIG_N28DB, DIG_N29DB, DIG_N30DB, DIG_N31DB,
  13. DIG_N32DB, DIG_N33DB, DIG_N34DB, DIG_N35DB, DIG_N36DB, DIG_N37DB, DIG_N38DB, DIG_N39DB,
  14. DIG_N40DB, DIG_N41DB, DIG_N42DB, DIG_N43DB, DIG_N44DB, DIG_N45DB, DIG_N46DB, DIG_N47DB,
  15. DIG_N48DB, DIG_N49DB, DIG_N50DB, DIG_N51DB, DIG_N52DB, DIG_N53DB, DIG_N54DB, DIG_N55DB,
  16. DIG_N56DB, DIG_N57DB, DIG_N58DB, DIG_N59DB, DIG_N60DB,
  17. };
  18. #if !BT_MUSIC_EFFECT_ABT_EN
  19. AT(.rodata.dac) const
  20. #endif
  21. u8 dac_dvol_tbl_16[16 + 1] = {
  22. 60, 43, 32, 26, 24, 22, 20, 18, 16,
  23. 14, 12, 10, 8, 6, 4, 2, 0,
  24. };
  25. #if !BT_MUSIC_EFFECT_ABT_EN
  26. AT(.rodata.dac) const
  27. #endif
  28. u8 dac_dvol_tbl_32[32 + 1] = {
  29. 60, 50, 43, 38, 35, 30, 28, 26,
  30. 24, 23, 22, 21, 20, 19, 18, 17,
  31. 16, 15, 14, 13, 12, 11, 10, 9,
  32. 8, 7, 6, 5, 4, 3, 2, 1, 0,
  33. };
  34. #if DAC_DNC_EN
  35. bool dac_dnc_is_en(void)
  36. {
  37. return DAC_DNC_EN;
  38. }
  39. #endif
  40. AT(.com_text.dac.dnc)
  41. bool dnc_tone_is_control(void)
  42. {
  43. return bsp_res_is_playing();
  44. }
  45. AT(.text.bsp.dac)
  46. u32 bsp_dac_get_gain_level(u8 vol)
  47. {
  48. u32 level;
  49. if (vol > VOL_MAX) {
  50. vol = VOL_MAX;
  51. }
  52. level = dac_dvol_table[vol];
  53. return 60 - level;
  54. }
  55. AT(.text.bsp.dac)
  56. void bsp_change_volume_db(u8 level)
  57. {
  58. s32 db_num;
  59. db_num = 60 - level;
  60. if (db_num > 60) {
  61. db_num = 60;
  62. }
  63. if (db_num < 0) {
  64. db_num = 0;
  65. }
  66. #if BT_MUSIC_EFFECT_DBB_EN
  67. if (music_effect_get_state_real(MUSIC_EFFECT_DBB)) {
  68. music_dbb_audio_set_vol_do(db_num);
  69. return;
  70. }
  71. #endif // BT_MUSIC_EFFECT_DBB_EN
  72. #if BT_MUSIC_EFFECT_DYEQ_EN
  73. if (music_effect_get_state_real(MUSIC_EFFECT_DYEQ)) {
  74. music_dyeq_audio_set_vol_do(db_num);
  75. return;
  76. }
  77. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  78. #if BT_MUSIC_EFFECT_XDRC_EN
  79. if (music_effect_get_state_real(MUSIC_EFFECT_XDRC)) {
  80. music_xdrc_audio_set_vol_do(db_num);
  81. return;
  82. }
  83. #endif // BT_MUSIC_EFFECT_XDRC_EN
  84. #if ANC_ALG_DYVOL_FF_LOCAL_VOL_EN
  85. bsp_anc_alg_dyvol_gain_cal(dac_dvol_tbl_db[db_num]);
  86. #else
  87. dac_vol_set(dac_dvol_tbl_db[db_num]);
  88. #endif // ANC_ALG_DYVOL_FF_LOCAL_VOL_EN
  89. }
  90. AT(.text.vol.convert)
  91. u16 bsp_volume_convert(u8 vol)
  92. {
  93. u16 vol_set = 0;
  94. u8 level = 0;
  95. if (vol <= VOL_MAX) {
  96. level = dac_dvol_table[vol] + sys_cb.gain_offset;
  97. if (level > 60) {
  98. level = 60;
  99. }
  100. vol_set = dac_dvol_tbl_db[level];
  101. }
  102. return vol_set;
  103. }
  104. AT(.com_text.dac_volume)
  105. void bsp_change_volume(u8 vol)
  106. {
  107. u8 level = 0;
  108. if (vol <= VOL_MAX) {
  109. level = dac_dvol_table[vol] + sys_cb.gain_offset;
  110. if (level > 60) {
  111. level = 60;
  112. }
  113. #if BT_MUSIC_EFFECT_DBB_EN
  114. if (music_effect_get_state_real(MUSIC_EFFECT_DBB)) {
  115. music_dbb_audio_set_vol_do(level);
  116. return;
  117. }
  118. #endif // BT_MUSIC_EFFECT_DBB_EN
  119. #if BT_MUSIC_EFFECT_DYEQ_EN
  120. if (music_effect_get_state_real(MUSIC_EFFECT_DYEQ)) {
  121. music_dyeq_audio_set_vol_do(level);
  122. return;
  123. }
  124. #endif // BT_MUSIC_EFFECT_DYEQ_EN
  125. #if BT_MUSIC_EFFECT_XDRC_EN
  126. if (music_effect_get_state_real(MUSIC_EFFECT_XDRC)) {
  127. music_xdrc_audio_set_vol_do(level);
  128. return;
  129. }
  130. #endif // BT_MUSIC_EFFECT_XDRC_EN
  131. #if ANC_ALG_DYVOL_FF_LOCAL_VOL_EN
  132. bsp_anc_alg_dyvol_gain_cal(dac_dvol_tbl_db[level]);
  133. #else
  134. dac_vol_set(dac_dvol_tbl_db[level]);
  135. #endif // ANC_ALG_DYVOL_FF_LOCAL_VOL_EN
  136. }
  137. }
  138. AT(.text.bsp.dac)
  139. bool bsp_set_volume(u8 vol)
  140. {
  141. if (!bsp_res_is_vol_busy()) { //未播放提示音,修改音量
  142. bsp_change_volume(vol);
  143. }
  144. if (vol == sys_cb.vol) {
  145. gui_box_show_vol();
  146. return false;
  147. }
  148. if (vol <= VOL_MAX) {
  149. sys_cb.vol = vol;
  150. gui_box_show_vol();
  151. sys_cb.cm_times = 0;
  152. sys_cb.cm_vol_change = 1;
  153. }
  154. printf("vol: %d\n", sys_cb.vol);
  155. return true;
  156. }
  157. AT(.text.bsp.dac)
  158. u8 bsp_volume_inc(u8 vol)
  159. {
  160. vol++;
  161. if(vol > VOL_MAX)
  162. vol = VOL_MAX;
  163. return vol;
  164. }
  165. AT(.text.bsp.dac)
  166. u8 bsp_volume_dec(u8 vol)
  167. {
  168. if(vol > 0)
  169. vol--;
  170. return vol;
  171. }
  172. //vcmbuf及差分
  173. AT(.text.bsp.dac)
  174. bool bsp_dac_off_for_bt_conn(void)
  175. {
  176. if ((DAC_OFF_FOR_BT_CONN_EN) && (DAC_CH_SEL >= DAC_VCMBUF_MONO)) {
  177. return true;
  178. }
  179. return false;
  180. }
  181. AT(.text.bsp.dac)
  182. void dac_set_anl_offset(u8 bt_call_flag)
  183. {
  184. if (bt_call_flag) {
  185. sys_cb.gain_offset = BT_CALL_MAX_GAIN;
  186. } else {
  187. sys_cb.gain_offset = DAC_MAX_GAIN;
  188. }
  189. }
  190. AT(.text.bsp.dac)
  191. void dac_set_vol_table(u8 vol_max)
  192. {
  193. if (vol_max == 16) {
  194. dac_dvol_table = dac_dvol_tbl_16;
  195. } else {
  196. dac_dvol_table = dac_dvol_tbl_32;
  197. }
  198. dac_set_anl_offset(0);
  199. }
  200. //开机控制DAC电容放电等待时间
  201. AT(.text.dac.pull)
  202. void dac_pull_down_delay(void)
  203. {
  204. delay_5ms(DAC_PULL_DOWN_DELAY);
  205. }
  206. AT(.com_text.dac.mute)
  207. void dac_set_mute_callback(u8 mute_flag)
  208. {
  209. #if LOUDSPEAKER_MUTE_EN
  210. if (mute_flag) {
  211. bsp_loudspeaker_mute();
  212. } else {
  213. if (!sys_cb.mute) {
  214. bsp_loudspeaker_unmute();
  215. //DAC延时淡入,防止UNMUTE时间太短导致喇叭声音不全的问题
  216. dac_unmute_set_delay(LOUDSPEAKER_UNMUTE_DELAY);
  217. }
  218. }
  219. #endif
  220. }
  221. AT(.text.bsp.dac)
  222. void dac_init(void)
  223. {
  224. cfg_dac_out_spr = DAC_OUT_SPR;
  225. //#if FUNC_USBDEV_EN
  226. // cfg_pcm_out_format = PCM_OUT_24BITS; //打开usb device默认用24bit dac
  227. //#else
  228. cfg_pcm_out_format = (DAC_24BITS_EN * PCM_OUT_24BITS) /*| PCM_OUT_MONO*/;
  229. //#endif
  230. dac_set_vol_table(xcfg_cb.vol_max);
  231. printf("[%s] vol_max:%d, offset: %d\n", __func__, xcfg_cb.vol_max, sys_cb.gain_offset);
  232. dac_aubuf_init();
  233. dac_power_on();
  234. dac_ang_gain_set(ANL_N0DB);
  235. plugin_music_eq();
  236. #if DAC_EQ_AFTER_VOL_EN
  237. music_eq_set_after_vol();
  238. #endif // DAC_EQ_AFTER_VOL_EN
  239. #if DAC_DRC_EN
  240. music_set_drc_by_res(RES_BUF_EQ_DAC_DRC, RES_LEN_EQ_DAC_DRC);
  241. #endif
  242. #if DAC_DNC_EN
  243. dac_dnc_init();
  244. dac_dnc_start();
  245. #endif
  246. }
  247. #if BT_MUSIC_EFFECT_ABT_EN
  248. AT(.text.bsp.dac.vol)
  249. void bsp_set_dac_dvol_tbl(u8* buf)
  250. {
  251. if (buf[2]) {
  252. memcpy(dac_dvol_tbl_32, &buf[3], 33);
  253. } else {
  254. memcpy(dac_dvol_tbl_16, &buf[3], 17);
  255. }
  256. bsp_set_volume(sys_cb.vol);
  257. }
  258. #endif // BT_MUSIC_EFFECT_ABT_EN