#include "include.h" #define FS_CRC_SEED 0xffff uint calc_crc(void *buf, uint len, uint seed); void mp3_res_play_kick(u32 addr, u32 len); void wav_res_play_kick(u32 addr, u32 len); void wav_res_dec_process(void); bool wav_res_is_play(void); bool wav_res_stop(void); void mp3_res_play_exit(void); #if FUNC_MUSIC_EN //扫描全盘文件 bool pf_scan_music(u8 new_dev) { if (new_dev) { #if USB_SD_UPDATE_EN func_update(); //尝试升级 #endif // USB_SD_UPDATE_EN } #if REC_FAST_PLAY f_msc.rec_scan = BIT(0); sys_cb.rec_num = 0; sys_cb.ftime = 0; #endif // REC_FAST_PLAY f_msc.file_total = fs_get_total_files(); if (!f_msc.file_total) { f_msc.dir_total = 0; return false; } #if REC_FAST_PLAY f_msc.rec_scan = 0; #endif // REC_FAST_PLAY f_msc.dir_total = fs_get_dirs_count(); //获取文件夹总数 return true; } #if MUSIC_BREAKPOINT_EN void bsp_music_breakpoint_clr(void) { f_msc.brkpt.file_ptr = 0; f_msc.brkpt.frame_count = 0; param_msc_breakpoint_write(); param_sync(); //printf("%s\n", __func__); } void bsp_music_breakpoint_init(void) { int clr_flag = 0; if (f_msc.brkpt_flag) { f_msc.brkpt_flag = 0; param_msc_breakpoint_read(); //printf("restore: %d, %d, %04x\n", f_msc.brkpt.file_ptr, f_msc.brkpt.frame_count, f_msc.brkpt.fname_crc); if (calc_crc(f_msc.fname, 8, FS_CRC_SEED) == f_msc.brkpt.fname_crc) { music_set_jump(&f_msc.brkpt); } else { clr_flag = 1; } } f_msc.brkpt.fname_crc = calc_crc(f_msc.fname, 8, FS_CRC_SEED); f_msc.brkpt.file_ptr = 0; f_msc.brkpt.frame_count = 0; if (clr_flag) { param_msc_breakpoint_write(); } } void bsp_music_breakpoint_save(void) { music_get_breakpiont(&f_msc.brkpt); param_msc_breakpoint_write(); param_sync(); //printf("save: %d, %d, %04x\n", f_msc.brkpt.file_ptr, f_msc.brkpt.frame_count, f_msc.brkpt.fname_crc); } #endif // MUSIC_BREAKPOINT_EN AT(.wavdec.code) u32 wav_dec_sample_rate_limit(void) {// 设置WAV支持的最高采样率,U盘时最高96k return 96000; } #endif // FUNC_MUSIC_EN void mp3_res_play_do(u32 addr, u32 len, bool sync) { u16 msg; u8 mute_bak; // printf("%s: addr: %x, len: %x\n", __func__, addr, len); if (len == 0) { return; } #if DAC_DNR_EN u8 sta = dac_dnr_get_sta(); dac_dnr_set_sta(0); #endif mute_bak = sys_cb.mute; if (sys_cb.mute) { bsp_loudspeaker_unmute(); } if(get_music_dec_sta() != MUSIC_STOP) { //避免来电响铃/报号未完成,影响get_music_dec_sta()状态 music_control(MUSIC_MSG_STOP); } bsp_change_volume(WARNING_VOLUME); if (music_set_eq_is_done()) { music_set_eq_by_num(0); // EQ 设置为 normal } mp3_res_play_kick(addr, len); while (get_music_dec_sta() != MUSIC_STOP) { WDT_CLR(); msg = msg_dequeue(); if (sys_cb.voice_evt_brk_en) { if (((msg == EVT_SD_INSERT) || (msg == EVT_UDISK_INSERT)) && (func_cb.sta != FUNC_MUSIC)) { func_message(msg); break; } } if ((PWRKEY_2_HW_PWRON) && (sys_cb.pwrdwn_hw_flag)) {//PWRKEY模拟硬件开关机快速关机 break; } if ((msg != NO_MSG) && ((msg & KEY_TYPE_MASK) != KEY_HOLD)) { msg_enqueue(msg); //还原未处理的消息 } } music_control(MUSIC_MSG_STOP); bsp_change_volume(sys_cb.vol); if (music_set_eq_is_done()) { music_set_eq_by_num(sys_cb.eq_mode); // 恢复 EQ } mp3_res_play_exit(); sys_cb.mute = mute_bak; if (sys_cb.mute) { bsp_loudspeaker_mute(); } #if DAC_DNR_EN dac_dnr_set_sta(sta); #endif } #if WARNING_WAVRES_PLAY void wav_res_play_do(u32 addr, u32 len, bool sync) { if (len == 0) { return; } #if DAC_DNR_EN u8 sta = dac_dnr_get_sta(); dac_dnr_set_sta(0); #endif wav_res_play_kick(addr, len); while (wav_res_is_play()) { wav_res_dec_process(); WDT_CLR(); } wav_res_stop(); #if DAC_DNR_EN dac_dnr_set_sta(sta); #endif } void wav_res_play(u32 addr, u32 len) { wav_res_play_do(addr, len, 0); } #endif void mp3_res_play(u32 addr, u32 len) { mp3_res_play_do(addr, len, 0); }