KT25-0812_82A-UART/apps/soundbox/task_manager/music/music.c

1031 lines
33 KiB
C
Raw Permalink Normal View History

2025-08-12 10:09:23 +00:00
#include "music/music.h"
#include "music_player.h"
#include "system/includes.h"
#include "app_config.h"
#include "app_task.h"
#include "app_main.h"
#include "clock_cfg.h"
#include "app_action.h"
#include "breakpoint.h"
#include "key_event_deal.h"
#include "tone_player.h"
#include "dev_multiplex_api.h"
#include "ui/ui_api.h"
#include "bt/bt.h"
#include "smartbox/smartbox.h"
#include "ui_manage.h"
#include "audio_dec.h"
#include "common/dev_status.h"
#include "clock_cfg.h"
#include "system/fs/fs.h"
/*************************************************************
music模式按键处理和事件处理
2025-08-21 08:15:01 +00:00
void app_music_task()
2025-08-12 10:09:23 +00:00
music模式主函数
2025-08-21 08:15:01 +00:00
static int music_sys_event_handler(struct sys_event *event)
2025-08-12 10:09:23 +00:00
music模式系统事件所有处理入口
2025-08-21 08:15:01 +00:00
static void music_task_close(void)
music模式退出
2025-08-12 10:09:23 +00:00
**************************************************************/
2025-08-21 08:15:01 +00:00
#define LOG_TAG_CONST APP_MUSIC
#define LOG_TAG "[APP_MUSIC]"
2025-08-12 10:09:23 +00:00
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
2025-08-21 08:15:01 +00:00
#define printfNFO_ENABLE
#define LOG_DUMP_ENABLE /* */
2025-08-12 10:09:23 +00:00
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_APP_MUSIC_EN
2025-08-21 08:15:01 +00:00
/// 模式参数结构体
struct __music_task_parm
{
2025-08-12 10:09:23 +00:00
u8 type;
int val;
};
2025-08-21 08:15:01 +00:00
/// music模式控制结构体
struct __music
{
2025-08-12 10:09:23 +00:00
struct __music_task_parm task_parm;
2025-08-21 08:15:01 +00:00
u16 file_err_counter; // 错误文件统计
u8 file_play_direct; // 0:下一曲, 1上一曲
u8 scandisk_break; // 扫描设备打断标志
2025-08-12 10:09:23 +00:00
char device_tone_dev[16];
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
u32 old_speed;
#endif
};
struct __music music_hdl;
#define __this (&music_hdl)
static struct __breakpoint *breakpoint = NULL;
static void music_player_play_start(void);
2025-08-21 08:15:01 +00:00
/// 设备提示音使能
#define MUSIC_DEVICE_TONE_EN 0
2025-08-12 10:09:23 +00:00
#if (MUSIC_DEVICE_TONE_EN)
2025-08-21 08:15:01 +00:00
struct __dev_tone
{
2025-08-12 10:09:23 +00:00
char *logo;
char *phy_logo;
char *tone_path;
2025-08-21 08:15:01 +00:00
u16 index;
2025-08-12 10:09:23 +00:00
};
2025-08-21 08:15:01 +00:00
enum
{
/// 0x1000起始为了不要跟提示音的IDEX_TONE_重叠了
2025-08-12 10:09:23 +00:00
DEVICE_INDEX_UDISK = 0x1000,
DEVICE_INDEX_UDISK_REC,
DEVICE_INDEX_SD0,
DEVICE_INDEX_SD0_REC,
DEVICE_INDEX_SD1,
DEVICE_INDEX_SD1_REC,
};
const struct __dev_tone device_tone[] = {
2025-08-21 08:15:01 +00:00
{"udisk0", "udisk0", TONE_RES_ROOT_PATH "tone/udisk.*", DEVICE_INDEX_UDISK},
{"udisk0_rec", "udisk0", TONE_RES_ROOT_PATH "tone/udisk.*", DEVICE_INDEX_UDISK_REC},
{"sd0", "sd0", TONE_RES_ROOT_PATH "tone/sd.*", DEVICE_INDEX_SD0},
{"sd0_rec", "sd0", TONE_RES_ROOT_PATH "tone/sd.*", DEVICE_INDEX_SD0_REC},
{"sd1", "sd1", TONE_RES_ROOT_PATH "tone/sd.*", DEVICE_INDEX_SD1},
{"sd1_rec", "sd1", TONE_RES_ROOT_PATH "tone/sd.*", DEVICE_INDEX_SD1_REC},
2025-08-12 10:09:23 +00:00
};
2025-08-21 08:15:01 +00:00
static void music_tone_play_end_callback(void *priv, int flag);
2025-08-12 10:09:23 +00:00
int music_device_tone_play(char *logo)
{
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
return false;
}
printf("__this->device_tone_dev = %s, logo =%s\n", __this->device_tone_dev, logo);
char *phy_logo = dev_manager_get_phy_logo(dev_manager_find_spec(logo, 0));
2025-08-21 08:15:01 +00:00
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0))
{
printf("[%s, %d]the same phy dev, no need device tone!!\n", logo, __LINE__);
2025-08-12 10:09:23 +00:00
return false;
}
2025-08-21 08:15:01 +00:00
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
{
if (strcmp(device_tone[i].logo, logo) == 0)
{
printf("[%s, %d]device_tone play \n", logo, __LINE__);
2025-08-12 10:09:23 +00:00
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
memcpy(__this->device_tone_dev, device_tone[i].phy_logo, strlen(device_tone[i].phy_logo));
tone_play_with_callback_by_name(device_tone[i].tone_path, 1, music_tone_play_end_callback, (void *)device_tone[i].index);
return true;
}
}
2025-08-21 08:15:01 +00:00
printf("[%s, %d]device_tone play \n", logo, __LINE__);
2025-08-12 10:09:23 +00:00
return false;
}
#endif
#if TCFG_LFN_EN
2025-08-21 08:15:01 +00:00
static u8 music_file_name[128] = {0}; // 长文件名
u16 music_file_name_len = 0;
2025-08-12 10:09:23 +00:00
#else
2025-08-21 08:15:01 +00:00
static u8 music_file_name[12 + 1] = {0}; // 8.3+\0
u16 music_file_name_len = 0;
2025-08-12 10:09:23 +00:00
#endif
const char *music_file_get_cur_name(int *len, int *is_unicode)
{
int unicode = fget_name_type(music_file_name, music_file_name_len);
2025-08-21 08:15:01 +00:00
*is_unicode = unicode;
2025-08-12 10:09:23 +00:00
*len = music_file_name_len;
return (const char *)music_file_name;
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码成功回调
@param priv: parm:
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void music_player_play_success(void *priv, int parm)
{
char *logo = music_player_get_dev_cur();
2025-08-21 08:15:01 +00:00
printf("\n\n----------------music_player_play_success----------------------\n");
printf("cur dev = %s\n", logo);
printf("total dev = %d\n", dev_manager_get_total(1));
printf("cur filenum = %d\n", music_player_get_file_cur());
printf("totol filenum = %d\n", music_player_get_file_total());
printf("totol time = %d\n", music_player_get_dec_total_time());
printf("sclust = %d\n", music_player_get_file_sclust());
printf("dir_cur = %d\n", music_player_get_dir_cur());
printf("dir_total = %d\n", music_player_get_dir_total());
printf("file indir = %d\n", music_player_get_fileindir_number());
music_file_name_len = fget_name(music_player_get_file_hdl(), music_file_name, sizeof(music_file_name));
2025-08-12 10:09:23 +00:00
int unicode = fget_name_type(music_file_name, music_file_name_len);
2025-08-21 08:15:01 +00:00
printf("cur file = %s\n", music_file_name);
printf("\n");
2025-08-12 10:09:23 +00:00
2025-08-21 08:15:01 +00:00
/// save breakpoint, 只保存文件信息
if (music_player_get_playing_breakpoint(breakpoint, 0) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, logo);
}
2025-08-21 08:15:01 +00:00
int analaz = music_player_lrc_analy_start();
/// show ui
2025-08-12 10:09:23 +00:00
UI_SHOW_MENU(MENU_FILENUM, 1000, music_player_get_file_cur(), NULL);
UI_MSG_POST("music_start:show_lyric=%4:dev=%4:filenum=%4:total_filenum=%4", !analaz, logo, music_player_get_file_cur(), music_player_get_file_total());
2025-08-21 08:15:01 +00:00
/// smartbox info update
2025-08-12 10:09:23 +00:00
SMARTBOX_UPDATE(MUSIC_FUNCTION_MASK,
BIT(MUSIC_INFO_ATTR_STATUS) | BIT(MUSIC_INFO_ATTR_FILE_NAME) | BIT(MUSIC_INFO_ATTR_FILE_PLAY_MODE));
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码结束回调处理
@param
@return
@note key msg中统一响应
*/
/*----------------------------------------------------------------------------*/
static void music_player_play_end(void *priv, int parm)
{
2025-08-21 08:15:01 +00:00
printf("music_player_play_end\n");
/// 这里推出消息, 目的是在music主流程switch case统一入口
2025-08-12 10:09:23 +00:00
app_task_put_key_msg(KEY_MUSIC_PLAYER_END, parm);
}
//*----------------------------------------------------------------------------*/
/**@brief music 播放器扫盘打断接口
@param
@return 1:0:
@note
*/
/*----------------------------------------------------------------------------*/
static int music_player_scandisk_break(void)
{
2025-08-21 08:15:01 +00:00
/// 注意:
/// 需要break fsn的事件 请在这里拦截,
/// 需要结合MUSIC_PLAYER_ERR_FSCAN错误做相应的处理
2025-08-12 10:09:23 +00:00
int msg[32] = {0};
struct sys_event *event = NULL;
char *logo = NULL;
char *evt_logo = NULL;
app_task_get_msg(msg, ARRAY_SIZE(msg), 0);
2025-08-21 08:15:01 +00:00
switch (msg[0])
{
2025-08-12 10:09:23 +00:00
case APP_MSG_SYS_EVENT:
event = (struct sys_event *)(&msg[1]);
2025-08-21 08:15:01 +00:00
switch (event->type)
{
2025-08-12 10:09:23 +00:00
case SYS_DEVICE_EVENT:
2025-08-21 08:15:01 +00:00
switch ((u32)event->arg)
{
2025-08-12 10:09:23 +00:00
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
2025-08-21 08:15:01 +00:00
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
2025-08-12 10:09:23 +00:00
evt_logo = (char *)"udisk0";
}
2025-08-21 08:15:01 +00:00
/// 设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
int str_len = 0;
2025-08-12 10:09:23 +00:00
logo = music_player_get_phy_dev(&str_len);
2025-08-21 08:15:01 +00:00
/// 响应设备插拔打断
if (event->u.dev.event == DEVICE_EVENT_OUT)
{
printf("__func__ = %s logo=%s evt_logo=%s %d\n", __FUNCTION__, logo, evt_logo, str_len);
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 1;
}
2025-08-21 08:15:01 +00:00
}
else
{
/// 响应新设备上线
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 1;
}
2025-08-21 08:15:01 +00:00
if (__this->scandisk_break == 0)
{
printf("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
2025-08-12 10:09:23 +00:00
dev_status_event_filter(event);
2025-08-21 08:15:01 +00:00
printf("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
2025-08-12 10:09:23 +00:00
}
break;
}
break;
case SYS_BT_EVENT:
2025-08-21 08:15:01 +00:00
if (bt_background_event_handler_filter(event))
{
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 1;
}
break;
case SYS_KEY_EVENT:
2025-08-21 08:15:01 +00:00
switch (event->u.key.event)
{
2025-08-12 10:09:23 +00:00
case KEY_CHANGE_MODE:
2025-08-21 08:15:01 +00:00
/// 响应切换模式事件
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 1;
break;
}
break;
}
break;
}
2025-08-21 08:15:01 +00:00
if (__this->scandisk_break)
{
/// 查询到需要打断的事件, 返回1 并且重新推送一次该事件,跑主循环处理流程
2025-08-12 10:09:23 +00:00
sys_event_notify(event);
printf("scandisk_break!!!!!!\n");
return 1;
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
return 0;
}
}
static const struct __player_cb music_player_callback = {
2025-08-21 08:15:01 +00:00
.start = music_player_play_success,
.end = music_player_play_end,
// .fsn_break = music_player_scandisk_break,
2025-08-12 10:09:23 +00:00
};
static void scan_enter(struct __dev *dev)
{
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
2025-08-21 08:15:01 +00:00
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_GET_SPEED, (u32)&__this->old_speed); // 获取sd速度
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{ // 设定速度大于获取的才加速
2025-08-12 10:09:23 +00:00
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, SD_BAUD_RATE_CHANGE_WHEN_SCAN);
}
}
}
#endif
clock_add_set(SCAN_DISK_CLK);
}
static void scan_exit(struct __dev *dev)
{
#ifdef SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
2025-08-21 08:15:01 +00:00
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, __this->old_speed); // 恢复原速
2025-08-12 10:09:23 +00:00
}
}
}
#endif
clock_remove_set(SCAN_DISK_CLK);
}
static const struct __scan_callback scan_cb = {
.enter = scan_enter,
.exit = scan_exit,
.scan_break = music_player_scandisk_break,
};
//*----------------------------------------------------------------------------*/
/**@brief music 模式提示音播放结束处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
2025-08-21 08:15:01 +00:00
static void music_tone_play_end_callback(void *priv, int flag)
2025-08-12 10:09:23 +00:00
{
u32 index = (u32)priv;
char *logo = NULL;
2025-08-21 08:15:01 +00:00
if (APP_MUSIC_TASK != app_get_curr_task())
{
2025-08-12 10:09:23 +00:00
log_error("tone callback task out \n");
return;
}
2025-08-21 08:15:01 +00:00
switch (index)
{
2025-08-12 10:09:23 +00:00
case IDEX_TONE_MUSIC:
2025-08-21 08:15:01 +00:00
/// 提示音播放结束, 启动播放器播放
2025-08-12 10:09:23 +00:00
music_player_play_start();
break;
#if (MUSIC_DEVICE_TONE_EN)
case DEVICE_INDEX_UDISK:
case DEVICE_INDEX_UDISK_REC:
case DEVICE_INDEX_SD0:
case DEVICE_INDEX_SD0_REC:
case DEVICE_INDEX_SD1:
case DEVICE_INDEX_SD1_REC:
2025-08-21 08:15:01 +00:00
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
{
if (index == device_tone[i].index)
{
2025-08-12 10:09:23 +00:00
logo = device_tone[i].logo;
break;
}
}
app_task_put_key_msg(KEY_MUSIC_DEVICE_TONE_END, (int)logo);
break;
#endif
default:
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式解码错误处理
@param err:MUSIC_PLAYER错误码表枚举
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_err_deal(int err)
{
u16 msg = KEY_NULL;
char *logo = NULL;
2025-08-21 08:15:01 +00:00
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL)
{
__this->file_err_counter = 0; /// 清除错误文件累计
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC)
{
2025-08-12 10:09:23 +00:00
log_e("music player err = %d\n", err);
}
2025-08-21 08:15:01 +00:00
switch (err)
{
2025-08-12 10:09:23 +00:00
case MUSIC_PLAYER_SUCC:
__this->file_err_counter = 0;
break;
case MUSIC_PLAYER_ERR_NULL:
break;
case MUSIC_PLAYER_ERR_POINT:
case MUSIC_PLAYER_ERR_NO_RAM:
2025-08-21 08:15:01 +00:00
msg = KEY_MUSIC_PLAYER_QUIT; // 退出音乐模式
2025-08-12 10:09:23 +00:00
break;
case MUSIC_PLAYER_ERR_DECODE_FAIL:
2025-08-21 08:15:01 +00:00
if (__this->file_err_counter >= music_player_get_file_total())
{
2025-08-12 10:09:23 +00:00
__this->file_err_counter = 0;
2025-08-21 08:15:01 +00:00
dev_manager_set_valid_by_logo(music_player_get_dev_cur(), 0); /// 将设备设置为无效设备
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT; // 没有设备了,退出音乐模式
}
else
{
//msg = KEY_MUSIC_AUTO_NEXT_DEV; /// 所有文件都是错误的, 切换到下一个设备
}
}
else
{
__this->file_err_counter++;
if (__this->file_play_direct == 0)
{
//msg = KEY_MUSIC_NEXT; // 播放下一曲
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
else
{
//msg = KEY_MUSIC_PREV; // 播放上一曲
2025-08-12 10:09:23 +00:00
}
}
break;
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
log_e("MUSIC_PLAYER_ERR_DEV_NOFOUND \n");
2025-08-21 08:15:01 +00:00
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT; /// 没有设备在线, 退出音乐模式
}
else
{
//msg = KEY_MUSIC_PLAYER_START; /// 没有找到指定设备, 播放之前的活动设备
2025-08-12 10:09:23 +00:00
}
break;
case MUSIC_PLAYER_ERR_FSCAN:
2025-08-21 08:15:01 +00:00
/// 需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break)
{
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 0;
2025-08-21 08:15:01 +00:00
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
2025-08-12 10:09:23 +00:00
break;
}
case MUSIC_PLAYER_ERR_DEV_READ:
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
logo = music_player_get_dev_cur();
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check_by_logo(logo, 1))
{
/// 如果错误失败在线, 并且是播放过程中产生的,先记录下断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, logo);
}
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_ERR_FSCAN)
{
dev_manager_set_valid_by_logo(logo, 0); /// 将设备设置为无效设备
}
else
{
// 针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
2025-08-12 10:09:23 +00:00
dev_manager_unmount(logo);
}
}
2025-08-21 08:15:01 +00:00
if (dev_manager_get_total(1) == 0)
{
msg = KEY_MUSIC_PLAYER_QUIT; /// 没有设备在线, 退出音乐模式
}
else
{
//msg = KEY_MUSIC_AUTO_NEXT_DEV; /// 切换设备
2025-08-12 10:09:23 +00:00
}
break;
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
2025-08-21 08:15:01 +00:00
/// 查找文件有扫盘的可能也需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break)
{
2025-08-12 10:09:23 +00:00
__this->scandisk_break = 0;
2025-08-21 08:15:01 +00:00
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
2025-08-12 10:09:23 +00:00
break;
}
case MUSIC_PLAYER_ERR_PARM:
logo = music_player_get_dev_cur();
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check_by_logo(logo, 1))
{
if (music_player_get_file_total())
{
//msg = KEY_MUSIC_PLAYER_PLAY_FIRST; /// 有文件,播放第一个文件
2025-08-12 10:09:23 +00:00
break;
}
}
2025-08-21 08:15:01 +00:00
if (dev_manager_get_total(1) == 0)
{
msg = KEY_MUSIC_PLAYER_QUIT; // 没有设备了,退出音乐模式
}
else
{
//msg = KEY_MUSIC_AUTO_NEXT_DEV;
2025-08-12 10:09:23 +00:00
}
break;
}
2025-08-21 08:15:01 +00:00
if (msg != KEY_NULL)
{
2025-08-12 10:09:23 +00:00
app_task_put_key_msg(msg, 0);
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 按键消息入口
@param
@return 1common不再处理 0common处理
@note
*/
/*----------------------------------------------------------------------------*/
static int music_key_event_opr(struct sys_event *event)
{
int ret = true;
int err = MUSIC_PLAYER_ERR_NULL;
u8 vol, auto_next_dev;
2025-08-21 08:15:01 +00:00
int mode;
2025-08-12 10:09:23 +00:00
char *logo = NULL;
2025-08-21 08:15:01 +00:00
char *play_name = NULL;
char str[32];
2025-08-12 10:09:23 +00:00
int msg[2];
msg[0] = event->u.key.event;
2025-08-21 08:15:01 +00:00
msg[1] = event->u.key.value; //
2025-08-12 10:09:23 +00:00
static int msg_demo = 0;
2025-08-21 08:15:01 +00:00
printf("music task msg = %d\n", msg[0]);
2025-08-12 10:09:23 +00:00
2025-08-21 08:15:01 +00:00
switch (msg[0])
{
2025-08-12 10:09:23 +00:00
case KEY_MUSIC_DEVICE_TONE_END:
#if (MUSIC_DEVICE_TONE_EN)
logo = (char *)msg[1];
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_DEVICE_TONE_END %s\n", logo);
if (logo)
{
if (true == breakpoint_vm_read(breakpoint, logo))
{
2025-08-12 10:09:23 +00:00
err = music_player_play_by_breakpoint(logo, breakpoint);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
err = music_player_play_first_file(logo);
}
}
break;
#endif
case KEY_MUSIC_PLAYER_START:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_START !!\n");
/// 断点播放活动设备
2025-08-12 10:09:23 +00:00
logo = dev_manager_get_logo(dev_manager_find_active(1));
2025-08-21 08:15:01 +00:00
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
if (music_player_get_dev_cur() && logo)
{
/// 播放的设备跟当前活动的设备是同一个设备,不处理
if (0 == strcmp(logo, music_player_get_dev_cur()))
{
2025-08-12 10:09:23 +00:00
log_w("the same dev!!\n");
break;
}
}
}
#if (MUSIC_DEVICE_TONE_EN)
2025-08-21 08:15:01 +00:00
if (music_device_tone_play(logo) == true)
{
2025-08-12 10:09:23 +00:00
break;
}
#endif
2025-08-21 08:15:01 +00:00
if (true == breakpoint_vm_read(breakpoint, logo))
{
2025-08-12 10:09:23 +00:00
err = music_player_play_by_breakpoint(logo, breakpoint);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
err = music_player_play_first_file(logo);
}
break;
2025-08-21 08:15:01 +00:00
case KEY_USER_PLAY_NUM:
printf("KEY_USER_PLAY_NUM = %d !!\n", msg[1]);
// memset(str, 0, 32);
// sprintf(str, "/%03d.*", msg[1]);
// printf("%s \n", str);
// err = music_player_play_by_path((char *)"fat_nor", str);
err = music_player_play_by_number((char *)"fat_nor", msg[1]);
printf("err = %d\n", err);
break;
case KEY_USER_PLAY_NAME:
printf("KEY_USER_PLAY_NAME !!\n");
play_name = (char *)msg[1];
printf("%s \n", play_name);
memset(str, 0, 32);
strcat(str, "/");
strcat(str, play_name);
strcat(str, ".*");
// strcat(play_name,".*")
printf("%s \n", str);
err = music_player_play_by_path((char *)"fat_nor", str);
printf("err = %d\n", err);
break;
case KEY_USER_PLAY_FULL_NAME:
printf("KEY_USER_PLAY_FULL_NAME !!\n");
play_name = (char *)msg[1];
printf("%s \n", play_name);
err = music_player_play_by_path((char *)"fat_nor", play_name);
printf("err = %d\n", err);
break;
/// 播放器退出处理
2025-08-12 10:09:23 +00:00
case KEY_MUSIC_PLAYER_QUIT:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_QUIT !!\n");
2025-08-12 10:09:23 +00:00
app_task_switch_next();
break;
2025-08-21 08:15:01 +00:00
/// 结束消息处理
2025-08-12 10:09:23 +00:00
case KEY_MUSIC_PLAYER_END:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_END\n");
2025-08-12 10:09:23 +00:00
err = music_player_end_deal(msg[1]);
break;
2025-08-21 08:15:01 +00:00
/// 播放执行类消息
case KEY_MUSIC_PP:
printf("KEY_MUSIC_PP\n");
2025-08-12 10:09:23 +00:00
err = music_player_pp();
2025-08-21 08:15:01 +00:00
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
2025-08-12 10:09:23 +00:00
ui_update_status(STATUS_MUSIC_PLAY);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
ui_update_status(STATUS_MUSIC_PAUSE);
}
printf("=============================================%d\n", music_player_get_play_status());
break;
case KEY_MUSIC_PLAYER_AUTO_NEXT:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_AUTO_NEXT\n");
2025-08-12 10:09:23 +00:00
err = music_player_play_auto_next();
break;
case KEY_MUSIC_PLAYER_PLAY_FIRST:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_PLAY_FIRST\n");
2025-08-12 10:09:23 +00:00
err = music_player_play_first_file(NULL);
break;
2025-08-21 08:15:01 +00:00
case KEY_MUSIC_PREV:
printf("KEY_MUSIC_PREV\n");
2025-08-12 10:09:23 +00:00
__this->file_play_direct = 1;
err = music_player_play_prev();
break;
2025-08-21 08:15:01 +00:00
case KEY_MUSIC_NEXT:
printf("KEY_MUSIC_NEXT\n");
2025-08-12 10:09:23 +00:00
__this->file_play_direct = 0;
err = music_player_play_next();
break;
case KEY_MUSIC_PLAYE_PREV_FOLDER:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_PREV_FOLDER\n");
2025-08-12 10:09:23 +00:00
err = music_player_play_folder_prev();
break;
case KEY_MUSIC_PLAYE_NEXT_FOLDER:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_NEXT_FOLDER\n");
2025-08-12 10:09:23 +00:00
err = music_player_play_folder_next();
break;
case KEY_MUSIC_AUTO_NEXT_DEV:
2025-08-21 08:15:01 +00:00
case KEY_MUSIC_CHANGE_DEV:
printf("KEY_MUSIC_CHANGE_DEV\n");
2025-08-12 10:09:23 +00:00
auto_next_dev = ((msg[0] == KEY_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
logo = music_player_get_dev_next(auto_next_dev);
printf("next dev = %s\n", logo);
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{ /// 找不到下一个设备,不响应设备切换
2025-08-12 10:09:23 +00:00
break;
}
2025-08-21 08:15:01 +00:00
/// 切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
#if (MUSIC_DEVICE_TONE_EN)
2025-08-21 08:15:01 +00:00
if (music_device_tone_play(logo) == true)
{
2025-08-12 10:09:23 +00:00
break;
}
#endif
2025-08-21 08:15:01 +00:00
if (true == breakpoint_vm_read(breakpoint, logo))
{
2025-08-12 10:09:23 +00:00
err = music_player_play_by_breakpoint(logo, breakpoint);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
err = music_player_play_first_file(logo);
}
break;
case KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH\n");
2025-08-12 10:09:23 +00:00
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
2025-08-21 08:15:01 +00:00
/// 尝试保存断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
2025-08-21 08:15:01 +00:00
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev()))
{
2025-08-12 10:09:23 +00:00
err = music_player_play_record_folder(NULL, breakpoint);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
err = music_player_play_record_folder(NULL, NULL);
}
2025-08-21 08:15:01 +00:00
#endif // TCFG_RECORD_FOLDER_DEV_ENABLE
2025-08-12 10:09:23 +00:00
break;
case KEY_MUSIC_PLAYE_BY_DEV_FILENUM:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_BY_DEV_FILENUM\n");
2025-08-12 10:09:23 +00:00
err = music_player_play_by_number((char *)"udisk0", 1);
break;
case KEY_MUSIC_PLAYE_BY_DEV_SCLUST:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_BY_DEV_SCLUST\n");
2025-08-12 10:09:23 +00:00
logo = dev_manager_get_logo(dev_manager_find_active(1));
err = music_player_play_by_sclust(logo, msg[1]);
break;
case KEY_MUSIC_PLAYE_BY_DEV_PATH:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYE_BY_DEV_PATH\n");
err = music_player_play_by_path((char *)"udisk0", "/sin.wav"); /// this is a demo
2025-08-12 10:09:23 +00:00
break;
2025-08-21 08:15:01 +00:00
/// 非播放执行类消息
2025-08-12 10:09:23 +00:00
case KEY_MUSIC_FF:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_FF\n");
2025-08-12 10:09:23 +00:00
music_player_ff(3);
break;
case KEY_MUSIC_FR:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_FR\n");
2025-08-12 10:09:23 +00:00
music_player_fr(3);
break;
case KEY_MUSIC_CHANGE_REPEAT:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_CHANGE_REPEAT\n");
2025-08-12 10:09:23 +00:00
mode = music_player_change_repeat_mode();
2025-08-21 08:15:01 +00:00
if (mode > 0)
{
2025-08-12 10:09:23 +00:00
UI_SHOW_MENU(MENU_MUSIC_REPEATMODE, 1000, mode, NULL);
}
break;
case KEY_MUSIC_DELETE_FILE:
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_DELETE_FILE\n");
2025-08-12 10:09:23 +00:00
err = music_player_delete_playing_file();
break;
default:
ret = false;
break;
}
2025-08-21 08:15:01 +00:00
/// 错误处理
2025-08-12 10:09:23 +00:00
music_player_err_deal(err);
2025-08-21 08:15:01 +00:00
/// smartbox info update
2025-08-12 10:09:23 +00:00
SMARTBOX_UPDATE(MUSIC_FUNCTION_MASK,
BIT(MUSIC_INFO_ATTR_STATUS) | BIT(MUSIC_INFO_ATTR_FILE_PLAY_MODE));
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief music 设备事件响应接口
@param
@return 1comomon不再做处理 0common统一处理
@note
*/
/*----------------------------------------------------------------------------*/
static int music_sys_event_handler(struct sys_event *event)
{
int err = 0;
char *logo = NULL;
char *evt_logo = NULL;
2025-08-21 08:15:01 +00:00
switch (event->type)
{
2025-08-12 10:09:23 +00:00
case SYS_KEY_EVENT:
return music_key_event_opr(event);
case SYS_DEVICE_EVENT:
2025-08-21 08:15:01 +00:00
switch ((u32)event->arg)
{
2025-08-12 10:09:23 +00:00
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
2025-08-21 08:15:01 +00:00
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
2025-08-12 10:09:23 +00:00
evt_logo = (char *)"udisk0";
}
2025-08-21 08:15:01 +00:00
int str_len = 0;
2025-08-12 10:09:23 +00:00
logo = music_player_get_phy_dev(&str_len);
2025-08-21 08:15:01 +00:00
printf("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
if (event->u.dev.event == DEVICE_EVENT_OUT)
{
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
break;
}
2025-08-21 08:15:01 +00:00
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, logo);
}
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
2025-08-21 08:15:01 +00:00
/// 停止解码,防止设备掉线后还继续使用
2025-08-12 10:09:23 +00:00
music_player_stop(1);
2025-08-21 08:15:01 +00:00
/// 重新选择活动设备播放
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0); // 卸载了设备再执行
printf("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
}
else
{
/// 新设备上线, 先记录当前设备断点, 然后播放活动设备
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, logo);
}
2025-08-21 08:15:01 +00:00
/// 停止解码,播放新活动设备
2025-08-12 10:09:23 +00:00
music_player_stop(1);
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
2025-08-21 08:15:01 +00:00
printf("KEY_MUSIC_PLAYER_START AFTER MOUNT\n");
// 先挂载了设备再执行
2025-08-12 10:09:23 +00:00
}
break;
2025-08-21 08:15:01 +00:00
default: // switch((u32)event->arg)
2025-08-12 10:09:23 +00:00
break;
}
2025-08-21 08:15:01 +00:00
break; // SYS_DEVICE_EVENT
default: // switch (event->type)
2025-08-12 10:09:23 +00:00
break;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式切换前参数设置
@param type:,
2025-08-21 08:15:01 +00:00
MUSIC_TASK_START_BY_NORMAL
MUSIC_TASK_START_BY_SCLUST
val:
2025-08-12 10:09:23 +00:00
@return
@note music_player_play_start接口
*/
/*----------------------------------------------------------------------------*/
void music_task_set_parm(u8 type, int val)
{
__this->task_parm.type = type;
__this->task_parm.val = val;
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式首次播放
@param
@return
@note music_task_set_parm设置参数,
2025-08-21 08:15:01 +00:00
2025-08-12 10:09:23 +00:00
*/
/*----------------------------------------------------------------------------*/
static void music_player_play_start(void)
{
2025-08-21 08:15:01 +00:00
switch (__this->task_parm.type)
{
2025-08-12 10:09:23 +00:00
case MUSIC_TASK_START_BY_NORMAL:
2025-08-21 08:15:01 +00:00
printf("MUSIC_TASK_START_BY_NORMAL\n");
2025-08-12 10:09:23 +00:00
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
break;
case MUSIC_TASK_START_BY_SCLUST:
2025-08-21 08:15:01 +00:00
printf("MUSIC_TASK_START_BY_SCLUST\n");
2025-08-12 10:09:23 +00:00
app_task_put_key_msg(KEY_MUSIC_PLAYE_BY_DEV_SCLUST, __this->task_parm.val);
break;
default:
2025-08-21 08:15:01 +00:00
printf("other MUSIC_TASK_START!!!\n");
2025-08-12 10:09:23 +00:00
break;
}
2025-08-21 08:15:01 +00:00
/// 提示音播放失败直接推送KEY_MUSIC_PLAYER_START启动播放
2025-08-12 10:09:23 +00:00
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式初始化处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void music_task_start()
{
printf("music task start!!!!!\n");
ui_update_status(STATUS_MUSIC_MODE);
2025-08-21 08:15:01 +00:00
/// 显示初始化
2025-08-12 10:09:23 +00:00
UI_SHOW_WINDOW(ID_WINDOW_MUSIC);
UI_SHOW_MENU(MENU_WAIT, 0, 0, NULL);
2025-08-21 08:15:01 +00:00
/// 时钟初始化
2025-08-12 10:09:23 +00:00
clock_idle(MUSIC_IDLE_CLOCK);
2025-08-21 08:15:01 +00:00
/// 按键使能
2025-08-12 10:09:23 +00:00
sys_key_event_enable();
#if (TCFG_LRC_LYRICS_ENABLE)
extern int lrc_init(void);
lrc_init();
#endif
2025-08-21 08:15:01 +00:00
/// 播放器初始化
2025-08-12 10:09:23 +00:00
struct __player_parm parm = {0};
parm.cb = (struct __player_cb *)&music_player_callback;
parm.scan_cb = (struct __scan_callback *)&scan_cb;
music_player_creat(NULL, &parm);
2025-08-21 08:15:01 +00:00
/// 获取断点句柄, 后面所有断点读/写都需要用到
2025-08-12 10:09:23 +00:00
breakpoint = breakpoint_handle_creat();
2025-08-21 08:15:01 +00:00
/// 初始化一些参数
2025-08-12 10:09:23 +00:00
__this->file_err_counter = 0;
__this->file_play_direct = 0;
__this->scandisk_break = 0;
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式退出处理
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void music_task_close()
{
UI_HIDE_CURR_WINDOW();
2025-08-21 08:15:01 +00:00
tone_play_stop_by_path(tone_table[IDEX_TONE_MUSIC]); // 停止播放提示音
2025-08-12 10:09:23 +00:00
char *logo = music_player_get_dev_cur();
2025-08-21 08:15:01 +00:00
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
2025-08-12 10:09:23 +00:00
breakpoint_vm_write(breakpoint, logo);
}
breakpoint_handle_destroy(&breakpoint);
music_player_destroy();
#if (TCFG_LRC_LYRICS_ENABLE)
extern void lrc_exit(void);
lrc_exit();
#endif
memset(__this, 0, sizeof(struct __music));
}
//*----------------------------------------------------------------------------*/
/**@brief music 在线检测 切换模式判断使用
@param
@return 1 线 0 线
@note
*/
/*----------------------------------------------------------------------------*/
int music_app_check(void)
{
2025-08-21 08:15:01 +00:00
if (dev_manager_get_total(1))
{
2025-08-12 10:09:23 +00:00
return true;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief music 主任务
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_music_task()
{
int res;
int msg[32];
music_task_start();
#if (MUSIC_DEVICE_TONE_EN)
music_player_play_start();
#else
2025-08-21 08:15:01 +00:00
// tone_play_with_callback_by_name(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC);
2025-08-12 10:09:23 +00:00
#endif
2025-08-21 08:15:01 +00:00
music_player_set_repeat_mode(FCYCLE_ONE);
2025-08-12 10:09:23 +00:00
2025-08-21 08:15:01 +00:00
while (1)
{
2025-08-12 10:09:23 +00:00
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
2025-08-21 08:15:01 +00:00
switch (msg[0])
{
2025-08-12 10:09:23 +00:00
case APP_MSG_SYS_EVENT:
2025-08-21 08:15:01 +00:00
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false)
{
2025-08-12 10:09:23 +00:00
app_default_event_deal((struct sys_event *)(&msg[1]));
}
break;
default:
break;
}
2025-08-21 08:15:01 +00:00
if (app_task_exitting())
{
2025-08-12 10:09:23 +00:00
music_task_close();
return;
}
}
}
#else
void app_music_task()
{
}
#endif