KT24-1110_65E-HA-651B/apps/soundbox/task_manager/spdif/spdif.c
2024-11-10 18:44:17 +08:00

234 lines
5.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*************************************************************
此文件函数主要是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 1、消息已经处理不需要发送到common 0、消息发送到common处理
@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 1、当前消息已经处理不需要发送comomon 0、当前消息不是linein处理的发送到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