完成功能,等待测试

This commit is contained in:
FlyM 2026-07-20 00:22:24 +08:00
parent d428b715b0
commit a1a4fb183b
19 changed files with 45757 additions and 60786 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"files.associations": {
"board_ac695x_demo_cfg.h": "c"
}
}

View File

@ -1,5 +1,130 @@
#include "kt.h"
#include "key_event_deal.h"
#include "music_player.h"
enum {
KT_LED_IDLE = 0, /* 空闲慢闪 */
KT_LED_PLAY, /* 播放常亮 */
KT_LED_FAIL, /* 播放失败快闪 */
};
/* 定时器 50ms慢闪 1s灭/1s亮快闪 100ms灭/100ms亮 */
#define KT_LED_SLOW_HALF 20
#define KT_LED_FAST_HALF 2
typedef struct _kt_var_ {
int kt_timer;
int t_cnt;
u8 led_mode;
u8 active_ch; /* 1~6, 0=无按键播放会话 */
} _kt_var;
static _kt_var kt_var;
#define __this (&kt_var)
static const char *const kt_file_tab[6] = {
"/01.mp3", "/02.mp3", "/03.mp3", "/04.mp3", "/05.mp3", "/06.mp3",
};
static void kt_led_set_mode(u8 mode)
{
__this->led_mode = mode;
__this->t_cnt = 0;
if (mode == KT_LED_PLAY) {
BT_LED_ON();
}
}
static void kt_audio_all_off(void)
{
AUDIO_OUT_CH1_OFF();
AUDIO_OUT_CH2_OFF();
AUDIO_OUT_CH3_OFF();
AUDIO_OUT_CH4_OFF();
}
static void kt_channel_outputs_off(u8 ch)
{
switch (ch) {
case 1:
AUDIO_OUT_CH1_OFF();
VOLTAGE_OUT_CH1_OFF();
VLED_OUT_CH1_OFF();
break;
case 2:
AUDIO_OUT_CH2_OFF();
VOLTAGE_OUT_CH2_OFF();
VLED_OUT_CH2_OFF();
break;
case 3:
AUDIO_OUT_CH3_OFF();
VOLTAGE_OUT_CH3_OFF();
VLED_OUT_CH3_OFF();
break;
case 4:
AUDIO_OUT_CH4_OFF();
VOLTAGE_OUT_CH4_OFF();
VLED_OUT_CH4_OFF();
break;
case 5:
VLED_OUT_CH5_OFF();
break;
case 6:
VLED_OUT_CH6_OFF();
break;
default:
break;
}
}
static void kt_channel_outputs_on(u8 ch)
{
/* 音频通道互斥:先全关再开对应通道(仅 1~4 有音频/电压脚) */
kt_audio_all_off();
VOLTAGE_OUT_CH1_OFF();
VOLTAGE_OUT_CH2_OFF();
VOLTAGE_OUT_CH3_OFF();
VOLTAGE_OUT_CH4_OFF();
VLED_OUT_CH1_OFF();
VLED_OUT_CH2_OFF();
VLED_OUT_CH3_OFF();
VLED_OUT_CH4_OFF();
VLED_OUT_CH5_OFF();
VLED_OUT_CH6_OFF();
switch (ch) {
case 1:
AUDIO_OUT_CH1_ON();
VOLTAGE_OUT_CH1_ON();
VLED_OUT_CH1_ON();
break;
case 2:
AUDIO_OUT_CH2_ON();
VOLTAGE_OUT_CH2_ON();
VLED_OUT_CH2_ON();
break;
case 3:
AUDIO_OUT_CH3_ON();
VOLTAGE_OUT_CH3_ON();
VLED_OUT_CH3_ON();
break;
case 4:
AUDIO_OUT_CH4_ON();
VOLTAGE_OUT_CH4_ON();
VLED_OUT_CH4_ON();
break;
case 5:
/* 硬件无 AUDIO/VOLTAGE 通道5仅 VLED */
VLED_OUT_CH5_ON();
break;
case 6:
/* 硬件无 AUDIO/VOLTAGE 通道6仅 VLED */
VLED_OUT_CH6_ON();
break;
default:
break;
}
}
void kt_boot_init(void)
{
@ -21,40 +146,177 @@ void kt_boot_init(void)
gpio_set_die(IO_PORTA_05,1);
//CS8406 TX EN
//ch1
gpio_set_pull_down(IO_PORTB_07,0);
gpio_set_pull_up(IO_PORTB_07,0);
gpio_set_direction(IO_PORTB_07,0);
gpio_set_output_value(IO_PORTB_07,0);
//ch2
gpio_set_pull_down(IO_PORTB_08,0);
gpio_set_pull_up(IO_PORTB_08,0);
gpio_set_direction(IO_PORTB_08,0);
gpio_set_output_value(IO_PORTB_08,0);
//ch3
gpio_set_pull_down(IO_PORTB_09,0);
gpio_set_pull_up(IO_PORTB_09,0);
gpio_set_direction(IO_PORTB_09,0);
gpio_set_output_value(IO_PORTB_09,0);
//ch4
gpio_set_pull_down(IO_PORTB_10,0);
gpio_set_pull_up(IO_PORTB_10,0);
gpio_set_direction(IO_PORTB_10,0);
gpio_set_output_value(IO_PORTB_10,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL1,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL1,0);
gpio_set_direction(AUDIO_OUT_CHANNEL1,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL1,0);
//earphone enable
//ch1
gpio_set_pull_down(AUDIO_OUT_CHANNEL2,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL2,0);
gpio_set_direction(AUDIO_OUT_CHANNEL2,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL2,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL3,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL3,0);
gpio_set_direction(AUDIO_OUT_CHANNEL3,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL3,0);
gpio_set_pull_down(AUDIO_OUT_CHANNEL4,0);
gpio_set_pull_up(AUDIO_OUT_CHANNEL4,0);
gpio_set_direction(AUDIO_OUT_CHANNEL4,0);
gpio_set_output_value(AUDIO_OUT_CHANNEL4,0);
//voltage output
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL1,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL2,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL3,0);
gpio_set_pull_down(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_pull_up(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_direction(VOLTAGE_OUT_CHANNEL4,0);
gpio_set_output_value(VOLTAGE_OUT_CHANNEL4,0);
//vled output
gpio_set_pull_down(VLED_OUT_CHANNEL1,0);
gpio_set_pull_up(VLED_OUT_CHANNEL1,0);
gpio_set_direction(VLED_OUT_CHANNEL1,0);
gpio_set_output_value(VLED_OUT_CHANNEL1,0);
gpio_set_pull_down(VLED_OUT_CHANNEL2,0);
gpio_set_pull_up(VLED_OUT_CHANNEL2,0);
gpio_set_direction(VLED_OUT_CHANNEL2,0);
gpio_set_output_value(VLED_OUT_CHANNEL2,0);
gpio_set_pull_down(VLED_OUT_CHANNEL3,0);
gpio_set_pull_up(VLED_OUT_CHANNEL3,0);
gpio_set_direction(VLED_OUT_CHANNEL3,0);
gpio_set_output_value(VLED_OUT_CHANNEL3,0);
gpio_set_pull_down(VLED_OUT_CHANNEL4,0);
gpio_set_pull_up(VLED_OUT_CHANNEL4,0);
gpio_set_direction(VLED_OUT_CHANNEL4,0);
gpio_set_output_value(VLED_OUT_CHANNEL4,0);
gpio_set_pull_down(VLED_OUT_CHANNEL5,0);
gpio_set_pull_up(VLED_OUT_CHANNEL5,0);
gpio_set_direction(VLED_OUT_CHANNEL5,0);
gpio_set_output_value(VLED_OUT_CHANNEL5,0);
gpio_set_pull_down(VLED_OUT_CHANNEL6,0);
gpio_set_pull_up(VLED_OUT_CHANNEL6,0);
gpio_set_direction(VLED_OUT_CHANNEL6,0);
gpio_set_output_value(VLED_OUT_CHANNEL6,0);
//bt led
gpio_set_pull_down(BT_LED_PIN,0);
gpio_set_pull_up(BT_LED_PIN,0);
gpio_set_direction(BT_LED_PIN,0);
gpio_set_output_value(BT_LED_PIN,0);
}
static void timer_cb(void *priv)
{
u8 half;
if (__this->led_mode == KT_LED_PLAY) {
BT_LED_ON();
return;
}
half = (__this->led_mode == KT_LED_FAIL) ? KT_LED_FAST_HALF : KT_LED_SLOW_HALF;
__this->t_cnt++;
if (__this->t_cnt <= half) {
BT_LED_OFF();
} else if (__this->t_cnt <= (half * 2)) {
BT_LED_ON();
} else {
__this->t_cnt = 0;
}
}
static void start_time_base(u32 time_base_ms)
{
if (__this->kt_timer) {
sys_timer_del(__this->kt_timer);
}
__this->t_cnt = 0;
__this->kt_timer = sys_timer_add(NULL, timer_cb, time_base_ms);
}
void kt_init(void)
{
__this->active_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
//CS8406 RST
gpio_set_output_value(IO_PORTA_06, 1);
//CS8406 TX EN
gpio_set_output_value(IO_PORTB_07,1);
gpio_set_output_value(IO_PORTB_08,1);
gpio_set_output_value(IO_PORTB_09,1);
gpio_set_output_value(IO_PORTB_10,1);
/* 默认关闭各音频通道,按键播放时再打开对应通道 */
kt_audio_all_off();
start_time_base(50);
}
/* 播放结束/出错/拔卡关闭对应输出返回1表示是按键播放会话 */
int kt_music_play_end_handler(void)
{
if (__this->active_ch == 0) {
return 0;
}
printf("kt_music_play_end_handler ch=%d\n", __this->active_ch);
kt_channel_outputs_off(__this->active_ch);
__this->active_ch = 0;
kt_led_set_mode(KT_LED_IDLE);
return 1;
}
/*
* sd1/0x.mp3 udisk0/0x.mp3
* //VLED
* kt_music_play_end_handler
*/
int kt_key_event_handler(u16 key)
{
u8 ch;
int err;
const char *path;
if (key < KEY_USER_KEY_1 || key > KEY_USER_KEY_6) {
return MUSIC_PLAYER_ERR_NULL;
}
ch = (u8)(key - KEY_USER_KEY_1 + 1);
path = kt_file_tab[ch - 1];
printf("kt_key_event_handler key=%d ch=%d path=%s\n", key, ch, path);
/* 若上一首按键播放未结束,先关掉上一通道输出 */
if (__this->active_ch) {
kt_channel_outputs_off(__this->active_ch);
__this->active_ch = 0;
}
err = music_player_play_by_path((char *)"sd1", path);
if (err != MUSIC_PLAYER_SUCC) {
err = music_player_play_by_path((char *)"udisk0", path);
}
if (err == MUSIC_PLAYER_SUCC) {
kt_channel_outputs_on(ch);
__this->active_ch = ch;
kt_led_set_mode(KT_LED_PLAY);
return MUSIC_PLAYER_SUCC;
}
/* 播放失败通道不动作BT_LED 快闪 */
printf("kt play fail ch=%d err=%d\n", ch, err);
kt_led_set_mode(KT_LED_FAIL);
return MUSIC_PLAYER_ERR_NULL;
}

View File

@ -3,9 +3,65 @@
#include "system/includes.h"
#define BT_LED_PIN IO_PORTB_03
#define BT_LED_ON() (gpio_set_output_value(BT_LED_PIN,1))
#define BT_LED_OFF() (gpio_set_output_value(BT_LED_PIN,0))
#define AUDIO_OUT_CHANNEL1 IO_PORTB_07
#define AUDIO_OUT_CHANNEL2 IO_PORTB_08
#define AUDIO_OUT_CHANNEL3 IO_PORTB_09
#define AUDIO_OUT_CHANNEL4 IO_PORTB_10
#define AUDIO_OUT_CH1_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL1,1))
#define AUDIO_OUT_CH2_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL2,1))
#define AUDIO_OUT_CH3_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL3,1))
#define AUDIO_OUT_CH4_ON() (gpio_set_output_value(AUDIO_OUT_CHANNEL4,1))
#define AUDIO_OUT_CH1_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL1,0))
#define AUDIO_OUT_CH2_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL2,0))
#define AUDIO_OUT_CH3_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL3,0))
#define AUDIO_OUT_CH4_OFF() (gpio_set_output_value(AUDIO_OUT_CHANNEL4,0))
#define VOLTAGE_OUT_CHANNEL1 IO_PORTA_09
#define VOLTAGE_OUT_CHANNEL2 IO_PORTA_10
#define VOLTAGE_OUT_CHANNEL3 IO_PORTB_02
#define VOLTAGE_OUT_CHANNEL4 IO_PORTB_11
#define VOLTAGE_OUT_CH1_ON() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL1,1))
#define VOLTAGE_OUT_CH2_ON() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL2,1))
#define VOLTAGE_OUT_CH3_ON() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL3,1))
#define VOLTAGE_OUT_CH4_ON() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL4,1))
#define VOLTAGE_OUT_CH1_OFF() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL1,0))
#define VOLTAGE_OUT_CH2_OFF() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL2,0))
#define VOLTAGE_OUT_CH3_OFF() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL3,0))
#define VOLTAGE_OUT_CH4_OFF() (gpio_set_output_value(VOLTAGE_OUT_CHANNEL4,0))
#define VLED_OUT_CHANNEL1 IO_PORTA_12
#define VLED_OUT_CHANNEL2 IO_PORTC_00
#define VLED_OUT_CHANNEL3 IO_PORTC_01
#define VLED_OUT_CHANNEL4 IO_PORTC_02
#define VLED_OUT_CHANNEL5 IO_PORTC_03
#define VLED_OUT_CHANNEL6 IO_PORTB_00
#define VLED_OUT_CH1_ON() (gpio_set_output_value(VLED_OUT_CHANNEL1,1))
#define VLED_OUT_CH2_ON() (gpio_set_output_value(VLED_OUT_CHANNEL2,1))
#define VLED_OUT_CH3_ON() (gpio_set_output_value(VLED_OUT_CHANNEL3,1))
#define VLED_OUT_CH4_ON() (gpio_set_output_value(VLED_OUT_CHANNEL4,1))
#define VLED_OUT_CH5_ON() (gpio_set_output_value(VLED_OUT_CHANNEL5,1))
#define VLED_OUT_CH6_ON() (gpio_set_output_value(VLED_OUT_CHANNEL6,1))
#define VLED_OUT_CH1_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL1,0))
#define VLED_OUT_CH2_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL2,0))
#define VLED_OUT_CH3_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL3,0))
#define VLED_OUT_CH4_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL4,0))
#define VLED_OUT_CH5_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL5,0))
#define VLED_OUT_CH6_OFF() (gpio_set_output_value(VLED_OUT_CHANNEL6,0))
// tx rst PA6
// tx audio status PA7
int kt_key_event_handler(u16 key);
int kt_music_play_end_handler(void);
void kt_boot_init(void);
void kt_init(void);

View File

@ -25,7 +25,7 @@
//*********************************************************************************//
// app 配置 //
//*********************************************************************************//
#define TCFG_APP_BT_EN 1
#define TCFG_APP_BT_EN 0
#define TCFG_APP_MUSIC_EN 1
#define TCFG_APP_LINEIN_EN 0
#define TCFG_APP_FM_EN 0
@ -42,7 +42,7 @@
//*********************************************************************************//
// UART配置 //
//*********************************************************************************//
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_ENABLE DISABLE_THIS_MOUDLE //串口打印模块使能
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置用于打印可以选择NO_CONFIG_PORT
#define TCFG_UART0_TX_PORT IO_PORT_DP //串口发送脚配置
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
@ -142,7 +142,7 @@
// USB 配置 //
//*********************************************************************************//
#define TCFG_PC_ENABLE TCFG_APP_PC_EN//PC模块使能
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE//U盘模块使能
#define TCFG_UDISK_ENABLE ENABLE_THIS_MOUDLE//U盘模块使能
#define TCFG_OTG_USB_DEV_EN BIT(0)//USB0 = BIT(0) USB1 = BIT(1)
#define TCFG_VIR_UDISK_ENABLE 0//ENABLE_THIS_MOUDLE

View File

@ -12,22 +12,22 @@
const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
//单击 //长按 //hold //抬起 //双击 //三击
[0] = {
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_1, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[1] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_2, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[2] = {
KEY_MUSIC_PP, KEY_CALL_HANG_UP, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL
KEY_USER_KEY_3, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_4, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[4] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL
KEY_USER_KEY_5, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[5] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_ENC_START, KEY_NULL
KEY_USER_KEY_6, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[6] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
@ -129,25 +129,25 @@ const u16 linein_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
const u16 music_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
//单击 //长按 //hold //抬起 //双击 //三击
[0] = {
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH, KEY_NULL
KEY_USER_KEY_1, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[1] = {
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_2, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[2] = {
KEY_MUSIC_PP, KEY_MUSIC_CHANGE_DEV, KEY_NULL, KEY_NULL, KEY_MUSIC_CHANGE_REPEAT, KEY_NULL
KEY_USER_KEY_3, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[3] = {
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_4, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[4] = {
KEY_MUSIC_PLAYE_PREV_FOLDER, KEY_MUSIC_FR, KEY_MUSIC_FR, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL
KEY_USER_KEY_5, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[5] = {
KEY_MUSIC_PLAYE_NEXT_FOLDER, KEY_MUSIC_FF, KEY_MUSIC_FF, KEY_NULL, KEY_NULL, KEY_NULL
KEY_USER_KEY_6, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[6] = {
KEY_MUSIC_PLAYER_AB_REPEAT_SWITCH, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
},
[7] = {
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL

View File

@ -14,7 +14,7 @@
#define CONFIG_DEBUG_LIB(x) (x & LIB_DEBUG)
#define CONFIG_DEBUG_ENABLE
//#define CONFIG_DEBUG_ENABLE
#ifndef CONFIG_DEBUG_ENABLE
//#define CONFIG_DEBUG_LITE_ENABLE //轻量级打印开关, 默认关闭

View File

@ -172,6 +172,12 @@ enum {
KEY_IR_NUM_8,
KEY_IR_NUM_9,//中间不允许插入
//在这里增加元素
KEY_USER_KEY_1,
KEY_USER_KEY_2,
KEY_USER_KEY_3,
KEY_USER_KEY_4,
KEY_USER_KEY_5,
KEY_USER_KEY_6,
//
KEY_HID_MODE_SWITCH,
KEY_HID_TAKE_PICTURE,

View File

@ -19,6 +19,7 @@
#include "clock_cfg.h"
#include "system/fs/fs.h"
#include "user_api/app_status_api.h"
#include "kt.h"
/*************************************************************
music模式按键处理和事件处理
@ -48,13 +49,15 @@
static u8 music_idle_flag = 1;
/// 模式参数结构体
struct __music_task_parm {
struct __music_task_parm
{
u8 type;
int val;
};
/// music模式控制结构体
struct __music {
struct __music
{
struct __music_task_parm task_parm;
u16 file_err_counter; // 错误文件统计
u8 file_play_direct; // 0:下一曲, 1上一曲
@ -69,20 +72,21 @@ struct __music music_hdl;
static struct __breakpoint *breakpoint = NULL;
static void music_player_play_start(void);
/// 设备提示音使能
#define MUSIC_DEVICE_TONE_EN 0
#if (MUSIC_DEVICE_TONE_EN)
struct __dev_tone {
struct __dev_tone
{
char *logo;
char *phy_logo;
char *tone_path;
u16 index;
};
enum {
enum
{
/// 0x1000起始为了不要跟提示音的IDEX_TONE_重叠了
DEVICE_INDEX_UDISK = 0x1000,
DEVICE_INDEX_UDISK_REC,
@ -102,17 +106,21 @@ const struct __dev_tone device_tone[] = {
static void music_tone_play_end_callback(void *priv, int flag);
int music_device_tone_play(char *logo)
{
if (logo == NULL) {
if (logo == NULL)
{
return false;
}
printf("__this->device_tone_dev = %s, logo =%s\n", __this->device_tone_dev, logo);
char *phy_logo = dev_manager_get_phy_logo(dev_manager_find_spec(logo, 0));
if (phy_logo && (strcmp(__this->device_tone_dev, phy_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) {
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));
@ -125,8 +133,6 @@ int music_device_tone_play(char *logo)
}
#endif
#if TCFG_LFN_EN
static u8 music_file_name[128] = {0}; // 长文件名
u16 music_file_name_len = 0;
@ -137,7 +143,8 @@ u16 music_file_name_len = 0;
const char *music_file_get_cur_name(int *len, int *is_unicode)
{
if (music_file_name[0] == '\\' && music_file_name[1] == 'U') {
if (music_file_name[0] == '\\' && music_file_name[1] == 'U')
{
*is_unicode = 1;
*len = music_file_name_len - 2;
return (const char *)(music_file_name + 2);
@ -147,26 +154,28 @@ const char *music_file_get_cur_name(int *len, int *is_unicode)
return (const char *)music_file_name;
}
static void music_set_dev_sync_mode(char *logo, u8 mode)
{
if (logo) {
if (logo)
{
struct imount *mount_hdl = NULL;
u8 async_mode = mode;
if ((!memcmp(logo, "udisk0", strlen("udisk0")))
|| (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec")))) {
if ((!memcmp(logo, "udisk0", strlen("udisk0"))) || (!memcmp(logo, "udisk0_rec", strlen("udisk0_rec"))))
{
struct file_dec_hdl *dec = get_file_dec_hdl();
if (dec) {
if (dec)
{
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec(logo, 0));
if (mount_hdl) {
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS
|| dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV) {
if (mount_hdl)
{
if (dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_APE || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_FLAC || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_DTS || dec->file_dec.decoder.dec_ops->coding_type == AUDIO_CODING_WAV)
{
/// 指定解码格式开启该功能
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
} else {
}
else
{
/// 不指定的解码格式不开启
async_mode = 0;
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
@ -174,10 +183,13 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
printf("udisk, set usb ASYNC = %d\n", async_mode);
}
}
} else {
}
else
{
// 不是udisk, 如果udisk在线 将udisk设置成非AYSNC_MODE
mount_hdl = dev_manager_get_mount_hdl(dev_manager_find_spec("udisk0", 0));
if (mount_hdl) {
if (mount_hdl)
{
async_mode = 0;
printf("not udisk, set usb ASYNC = 0\n");
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_ASYNC_MODE, (u32)async_mode);
@ -186,7 +198,6 @@ static void music_set_dev_sync_mode(char *logo, u8 mode)
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码成功回调
@param priv: parm:
@ -213,19 +224,21 @@ static void music_player_play_success(void *priv, int parm)
log_i("file indir = %d\n", music_player_get_fileindir_number());
music_file_name_len = fget_name(music_player_get_file_hdl(), music_file_name, sizeof(music_file_name));
int unicode = 0;
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U')) {
if ((music_file_name[0] == '\\') && (music_file_name[1] == 'U'))
{
unicode = 1;
music_file_name_len -= 2;
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name + 2, music_file_name_len, unicode);
} else {
}
else
{
log_i("cur file = %s, len = %d, unicode = %d\n", music_file_name, music_file_name_len, unicode);
}
log_i("\n");
/// save breakpoint, 只保存文件信息
if (music_player_get_playing_breakpoint(breakpoint, 0) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 0) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
@ -236,7 +249,6 @@ static void music_player_play_success(void *priv, int parm)
/// smartbox info update
SMARTBOX_UPDATE(MUSIC_FUNCTION_MASK,
BIT(MUSIC_INFO_ATTR_STATUS) | BIT(MUSIC_INFO_ATTR_FILE_NAME) | BIT(MUSIC_INFO_ATTR_FILE_PLAY_MODE));
}
//*----------------------------------------------------------------------------*/
/**@brief music 解码结束回调处理
@ -281,35 +293,44 @@ static int music_player_scandisk_break(void)
char *logo = NULL;
char *evt_logo = NULL;
app_task_get_msg(msg, ARRAY_SIZE(msg), 0);
switch (msg[0]) {
switch (msg[0])
{
case APP_MSG_SYS_EVENT:
event = (struct sys_event *)(&msg[1]);
switch (event->type) {
switch (event->type)
{
case SYS_DEVICE_EVENT:
switch ((u32)event->arg) {
switch ((u32)event->arg)
{
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
evt_logo = (char *)"udisk0";
}
/// 设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
int str_len = 0;
logo = music_player_get_phy_dev(&str_len);
/// 响应设备插拔打断
if (event->u.dev.event == DEVICE_EVENT_OUT) {
if (event->u.dev.event == 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))) {
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
__this->scandisk_break = 1;
}
} else {
}
else
{
/// 响应新设备上线
__this->scandisk_break = 1;
}
if (__this->scandisk_break == 0) {
if (__this->scandisk_break == 0)
{
log_i("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
dev_status_event_filter(event);
log_i("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
@ -318,12 +339,14 @@ static int music_player_scandisk_break(void)
}
break;
case SYS_BT_EVENT:
if (bt_background_event_handler_filter(event)) {
if (bt_background_event_handler_filter(event))
{
__this->scandisk_break = 1;
}
break;
case SYS_KEY_EVENT:
switch (event->u.key.event) {
switch (event->u.key.event)
{
case KEY_CHANGE_MODE:
/// 响应切换模式事件
__this->scandisk_break = 1;
@ -331,7 +354,8 @@ static int music_player_scandisk_break(void)
// 其他按键case 在这里增加
}
/// 因为TWS转发sys_event_notify需要用原始的按键序号 未经过按键表处理, 所以这里要特殊处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
app_task_put_key_msg(event->u.key.event, (int)event->u.key.value);
printf("key break scan!!");
return 1;
@ -340,12 +364,15 @@ static int music_player_scandisk_break(void)
}
break;
}
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
/// 查询到需要打断的事件, 返回1 并且重新推送一次该事件,跑主循环处理流程
sys_event_notify(event);
printf("scandisk_break!!!!!!\n");
return 1;
} else {
}
else
{
return 0;
}
}
@ -361,11 +388,13 @@ static void scan_enter(struct __dev *dev)
{
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
if (mount_hdl) {
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_GET_SPEED, (u32)&__this->old_speed); // 获取sd速度
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) { //设定速度大于获取的才加速
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{ // 设定速度大于获取的才加速
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, SD_BAUD_RATE_CHANGE_WHEN_SCAN);
}
}
@ -378,10 +407,12 @@ static void scan_exit(struct __dev *dev)
{
#ifdef SD_BAUD_RATE_CHANGE_WHEN_SCAN
struct imount *mount_hdl = dev_manager_get_mount_hdl(dev);
if (mount_hdl) {
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0")))
|| (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1")))) {
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed) {
if (mount_hdl)
{
if ((!memcmp(dev_manager_get_logo(dev), "sd0", strlen("sd0"))) || (!memcmp(dev_manager_get_logo(dev), "sd1", strlen("sd1"))))
{
if (SD_BAUD_RATE_CHANGE_WHEN_SCAN > __this->old_speed)
{
dev_ioctl(mount_hdl->dev.fd, IOCTL_SET_SPEED, __this->old_speed); // 恢复原速
}
}
@ -408,15 +439,16 @@ static void music_tone_play_end_callback(void *priv, int flag)
u32 index = (u32)priv;
char *logo = NULL;
if (APP_MUSIC_TASK != app_get_curr_task()) {
if (APP_MUSIC_TASK != app_get_curr_task())
{
log_error("tone callback task out \n");
return;
}
switch (index) {
switch (index)
{
case IDEX_TONE_MUSIC:
///提示音播放结束, 启动播放器播放
music_player_play_start();
/// 进入 music 后不自动播放,保持静默
break;
#if (MUSIC_DEVICE_TONE_EN)
case DEVICE_INDEX_UDISK:
@ -425,8 +457,10 @@ static void music_tone_play_end_callback(void *priv, int flag)
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) {
for (int i = 0; i < ARRAY_SIZE(device_tone); i++)
{
if (index == device_tone[i].index)
{
logo = device_tone[i].logo;
break;
}
@ -439,7 +473,6 @@ static void music_tone_play_end_callback(void *priv, int flag)
}
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式解码错误处理
@param err:MUSIC_PLAYER错误码表枚举
@ -451,15 +484,18 @@ void music_player_err_deal(int err)
{
u16 msg = KEY_NULL;
char *logo = NULL;
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL) {
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_ERR_DECODE_FAIL)
{
__this->file_err_counter = 0; /// 清除错误文件累计
}
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC) {
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC)
{
log_e("music player err = %d\n", err);
}
switch (err) {
switch (err)
{
case MUSIC_PLAYER_SUCC:
__this->file_err_counter = 0;
break;
@ -470,35 +506,48 @@ void music_player_err_deal(int err)
msg = KEY_MUSIC_PLAYER_QUIT; // 退出音乐模式
break;
case MUSIC_PLAYER_ERR_DECODE_FAIL:
if (__this->file_err_counter >= music_player_get_file_total()) {
if (__this->file_err_counter >= music_player_get_file_total())
{
__this->file_err_counter = 0;
dev_manager_set_valid_by_logo(music_player_get_dev_cur(), 0); /// 将设备设置为无效设备
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
} else {
msg = KEY_MUSIC_AUTO_NEXT_DEV;///所有文件都是错误的, 切换到下一个设备
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
/// 无设备时留在 music 空闲,等待插卡
}
} else {
else
{
/// 不自动切设备播放
}
}
else
{
__this->file_err_counter++;
if (__this->file_play_direct == 0) {
if (__this->file_play_direct == 0)
{
msg = KEY_MUSIC_NEXT; // 播放下一曲
} else {
}
else
{
msg = KEY_MUSIC_PREV; // 播放上一曲
}
}
break;
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
log_e("MUSIC_PLAYER_ERR_DEV_NOFOUND \n");
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0获取所有设备
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
} else {
msg = KEY_MUSIC_PLAYER_START;///没有找到指定设备, 播放之前的活动设备
if (dev_manager_get_total(1) == 0)
{ // 参数为1 :获取所有有效设备 参数0获取所有设备
/// 无设备时留在 music 空闲,等待插卡
}
else
{
/// 不自动切设备播放
}
break;
case MUSIC_PLAYER_ERR_FSCAN:
/// 需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
__this->scandisk_break = 0;
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
@ -507,53 +556,68 @@ void music_player_err_deal(int err)
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
logo = music_player_get_dev_cur();
if (dev_manager_online_check_by_logo(logo, 1)) {
if (dev_manager_online_check_by_logo(logo, 1))
{
/// 如果错误失败在线, 并且是播放过程中产生的,先记录下断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
music_player_stop(0); // 先停止防止下一步操作VM卡顿
breakpoint_vm_write(breakpoint, logo);
}
if (err == MUSIC_PLAYER_ERR_FSCAN) {
if (err == MUSIC_PLAYER_ERR_FSCAN)
{
dev_manager_set_valid_by_logo(logo, 0); /// 将设备设置为无效设备
} else {
}
else
{
// 针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
dev_manager_unmount(logo);
}
}
if (dev_manager_get_total(1) == 0) {
if (dev_manager_get_total(1) == 0)
{
app_status_handler(APP_STATUS_MUSIC_QUIT);
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
} else {
msg = KEY_MUSIC_AUTO_NEXT_DEV;///切换设备
/// 无设备时留在 music 空闲,等待插卡
}
else
{
/// 不自动切设备播放
}
break;
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
/// 查找文件有扫盘的可能也需要结合music_player_scandisk_break中处理的标志位处理
if (__this->scandisk_break) {
if (__this->scandisk_break)
{
__this->scandisk_break = 0;
/// 此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
break;
}
case MUSIC_PLAYER_ERR_PARM:
logo = music_player_get_dev_cur();
if (dev_manager_online_check_by_logo(logo, 1)) {
if (music_player_get_file_total()) {
if (dev_manager_online_check_by_logo(logo, 1))
{
if (music_player_get_file_total())
{
msg = KEY_MUSIC_PLAYER_PLAY_FIRST; /// 有文件,播放第一个文件
break;
}
}
if (dev_manager_get_total(1) == 0) {
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
} else {
msg = KEY_MUSIC_AUTO_NEXT_DEV;
if (dev_manager_get_total(1) == 0)
{
/// 无设备时留在 music 空闲,等待插卡
}
else
{
/// 不自动切设备播放
}
break;
case MUSIC_PLAYER_ERR_FILE_READ: // 文件读错误
msg = KEY_MUSIC_NEXT; // 播放下一曲
break;
}
if (msg != KEY_NULL) {
if (msg != KEY_NULL)
{
app_task_put_key_msg(msg, 0);
}
}
@ -579,42 +643,101 @@ static int music_key_event_opr(struct sys_event *event)
log_i("music task msg = %d\n", msg[0]);
switch (msg[0]) {
switch (msg[0])
{
case KEY_MUSIC_DEVICE_TONE_END:
#if (MUSIC_DEVICE_TONE_EN)
logo = (char *)msg[1];
log_i("KEY_MUSIC_DEVICE_TONE_END %s\n", logo);
if (logo) {
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (logo)
{
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
}
break;
#endif
case KEY_USER_KEY_1:
printf("KEY_USER_KEY_1\n");
//优先播放sd1/01.mp3其次播放udisk0/01.mp3,并打开音频通道1如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL1,2-打开VLED_OUT_CH1
//播放完成后关闭VOLTAGE_CHANNEL1,VLED_OUT_CH1
err = kt_key_event_handler(KEY_USER_KEY_1);
break;
case KEY_USER_KEY_2:
printf("KEY_USER_KEY_2\n");
//优先播放sd1/02.mp3其次播放udisk0/02.mp3,并打开音频通道2如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL2,2-打开VLED_OUT_CH2
//播放完成后关闭VOLTAGE_CHANNEL2,VLED_OUT_CH2
err = kt_key_event_handler(KEY_USER_KEY_2);
break;
case KEY_USER_KEY_3:
printf("KEY_USER_KEY_3\n");
//优先播放sd1/03.mp3其次播放udisk0/03.mp3,并打开音频通道3如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL3,2-打开VLED_OUT_CH3
//播放完成后关闭VOLTAGE_CHANNEL3,VLED_OUT_CH3
err = kt_key_event_handler(KEY_USER_KEY_3);
break;
case KEY_USER_KEY_4:
printf("KEY_USER_KEY_4\n");
//优先播放sd1/04.mp3其次播放udisk0/04.mp3,并打开音频通道4如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL4,2-打开VLED_OUT_CH4
//播放完成后关闭VOLTAGE_CHANNEL4,VLED_OUT_CH4
err = kt_key_event_handler(KEY_USER_KEY_4);
break;
case KEY_USER_KEY_5:
printf("KEY_USER_KEY_5\n");
//优先播放sd1/05.mp3其次播放udisk0/05.mp3,并打开音频通道5如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL5,2-打开VLED_OUT_CH5
//播放完成后关闭VOLTAGE_CHANNEL5,VLED_OUT_CH5
err = kt_key_event_handler(KEY_USER_KEY_5);
break;
case KEY_USER_KEY_6:
printf("KEY_USER_KEY_6\n");
//优先播放sd1/06.mp3其次播放udisk0/06.mp3,并打开音频通道6如果播放失败则不做任何反应
//如果播放成功1-打开VOLTAGE_CHANNEL6,2-打开VLED_OUT_CH6
//播放完成后关闭VOLTAGE_CHANNEL6,VLED_OUT_CH6
err = kt_key_event_handler(KEY_USER_KEY_6);
break;
case KEY_MUSIC_PLAYER_START:
log_i("KEY_MUSIC_PLAYER_START !!\n");
app_status_handler(APP_STATUS_MUSIC_PLAY);
/// 断点播放活动设备
logo = dev_manager_get_logo(dev_manager_find_active(1));
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_dev_cur() && logo) {
if (logo == NULL)
{
log_w("no play device, stay in music idle\n");
break;
}
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
if (music_player_get_dev_cur() && logo)
{
/// 播放的设备跟当前活动的设备是同一个设备,不处理
if (0 == strcmp(logo, music_player_get_dev_cur())) {
if (0 == strcmp(logo, music_player_get_dev_cur()))
{
log_w("the same dev!!\n");
break;
}
}
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
if (music_device_tone_play(logo) == true)
{
break;
}
#endif
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
break;
@ -626,27 +749,41 @@ static int music_key_event_opr(struct sys_event *event)
/// 结束消息处理
case KEY_MUSIC_PLAYER_END:
log_i("KEY_MUSIC_PLAYER_END\n");
if (kt_music_play_end_handler()) {
/// 按键指定文件播放结束:关通道,不自动下一曲
err = MUSIC_PLAYER_ERR_NULL;
break;
}
err = music_player_end_deal(msg[1]);
break;
// 播放器解码错误处理
case KEY_MUSIC_PLAYER_DEC_ERR:
if (kt_music_play_end_handler()) {
err = MUSIC_PLAYER_ERR_NULL;
break;
}
err = music_player_decode_err_deal(msg[1]);
break;
/// 播放执行类消息
case KEY_MUSIC_PP:
log_i("KEY_MUSIC_PP\n");
logo = music_player_get_dev_cur();
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
music_set_dev_sync_mode(logo, 0);
} else {
}
else
{
music_set_dev_sync_mode(logo, 1);
}
err = music_player_pp();
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY)
{
app_status_handler(APP_STATUS_MUSIC_PLAY);
ui_update_status(STATUS_MUSIC_PLAY);
} else {
}
else
{
app_status_handler(APP_STATUS_MUSIC_PP);
ui_update_status(STATUS_MUSIC_PAUSE);
/* tone_play_by_path(tone_table[IDEX_TONE_MAX_VOL],1); */
@ -688,22 +825,28 @@ static int music_key_event_opr(struct sys_event *event)
auto_next_dev = ((msg[0] == KEY_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
logo = music_player_get_dev_next(auto_next_dev);
printf("next dev = %s\n", logo);
if (logo == NULL) { ///找不到下一个设备,不响应设备切换
if (logo == NULL)
{ /// 找不到下一个设备,不响应设备切换
break;
}
/// 切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
music_player_stop(0); // 先停止防止下一步操作VM卡顿
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
#if (MUSIC_DEVICE_TONE_EN)
if (music_device_tone_play(logo) == true) {
if (music_device_tone_play(logo) == true)
{
break;
}
#endif
if (true == breakpoint_vm_read(breakpoint, logo)) {
if (true == breakpoint_vm_read(breakpoint, logo))
{
err = music_player_play_by_breakpoint(logo, breakpoint);
} else {
}
else
{
err = music_player_play_first_file(logo);
}
break;
@ -711,12 +854,16 @@ static int music_key_event_opr(struct sys_event *event)
log_i("KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH\n");
#if (TCFG_RECORD_FOLDER_DEV_ENABLE)
/// 尝试保存断点
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
}
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev())) {
if (true == breakpoint_vm_read(breakpoint, music_player_get_cur_music_dev()))
{
err = music_player_play_record_folder(NULL, breakpoint);
} else {
}
else
{
err = music_player_play_record_folder(NULL, NULL);
}
#endif // TCFG_RECORD_FOLDER_DEV_ENABLE
@ -736,7 +883,6 @@ static int music_key_event_opr(struct sys_event *event)
err = music_player_play_by_path((char *)"udisk0", "/sin.wav"); /// this is a demo
break;
/// 非播放执行类消息
case KEY_MUSIC_FF:
log_i("KEY_MUSIC_FF\n");
@ -751,7 +897,8 @@ static int music_key_event_opr(struct sys_event *event)
case KEY_MUSIC_CHANGE_REPEAT:
log_i("KEY_MUSIC_CHANGE_REPEAT\n");
mode = music_player_change_repeat_mode();
if (mode > 0) {
if (mode > 0)
{
UI_SHOW_MENU(MENU_MUSIC_REPEATMODE, 1000, mode, NULL);
}
break;
@ -768,7 +915,6 @@ static int music_key_event_opr(struct sys_event *event)
break;
}
/// 错误处理
music_player_err_deal(err);
/// smartbox info update
@ -778,7 +924,6 @@ static int music_key_event_opr(struct sys_event *event)
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief music 设备事件响应接口
@param
@ -791,42 +936,48 @@ static int music_sys_event_handler(struct sys_event *event)
int err = 0;
char *logo = NULL;
char *evt_logo = NULL;
switch (event->type) {
switch (event->type)
{
case SYS_KEY_EVENT:
return music_key_event_opr(event);
case SYS_DEVICE_EVENT:
switch ((u32)event->arg) {
switch ((u32)event->arg)
{
case DRIVER_EVENT_FROM_SD0:
case DRIVER_EVENT_FROM_SD1:
case DRIVER_EVENT_FROM_SD2:
evt_logo = (char *)event->u.dev.value;
case DEVICE_EVENT_FROM_OTG:
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG)
{
evt_logo = (char *)"udisk0";
}
int str_len = 0;
logo = music_player_get_phy_dev(&str_len);
log_i("evt_logo =%s, logo = %s len =%d\n", evt_logo, logo, str_len);
if (event->u.dev.event == DEVICE_EVENT_OUT) {
if (logo == NULL) {
if (event->u.dev.event == DEVICE_EVENT_OUT)
{
if (logo == NULL)
{
break;
}
if (logo && (0 == memcmp(logo, evt_logo, str_len))) {
if (logo && (0 == memcmp(logo, evt_logo, str_len)))
{
/// 相同的设备才响应
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
memset(__this->device_tone_dev, 0, sizeof(__this->device_tone_dev));
///停止解码,防止设备掉线后还继续使用
/// 停止解码,防止设备掉线后还继续使用;不自动切到其他设备播放
music_player_stop(1);
///重新选择活动设备播放
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);//卸载了设备再执行
log_i("KEY_MUSIC_PLAYER_START AFTER UMOUNT\n");
kt_music_play_end_handler();
log_i("dev out, stay idle (no auto play)\n");
}
} else {
#if (MUSIC_DEV_ONLINE_START_AFTER_MOUNT_EN == 0)
music_task_dev_online_start();
#endif
}
else
{
/// 设备上线不自动播放
}
break;
default: // switch((u32)event->arg)
@ -865,7 +1016,8 @@ void music_task_set_parm(u8 type, int val)
/*----------------------------------------------------------------------------*/
static void music_player_play_start(void)
{
switch (__this->task_parm.type) {
switch (__this->task_parm.type)
{
case MUSIC_TASK_START_BY_NORMAL:
log_i("MUSIC_TASK_START_BY_NORMAL\n");
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
@ -881,34 +1033,16 @@ static void music_player_play_start(void)
/// 提示音播放失败直接推送KEY_MUSIC_PLAYER_START启动播放
}
//*----------------------------------------------------------------------------*/
/**@brief music 模式新设备上线处理
@param
@return
@note
@note /U盘不上线自动播放/
*/
/*----------------------------------------------------------------------------*/
void music_task_dev_online_start(void)
{
u8 save = 0;
char *logo = music_player_get_dev_cur();
if (logo && breakpoint) {
///新设备上线, 先记录当前设备断点, 然后播放活动设备
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
save = 1;
//这里不要直接记忆断点, 解码停了之后再记忆
//breakpoint_vm_write(breakpoint, logo);
}
}
///停止解码,播放新活动设备
music_player_stop(1);
if (save && breakpoint) {
breakpoint_vm_write(breakpoint, logo);
}
app_task_put_key_msg(KEY_MUSIC_PLAYER_START, 0);
log_i("KEY_MUSIC_PLAYER_START AFTER MOUNT\n");
//先挂载了设备再执行
log_i("dev online, stay idle (no auto play)\n");
}
//*----------------------------------------------------------------------------*/
@ -937,7 +1071,6 @@ static void music_task_start()
/// 按键使能
sys_key_event_enable();
/// 播放器初始化
struct __player_parm parm = {0};
parm.cb = &music_player_callback;
@ -963,7 +1096,8 @@ static void music_task_close()
UI_HIDE_CURR_WINDOW();
tone_play_stop_by_path(tone_table[IDEX_TONE_MUSIC]); // 停止播放提示音
char *logo = music_player_get_dev_cur();
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
if (music_player_get_playing_breakpoint(breakpoint, 1) == true)
{
breakpoint_vm_write(breakpoint, logo);
}
@ -982,16 +1116,13 @@ static void music_task_close()
/**@brief music 在线检测 切换模式判断使用
@param
@return 1 线 0 线
@note
@note SD/U盘时也允许进入 music
*/
/*----------------------------------------------------------------------------*/
int music_app_check(void)
{
if (dev_manager_get_total(1)) {
return true;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief music 主任务
@ -1005,36 +1136,24 @@ void app_music_task()
int res;
int msg[32];
music_task_start();
/// 进入 music 后不自动播放(有无介质均静默),由按键/业务自行触发播放
#if (MUSIC_DEVICE_TONE_EN)
music_player_play_start();
#else
#if TCFG_DEC2TWS_ENABLE
extern void set_tws_background_connected_flag(u8 flag);
extern u8 get_tws_background_connected_flag();
if (get_tws_background_connected_flag()) { //不播放提示音
music_player_play_start();
set_tws_background_connected_flag(0);
} else
#endif
while (1)
{
tone_play_with_callback_by_name(tone_table[IDEX_TONE_MUSIC], 1, music_tone_play_end_callback, (void *)IDEX_TONE_MUSIC);
}
#endif
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
switch (msg[0])
{
case APP_MSG_SYS_EVENT:
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
if (music_sys_event_handler((struct sys_event *)(&msg[1])) == false)
{
app_default_event_deal((struct sys_event *)(&msg[1]));
}
break;
default:
break;
}
if (app_task_exitting()) {
if (app_task_exitting())
{
music_task_close();
return;
}
@ -1054,10 +1173,6 @@ REGISTER_LP_TARGET(music_lp_target) = {
void app_music_task()
{
}
#endif

View File

@ -62,8 +62,14 @@ static int power_on_init(void)
return 0;
#endif
app_task_switch_to(APP_MUSIC_TASK);
#if 0
#if TCFG_APP_BT_EN
app_task_switch_to(APP_BT_TASK);
app_task_switch_to(APP_MUSIC_TASK);
#else
#if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式
@ -76,6 +82,7 @@ static int power_on_init(void)
/* app_task_switch_to(APP_LINEIN_TASK);//如果带检测,设备不在线,则不跳转 */
#endif
#endif
#endif
return 0;

View File

@ -1,5 +1,26 @@
fat_vfs_ops

Binary file not shown.

View File

@ -1,6 +1,27 @@
rem @echo off
@echo *****************************************************************

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff