KT25-0812_82A-UART/apps/common/music/music_player.c

1665 lines
51 KiB
C
Raw Normal View History

2025-08-12 10:09:23 +00:00
#include "music/music_player.h"
#include "key_event_deal.h"
#include "app_config.h"
#include "audio_enc.h"
#include "app_main.h"
2025-08-27 16:29:07 +00:00
#include "kt.h"
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
#define LOG_INFO_ENABLE
2025-08-21 08:15:01 +00:00
#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
#define MUSIC_PLAYER_CYCLE_ALL_DEV_EN 1 // FCYCLE_ALL循环模式是否使能所有设备循环
2025-08-12 10:09:23 +00:00
2025-08-21 08:15:01 +00:00
/// music player总控制句柄
struct __music_player
{
struct __dev *dev; // 当前播放设备节点
struct vfscan *fsn; // 设备扫描句柄
FILE *file; // 当前播放文件句柄
FILE *lrc_file; // 当前播放文件句柄
void *priv; // music回调函数私有参数
struct __player_parm parm; // 回调及参数配置
2025-08-12 10:09:23 +00:00
};
static struct __music_player *music_player = NULL;
2025-08-21 08:15:01 +00:00
#define __this music_player
2025-08-12 10:09:23 +00:00
static volatile u16 magic_cnt = 0;
2025-08-21 08:15:01 +00:00
/// 播放参数,文件扫描时用,文件后缀等
2025-08-12 10:09:23 +00:00
static const char scan_parm[] = "-t"
#if (TCFG_DEC_MP3_ENABLE)
"MP1MP2MP3"
#endif
#if (TCFG_DEC_WMA_ENABLE)
"WMA"
#endif
2025-08-21 08:15:01 +00:00
#if (TCFG_DEC_WAV_ENABLE || TCFG_DEC_DTS_ENABLE)
2025-08-12 10:09:23 +00:00
"WAVDTS"
#endif
#if (TCFG_DEC_FLAC_ENABLE)
"FLA"
#endif
#if (TCFG_DEC_APE_ENABLE)
"APE"
#endif
#if (TCFG_DEC_M4A_ENABLE)
"M4AAAC"
#endif
#if (TCFG_DEC_M4A_ENABLE || TCFG_DEC_ALAC_ENABLE)
"MP4"
#endif
#if (TCFG_DEC_AMR_ENABLE)
"AMR"
#endif
#if (TCFG_DEC_DECRYPT_ENABLE)
"SMP"
#endif
#if (TCFG_DEC_MIDI_ENABLE)
"MID"
#endif
" -sn -r"
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
2025-08-21 08:15:01 +00:00
" -m" REC_FOLDER_NAME
2025-08-12 10:09:23 +00:00
#endif
2025-08-21 08:15:01 +00:00
;
2025-08-12 10:09:23 +00:00
volatile u8 save_mode_cnt = 0;
volatile u16 save_mode_timer = 0;
//*----------------------------------------------------------------------------*/
/**@brief music_player循环模式处理接口
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void music_player_mode_save_do(void *priv)
{
local_irq_disable();
2025-08-21 08:15:01 +00:00
if (++save_mode_cnt >= 5)
{
if (save_mode_timer)
{
2025-08-12 10:09:23 +00:00
sys_timer_del(save_mode_timer);
}
save_mode_timer = 0;
save_mode_cnt = 0;
local_irq_enable();
log_info("MODE_SAVE\n");
syscfg_write(CFG_MUSIC_MODE, &app_var.cycle_mode, 1);
return;
}
local_irq_enable();
}
//*----------------------------------------------------------------------------*/
/**@brief music_player释放接口
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_destroy(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
free(__this);
__this = NULL;
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player创建接口
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
bool music_player_creat(void *priv, struct __player_parm *parm)
{
__this = zalloc(sizeof(struct __music_player));
2025-08-21 08:15:01 +00:00
if (__this == NULL)
{
2025-08-12 10:09:23 +00:00
return false;
}
__this->priv = priv;
memcpy(&__this->parm, parm, sizeof(struct __player_parm));
ASSERT(__this->parm.cb, "music_player parm error!!\n");
ASSERT(__this->parm.scan_cb, "music_player parm error 1 !!\n");
return true;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放结束处理
@param parm
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_end_deal(int parm)
{
int err = 0;
u8 event = (u8)parm;
u8 read_err = (u8)(parm >> 8);
u16 magic = (u16)(parm >> 16);
2025-08-21 08:15:01 +00:00
switch (event)
{
/// 文件播放结束, 包括正常播放结束和读文件错误导致的结束, 如拔掉设备产生的错误结束
2025-08-12 10:09:23 +00:00
case AUDIO_PLAY_EVENT_END:
log_i("AUDIO_PLAY_EVENT_END\n");
2025-08-21 08:15:01 +00:00
if (read_err)
{
2025-08-12 10:09:23 +00:00
log_e("read err, magic err = %d, %d\n", magic, magic_cnt);
2025-08-21 08:15:01 +00:00
if (magic == magic_cnt - 1)
{
err = MUSIC_PLAYER_ERR_DEV_READ; /// 设备读错误
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
else
{
err = MUSIC_PLAYER_ERR_NULL; /// 序号已经对不上了, 不处理
}
}
else
{
/// 正常结束,自动下一曲
2025-08-27 16:29:07 +00:00
printf("......app_var.cycle_mode : %d \n", app_var.cycle_mode);
2025-08-12 10:09:23 +00:00
#if (MUSIC_PLAYER_CYCLE_ALL_DEV_EN)
u32 cur_file = music_player_get_file_cur();
2025-08-21 08:15:01 +00:00
if ((music_player_get_record_play_status() == false) && (app_var.cycle_mode == FCYCLE_ALL) && (cur_file >= music_player_get_file_total()) && (dev_manager_get_total(1) > 1))
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_first_file 1 \n");
2025-08-12 10:09:23 +00:00
char *logo = music_player_get_dev_flit("_rec", 1);
2025-08-21 08:15:01 +00:00
if (logo)
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_first_file 2 \n");
2025-08-12 10:09:23 +00:00
err = music_player_play_first_file(logo);
break;
}
}
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 1 \n");
2025-08-21 08:15:01 +00:00
#endif /*MUSIC_PLAYER_CYCLE_ALL_DEV_EN*/
2025-08-27 16:29:07 +00:00
printf("......kt_get_cycle() : %d \n", kt_get_cycle());
if (kt_get_cycle() != FCYCLE_ONE && kt_get_cycle() != FCYCLE_LIST)
{
printf("......music_player_play_auto_next 2\n");
err = music_player_play_auto_next();
}
2025-08-12 10:09:23 +00:00
}
2025-08-27 16:29:07 +00:00
printf("......music_player_end_deal 1 \n");
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 AUDIO_PLAY_EVENT_ERR:
log_i("AUDIO_PLAY_EVENT_ERR\n");
2025-08-21 08:15:01 +00:00
//err = music_player_play_auto_next(); /// 文件播放过程出现的错误, 自动下一曲
2025-08-12 10:09:23 +00:00
break;
default:
break;
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放结束事件回调
@param
@return
@note api层接口
*/
/*----------------------------------------------------------------------------*/
static void music_player_end_event_callback(void *priv, int argc, int *argv)
{
u8 event = (u8)argv[0];
u8 read_err = (u8)argv[1];
u16 magic = (u16)priv;
log_i("music_player_end_event_callback\n");
int parm = event | (read_err << 8) | (magic << 16);
2025-08-21 08:15:01 +00:00
if (__this->parm.cb && __this->parm.cb->end)
{
2025-08-12 10:09:23 +00:00
__this->parm.cb->end(__this->priv, parm);
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player解码器启动接口
@param
2025-08-21 08:15:01 +00:00
file
dbp
2025-08-12 10:09:23 +00:00
@return music_player
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_decode_start(FILE *file, struct audio_dec_breakpoint *dbp)
{
2025-08-21 08:15:01 +00:00
if (file)
{
/// get file short name
u8 file_name[12 + 1] = {0}; // 8.3+\0
2025-08-12 10:09:23 +00:00
fget_name(music_player_get_file_hdl(), file_name, sizeof(file_name));
log_i("\n");
log_i("file name: %s\n", file_name);
log_i("\n");
}
int ret;
ret = file_dec_create((void *)magic_cnt, music_player_end_event_callback);
2025-08-21 08:15:01 +00:00
if (ret)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_NO_RAM;
}
2025-08-21 08:15:01 +00:00
magic_cnt++;
2025-08-12 10:09:23 +00:00
ret = file_dec_open(file, dbp);
2025-08-21 08:15:01 +00:00
if (ret)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DECODE_FAIL;
}
2025-08-21 08:15:01 +00:00
if (__this->parm.cb && __this->parm.cb->start)
{
2025-08-12 10:09:23 +00:00
__this->parm.cb->start(__this->priv, 0);
}
return MUSIC_PLAYER_SUCC;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放设备断点信息
@param
2025-08-21 08:15:01 +00:00
bp
flag
1 0
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
bool music_player_get_playing_breakpoint(struct __breakpoint *bp, u8 flag)
{
2025-08-21 08:15:01 +00:00
if (__this == NULL || bp == NULL)
{
2025-08-12 10:09:23 +00:00
return false;
}
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1))
{
if (file_dec_is_play() == true || file_dec_is_pause() == true)
{
if (__this->file)
{
if (flag)
{
/// 获取断点解码信息
2025-08-12 10:09:23 +00:00
int ret = file_dec_get_breakpoint(&bp->dbp);
2025-08-21 08:15:01 +00:00
if (ret)
{
/// 获取断点解码信息错误
2025-08-12 10:09:23 +00:00
log_e("file_dec_get_breakpoint err !!\n");
}
}
2025-08-21 08:15:01 +00:00
/// 获取断点文件信息
2025-08-12 10:09:23 +00:00
struct vfs_attr attr = {0};
fget_attrs(__this->file, &attr);
bp->sclust = attr.sclust;
bp->fsize = attr.fsize;
log_i("get playing breakpoint ok\n");
return true;
}
}
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放设备文件总数
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u16 music_player_get_file_total(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->fsn)
{
2025-08-12 10:09:23 +00:00
return __this->fsn->file_number;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放文件序号
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u16 music_player_get_file_cur(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->fsn)
{
2025-08-12 10:09:23 +00:00
return __this->fsn->file_counter;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放文件所在文件夹的文件总数
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u16 music_player_get_fileindir_number(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->fsn)
{
2025-08-12 10:09:23 +00:00
return __this->fsn->fileTotalInDir;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放文件所在文件夹
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u16 music_player_get_dir_cur(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->fsn)
{
2025-08-12 10:09:23 +00:00
return __this->fsn->musicdir_counter;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取文件夹总数
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u16 music_player_get_dir_total(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->fsn)
{
2025-08-12 10:09:23 +00:00
return __this->fsn->dir_totalnumber;
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取文件句柄
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
FILE *music_player_get_file_hdl(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->file)
{
2025-08-12 10:09:23 +00:00
return __this->file;
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取文件簇号
@param
@return , -1:
@note
*/
/*----------------------------------------------------------------------------*/
u32 music_player_get_file_sclust(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->file)
{
2025-08-12 10:09:23 +00:00
struct vfs_attr tmp_attr = {0};
fget_attrs(__this->file, &tmp_attr);
return tmp_attr.sclust;
}
2025-08-21 08:15:01 +00:00
return (u32)-1;
2025-08-12 10:09:23 +00:00
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放设备盘符
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
char *music_player_get_dev_cur(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
return dev_manager_get_logo(__this->dev);
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放设备下一个设备
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
char *music_player_get_dev_next(u8 auto_next)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
if (auto_next)
{
2025-08-12 10:09:23 +00:00
return dev_manager_get_logo(dev_manager_find_next(__this->dev, 1));
2025-08-21 08:15:01 +00:00
}
else
{
// 跳过录音设备
2025-08-12 10:09:23 +00:00
struct __dev *next = dev_manager_find_next(__this->dev, 1);
2025-08-21 08:15:01 +00:00
if (next)
{
2025-08-12 10:09:23 +00:00
char *logo = dev_manager_get_logo(next);
2025-08-21 08:15:01 +00:00
if (logo)
{
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, "_rec");
2025-08-21 08:15:01 +00:00
if (str)
{
2025-08-12 10:09:23 +00:00
char *cur_phy_logo = dev_manager_get_phy_logo(__this->dev);
char *next_phy_logo = dev_manager_get_phy_logo(next);
2025-08-21 08:15:01 +00:00
if (cur_phy_logo && next_phy_logo && strcmp(cur_phy_logo, next_phy_logo) == 0)
{
// 是同一个物理设备的录音设别, 跳过
2025-08-12 10:09:23 +00:00
next = dev_manager_find_next(next, 1);
2025-08-21 08:15:01 +00:00
if (next != __this->dev)
{
2025-08-12 10:09:23 +00:00
logo = dev_manager_get_logo(next);
return logo;
2025-08-21 08:15:01 +00:00
}
else
{
// 没有其他设备了(只有录音文件夹设备及本身)
2025-08-12 10:09:23 +00:00
return NULL;
}
}
}
return logo;
}
}
}
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放设备上一个设备
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
char *music_player_get_dev_prev(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
return dev_manager_get_logo(dev_manager_find_prev(__this->dev, 1));
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放状态
@param
@return
2025-08-21 08:15:01 +00:00
FILE_DEC_STATUS_STOP,//解码停止
FILE_DEC_STATUS_PLAY,//正在解码
FILE_DEC_STATUS_PAUSE,//解码暂停
2025-08-12 10:09:23 +00:00
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_get_play_status(void)
{
int status = file_dec_get_status();
2025-08-21 08:15:01 +00:00
if (status == FILE_DEC_STATUS_WAIT_PAUSE || status == FILE_DEC_STATUS_PAUSE || status == FILE_DEC_STATUS_PAUSE_SUCCESS)
{
2025-08-12 10:09:23 +00:00
return FILE_DEC_STATUS_PAUSE;
2025-08-21 08:15:01 +00:00
}
else if (status == FILE_DEC_STATUS_WAIT_PLAY || status == FILE_DEC_STATUS_PLAY)
{
2025-08-12 10:09:23 +00:00
return FILE_DEC_STATUS_PLAY;
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
return FILE_DEC_STATUS_STOP;
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放歌曲时间
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_get_dec_cur_time(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
return file_dec_get_cur_time();
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放歌曲总时间
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_get_dec_total_time(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
return file_dec_get_total_time();
}
return 0;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放循环模式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
u8 music_player_get_repeat_mode(void)
{
return app_var.cycle_mode;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前播放对应的music设备
@param
@return
@note 便
*/
/*----------------------------------------------------------------------------*/
char *music_player_get_cur_music_dev(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
char music_dev_logo[16] = {0};
char *logo = dev_manager_get_logo(__this->dev);
2025-08-21 08:15:01 +00:00
if (logo)
{
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, "_rec");
2025-08-21 08:15:01 +00:00
if (str)
{
/// 录音设备,切换到音乐设备播放
2025-08-12 10:09:23 +00:00
strncpy(music_dev_logo, logo, strlen(logo) - strlen(str));
logo = dev_manager_get_logo(dev_manager_find_spec(music_dev_logo, 1));
}
}
return logo;
}
return NULL;
}
const char *music_player_get_phy_dev(int *len)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
char *logo = dev_manager_get_logo(__this->dev);
2025-08-21 08:15:01 +00:00
if (logo)
{
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, "_rec");
2025-08-21 08:15:01 +00:00
if (str)
{
/// 录音设备,切换到音乐设备播放
if (len)
{
*len = strlen(logo) - strlen(str);
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
}
else
{
if (len)
{
*len = strlen(logo);
2025-08-12 10:09:23 +00:00
}
}
return logo;
}
}
2025-08-21 08:15:01 +00:00
if (len)
{
*len = 0;
2025-08-12 10:09:23 +00:00
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player获取当前录音区分播放状态
@param
@return true, false
@note
*/
/*----------------------------------------------------------------------------*/
bool music_player_get_record_play_status(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
char *logo = dev_manager_get_logo(__this->dev);
2025-08-21 08:15:01 +00:00
if (logo)
{
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, "_rec");
2025-08-21 08:15:01 +00:00
if (str)
{
2025-08-12 10:09:23 +00:00
return true;
}
}
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player从设备列表里面往前或往后找设备并且过滤掉指定字符串的设备
@param
2025-08-21 08:15:01 +00:00
flit: logo包含这个字符串的会被过滤
direct 1: 0
2025-08-12 10:09:23 +00:00
@return NULL
@note
*/
/*----------------------------------------------------------------------------*/
char *music_player_get_dev_flit(char *flit, u8 direct)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
u32 counter = 0;
struct __dev *dev = __this->dev;
u32 dev_total = dev_manager_get_total(1);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 1)
{
if (dev_total > 1)
{
while (1)
{
if (direct)
{
2025-08-12 10:09:23 +00:00
dev = dev_manager_find_next(dev, 1);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
dev = dev_manager_find_prev(dev, 1);
}
2025-08-21 08:15:01 +00:00
if (dev)
{
2025-08-12 10:09:23 +00:00
char *logo = dev_manager_get_logo(dev);
2025-08-21 08:15:01 +00:00
if (flit)
{
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, flit);
2025-08-21 08:15:01 +00:00
if (!str)
{
2025-08-12 10:09:23 +00:00
return logo;
}
counter++;
2025-08-21 08:15:01 +00:00
if (counter >= (dev_total - 1))
{
2025-08-12 10:09:23 +00:00
break;
}
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
return logo;
}
}
}
}
}
}
return NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放/暂停
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_pp(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
file_dec_pp();
}
return MUSIC_PLAYER_ERR_NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player解码停止
@param
2025-08-21 08:15:01 +00:00
fsn_release
1
0
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_stop(u8 fsn_release)
{
2025-08-21 08:15:01 +00:00
if (__this == NULL)
{
return;
2025-08-12 10:09:23 +00:00
}
#if (defined(TCFG_LRC_LYRICS_ENABLE) && (TCFG_LRC_LYRICS_ENABLE))
extern void lrc_set_analysis_flag(u8 flag);
lrc_set_analysis_flag(0);
#endif
2025-08-21 08:15:01 +00:00
/// 停止解码
2025-08-12 10:09:23 +00:00
file_dec_close();
2025-08-21 08:15:01 +00:00
if (__this->file)
{
2025-08-12 10:09:23 +00:00
fclose(__this->file);
__this->file = NULL;
}
2025-08-21 08:15:01 +00:00
if (__this->lrc_file)
{
2025-08-12 10:09:23 +00:00
fclose(__this->lrc_file);
__this->lrc_file = NULL;
}
2025-08-21 08:15:01 +00:00
if (fsn_release && __this->fsn)
{
/// 根据播放情景, 通过设定flag决定是否需要释放fscan 释放后需要重新扫盘!!!
2025-08-12 10:09:23 +00:00
dev_manager_scan_disk_release(__this->fsn);
__this->fsn = NULL;
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player快进
@param step
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_ff(int step)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
file_dec_FF(step);
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player快退
@param step退
@return
@note
*/
/*----------------------------------------------------------------------------*/
void music_player_fr(int step)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
file_dec_FR(step);
}
}
//*----------------------------------------------------------------------------*/
/**@brief music_player设置播放循环模式
@param mode
2025-08-21 08:15:01 +00:00
FCYCLE_ALL
FCYCLE_ONE
FCYCLE_FOLDER
FCYCLE_RANDOM
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_set_repeat_mode(u8 mode)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
if (mode >= FCYCLE_MAX)
{
2025-08-12 10:09:23 +00:00
return -1;
}
2025-08-21 08:15:01 +00:00
if (__this->fsn)
{
2025-08-12 10:09:23 +00:00
__this->fsn->cycle_mode = mode;
log_i("cycle_mode = %d\n", mode);
local_irq_disable();
save_mode_cnt = 0;
2025-08-21 08:15:01 +00:00
if (save_mode_timer == 0)
{
2025-08-12 10:09:23 +00:00
save_mode_timer = sys_timer_add(NULL, music_player_mode_save_do, 1000);
}
local_irq_enable();
return mode;
}
}
return -1;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player切换循环模式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_change_repeat_mode(void)
{
2025-08-21 08:15:01 +00:00
if (__this)
{
2025-08-12 10:09:23 +00:00
app_var.cycle_mode++;
2025-08-21 08:15:01 +00:00
if (app_var.cycle_mode >= FCYCLE_MAX)
{
2025-08-12 10:09:23 +00:00
app_var.cycle_mode = FCYCLE_ALL;
}
2025-08-21 08:15:01 +00:00
return music_player_set_repeat_mode(app_var.cycle_mode);
2025-08-12 10:09:23 +00:00
}
return -1;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player删除当前播放文件,并播放下一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_delete_playing_file(void)
{
2025-08-21 08:15:01 +00:00
if (__this && __this->file)
{
/// 获取当前播放文件序号, 文件删除之后, 播放下一曲
2025-08-12 10:09:23 +00:00
int err = 0;
int cur_file = music_player_get_file_cur();
char *cur_dev = music_player_get_dev_cur();
file_dec_close();
err = fdelete(__this->file);
2025-08-21 08:15:01 +00:00
if (err)
{
2025-08-12 10:09:23 +00:00
log_info("[%s, %d] fail!!, replay cur file\n", __FUNCTION__, __LINE__);
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
log_info("[%s, %d] ok, play next file\n", __FUNCTION__, __LINE__);
}
__this->file = NULL;
return music_player_play_by_number(cur_dev, cur_file);
}
return MUSIC_PLAYER_ERR_NULL;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放上一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_prev_cycle_single_dev(void)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
/// check dev, 检查设备是否有掉线
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 不需要重新找设备、扫盘
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_PREV_FILE, 0, __this->parm.scan_cb); /// 选择上一曲
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
int music_player_play_prev(void)
{
int err;
#if (MUSIC_PLAYER_CYCLE_ALL_DEV_EN)
u32 cur_file = music_player_get_file_cur();
2025-08-21 08:15:01 +00:00
if ((music_player_get_record_play_status() == false) && (app_var.cycle_mode == FCYCLE_ALL) && (cur_file == 1) && (dev_manager_get_total(1) > 1))
{
2025-08-12 10:09:23 +00:00
char *logo = music_player_get_dev_flit("_rec", 0);
err = music_player_play_last_file(logo);
return err;
}
2025-08-21 08:15:01 +00:00
#endif /*MUSIC_PLAYER_CYCLE_ALL_DEV_EN*/
2025-08-12 10:09:23 +00:00
err = music_player_play_prev_cycle_single_dev();
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放下一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_next_cycle_single_dev(void)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
/// check dev, 检查设备是否有掉线
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 不需要重新找设备、扫盘
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_NEXT_FILE, 0, __this->parm.scan_cb); /// 选择下一曲
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
int music_player_play_next(void)
{
int err;
#if (MUSIC_PLAYER_CYCLE_ALL_DEV_EN)
u32 cur_file = music_player_get_file_cur();
2025-08-21 08:15:01 +00:00
if ((music_player_get_record_play_status() == false) && (app_var.cycle_mode == FCYCLE_ALL) && (cur_file >= music_player_get_file_total()) && (dev_manager_get_total(1) > 1))
{
2025-08-12 10:09:23 +00:00
char *logo = music_player_get_dev_flit("_rec", 1);
err = music_player_play_first_file(logo);
return err;
}
2025-08-21 08:15:01 +00:00
#endif /*MUSIC_PLAYER_CYCLE_ALL_DEV_EN*/
2025-08-12 10:09:23 +00:00
err = music_player_play_next_cycle_single_dev();
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放第一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
2025-08-27 16:29:07 +00:00
static u8 first_start = 0;
2025-08-12 10:09:23 +00:00
int music_player_play_first_file(char *logo)
{
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
2025-08-12 10:09:23 +00:00
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_FIRST_FILE, 0, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-27 16:29:07 +00:00
if (first_start == 0)
{
first_start = 1;
dev_manager_set_active(__this->dev);
return MUSIC_PLAYER_SUCC;
//return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player播放最后一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_last_file(char *logo)
{
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
2025-08-12 10:09:23 +00:00
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_LAST_FILE, 0, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player自动播放下一曲
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_auto_next(void)
{
2025-08-27 16:29:07 +00:00
printf("......cycle : %d ,music_player_play_auto_next 1 \n", kt_get_cycle());
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
/// get dev, 检查设备是否有掉线
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 2 \n");
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 不需要重新找设备、扫盘
if (__this->fsn == NULL)
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 3 \n");
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_AUTO_FILE, 0, __this->parm.scan_cb); /// 选择自动下一曲
if (__this->file == NULL)
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 4 \n");
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 5 \n");
2025-08-21 08:15:01 +00:00
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
2025-08-27 16:29:07 +00:00
printf("......music_player_play_auto_next 6 \n");
2025-08-12 10:09:23 +00:00
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player上一个文件夹
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_folder_prev(void)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
/// get dev, 检查设备是否有掉线
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 不需要重新找设备、扫盘
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_PREV_FOLDER_FILE, 0, __this->parm.scan_cb); /// 选择播放下一个文件夹
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player下一个文件夹
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_folder_next(void)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
/// get dev, 检查设备是否有掉线
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 不需要重新找设备、扫盘
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_NEXT_FOLDER_FILE, 0, __this->parm.scan_cb); /// 选择播放上一个文件夹
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player上一个设备
@param bp
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_devcie_prev(struct __breakpoint *bp)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(1);
2025-08-21 08:15:01 +00:00
/// get dev
2025-08-12 10:09:23 +00:00
__this->dev = dev_manager_find_prev(__this->dev, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// get fscan
2025-08-12 10:09:23 +00:00
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, (const char *)scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
int err = 0;
2025-08-21 08:15:01 +00:00
if (bp)
{
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, bp->sclust, __this->parm.scan_cb); // 根据文件簇号查找断点文件
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
err = music_player_decode_start(__this->file, &(bp->dbp));
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
/* __this->file = file_manager_select(__this->dev, __this->fsn, FSEL_LAST_FILE, 0, __this->parm.scan_cb); */
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_FIRST_FILE, 0, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
err = music_player_decode_start(__this->file, 0);
}
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player下一个设备
@param bp
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_devcie_next(struct __breakpoint *bp)
{
2025-08-21 08:15:01 +00:00
/// close player first
2025-08-12 10:09:23 +00:00
music_player_stop(1);
2025-08-21 08:15:01 +00:00
/// get dev
2025-08-12 10:09:23 +00:00
__this->dev = dev_manager_find_next(__this->dev, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// get fscan
2025-08-12 10:09:23 +00:00
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
int err = 0;
2025-08-21 08:15:01 +00:00
if (bp)
{
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, bp->sclust, __this->parm.scan_cb); // 根据文件簇号查找断点文件
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
err = music_player_decode_start(__this->file, &(bp->dbp));
2025-08-21 08:15:01 +00:00
}
else
{
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_FIRST_FILE, 0, __this->parm.scan_cb); // 选择第一个文件播放
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
err = music_player_decode_start(__this->file, 0);
}
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player断点播放指定设备
@param
2025-08-21 08:15:01 +00:00
logosd0/sd1/udisk0
bp
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_by_breakpoint(char *logo, struct __breakpoint *bp)
{
u32 bp_flag = 1;
2025-08-21 08:15:01 +00:00
if (bp == NULL)
{
2025-08-12 10:09:23 +00:00
return music_player_play_first_file(logo);
2025-08-21 08:15:01 +00:00
// return MUSIC_PLAYER_ERR_PARM;
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
bp_flag = 0;
2025-08-21 08:15:01 +00:00
set_bp_info(bp->sclust, bp->fsize, &bp_flag); // 断点若有效把bp_flag置1,注意后面要使用put_bp_info释放
2025-08-12 10:09:23 +00:00
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
put_bp_info();
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
if (!bp_flag)
{ // 断点无效
2025-08-12 10:09:23 +00:00
put_bp_info();
return MUSIC_PLAYER_ERR_PARM;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, bp->sclust, __this->parm.scan_cb); // 根据文件簇号查找断点文件
2025-08-12 10:09:23 +00:00
put_bp_info();
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
struct vfs_attr attr = {0};
fget_attrs(__this->file, &attr);
2025-08-21 08:15:01 +00:00
if (bp->fsize != attr.fsize)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_PARM;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, &(bp->dbp));
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player序号播放指定设备
@param
2025-08-21 08:15:01 +00:00
logosd0/sd1/udisk0
number
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_by_number(char *logo, u32 number)
{
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
2025-08-12 10:09:23 +00:00
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_NUMBER, number, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player簇号播放指定设备
@param
2025-08-21 08:15:01 +00:00
logosd0/sd1/udisk0
sclust
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_by_sclust(char *logo, u32 sclust)
{
char *cur_logo = dev_manager_get_logo(__this->dev);
2025-08-21 08:15:01 +00:00
if (logo == NULL || (cur_logo && (0 == strcmp(logo, cur_logo))))
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, sclust, __this->parm.scan_cb); // 根据簇号查找文件
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player路径播放指定设备
@param
2025-08-21 08:15:01 +00:00
logosd0/sd1/udisk0, NULL
path
2025-08-12 10:09:23 +00:00
@return
@note
*/
/*----------------------------------------------------------------------------*/
int music_player_play_by_path(char *logo, const char *path)
{
2025-08-21 08:15:01 +00:00
if (path == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_POINT;
}
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
music_player_stop(0);
2025-08-21 08:15:01 +00:00
if (dev_manager_online_check(__this->dev, 1) == 0)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_OFFLINE;
}
2025-08-21 08:15:01 +00:00
/// 没有指定设备不需要找设备, 不需要扫描
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev_manager_find_spec(logo, 1);
2025-08-21 08:15:01 +00:00
if (__this->dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_DEV_NOFOUND;
}
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
}
2025-08-21 08:15:01 +00:00
if (__this->fsn == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FSCAN;
}
2025-08-21 08:15:01 +00:00
/// get file
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_PATH, (int)path, __this->parm.scan_cb); // 根据簇号查找文件
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
int err = music_player_decode_start(__this->file, 0);
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] ok\n", __FUNCTION__, __LINE__);
}
return err;
}
//*----------------------------------------------------------------------------*/
/**@brief music_player录音区分切换播放
@param
2025-08-21 08:15:01 +00:00
logosd0/sd1/udisk0, NULL
bp
2025-08-12 10:09:23 +00:00
@return
@note "_rec"
2025-08-21 08:15:01 +00:00
2025-08-12 10:09:23 +00:00
*/
/*----------------------------------------------------------------------------*/
int music_player_play_record_folder(char *logo, struct __breakpoint *bp)
{
int err = MUSIC_PLAYER_ERR_NULL;
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
char rec_dev_logo[16] = {0};
char music_dev_logo[16] = {0};
u8 rec_play = 0;
struct __dev *dev;
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
logo = dev_manager_get_logo(__this->dev);
2025-08-21 08:15:01 +00:00
if (logo == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_RECORD_DEV;
}
}
2025-08-21 08:15:01 +00:00
/// 判断是否是录音设备
2025-08-12 10:09:23 +00:00
char *str = strstr(logo, "_rec");
2025-08-21 08:15:01 +00:00
if (str == NULL)
{
/// 是非录音设备,切换到录音设备播放
2025-08-12 10:09:23 +00:00
sprintf(rec_dev_logo, "%s%s", logo, "_rec");
dev = dev_manager_find_spec(rec_dev_logo, 1);
logo = rec_dev_logo;
rec_play = 1;
2025-08-21 08:15:01 +00:00
}
else
{
/// 录音设备,切换到音乐设备播放
2025-08-12 10:09:23 +00:00
strncpy(music_dev_logo, logo, strlen(logo) - strlen(str));
log_i("music_dev_logo = %s, logo = %s, str = %s, len = %d\n", music_dev_logo, logo, str, strlen(logo) - strlen(str));
dev = dev_manager_find_spec(music_dev_logo, 1);
logo = music_dev_logo;
rec_play = 0;
}
2025-08-21 08:15:01 +00:00
if (dev == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_RECORD_DEV;
}
2025-08-21 08:15:01 +00:00
/// 需要扫盘
2025-08-12 10:09:23 +00:00
struct vfscan *fsn = dev_manager_scan_disk(dev, NULL, scan_parm, app_var.cycle_mode, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (fsn == NULL)
{
2025-08-12 10:09:23 +00:00
dev_manager_set_valid(dev, 0);
return MUSIC_PLAYER_ERR_RECORD_DEV;
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
music_player_stop(1);
__this->dev = dev;
__this->fsn = fsn;
}
2025-08-21 08:15:01 +00:00
/// get file
if (bp)
{
2025-08-12 10:09:23 +00:00
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, bp->sclust, __this->parm.scan_cb);
2025-08-21 08:15:01 +00:00
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
2025-08-12 10:09:23 +00:00
err = music_player_decode_start(__this->file, &bp->dbp);
2025-08-21 08:15:01 +00:00
}
else
{
__this->file = file_manager_select(__this->dev, __this->fsn, FSEL_FIRST_FILE, 0, __this->parm.scan_cb); // 播放录音文件夹第一个文件
if (__this->file == NULL)
{
2025-08-12 10:09:23 +00:00
return MUSIC_PLAYER_ERR_FILE_NOFOUND;
}
2025-08-21 08:15:01 +00:00
/// start decoder
err = music_player_decode_start(__this->file, 0); // 录音文件夹不支持断点播放
2025-08-12 10:09:23 +00:00
}
2025-08-21 08:15:01 +00:00
if (err == MUSIC_PLAYER_SUCC)
{
/// 选定新设备播放成功后,需要激活当前设备
2025-08-12 10:09:23 +00:00
dev_manager_set_active(__this->dev);
log_i("[%s %d] %s devcie play ok\n", __FUNCTION__, __LINE__, logo);
}
2025-08-21 08:15:01 +00:00
#endif // TCFG_RECORD_FOLDER_DEV_ENABLE
2025-08-12 10:09:23 +00:00
return err;
}
int music_player_lrc_analy_start()
{
#if (defined(TCFG_LRC_LYRICS_ENABLE) && (TCFG_LRC_LYRICS_ENABLE))
2025-08-21 08:15:01 +00:00
extern bool lrc_analysis_api(FILE * file, FILE * *newFile);
2025-08-12 10:09:23 +00:00
extern void lrc_set_analysis_flag(u8 flag);
log_i("lrc analys...");
2025-08-21 08:15:01 +00:00
if (__this && __this->file)
{
if (lrc_analysis_api(__this->file, &(__this->lrc_file)))
{
2025-08-12 10:09:23 +00:00
lrc_set_analysis_flag(1);
return 0;
2025-08-21 08:15:01 +00:00
}
else
{
2025-08-12 10:09:23 +00:00
lrc_set_analysis_flag(0);
return -1;
}
}
#endif
return -1;
}
2025-08-21 08:15:01 +00:00
#endif // TCFG_APP_MUSIC_EN