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

385 lines
10 KiB
C
Raw 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.

#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()
{
printf("__lp_way_adc_start\n");
#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
//printf("linein_dec_open(TCFG_LP_LR_CH, 44100);\n");
printf("linein_dec_open(TCFG_LP_LR_CH, 44100) = %d\n", 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)
printf("__lp_way_adc_start\n");
__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);
printf("__this->volume = %d\n", __this->volume);
__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