123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- #include "include.h"
- #if HLW_UI
- #include "hlw_func.h"
- #endif // HLW_UI
- #define FS_CRC_SEED 0xffff
- uint calc_crc(void *buf, uint len, uint seed);
- bool mp3_res_play_kick(u32 addr, u32 len, bool kick);
- bool wav_res_play_kick(u32 addr, u32 len, bool kick);
- 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
- #if BT_BACKSTAGE_EN
- const u32 *res_addr[] = {
- #if WARNING_FUNC_MUSIC
- &RES_BUF_MUSIC_MODE_MP3,
- #endif
- #if WARNING_USB_SD
- &RES_BUF_SDCARD_MODE_MP3,
- &RES_BUF_USB_MODE_MP3,
- #endif
- #if WARNING_FUNC_BT
- &RES_BUF_BT_MODE_MP3,
- #endif
- #if WARNING_FUNC_FMRX
- &RES_BUF_FM_MODE_MP3,
- #endif
- #if WARNING_FUNC_AUX
- &RES_BUF_AUX_MODE_MP3,
- #endif
- };
- #endif
- //扫描全盘文件
- 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
- if (new_dev) {
- #if MUSIC_PLAYDEV_BOX_EN
- gui_box_show_playdev();
- #endif // MUSIC_PLAYDEV_BOX_EN
- #if WARNING_USB_SD
- if (sys_cb.cur_dev <= DEV_SDCARD1) {
- mp3_res_play(RES_BUF_SDCARD_MODE_MP3, RES_LEN_SDCARD_MODE_MP3);
- } else {
- mp3_res_play(RES_BUF_USB_MODE_MP3, RES_LEN_USB_MODE_MP3);
- }
- #endif // WARNING_USB_SD
- }
- f_msc.dir_total = fs_get_dirs_count(); //获取文件夹总数
- return true;
- }
- #if MUSIC_PLAYMODE_NUM
- //music播放模式切换
- void music_playmode_next(void)
- {
- sys_cb.play_mode++;
- if (sys_cb.play_mode >= MUSIC_PLAYMODE_NUM) {
- sys_cb.play_mode = NORMAL_MODE;
- }
- gui_box_show_playmode();
- plugin_playmode_warning();
- }
- #endif // MUSIC_PLAYMODE_NUM
- #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
- #endif // FUNC_MUSIC_EN
- #if WARNING_MP3_EN
- void mp3_res_play(u32 addr, u32 len)
- {
- #if QTEST_EN
- if(qtest_get_mode()){
- return;
- }
- #endif
- u16 msg;
- u8 mute_bak;
- // printf("%s: addr: %x, len: %x\n", __func__, addr, len);
- if (len == 0) {
- return;
- }
- #if BT_BACKSTAGE_EN
- if (func_cb.sta_break != FUNC_NULL) {
- for (u32 i = 0; i < sizeof(res_addr) / sizeof(u32); i++) {
- if (*res_addr[i] == addr) {
- if (func_cb.sta != FUNC_BT) {
- func_cb.sta_break = FUNC_NULL;
- }
- return;
- }
- }
- }
- #endif
- u8 dac_sta = dac_get_pwr_sta();
- func_bt_set_dac(1);
- #if SYS_KARAOK_EN
- u8 voice_bak = 0, func_sta = func_cb.sta;
- if (karaok_get_voice_rm_sta()) {
- voice_bak = 1;
- karaok_voice_rm_disable();
- }
- bsp_karaok_exit(AUDIO_PATH_KARAOK);
- #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);
- }
- #if BT_MUSIC_EFFECT_EN
- music_effect_alg_suspend(MUSIC_EFFECT_SUSPEND_FOR_RES);
- #endif // BT_MUSIC_EFFECT_EN
- bsp_change_volume(WARNING_VOLUME);
- mp3_res_play_kick(addr, len, true);
- while (get_music_dec_sta() != MUSIC_STOP) {
- bt_thread_check_trigger();
- sys_run_loop();
- 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 BT_HFP_INBAND_RING_EN
- // if (ring_mp3_msg_work()) { //mp3本地铃声事件处理
- // func_message(msg);
- // break;
- // }
- #endif
- }
- #if HLW_UI
- hlw_func_poweron_led_handle();
- #endif // HLW_UI
- #if LINEIN_DETECT_EN
- if ((msg == EVT_LINEIN_INSERT) && ((sys_cb.voice_evt_brk_en) || (LINEIN_2_PWRDOWN_EN))) {
- func_message(msg);
- break;
- }
- #endif // LINEIN_DETECT_EN
- if (msg != NO_MSG) {
- #if HLW_UI
- //部分事件允许打断提示音
- if((msg == EVT_POWEROFF_CMD) || (msg == EVT_CLEAR_PAIRLIST) || (msg == KL_PWR_NEXT)
- || (msg == KH_PWR_NEXT) || (msg == KLU_PWR_NEXT)|| (msg == KLH_PLAY_PWR_USER_DEF)
- || (msg == EVT_IODM_TEST)||(msg == EVT_LED_OPEN)||(msg == EVT_LED_CLOSE)
- || (msg == EVT_PC_INSERT))
- {
- func_message(msg);
- //小牛测试需要直接打断提示音
- if(msg == EVT_IODM_TEST)
- {
- break;
- }
- }
- else
- {
- msg_enqueue(msg); //还原未处理的消息
- }
- #else
- msg_enqueue(msg); //还原未处理的消息
- #endif // HLW_UI
- }
- #if HLW_UI
- //需要进入充电或者在产测模式可以打断mp3
- if((func_cb.sta == FUNC_CHARGE)||(hlw_cb.chance_mode == 1)
- ||(func_cb.sta == FUNC_BT_DUT)
- #if FUNC_USBDEV_EN
- ||(func_cb.sta == FUNC_USBDEV)
- #endif // FUNC_USBDEV_EN
- ||((func_cb.sta == FUNC_PWROFF)&& (addr != RES_BUF_EN_POWEROFF_MP3))
- ||(func_cb.sta == FUNC_BT_IODM))
- {
- break;
- }
- #endif // HLW_UI
- #if (CHARGE_BOX_TYPE == CBOX_SSW)
- if(bt_get_status() >= BT_STA_IDLE) {
- charge_box_ssw_process(0);
- }
- #endif
- #if BT_TWS_EN && WARNING_BREAK_EN
- if(sys_cb.tws_res_brk) {
- sys_cb.tws_res_brk = 0;
- break;
- }
- #endif
- }
- music_control(MUSIC_MSG_STOP);
- #if BT_MUSIC_EFFECT_EN
- music_effect_alg_reinit();
- music_effect_alg_restart();
- #endif // BT_MUSIC_EFFECT_EN
- #if HLW_UI
- #if FUNC_USBDEV_EN
- if(func_cb.sta == FUNC_USBDEV)
- {
- //bsp_change_volume(VOL_MAX);
- ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX));
- }
- else
- #endif // FUNC_USBDEV_EN
- {
- if(sys_cb.incall_flag)
- {
- bsp_change_volume(sys_cb.hfp_vol);
- }
- else
- {
- bsp_change_volume(sys_cb.vol);
- }
- }
- #else
- bsp_change_volume(sys_cb.vol);
- #endif // HLW_UI
- mp3_res_play_exit();
- sys_cb.mute = mute_bak;
- if (sys_cb.mute) {
- bsp_loudspeaker_mute();
- }
- func_bt_set_dac(dac_sta);
- #if SYS_KARAOK_EN
- if (voice_bak) {
- karaok_voice_rm_enable();
- }
- bsp_karaok_init(AUDIO_PATH_KARAOK, func_sta);
- #endif
- }
- #else
- void mp3_res_play(u32 addr, u32 len) {}
- #endif
- #if WARNING_SYSVOL_ADJ_EN
- void bsp_res_sysvol_adjust(void)
- {
- #if 0//FUNC_USBDEV_EN
- if(func_cb.sta == FUNC_USBDEV)
- {
- ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX-12));
- }
- else
- #endif // FUNC_USBDEV_EN
- {
- #if HLW_UI
- if ((sys_cb.vol > VOL_MAX/4)
- #if FUNC_USBDEV_EN
- ||(func_cb.sta == FUNC_USBDEV)
- #endif
- )
- {
- #else
- if (sys_cb.vol == VOL_MAX) {
- #endif // HLW_UI
- #if BT_MUSIC_EFFECT_DYEQ_EN
- if (music_effect_get_state_real(MUSIC_EFFECT_DYEQ)) {
- music_dyeq_audio_set_vol_by_vol(WARNING_SYSVOL_ADJ_LEVEL, 0);
- return;
- }
- #endif // BT_MUSIC_EFFECT_DYEQ_EN
- #if BT_MUSIC_EFFECT_XDRC_EN
- if (music_effect_get_state_real(MUSIC_EFFECT_XDRC)) {
- music_xdrc_audio_set_vol_by_vol(WARNING_SYSVOL_ADJ_LEVEL, 0);
- return;
- }
- #endif // BT_MUSIC_EFFECT_XDRC_EN
- dac_vol_set(WARNING_SYSVOL_ADJ_LEVEL);
- }
- }
- }
- void bsp_res_sysvol_resume(void)
- {
- #if HLW_UI
- #if FUNC_USBDEV_EN
- if(func_cb.sta == FUNC_USBDEV)
- {
- ude_set_sys_volume(bsp_dac_get_gain_level(VOL_MAX));
- }
- else
- #endif // FUNC_USBDEV_EN
- {
- if(sys_cb.incall_flag)
- {
- bsp_change_volume(sys_cb.hfp_vol);
- }
- else
- {
- bsp_change_volume(sys_cb.vol);
- }
- }
- #else
- bsp_change_volume(sys_cb.vol);
- #endif // HLW_UI
- }
- #endif
- #if WARNING_WAV_EN
- void wav_res_play(u32 addr, u32 len)
- {
- if (len == 0) {
- return;
- }
- #if ABP_EN
- if (abp_is_playing()) {
- #if ABP_PLAY_DIS_WAV_EN
- return;
- #else
- #if BT_TWS_EN
- abp_stop_fade_out();
- #endif
- abp_stop();
- dac1_aubuf_clr();
- #endif // ABP_PLAY_DIS_WAV_EN
- }
- #endif // ABP_EN
- u8 dac_sta = dac_get_pwr_sta();
- func_bt_set_dac(1);
- #if TINY_TRANSPARENCY_EN
- sys_cb.ttp_sta = sys_cb.ttp_start;
- bsp_ttp_stop();
- #endif
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_adjust();
- #endif
- sys_clk_req(INDEX_RES_PLAY, SYS_120M);
- wav_res_play_kick(addr, len, 1);
- while (wav_res_is_play()) {
- bt_thread_check_trigger();
- wav_res_dec_process();
- WDT_CLR();
- #if BT_TWS_EN && WARNING_BREAK_EN
- if(sys_cb.tws_res_brk) {
- sys_cb.tws_res_brk = 0;
- break;
- }
- #endif
- }
- wav_res_stop();
- sys_clk_free(INDEX_RES_PLAY);
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_resume();
- #endif
- #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
- if (sys_cb.abp_mode) {
- abp_start(sys_cb.abp_mode - 1);
- #if BT_TWS_EN
- abp_start_fade_in();
- #endif
- }
- #endif
- func_bt_set_dac(dac_sta);
- #if TINY_TRANSPARENCY_EN
- if (sys_cb.ttp_sta) {
- bsp_ttp_start();
- }
- #endif
- }
- #endif
- void piano_res_play(u8 type, void *res)
- {
- #if ABP_EN
- if (abp_is_playing()) {
- #if ABP_PLAY_DIS_WAV_EN
- return;
- #else
- abp_stop();
- dac1_aubuf_clr();
- #endif // ABP_PLAY_DIS_WAV_EN
- }
- #endif // ABP_EN
- u8 dac_sta = dac_get_pwr_sta();
- func_bt_set_dac(1);
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_adjust();
- #endif
- tone_play_kick(type, res, true);
- while (tone_is_playing()) {
- bt_thread_check_trigger();
- piano_play_process();
- }
- tone_play_end();
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_resume();
- #endif
- func_bt_set_dac(dac_sta);
- #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
- if (sys_cb.abp_mode) {
- bsp_abp_set_mode(sys_cb.abp_mode);
- }
- #endif
- }
- #if WARNING_WSBC_EN
- void wsbc_res_play(u32 addr, u32 len)
- {
- if (len == 0) {
- return;
- }
- #if ABP_EN
- if (abp_is_playing()) {
- #if ABP_PLAY_DIS_WAV_EN
- return;
- #else
- abp_stop();
- dac1_aubuf_clr();
- #endif // ABP_PLAY_DIS_WAV_EN
- }
- #endif // ABP_EN
- u8 dac_sta = dac_get_pwr_sta();
- func_bt_set_dac(1);
- #if TINY_TRANSPARENCY_EN
- sys_cb.ttp_sta = sys_cb.ttp_start;
- bsp_ttp_stop();
- #endif
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_adjust();
- #endif
- sys_clk_req(INDEX_RES_PLAY, SYS_160M);
- warning_play_init((u8*)addr, len, 1);
- while (!warning_play_proc()) {
- bt_thread_check_trigger();
- WDT_CLR();
- #if BT_TWS_EN && WARNING_BREAK_EN
- if(sys_cb.tws_res_brk) {
- sys_cb.tws_res_brk = 0;
- break;
- }
- #endif
- }
- warning_play_exit();
- sys_clk_free(INDEX_RES_PLAY);
- #if WARNING_SYSVOL_ADJ_EN
- bsp_res_sysvol_resume();
- #endif
- #if ABP_EN && !ABP_PLAY_DIS_WAV_EN
- if (sys_cb.abp_mode) {
- abp_start(sys_cb.abp_mode - 1);
- }
- #endif
- func_bt_set_dac(dac_sta);
- #if TINY_TRANSPARENCY_EN
- if (sys_cb.ttp_sta) {
- bsp_ttp_start();
- }
- #endif
- }
- #endif
- //提示音播报完毕,设置状态
- void bsp_res_play_exit_cb(uint8_t res_idx)
- {
- #if BT_LOW_LATENCY_EN
- if (TWS_RES_MUSIC_MODE == res_idx) {
- printf("music mode\n");
- bt_low_latency_disable();
- } else if (TWS_RES_GAME_MODE == res_idx) {
- printf("game mode\n");
- bt_low_latency_enable();
- }
- #endif
- #if ANC_EN
- uint8_t anc_mode = 0;
- if (TWS_RES_NR_DISABLE == res_idx) {
- anc_mode = 1;
- } else if (TWS_RES_ANC == res_idx) {
- anc_mode = 2;
- } else if (TWS_RES_TRANSPARENCY == res_idx) {
- anc_mode = 3;
- }
- if (anc_mode) {
- anc_mode--;
- bsp_anc_set_mode(anc_mode);
- bsp_param_write(&anc_mode, PARAM_ANC_NR_STA, 1);
- bsp_param_sync();
- }
- #endif
- #if ASR_EN
- if (res_idx == TWS_RES_ASR_ON) {
- sys_cb.asr_enable = 1;
- if (!bt_tws_is_slave()) {
- bsp_asr_start();
- }
- } else if (res_idx == TWS_RES_ASR_OFF) {
- sys_cb.asr_enable = 0;
- bsp_asr_stop();
- }
- #endif
- }
- #if !BT_TWS_EN
- uint8_t bsp_res_play(uint8_t res_idx)
- {
- //用于APP某些功能需要重启,和清除配对记录
- #if HLW_UI
- if(hlw_cb.donot_need_play_flag)
- {
- return;
- }
- #endif // HLW_UI
- uint8_t res_type = tws_res_get_type(res_idx);
- if (res_type != RES_TYPE_INVALID) {
- u32 addr, len;
- tws_res_get_addr(res_idx, &addr, &len);
- if (len != 0) {
- if(res_type == RES_TYPE_MP3) {
- #if WARNING_MP3_EN
- bt_audio_bypass();
- mp3_res_play(addr, len);
- bsp_res_play_exit_cb(res_idx);
- bt_audio_enable();
- #endif
- #if WARNING_WSBC_EN
- } else if(res_type == RES_TYPE_WSBC) {
- wsbc_res_play(addr, len);
- #endif
- #if WARNING_WAV_EN
- } else if(res_type == RES_TYPE_WAV) {
- wav_res_play(addr, len);
- #endif
- #if WARNING_PIANO_EN
- } else if(res_type == RES_TYPE_PIANO || res_type == RES_TYPE_TONE) {
- int type = (res_type == RES_TYPE_TONE)? WARNING_TONE : WARNING_PIANO;
- piano_res_play(type, (void *)addr);
- #endif
- }
- }
- }
- #if HLW_UI
- //报完电量后,才允许下一次播报低电
- if((res_idx == TWS_RES_BATTERY_HIGH)||(res_idx == TWS_RES_BATTERY_MIDDLE)||(res_idx == TWS_RES_BATTERY_LOW))
- {
- hlw_cb.poweron_lowbat_flag = false;
- }
- #endif // HLW_UI
- return RES_ERR_INVALID;
- }
- #endif
|