mcu_ab568x/userboot240328/app/platform/bsp/bsp_music.c
2025-05-30 18:03:10 +08:00

188 lines
4.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}