188 lines
4.5 KiB
C
188 lines
4.5 KiB
C
#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);
|
||
}
|
||
|