Files
AC707N/SDK/apps/watch/mode/music/music_app_msg_handler.c
T
2025-12-03 11:12:34 +08:00

343 lines
13 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".music_app_msg_handler.data.bss")
#pragma data_seg(".music_app_msg_handler.data")
#pragma const_seg(".music_app_msg_handler.text.const")
#pragma code_seg(".music_app_msg_handler.text")
#endif
#include "key_driver.h"
#include "app_main.h"
#include "init.h"
#include "dev_manager.h"
#include "music/music_player.h"
#include "music/breakpoint.h"
#include "app_music.h"
#include "scene_switch.h"
#include "node_param_update.h"
#include "clock_manager/clock_manager.h"
extern struct __music music_hdl;
//*----------------------------------------------------------------------------*/
/**@brief music 模式解码错误处理
@param err:错误码,详细错误码描述请看MUSIC_PLAYER错误码表枚举
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_err_deal(int err)
{
u16 msg = APP_MSG_NULL;
char *logo = NULL;
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL) {
music_hdl.file_err_counter = 0;///清除错误文件累计
}
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC) {
log_e("music player err = %d\n", err);
}
switch (err) {
case MUSIC_PLAYER_SUCC:
music_hdl.file_err_counter = 0;
break;
case MUSIC_PLAYER_ERR_NULL:
break;
case MUSIC_PLAYER_ERR_POINT:
/* fall-through */
case MUSIC_PLAYER_ERR_NO_RAM:
msg = APP_MSG_GOTO_NEXT_MODE;//退出音乐模式
break;
case MUSIC_PLAYER_ERR_DECODE_FAIL:
if (music_hdl.file_err_counter >= music_hdl.player_hd->fsn->file_number) {
music_hdl.file_err_counter = 0;
dev_manager_set_valid_by_logo(dev_manager_get_logo(music_hdl.player_hd->dev), 0);///将设备设置为无效设备
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
msg = APP_MSG_GOTO_NEXT_MODE;//没有设备了,退出音乐模式
} else {
msg = APP_MSG_MUSIC_AUTO_NEXT_DEV;///所有文件都是错误的, 切换到下一个设备
}
} else {
music_hdl.file_err_counter ++;
if (music_hdl.file_play_direct == 0) {
msg = APP_MSG_MUSIC_NEXT;//播放下一曲
} else {
msg = APP_MSG_MUSIC_PREV;//播放上一曲
}
}
break;
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
log_e("MUSIC_PLAYER_ERR_DEV_NOFOUND \n");
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
msg = APP_MSG_GOTO_NEXT_MODE;///没有设备在线, 退出音乐模式
} else {
msg = APP_MSG_MUSIC_PLAY_FIRST;///没有找到指定设备, 播放之前的活动设备
}
break;
case MUSIC_PLAYER_ERR_FSCAN:
///需要结合music_player_scandisk_break中处理的标志位处理
if (music_hdl.scandisk_break) {
music_hdl.scandisk_break = 0;
///此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
}
case MUSIC_PLAYER_ERR_DEV_READ:
log_e("MUSIC_PLAYER_ERR_DEV_READ \n");
/* fall-through */
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
logo = dev_manager_get_logo(music_hdl.player_hd->dev);
if (dev_manager_online_check_by_logo(logo, 1)) {
///如果错误失败在线, 并且是播放过程中产生的,先记录下断点
if (music_player_get_playing_breakpoint(music_hdl.player_hd, music_hdl.breakpoint, 1) == true) {
music_player_stop(music_hdl.player_hd, 0);//先停止,防止下一步操作VM卡顿
breakpoint_vm_write(music_hdl.breakpoint, logo);
}
if (err == MUSIC_PLAYER_ERR_FSCAN) {
dev_manager_set_valid_by_logo(logo, 0);///将设备设置为无效设备
} else {
//针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
dev_manager_unmount(logo);
}
}
if (dev_manager_get_total(1) == 0) {
/* app_status_handler(APP_STATUS_MUSIC_QUIT); */
msg = APP_MSG_GOTO_NEXT_MODE;///没有设备在线, 退出音乐模式
} else {
msg = APP_MSG_MUSIC_AUTO_NEXT_DEV;///切换设备
}
break;
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
///查找文件有扫盘的可能,也需要结合music_player_scandisk_break中处理的标志位处理
if (music_hdl.scandisk_break) {
music_hdl.scandisk_break = 0;
///此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
}
case MUSIC_PLAYER_ERR_PARM:
logo = dev_manager_get_logo(music_hdl.player_hd->dev);
if (dev_manager_online_check_by_logo(logo, 1)) {
if (music_hdl.player_hd->fsn->file_number) {
msg = APP_MSG_MUSIC_PLAY_FIRST;///有文件,播放第一个文件
break;
}
}
if (dev_manager_get_total(1) == 0) {
msg = APP_MSG_GOTO_NEXT_MODE;//没有设备了,退出音乐模式
} else {
msg = APP_MSG_MUSIC_AUTO_NEXT_DEV;
}
break;
case MUSIC_PLAYER_ERR_FILE_READ://文件读错误
msg = APP_MSG_MUSIC_NEXT;//播放下一曲
break;
}
if (msg != APP_MSG_NULL) {
app_send_message(msg, 0);
}
}
int music_app_msg_handler(int *msg)
{
int err = MUSIC_PLAYER_ERR_NULL;
char *logo = NULL;
if (false == app_in_mode(APP_MODE_MUSIC)) {
return 0;
}
u8 auto_next_dev;
struct file_player *file_player = get_music_file_player();
switch (msg[0]) {
case APP_MSG_CHANGE_MODE:
printf("app msg key change mode\n");
app_send_message(APP_MSG_GOTO_NEXT_MODE, 0);
break;
case APP_MSG_MUSIC_PP:
printf("app msg music pp\n");
music_file_player_pp(file_player);
app_send_message(APP_MSG_MUSIC_PLAY_STATUS, music_file_get_player_status(file_player));
break;
case APP_MSG_MUSIC_SPEED_UP:
printf("app msg music speed up\n");
music_hdl.speed_mode = music_file_speed_up(file_player);
clock_refurbish();
break;
case APP_MSG_MUSIC_SPEED_DOWN:
printf("app msg music speed down\n");
music_hdl.speed_mode = music_file_speed_down(file_player);
clock_refurbish();
break;
case APP_MSG_PITCH_UP:
printf("app msg music pitch up\n");
music_hdl.pitch_mode = music_file_pitch_up(file_player);
break;
case APP_MSG_PITCH_DOWN:
printf("app msg music pitch down\n");
music_hdl.pitch_mode = music_file_pitch_down(file_player);
break;
case APP_MSG_MUSIC_CHANGE_REPEAT:
music_player_change_repeat_mode(music_hdl.player_hd);
app_send_message(APP_MSG_REPEAT_MODE_CHANGED, music_player_get_repeat_mode());
break;
case APP_MSG_MUSIC_PLAYER_AB_REPEAT_SWITCH:
printf("app msg music ab repeat switch\n");
#if FILE_DEC_AB_REPEAT_EN
music_file_ab_repeat_switch(file_player);
#endif
break;
case APP_MSG_MUSIC_PLAY_FIRST:
printf("music_player_play_first_file\n");
err = music_player_play_first_file(music_hdl.player_hd, NULL);
break;
case APP_MSG_MUSIC_NEXT:
printf("app msg music next\n");
mem_stats();
/* app_status_handler(APP_STATUS_MUSIC_FFR); */
music_hdl.file_play_direct = 0;
err = music_player_play_next(music_hdl.player_hd);
break;
case APP_MSG_MUSIC_PREV:
printf("app msg music prev\n");
mem_stats();
/* app_status_handler(APP_STATUS_MUSIC_FFR); */
music_hdl.file_play_direct = 1;
err = music_player_play_prev(music_hdl.player_hd);
break;
case APP_MSG_MUSIC_PLAYE_PREV_FOLDER:
err = music_player_play_folder_prev(music_hdl.player_hd);
break;
case APP_MSG_MUSIC_PLAYE_NEXT_FOLDER:
err = music_player_play_folder_next(music_hdl.player_hd);
break;
case APP_MSG_MUSIC_AUTO_NEXT_DEV:
/* fall-through */
case APP_MSG_MUSIC_CHANGE_DEV:
log_i("KEY_MUSIC_CHANGE_DEV\n");
auto_next_dev = ((msg[0] == APP_MSG_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
logo = music_player_get_dev_next(music_hdl.player_hd, auto_next_dev);
if (logo == NULL) { ///找不到下一个设备,不响应设备切换
break;
}
printf("next dev = %s\n", logo);
///切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
if (music_player_get_playing_breakpoint(music_hdl.player_hd, music_hdl.breakpoint, 1) == true) {
music_player_stop(music_hdl.player_hd, 0); //先停止,防止下一步操作VM卡顿
breakpoint_vm_write(music_hdl.breakpoint, dev_manager_get_logo(music_hdl.player_hd->dev));
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
break;
}
#endif
if (true == breakpoint_vm_read(music_hdl.breakpoint, logo)) {
err = music_player_play_by_breakpoint(music_hdl.player_hd, logo, music_hdl.breakpoint);
} else {
err = music_player_play_first_file(music_hdl.player_hd, logo);
}
break;
case APP_MSG_MUSIC_PLAY_REC_FOLDER_SWITCH:
log_i("KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH\n");
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
///尝试保存断点
if (music_player_get_playing_breakpoint(music_hdl.player_hd, breakpoint, 1) == true) {
breakpoint_vm_write(breakpoint, dev_manager_get_logo(music_hdl.player_hd->dev));
}
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev())) {
err = music_player_play_record_folder(music_hdl.player_hd, NULL, breakpoint);
} else {
err = music_player_play_record_folder(music_hdl.player_hd, NULL, NULL);
}
#endif//TCFG_RECORD_FOLDER_DEV_ENABLE
break;
case APP_MSG_MUSIC_PLAY_START_BY_DEV:
#if (MUSIC_DEVICE_TONE_EN)
logo = (char *)msg[1];
log_i("KEY_MUSIC_DEVICE_TONE_END %s\n", logo);
if (logo) {
if (true == breakpoint_vm_read(music_hdl.breakpoint, logo)) {
err = music_player_play_by_breakpoint(music_hdl.player_hd, logo, music_hdl.breakpoint);
} else {
err = music_player_play_first_file(music_hdl.player_hd, logo);
}
}
break;
#endif
case APP_MSG_MUSIC_MOUNT_PLAY_START:
logo = (char *)msg[1];
log_i("APP_MSG_MUSIC_MOUNT_PLAY_START %s\n", logo);
dev_manager_set_active_by_logo(logo);
/* fall-through */
case APP_MSG_MUSIC_PLAY_START:
log_i("APP_MSG_MUSIC_PLAY_START !!\n");
#if 1
/* app_status_handler(APP_STATUS_MUSIC_PLAY); */
///断点播放活动设备
logo = dev_manager_get_logo(dev_manager_find_active(1));
if (music_player_runing()) {
if (dev_manager_get_logo(music_hdl.player_hd->dev) && logo) {///播放的设备跟当前活动的设备是同一个设备,不处理
if (0 == strcmp(logo, dev_manager_get_logo(music_hdl.player_hd->dev))) {
log_w("the same dev!!\n");
break;
}
}
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
break;
}
#endif
log_i("APP_MSG_MUSIC_PLAY_START %s\n", logo);
if (true == breakpoint_vm_read(music_hdl.breakpoint, logo)) {
err = music_player_play_by_breakpoint(music_hdl.player_hd, logo, music_hdl.breakpoint);
} else {
err = music_player_play_first_file(music_hdl.player_hd, logo);
}
#endif
break;
case APP_MSG_MUSIC_PLAY_START_BY_SCLUST:
log_i("KEY_MUSIC_PLAYE_BY_DEV_SCLUST\n");
logo = dev_manager_get_logo(dev_manager_find_active(1));
err = music_player_play_by_sclust(music_hdl.player_hd, logo, msg[1]);
break;
case APP_MSG_MUSIC_FR:
printf("app msg music fr \n");
music_file_player_fr(3, file_player);
break;
case APP_MSG_MUSIC_FF:
printf("app msg music ff\n");
music_file_player_ff(3, file_player);
break;
case APP_MSG_MUSIC_PLAYER_END:
err = music_player_end_deal(music_hdl.player_hd, msg[1]);
break;
case APP_MSG_MUSIC_DEC_ERR:
err = music_player_decode_err_deal(music_hdl.player_hd, msg[1]);
break;
case APP_MSG_MUSIC_PLAY_BY_NUM:
printf("APP_MSG_MUSIC_PLAY_BY_NUM:%d\n", msg[1]);
logo = dev_manager_get_logo(dev_manager_find_active(1));
err = music_player_play_by_number(music_hdl.player_hd, logo, msg[1]);
break;
case APP_MSG_MUSIC_PLAY_START_AT_DEST_TIME:
#if FILE_DEC_DEST_PLAY
if (music_player_runing()) {
//for test 测试MP3定点播放功能
puts("\n play start at 5s \n");
file_dec_set_start_play(5000, AUDIO_CODING_MP3);
}
#endif
break;
default:
app_common_key_msg_handler(msg);
break;
}
music_player_err_deal(err);
return 0;
}