#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