KT24-1110_65E-HA-651B/apps/soundbox/task_manager/spdif/spdif.c

234 lines
5.6 KiB
C
Raw Permalink Normal View History

2024-11-10 10:44:17 +00:00
/*************************************************************
spdif模式按键处理和事件处理
void app_spdif_task()
spdif模式主函数
static int spdif_sys_event_handler(struct sys_event *event)
spdif模式系统事件所有处理入口
static void spdif_task_close(void)
spdif模式退出
**************************************************************/
#include "app_config.h"
#include "key_event_deal.h"
#include "system/includes.h"
#include "tone_player.h"
#include "app_task.h"
#include "tone_player.h"
#include "media/includes.h"
#include "asm/audio_spdif.h"
#include "clock_cfg.h"
#include "ui/ui_api.h"
#include "ui_manage.h"
#if TCFG_APP_SPDIF_EN
extern struct audio_spdif_hdl spdif_slave_hdl;
/* #define LOG_TAG_CONST APP_SPDIF */
#define LOG_TAG "[APP_SPDIF]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
static u8 source = 0;
///*----------------------------------------------------------------------------*/
/**@brief spdif 硬件设置
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void spdif_open(void)
{
#if TCFG_SPDIF_OUTPUT_ENABLE
spdif_slave_hdl.output_port = SPDIF_OUT_PORT_A;//PB11
#endif
spdif_slave_hdl.input_port = SPDIF_IN_PORT_A;//PA9
source = 0;
audio_spdif_slave_open(&spdif_slave_hdl);
audio_spdif_slave_start(&spdif_slave_hdl);
#if TCFG_HDMI_ARC_ENABLE
extern void hdmi_cec_init(void);
hdmi_cec_init();
#endif
}
///*----------------------------------------------------------------------------*/
/**@brief spdif 模式初始化
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void spdif_app_init(void)
{
extern void spdif_dec_init(void);
spdif_dec_init();
ui_update_status(STATUS_SPDIF_MODE);
clock_idle(SPDIF_IDLE_CLOCK);
UI_SHOW_WINDOW(ID_WINDOW_SPDIF);
sys_key_event_enable();
spdif_open();
}
//*----------------------------------------------------------------------------*/
/**@brief spdif 模式退出
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void spdif_task_close(void)
{
UI_HIDE_CURR_WINDOW();
audio_spdif_slave_close(&spdif_slave_hdl);
log_info("APP_SPDIF_STOP1\n");
extern void spdif_dec_close(void);
spdif_dec_close();
#if TCFG_HDMI_ARC_ENABLE
extern void hdmi_cec_close(void);
hdmi_cec_close();
#endif
}
//*----------------------------------------------------------------------------*/
/**@brief spdif 输入io口设置
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static void switch_spdif_input_port(void)
{
source++;
if (source > 2) {
source = 0;
}
printf("\n--func=%s\n", __FUNCTION__);
switch (source) {
case 0:
audio_spdif_slave_switch_port(&spdif_slave_hdl, SPDIF_IN_PORT_A);
break;
case 1:
audio_spdif_slave_switch_port(&spdif_slave_hdl, SPDIF_IN_PORT_C);
break;
case 2:
audio_spdif_slave_switch_port(&spdif_slave_hdl, SPDIF_IN_PORT_D);
break;
default:
break;
}
}
//*----------------------------------------------------------------------------*/
/**@brief spdif 按键消息入口
@param
@return 1common 0common处理
@note
*/
/*----------------------------------------------------------------------------*/
static int spdif_key_event_opr(struct sys_event *event)
{
int ret = true;
int err = 0;
int key_event = event->u.key.event;
int key_value = event->u.key.value;//
log_info("key_event:%d \n", key_event);
switch (key_event) {
case KEY_SPDIF_SW_SOURCE:
log_info("KEY_SPDIF_SW_SOURCE \n");
switch_spdif_input_port();
break;
default :
ret = false;
break;
}
return ret;
}
//*----------------------------------------------------------------------------*/
/**@brief spdif 模式活跃状态 所有消息入口
@param
@return 1comomon 0linein处理的common统一处理
@note
*/
/*----------------------------------------------------------------------------*/
static int spdif_sys_event_handler(struct sys_event *event)
{
switch (event->type) {
case SYS_KEY_EVENT:
return spdif_key_event_opr(event);
case SYS_DEVICE_EVENT:
return false;
default:
return false;
}
return false;
}
//*----------------------------------------------------------------------------*/
/**@brief spdif 主任务
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void app_spdif_task()
{
int res;
int msg[32];
spdif_app_init();
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
switch (msg[0]) {
case APP_MSG_SYS_EVENT:
if (spdif_sys_event_handler((struct sys_event *)(&msg[1])) == false) {
app_default_event_deal((struct sys_event *)(&msg[1])); //由common统一处理
}
break;
default:
break;
}
if (app_task_exitting()) {
spdif_task_close();
return;
}
}
}
#else
void app_spdif_task()
{
}
#endif