871 lines
28 KiB
C
871 lines
28 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS
|
|
#pragma bss_seg(".music.data.bss")
|
|
#pragma data_seg(".music.data")
|
|
#pragma const_seg(".music.text.const")
|
|
#pragma code_seg(".music.text")
|
|
#endif
|
|
#include "system/includes.h"
|
|
#include "music/music_player.h"
|
|
#include "music/breakpoint.h"
|
|
#include "app_action.h"
|
|
#include "app_main.h"
|
|
#include "bt.h"
|
|
#include "tone_player.h"
|
|
#include "key_event_deal.h"
|
|
#include "audio_config.h"
|
|
#include "bt_background.h"
|
|
#include "default_event_handler.h"
|
|
#include "app_online_cfg.h"
|
|
#include "system/event.h"
|
|
#include "app_music.h"
|
|
#include "app_tone.h"
|
|
#include "dev_status.h"
|
|
#include "effect/effects_default_param.h"
|
|
#include "scene_switch.h"
|
|
#include "mic_effect.h"
|
|
#include "app_config.h"
|
|
#include "ui/ui_api.h"
|
|
/* #include "jlui_app/ui_api.h" */
|
|
#if (TCFG_LRC_LYRICS_ENABLE)
|
|
#include "ui/jlui_app/lyrics_api.h"
|
|
#endif
|
|
|
|
#if TCFG_APP_MUSIC_EN
|
|
//切歌切模式是否保持倍速播放的状态
|
|
#define MUSIC_PLAYBACK_SPEED_KEEP 0
|
|
|
|
//切歌切模式是否保持变调的状态
|
|
#define MUSIC_PLAYBACK_PITCH_KEEP 0
|
|
|
|
static u8 music_idle_flag = 1;
|
|
|
|
|
|
|
|
struct __music music_hdl = {
|
|
.speed_mode = PLAY_SPEED_1,
|
|
.pitch_mode = PITCH_0,
|
|
};
|
|
#define __this (&music_hdl)
|
|
|
|
|
|
#if LIB_SUPPORT_MULTI_SECTOER_READ
|
|
OS_MUTEX pre_read_mutex;
|
|
char *prebuf = NULL;
|
|
#endif
|
|
|
|
|
|
//设备提示音使能
|
|
#if (MUSIC_DEVICE_TONE_EN)
|
|
struct __dev_tone {
|
|
char *logo;
|
|
char *phy_logo;
|
|
u16 index;
|
|
};
|
|
|
|
enum {
|
|
///0x1000起始为了不要跟提示音的IDEX_TONE_重叠了
|
|
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[] = {
|
|
{"udisk0", "udisk0", DEVICE_INDEX_UDISK} ,
|
|
{"udisk0_rec", "udisk0", DEVICE_INDEX_UDISK_REC} ,
|
|
{"sd0", "sd0", DEVICE_INDEX_SD0} ,
|
|
{"sd0_rec", "sd0", DEVICE_INDEX_SD0_REC} ,
|
|
{"sd1", "sd1", DEVICE_INDEX_SD1} ,
|
|
{"sd1_rec", "sd1", DEVICE_INDEX_SD1_REC} ,
|
|
};
|
|
|
|
static int music_tone_play_end_callback(void *priv, enum stream_event event);
|
|
int music_device_tone_play(char *logo)
|
|
{
|
|
if (logo == NULL) {
|
|
return false;
|
|
}
|
|
int ret = 0;
|
|
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));
|
|
if (phy_logo && (strcmp(__this->device_tone_dev, phy_logo) == 0)) {
|
|
log_i("[%s, %d]the same phy dev, no need device tone!!\n", logo, __LINE__);
|
|
return false;
|
|
}
|
|
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
|
|
if (strcmp(device_tone[i].logo, logo) == 0) {
|
|
log_i("[%s, %d]device_tone play \n", logo, __LINE__);
|
|
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));
|
|
#if TCFG_TONE2TWS_ENABLE
|
|
ret = tws_play_tone_file_callback(device_tone[i].tone_path, 1, music_tone_play_end_callback, (void *)device_tone[i].index, 400);
|
|
if (ret)
|
|
#endif
|
|
{
|
|
if (device_tone[i].index < DEVICE_INDEX_SD0) {
|
|
ret = play_tone_file_callback(get_tone_files()->device_udisk, (void *)device_tone[i].index, music_tone_play_end_callback);
|
|
} else {
|
|
ret = play_tone_file_callback(get_tone_files()->device_sd, (void *)device_tone[i].index, music_tone_play_end_callback);
|
|
}
|
|
if (ret) { //提示音播放失败
|
|
music_tone_play_end_callback((void *)device_tone[i].index, STREAM_EVENT_NONE);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
log_i("[%s, %d]device_tone play \n", logo, __LINE__);
|
|
return false;
|
|
}
|
|
|
|
|
|
#endif
|
|
/* extern const u8 music_key_table[][KEY_EVENT_MAX]; */
|
|
|
|
static u8 music_idle_query()
|
|
{
|
|
return music_idle_flag;
|
|
}
|
|
REGISTER_LP_TARGET(music_lp_target) = {
|
|
.name = "music",
|
|
.is_idle = music_idle_query,
|
|
};
|
|
|
|
__attribute__((weak))
|
|
void music_player_get_sd_music_name(char *src)
|
|
{
|
|
}
|
|
|
|
static void music_save_breakpoint(int save_dec_bp)
|
|
{
|
|
char *logo = NULL;
|
|
if (__this->player_hd) {
|
|
logo = dev_manager_get_logo(__this->player_hd->dev);
|
|
}
|
|
///save breakpoint, 只保存文件信息
|
|
if (music_player_get_playing_breakpoint(__this->player_hd, __this->breakpoint, save_dec_bp) == true) {
|
|
breakpoint_vm_write(__this->breakpoint, logo);
|
|
}
|
|
}
|
|
|
|
/*获取music app当前播放的设备*/
|
|
char *music_app_get_dev_cur(void)
|
|
{
|
|
if (__this->player_hd && __this->player_hd->dev) {
|
|
return dev_manager_get_logo(__this->player_hd->dev);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*获取music app当前的断点地址*/
|
|
struct audio_dec_breakpoint *music_app_get_dbp_addr(void)
|
|
{
|
|
if (__this && __this->breakpoint) {
|
|
return &(__this->breakpoint->dbp);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*获取music app当前播放的句柄*/
|
|
struct music_player *music_app_get_cur_hdl(void)
|
|
{
|
|
return __this->player_hd;
|
|
}
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 模式切换前参数设置
|
|
@param type:播放方式,暂时支持:
|
|
MUSIC_TASK_START_BY_NORMAL:首次播放按照正常断点播放
|
|
MUSIC_TASK_START_BY_SCLUST:首次播放按照簇号播放
|
|
val:播放参数
|
|
@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设置参数,
|
|
进入音乐模式后会按照对应参数播放
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static void music_player_play_start(void)
|
|
{
|
|
switch (__this->task_parm.type) {
|
|
case MUSIC_TASK_START_BY_NORMAL:
|
|
log_i("MUSIC_TASK_START_BY_NORMAL\n");
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START, 0);
|
|
break;
|
|
case MUSIC_TASK_START_BY_SCLUST:
|
|
log_i("MUSIC_TASK_START_BY_SCLUST\n");
|
|
/* app_send_message(APP_MSG_MUSIC_PLAY_START_BY_SCLUST, 0); */
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START_BY_SCLUST, __this->task_parm.val);
|
|
break;
|
|
default:
|
|
log_i("other MUSIC_TASK_START!!!\n");
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief 录音模式提示音结束处理
|
|
@param 无
|
|
@return
|
|
@note
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static int music_tone_play_end_callback(void *priv, enum stream_event event)
|
|
{
|
|
u32 index = (u32)priv;
|
|
char *logo = NULL;
|
|
|
|
if (false == app_in_mode(APP_MODE_MUSIC)) {
|
|
log_e("tone callback task out \n");
|
|
return 0;
|
|
}
|
|
switch (event) {
|
|
case STREAM_EVENT_NONE:
|
|
case STREAM_EVENT_STOP:
|
|
switch (index) {
|
|
#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:
|
|
for (int i = 0; i < ARRAY_SIZE(device_tone); i++) {
|
|
if (index == device_tone[i].index) {
|
|
logo = device_tone[i].logo;
|
|
break;
|
|
}
|
|
}
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START_BY_DEV, (int)logo);
|
|
break;
|
|
#endif
|
|
default:
|
|
///提示音播放结束, 启动播放器播放
|
|
music_player_play_start();
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
/*根据播放文件的格式动态开启SD卡常活动状态*/
|
|
static void music_set_sd_keep_active(char *logo)
|
|
{
|
|
struct imount *mount_hdl = NULL;
|
|
if (logo) {
|
|
if ((!memcmp(logo, "sd0", strlen("sd0")))
|
|
|| (!memcmp(logo, "sd1", strlen("sd1")))) {
|
|
struct file_player *file_play_hd = get_music_file_player();
|
|
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec(logo, 0));
|
|
if (file_play_hd) {
|
|
if (file_play_hd->stream->coding_type == AUDIO_CODING_WAV
|
|
|| file_play_hd->stream->coding_type == AUDIO_CODING_DTS
|
|
|| file_play_hd->stream->coding_type == AUDIO_CODING_FLAC
|
|
|| file_play_hd->stream->coding_type == AUDIO_CODING_APE) {
|
|
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ACTIVE_STATUS, 1);
|
|
log_i("sd set active status 1\n");
|
|
} else {
|
|
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ACTIVE_STATUS, 0);
|
|
log_i("sd set active status 0\n");
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
//非播放状态 关闭sd卡常活动状态
|
|
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec("sd0", 0));
|
|
if (mount_hdl) {
|
|
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ACTIVE_STATUS, 0);
|
|
log_i("sd0 set active status 0\n");
|
|
}
|
|
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec("sd1", 0));
|
|
if (mount_hdl) {
|
|
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ACTIVE_STATUS, 0);
|
|
log_i("sd1 set active status 0\n");
|
|
}
|
|
}
|
|
}
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 解码成功回调
|
|
@param priv:私有参数, parm:暂时未用
|
|
@return
|
|
@note 此处可以做一些用户操作, 如断点保存, 显示, 获取播放信息等
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static void music_player_play_success(void *priv, int parm)
|
|
{
|
|
char *logo = dev_manager_get_logo(__this->player_hd->dev);
|
|
#if MUSIC_PLAYBACK_SPEED_KEEP
|
|
struct file_player *file_player = get_music_file_player();
|
|
music_file_set_speed(file_player, music_hdl.speed_mode); //设置播放速度
|
|
#endif
|
|
|
|
#if MUSIC_PLAYBACK_PITCH_KEEP
|
|
struct file_player *file_player = get_music_file_player();
|
|
music_file_set_pitch(file_player, music_hdl.pitch_mode);
|
|
#endif
|
|
music_vocal_remover_update_parm();
|
|
//播放WAV APE 格式歌曲,需设置SD卡常活动状态,提高读取速度
|
|
music_set_sd_keep_active(logo);
|
|
|
|
log_i("cur filenum = %d\n", __this->player_hd->fsn->file_counter);
|
|
log_i("totol filenum = %d\n", __this->player_hd->fsn->file_number);
|
|
/* log_i("totol time = %d\n", music_player_get_dec_total_time()); */
|
|
int unicode = 0;
|
|
int name_buf_need_len = 128;
|
|
u8 *music_file_name = zalloc(name_buf_need_len);
|
|
int music_file_name_len = fget_name(__this->player_hd->file, music_file_name, name_buf_need_len);
|
|
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U')) {
|
|
unicode = 1;
|
|
//music_file_name_len -= 2;
|
|
log_i("cur file(unicode) = %s, len = %d, unicode = %d\n", music_file_name + 2, music_file_name_len - 2, unicode);
|
|
/* put_buf(music_file_name, music_file_name_len + 2); */
|
|
char *utf8 = zalloc(2 * name_buf_need_len);
|
|
int file_len = Unicode2UTF8(utf8, (u16 *)music_file_name + 1, (music_file_name_len - 2) / 2);
|
|
log_i(">>>[test]:filename = %s, len = %d\n", utf8, file_len);
|
|
music_player_get_sd_music_name(utf8);
|
|
UI_MSG_POST("up_music_name");
|
|
if (utf8) {
|
|
free(utf8);
|
|
utf8 = NULL;
|
|
}
|
|
} else {
|
|
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name, music_file_name_len, unicode);
|
|
music_player_get_sd_music_name((char *)music_file_name);
|
|
}
|
|
log_i("\n");
|
|
if (music_file_name) {
|
|
free(music_file_name);
|
|
}
|
|
music_save_breakpoint(0);
|
|
#if TCFG_LRC_LYRICS_ENABLE
|
|
int analaz = music_player_lrc_analy_start(music_app_get_cur_hdl());
|
|
#endif
|
|
app_send_message2(APP_MSG_MUSIC_FILE_NUM_CHANGED, __this->player_hd->fsn->file_counter, __this->player_hd->fsn->file_number);
|
|
|
|
}
|
|
|
|
static void send_music_player_end_msg(void *parm)
|
|
{
|
|
__this->timer = 0;
|
|
app_send_message(APP_MSG_MUSIC_PLAYER_END, (int)parm);
|
|
}
|
|
void ui_music_get_file_name()
|
|
{
|
|
int unicode = 0;
|
|
int name_buf_need_len = 128;
|
|
u8 *music_file_name = zalloc(name_buf_need_len);
|
|
int music_file_name_len;
|
|
if (!__this->player_hd->file) {
|
|
if (music_file_name) {
|
|
free(music_file_name);
|
|
}
|
|
return;
|
|
}
|
|
music_file_name_len = fget_name(__this->player_hd->file, music_file_name, name_buf_need_len);
|
|
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U')) {
|
|
unicode = 1;
|
|
//music_file_name_len -= 2;
|
|
log_i("cur file(unicode) = %s, len = %d, unicode = %d\n", music_file_name + 2, music_file_name_len - 2, unicode);
|
|
/* put_buf(music_file_name, music_file_name_len + 2); */
|
|
u8 *utf8 = zalloc(2 * name_buf_need_len);
|
|
int file_len = Unicode2UTF8((char *)utf8, (u16 *)music_file_name + 1, (music_file_name_len - 2) / 2);
|
|
log_i(">>>[test]:filename = %s, len = %d\n", utf8, file_len);
|
|
music_player_get_sd_music_name((char *)utf8);
|
|
/* UI_MSG_POST("UP_MUSIC_NAME:p=%4", utf8); */
|
|
if (utf8) {
|
|
free(utf8);
|
|
utf8 = NULL;
|
|
}
|
|
} else {
|
|
music_player_get_sd_music_name((char *)music_file_name);
|
|
}
|
|
|
|
if (music_file_name) {
|
|
free(music_file_name);
|
|
}
|
|
/* return utf8; */
|
|
|
|
}
|
|
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 解码结束回调处理
|
|
@param
|
|
@return
|
|
@note 此处统一将错误通过消息的方式发出, 在key msg中统一响应
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static void music_player_play_end(void *priv, int parm)
|
|
{
|
|
if (parm) {
|
|
if (__this->timer == 0) {
|
|
__this->timer = sys_timeout_add((void *)parm, send_music_player_end_msg, 1000);
|
|
}
|
|
} else {
|
|
app_send_message(APP_MSG_MUSIC_PLAYER_END, parm);
|
|
}
|
|
}
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 解码错误回调
|
|
@param
|
|
@return
|
|
@note 此处统一将错误通过消息的方式发出, 在key msg中统一响应
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static void music_player_decode_err(void *priv, int parm)
|
|
{
|
|
log_i("music_player_decode_err\n");
|
|
///这里推出消息, 目的是在music主流程switch case统一入口
|
|
/* app_task_put_key_msg(KEY_MUSIC_PLAYER_DEC_ERR, parm); */
|
|
app_send_message(APP_MSG_MUSIC_DEC_ERR, parm);
|
|
}
|
|
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 播放器扫盘打断接口
|
|
@param
|
|
@return 1:打断当前扫描,0:正常扫描
|
|
@note 设备扫描耗时长的情况下, 此接口提供打断机制
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
static int music_player_scandisk_break(void)
|
|
{
|
|
///注意:
|
|
///需要break fsn的事件, 请在这里拦截,
|
|
///需要结合MUSIC_PLAYER_ERR_FSCAN错误,做相应的处理
|
|
int msg[32] = {0};
|
|
const char *logo = NULL;
|
|
char *evt_logo = NULL;
|
|
struct key_event *key_evt = NULL;
|
|
struct bt_event *bt_evt = NULL;
|
|
int msg_from, msg_argc = 0;
|
|
int *msg_argv = NULL;
|
|
if (__this->scandisk_break) {//设备上下线直接打断
|
|
return 1;
|
|
}
|
|
int res = os_taskq_accept(8, msg);
|
|
if (res != OS_TASKQ) {
|
|
return 0;
|
|
}
|
|
msg_from = msg[0];
|
|
switch (msg[0]) {
|
|
case MSG_FROM_DEVICE:
|
|
switch (msg[1]) {
|
|
case DRIVER_EVENT_FROM_SD0:
|
|
case DRIVER_EVENT_FROM_SD1:
|
|
case DRIVER_EVENT_FROM_SD2:
|
|
evt_logo = (char *)msg[3];
|
|
case DEVICE_EVENT_FROM_USB_HOST:
|
|
if (!strncmp((char *)msg[3], "udisk", 5)) {
|
|
evt_logo = (char *)msg[3];
|
|
}
|
|
msg_argc = 12;
|
|
msg_argv = msg + 1;
|
|
///设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
|
|
int str_len = 0;
|
|
logo = music_player_get_phy_dev(__this->player_hd, &str_len);
|
|
///响应设备插拔打断
|
|
if (msg[2] == DEVICE_EVENT_OUT) {
|
|
log_i("__func__ = %s logo=%s evt_logo=%s %d\n", __FUNCTION__, logo, evt_logo, str_len);
|
|
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
|
|
///相同的设备才响应
|
|
__this->scandisk_break = 1;
|
|
}
|
|
} else if (msg[2] == DEVICE_EVENT_IN) {
|
|
///响应新设备上线
|
|
__this->scandisk_break = 1;
|
|
}
|
|
if (__this->scandisk_break == 0) {
|
|
log_i("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
|
|
dev_status_event_filter(msg + 1);
|
|
log_i("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case MSG_FROM_BT_STACK:
|
|
#if (TCFG_BT_BACKGROUND_ENABLE)
|
|
bt_background_msg_forward_filter(msg);
|
|
#endif
|
|
break;
|
|
case MSG_FROM_APP:
|
|
msg_argc = 12; //按最大参数个数处理
|
|
msg_argv = msg + 1;
|
|
switch (msg[1]) {
|
|
case APP_MSG_CHANGE_MODE:
|
|
/* fall-through */
|
|
case APP_MSG_GOTO_MODE:
|
|
/* fall-through */
|
|
case APP_MSG_GOTO_NEXT_MODE:
|
|
//响应切换模式事件
|
|
__this->scandisk_break = 1;
|
|
break;
|
|
//其他按键case 在这里增加
|
|
}
|
|
break;
|
|
case MSG_FROM_KEY:
|
|
int key_msg = app_key_event_remap(music_mode_key_table, msg + 1);
|
|
msg_from = MSG_FROM_APP;
|
|
msg[1] = key_msg;
|
|
msg_argv = msg + 1;
|
|
msg_argc = 12; //按最大参数个数处理
|
|
switch (key_msg) {
|
|
case APP_MSG_CHANGE_MODE:
|
|
//响应切换模式事件
|
|
__this->scandisk_break = 1;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
if (__this->scandisk_break) {
|
|
///查询到需要打断的事件, 返回1, 并且重新推送一次该事件,跑主循环处理流程
|
|
app_send_message_from(msg_from, msg_argc, msg_argv);
|
|
printf("scandisk_break!!!!!!\n");
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void scan_enter(struct __dev *dev)
|
|
{
|
|
__this->scandisk_mark = 1;
|
|
}
|
|
|
|
static void scan_exit(struct __dev *dev)
|
|
{
|
|
__this->scandisk_mark = 0;
|
|
}
|
|
|
|
static const struct __player_cb music_player_callback = {
|
|
.start = music_player_play_success,
|
|
.end = music_player_play_end,
|
|
.err = music_player_decode_err,
|
|
};
|
|
|
|
static const struct __scan_callback scan_cb = {
|
|
.enter = scan_enter,
|
|
.exit = scan_exit,
|
|
.scan_break = music_player_scandisk_break,
|
|
};
|
|
|
|
static int app_music_init()
|
|
{
|
|
int ret = 0;
|
|
__this->music_busy = 0;
|
|
music_idle_flag = 0;
|
|
/* ui_update_status(STATUS_MUSIC_MODE); */
|
|
|
|
#if TCFG_MIC_EFFECT_ENABLE
|
|
//切换mic eff irq points
|
|
tone_player_stop();
|
|
mic_effect_player_pause(1);
|
|
mic_effect_set_irq_point_unit(AUDIO_ADC_IRQ_POINTS_MUSIC_MODE);
|
|
mic_effect_player_pause(0);
|
|
#endif
|
|
|
|
#if (TCFG_LRC_LYRICS_ENABLE)
|
|
lyrics_init();
|
|
#endif
|
|
|
|
///播放器初始化
|
|
/* struct __player_parm parm = {0}; */
|
|
/* parm.cb = &music_player_callback; */
|
|
/* parm.scan_cb = &scan_cb; */
|
|
/* music_player_creat(NULL, &parm); */
|
|
__this->player_hd = music_player_creat();
|
|
music_player_reg_scandisk_callback(__this->player_hd, &scan_cb);
|
|
music_player_reg_dec_callback(__this->player_hd, &music_player_callback);
|
|
///获取断点句柄, 后面所有断点读/写都需要用到
|
|
__this->breakpoint = breakpoint_handle_creat();
|
|
///初始化一些参数
|
|
__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));
|
|
#if (MUSIC_DEVICE_TONE_EN)
|
|
music_player_play_start();
|
|
#else
|
|
#if TCFG_TONE2TWS_ENABLE
|
|
ret = tws_play_tone_file_callback(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC, 400);
|
|
if (ret)
|
|
#endif
|
|
{
|
|
tone_player_stop();
|
|
ret = play_tone_file_callback(get_tone_files()->music_mode, NULL, music_tone_play_end_callback);
|
|
if (ret) {
|
|
music_tone_play_end_callback(NULL, STREAM_EVENT_NONE);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if LIB_SUPPORT_MULTI_SECTOER_READ
|
|
os_mutex_create(&pre_read_mutex);
|
|
if (!prebuf) {
|
|
y_printf("\n >>>[test]:func = %s,line= %d\n", __FUNCTION__, __LINE__);
|
|
prebuf = zalloc(MAX_READ_LEN);
|
|
ASSERT(prebuf);
|
|
/* last_pos = 0; */
|
|
/* PosInBuf = 0; */
|
|
}
|
|
#endif
|
|
|
|
#if TCFG_USER_EMITTER_ENABLE
|
|
extern u8 *get_cur_connect_emitter_mac_addr(void);
|
|
void *bt_addr = get_cur_connect_emitter_mac_addr();
|
|
if (bt_addr) {
|
|
extern void emitter_open(u8 source);
|
|
emitter_open(1); // 开启蓝牙发射
|
|
}
|
|
#endif
|
|
|
|
app_send_message(APP_MSG_ENTER_MODE, APP_MODE_MUSIC);
|
|
#if (defined CONFIG_JL_UI_ENABLE)&&CONFIG_JL_UI_ENABLE
|
|
UI_MSG_POST("up_music_status");
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
void app_music_exit()
|
|
{
|
|
music_save_breakpoint(1);
|
|
music_player_stop(__this->player_hd, 1);
|
|
breakpoint_handle_destroy(&__this->breakpoint);
|
|
music_player_destroy(__this->player_hd);
|
|
music_set_sd_keep_active(NULL);
|
|
|
|
#if TCFG_USER_EMITTER_ENABLE
|
|
extern u8 *get_cur_connect_emitter_mac_addr(void);
|
|
void *bt_addr = get_cur_connect_emitter_mac_addr();
|
|
if (bt_addr) {
|
|
extern void emitter_close(u8 source);
|
|
emitter_close(1); // 关闭蓝牙发射
|
|
}
|
|
#endif
|
|
|
|
if (__this->timer) {
|
|
sys_timeout_del(__this->timer);
|
|
__this->timer = 0;
|
|
}
|
|
|
|
__this->player_hd = NULL;
|
|
music_idle_flag = 1;
|
|
|
|
#if LIB_SUPPORT_MULTI_SECTOER_READ
|
|
os_mutex_del(&pre_read_mutex, 0);
|
|
if (prebuf) {
|
|
y_printf("\n >>>[test]:func = %s,line= %d\n", __FUNCTION__, __LINE__);
|
|
free(prebuf);
|
|
prebuf = NULL;
|
|
}
|
|
#endif
|
|
#if TCFG_MIC_EFFECT_ENABLE
|
|
//切换mic eff irq points
|
|
mic_effect_player_pause(1);
|
|
mic_effect_set_irq_point_unit(AUDIO_ADC_IRQ_POINTS);
|
|
mic_effect_player_pause(0);
|
|
#endif
|
|
|
|
app_send_message(APP_MSG_EXIT_MODE, APP_MODE_MUSIC);
|
|
}
|
|
|
|
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 模式新设备上线处理
|
|
@param 无
|
|
@return
|
|
@note
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
void music_task_dev_online_start(char *in_logo)
|
|
{
|
|
if (false == app_in_mode(APP_MODE_MUSIC)) {
|
|
log_e("not music mode \n");
|
|
return ;
|
|
}
|
|
__this->music_busy = 1;
|
|
u8 save = 0;
|
|
char *logo = dev_manager_get_logo(__this->player_hd->dev);
|
|
if (logo && __this->breakpoint) {
|
|
///新设备上线, 先记录当前设备断点, 然后播放活动设备
|
|
if (music_player_get_playing_breakpoint(__this->player_hd, __this->breakpoint, 1) == true) {
|
|
save = 1;
|
|
//这里不要直接记忆断点, 解码停了之后再记忆
|
|
//breakpoint_vm_write(__this->breakpoint, logo);
|
|
}
|
|
}
|
|
///停止解码,播放新活动设备
|
|
music_player_stop(__this->player_hd, 1);
|
|
if (save && __this->breakpoint) {
|
|
breakpoint_vm_write(__this->breakpoint, logo);
|
|
}
|
|
__this->music_busy = 0;
|
|
app_send_message(APP_MSG_MUSIC_MOUNT_PLAY_START, (int)in_logo);
|
|
log_i("APP_MSG_MUSIC_PLAY_START AFTER MOUNT\n");
|
|
//先挂载了设备再执行
|
|
}
|
|
|
|
void music_set_start_auto_play(u8 on)
|
|
{
|
|
__this->auto_play = !!on;
|
|
}
|
|
//*----------------------------------------------------------------------------*/
|
|
/**@brief music 设备事件响应接口
|
|
@param 无
|
|
@return 1、当前消息已经处理,comomon不再做处理 0、common统一处理
|
|
@note
|
|
*/
|
|
/*----------------------------------------------------------------------------*/
|
|
int music_device_msg_handler(int *msg)
|
|
{
|
|
__this->music_busy = 1;
|
|
int err = 0;
|
|
char *logo = NULL;
|
|
char *evt_logo = NULL;
|
|
switch (msg[0]) {
|
|
case DRIVER_EVENT_FROM_SD0:
|
|
case DRIVER_EVENT_FROM_SD1:
|
|
case DRIVER_EVENT_FROM_SD2:
|
|
evt_logo = (char *)msg[2];
|
|
case DEVICE_EVENT_FROM_USB_HOST:
|
|
if (!strncmp((char *)msg[2], "udisk", 5)) {
|
|
evt_logo = (char *)msg[2];
|
|
}
|
|
int str_len = 0;
|
|
logo = (char *)music_player_get_phy_dev(__this->player_hd, &str_len);
|
|
log_i("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
|
|
if (msg[1] == DEVICE_EVENT_OUT) {
|
|
if (__this->timer) {
|
|
sys_timeout_del(__this->timer);
|
|
__this->timer = 0;
|
|
}
|
|
if (logo == NULL) {
|
|
break;
|
|
}
|
|
if (0 == memcmp(logo, evt_logo, str_len)) {
|
|
///相同的设备才响应
|
|
if (music_player_get_playing_breakpoint(__this->player_hd, __this->breakpoint, 1) == true) {
|
|
dev_manager_set_valid_by_logo(logo, 0);///尽快将设备设置为无效设备
|
|
breakpoint_vm_write(__this->breakpoint, logo);
|
|
} else {
|
|
dev_manager_set_valid_by_logo(logo, 0);///将设备设置为无效设备
|
|
}
|
|
if (__this->scandisk_mark) {//自己打断自己的扫描推消息出去,重启解码
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START, 0);
|
|
__this->scandisk_break = 1;
|
|
}
|
|
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
|
|
if (music_player_runing()) {
|
|
|
|
///停止解码,防止设备掉线后还继续使用
|
|
music_player_stop(__this->player_hd, 1);
|
|
///重新选择活动设备播放
|
|
/* app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);//卸载了设备再执行 */
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START, 0);
|
|
log_i("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
|
|
}
|
|
} else {
|
|
if (!dev_manager_check_by_logo(evt_logo)) { //未成功的插入,打断原来播放需恢复
|
|
if (!music_player_runing()) {
|
|
app_send_message(APP_MSG_MUSIC_PLAY_START, 0);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (__this->scandisk_mark) {
|
|
__this->scandisk_break = 1;
|
|
}
|
|
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN == 0)
|
|
music_task_dev_online_start(evt_logo);
|
|
#endif
|
|
}
|
|
break;
|
|
default://switch((u32)event->arg)
|
|
break;
|
|
}
|
|
|
|
__this->music_busy = 0;
|
|
return false;
|
|
}
|
|
|
|
struct app_mode *app_enter_music_mode(int arg)
|
|
{
|
|
int msg[16];
|
|
struct app_mode *next_mode;
|
|
|
|
app_music_init();
|
|
|
|
if (__this->auto_play) {
|
|
music_player_play_start();
|
|
__this->auto_play = 0;
|
|
}
|
|
while (1) {
|
|
if (!app_get_message(msg, ARRAY_SIZE(msg), music_mode_key_table)) {
|
|
continue;
|
|
}
|
|
next_mode = app_mode_switch_handler(msg);
|
|
if (next_mode) {
|
|
break;
|
|
}
|
|
|
|
switch (msg[0]) {
|
|
case MSG_FROM_APP:
|
|
music_app_msg_handler(msg + 1);
|
|
break;
|
|
case MSG_FROM_DEVICE:
|
|
break;
|
|
}
|
|
|
|
app_default_msg_handler(msg);
|
|
}
|
|
|
|
app_music_exit();
|
|
|
|
return next_mode;
|
|
}
|
|
|
|
static int music_mode_try_enter(int arg)
|
|
{
|
|
|
|
if (dev_manager_get_total(1)) {
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static int music_mode_try_exit()
|
|
{
|
|
return __this->music_busy;
|
|
}
|
|
|
|
static const struct app_mode_ops music_mode_ops = {
|
|
.try_enter = music_mode_try_enter,
|
|
.try_exit = music_mode_try_exit,
|
|
};
|
|
|
|
/*
|
|
* 注册music模式
|
|
*/
|
|
REGISTER_APP_MODE(music_mode) = {
|
|
.name = APP_MODE_MUSIC,
|
|
.index = APP_MODE_MUSIC_INDEX,
|
|
.ops = &music_mode_ops,
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|