KT25-1015_AC695x_SDK310/apps/soundbox/task_manager/lp/lp_api.c

382 lines
9.9 KiB
C
Raw Normal View History

2026-03-09 09:39:24 +00:00
#include "system/includes.h"
#include "app_config.h"
#include "app_task.h"
#include "media/includes.h"
#include "tone_player.h"
#include "audio_dec_linein.h"
#include "asm/audio_linein.h"
#include "app_main.h"
#include "ui_manage.h"
#include "vm.h"
#include "lp/lp_dev.h"
#include "lp/lp.h"
#include "key_event_deal.h"
#include "user_cfg.h"
#include "ui/ui_api.h"
#include "fm_emitter/fm_emitter_manage.h"
#include "clock_cfg.h"
#include "bt.h"
#include "bt_tws.h"
#ifndef CONFIG_MEDIA_NEW_ENABLE
#include "application/audio_output_dac.h"
#endif
/*************************************************************
lp实现api
**************************************************************/
#if TCFG_APP_LP_EN
#define LOG_TAG_CONST APP_LP
#define LOG_TAG "[APP_LP]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
struct lp_opr
{
void *rec_dev;
u8 volume : 7;
u8 onoff : 1;
u8 audio_state; /*判断lp模式使用模拟音量还是数字音量*/
};
static struct lp_opr lp_hdl = {0};
#define __this (&lp_hdl)
/**@brief lp 音量设置函数
@param
@return
@note lp 使
*/
/*----------------------------------------------------------------------------*/
int lp_volume_set(u8 vol)
{
if (TCFG_LP_LR_CH == AUDIO_LIN_DACL_CH)
{
app_audio_output_ch_analog_gain_set(BIT(0), 0);
/* app_audio_output_ch_analog_gain_set(BIT(1), vol); */
}
else if (TCFG_LP_LR_CH == AUDIO_LIN_DACR_CH)
{
app_audio_output_ch_analog_gain_set(BIT(1), 0);
/* app_audio_output_ch_analog_gain_set(BIT(0), vol); */
}
app_audio_set_volume(__this->audio_state, vol, 1);
log_info("lp vol: %d", __this->volume);
__this->volume = vol;
#if (TCFG_DEC2TWS_ENABLE)
bt_tws_sync_volume();
#endif
#if (TCFG_LP_INPUT_WAY != LINEIN_INPUT_WAY_ADC)
if (__this->volume)
{
audio_linein_mute(0);
}
else
{
audio_linein_mute(1);
}
#endif
return true;
}
/*----------------------------------------------------------------------------*/
/**@brief lp 使用模拟直通方式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static inline void __lp_way_analog_start()
{
app_audio_state_switch(__this->audio_state, get_max_sys_vol()); //
app_audio_set_volume(__this->audio_state, __this->volume, 1);
if (!app_audio_get_volume(__this->audio_state))
{
audio_lp_mute(1); // 模拟输出时候dac为0也有数据
}
if (TCFG_LP_LR_CH & (BIT(0) | BIT(1)))
{
audio_lp0_open(TCFG_LP_LR_CH, 1);
}
else if (TCFG_LP_LR_CH & (BIT(2) | BIT(3)))
{
audio_lp1_open(TCFG_LP_LR_CH, 1);
}
else if (TCFG_LP_LR_CH & (BIT(4) | BIT(5)))
{
audio_lp2_open(TCFG_LP_LR_CH, 1);
}
if (TCFG_LP_LR_CH != AUDIO_LIN0_LR && TCFG_LP_LR_CH != AUDIO_LIN1_LR && TCFG_LP_LR_CH != AUDIO_LIN2_LR)
{
audio_lp_ch_combine(1, 1);
}
audio_lp_gain(1); // high gain
if (app_audio_get_volume(__this->audio_state))
{
audio_lp_mute(0);
app_audio_set_volume(__this->audio_state, app_audio_get_volume(__this->audio_state), 1); // 防止无法调整
}
// 模拟输出时候dac为0也有数据
}
/*----------------------------------------------------------------------------*/
/**@brief lp 使用dac IO输入方式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static inline void __lp_way_dac_analog_start()
{
app_audio_state_switch(__this->audio_state, get_max_sys_vol());
app_audio_set_volume(__this->audio_state, __this->volume, 1);
if ((TCFG_LP_LR_CH == AUDIO_LIN_DACL_CH) || (TCFG_LP_LR_CH == AUDIO_LIN_DACR_CH))
{
audio_lp_via_dac_open(TCFG_LP_LR_CH, 1);
}
else
{
ASSERT(0, "lp ch err\n");
}
lp_volume_set(app_audio_get_volume(__this->audio_state));
}
/*----------------------------------------------------------------------------*/
/**@brief lp 使用采集adc输入方式
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
static inline void __lp_way_adc_start()
{
#if (TCFG_LP_MULTIPLEX_WITH_FM && (defined(CONFIG_CPU_BR25)))
linein_dec_open(AUDIO_LIN1R_CH, 44100); // 696X 系列FM 与 LP复用脚绑定选择AUDIO_LIN1R_CH
#elif ((TCFG_LP_LR_CH & AUDIO_LIN1R_CH) && (defined(CONFIG_CPU_BR25))) // FM 与 LP 复用未使能不可选择AUDIO_LIN1R_CH
log_e("FM is not multiplexed with lp. channel selection err\n");
ASSERT(0, "err\n");
#else
linein_dec_open(TCFG_LP_LR_CH, 44100);
#endif
}
///*----------------------------------------------------------------------------*/
/**@brief lp 设置硬件
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int lp_start(void)
{
if (__this->onoff == 1)
{
log_info("lp is aleady start\n");
return true;
}
#if (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_ADC)
__lp_way_adc_start();
__this->audio_state = APP_AUDIO_STATE_MUSIC;
#elif (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_ANALOG)
__this->volume = app_audio_get_volume(__this->audio_state);
log_info("current sys vol:%d\n", __this->volume);
__this->audio_state = APP_AUDIO_STATE_LP;
__lp_way_analog_start();
audio_dac_vol_mute_lock(1);
#ifndef CONFIG_MEDIA_NEW_ENABLE
#if AUDIO_OUTPUT_AUTOMUTE
extern void mix_out_automute_skip(u8 skip);
mix_out_automute_skip(1);
#endif // #if AUDIO_OUTPUT_AUTOMUTE
#endif
#elif (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_DAC)
__this->volume = app_audio_get_volume(__this->audio_state);
log_info("current sys vol:%d\n", __this->volume);
__this->audio_state = APP_AUDIO_STATE_LP;
__lp_way_dac_analog_start();
audio_dac_vol_mute_lock(1);
#ifndef CONFIG_MEDIA_NEW_ENABLE
#if AUDIO_OUTPUT_AUTOMUTE
extern void mix_out_automute_skip(u8 skip);
mix_out_automute_skip(1);
#endif // #if AUDIO_OUTPUT_AUTOMUTE
#endif
#endif
__this->volume = app_audio_get_volume(__this->audio_state);
__this->onoff = 1;
UI_REFLASH_WINDOW(false); // 刷新主页并且支持打断显示
return true;
}
/*----------------------------------------------------------------------------*/
/**@brief lp stop
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
void lp_stop(void)
{
if (__this->onoff == 0)
{
log_info("lp is aleady stop\n");
return;
}
#if (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_ADC)
linein_dec_close();
#elif (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_ANALOG)
if (TCFG_LP_LR_CH & (BIT(0) | BIT(1)))
{
audio_lp0_close(TCFG_LP_LR_CH, 0);
}
else if (TCFG_LP_LR_CH & (BIT(2) | BIT(3)))
{
audio_lp1_close(TCFG_LP_LR_CH, 0);
}
else if (TCFG_LP_LR_CH & (BIT(4) | BIT(5)))
{
audio_lp2_close(TCFG_LP_LR_CH, 0);
}
audio_dac_vol_mute_lock(0);
#ifndef CONFIG_MEDIA_NEW_ENABLE
#if AUDIO_OUTPUT_AUTOMUTE
extern void mix_out_automute_skip(u8 skip);
mix_out_automute_skip(0);
#endif // #if AUDIO_OUTPUT_AUTOMUTE
#endif
#elif (TCFG_LP_INPUT_WAY == LINEIN_INPUT_WAY_DAC)
audio_lp_via_dac_close(TCFG_LP_LR_CH, 0);
audio_dac_vol_mute_lock(0);
#ifndef CONFIG_MEDIA_NEW_ENABLE
#if AUDIO_OUTPUT_AUTOMUTE
extern void mix_out_automute_skip(u8 skip);
mix_out_automute_skip(0);
#endif // #if AUDIO_OUTPUT_AUTOMUTE
#endif
#endif
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, __this->volume, 1);
__this->onoff = 0;
}
/*----------------------------------------------------------------------------*/
/**@brief lp start stop 播放暂停切换
@param
@return
@note
*/
/*----------------------------------------------------------------------------*/
int lp_volume_pp(void)
{
if (__this->onoff)
{
lp_stop();
}
else
{
lp_start();
}
log_info("pp:%d \n", __this->onoff);
UI_REFLASH_WINDOW(true);
return __this->onoff;
}
/**@brief 获取lp 播放状态
@param
@return 1: 0
@note
*/
/*----------------------------------------------------------------------------*/
u8 lp_get_status(void)
{
return __this->onoff;
}
/*
@note lp 使
*/
void lp_tone_play_callback(void *priv, int flag) // 模拟lp用数字音量调节播提示音要用这个回调
{
lp_volume_pp();
}
void lp_tone_play(u8 index, u8 preemption)
{
if (preemption)
{ // 抢断播放
lp_volume_pp();
tone_play_index_with_callback(index, preemption, lp_tone_play_callback, NULL);
}
else
{
tone_play_index_with_callback(index, preemption, NULL, NULL);
}
}
void lp_key_vol_up()
{
u8 vol;
if (__this->volume < get_max_sys_vol())
{
__this->volume++;
lp_volume_set(__this->volume);
}
else
{
lp_volume_set(__this->volume);
if (tone_get_status() == 0)
{
/* tone_play(TONE_MAX_VOL); */
#if TCFG_MAX_VOL_PROMPT
tone_play_by_path(tone_table[IDEX_TONE_MAX_VOL], 0);
#endif
}
}
vol = __this->volume;
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
log_info("vol+:%d\n", __this->volume);
}
/*
@note lp 使
*/
void lp_key_vol_down()
{
u8 vol;
if (__this->volume)
{
__this->volume--;
lp_volume_set(__this->volume);
}
vol = __this->volume;
UI_SHOW_MENU(MENU_MAIN_VOL, 1000, vol, NULL);
log_info("vol-:%d\n", __this->volume);
}
#endif