406 lines
13 KiB
C
406 lines
13 KiB
C
#ifndef AUDIO_ANC_H
|
||
#define AUDIO_ANC_H
|
||
|
||
#include "generic/typedef.h"
|
||
#include "asm/anc.h"
|
||
#include "anc_btspp.h"
|
||
#include "anc_uart.h"
|
||
#include "app_config.h"
|
||
#include "in_ear_detect/in_ear_manage.h"
|
||
#include "audio_anc_mult_scene.h"
|
||
#include "icsd_anc_app.h"
|
||
#include "audio_anc_fade_ctr.h"
|
||
|
||
/*******************ANC User Config***********************/
|
||
#define ANC_COEFF_SAVE_ENABLE 1 /*ANC滤波器表保存使能*/
|
||
#define ANC_INFO_SAVE_ENABLE 0 /*ANC信息记忆:保存上一次关机时所处的降噪模式等等*/
|
||
#define ANC_TONE_PREEMPTION 0 /*ANC提示音打断播放(1)还是叠加播放(0)*/
|
||
#define ANC_BOX_READ_COEFF 1 /*支持通过工具读取ANC训练系数*/
|
||
#define ANC_FADE_EN 1 /*ANC淡入淡出使能*/
|
||
#define ANC_MODE_SYSVDD_EN 0 /*ANC模式提高SYSVDD,避免某些IC电压太低导致ADC模块工作不正常*/
|
||
#define ANC_TONE_END_MODE_SW 1 /*ANC提示音结束进行模式切换*/
|
||
#define ANC_MODE_EN_MODE_NEXT_SW 1 /*ANC提示音结束后才允许下一次模式切换*/
|
||
#define ANC_MODE_FADE_LVL 1 /*降噪模式淡入步进 * 53ms*/
|
||
|
||
/*
|
||
ANC多场景滤波器配置
|
||
*/
|
||
#define ANC_MULT_ORDER_ENABLE 0 /*ANC多滤波器使能*/
|
||
#define ANC_MULT_ORDER_CMP_ONLY_USE_ID1 1 /*ANC多滤波器-CMP音乐补偿仅使用场景ID1的参数*/
|
||
#define ANC_MULT_ORDER_TRANS_ONLY_USE_ID1 0 /*ANC多滤波器-通透模式仅使用场景ID1的参数*/
|
||
|
||
#define ANC_MULT_ORDER_NORMAL_ID 1 /*ANC多滤波器-开机默认场景ID*/
|
||
|
||
//ANC多滤波器-耳道自适应ID匹配,选择0则跟随当前场景
|
||
#define ANC_MULT_ADPTIVE_TRAIN_USE_ID 1 /*耳道自适应-训练使用的场景ID*/
|
||
#define ANC_MULT_ADPTIVE_MATCH_USE_ID 1 /*耳道自适应-匹配使用的场景ID*/
|
||
|
||
/*-------------------耳道自适应开发者模式说明------------------
|
||
开发者模式(支持工具在线修改)
|
||
权限:
|
||
1、MIC/SPK数据获取,采样率跟随ANC
|
||
2、支持工具自适应数据读取,会占用3-4K ram
|
||
3、TWS区分左右参数
|
||
4、进入后不支持产测,关机自动退出开发者模式
|
||
|
||
ANC_DEVELOPER_MODE_EN
|
||
开发者强制模式(不支持工具修改, 开机默认开发者模式)
|
||
新增权限:
|
||
5、每次自适应都保存数据,保存前会校验数据,确保开机转换数据正常,不会死机
|
||
6、自适应失败播放提示音
|
||
-------------------------------------------------------------*/
|
||
#define ANC_DEVELOPER_MODE_EN 0 /*开发者强制模式强制使能,启动后不支持产测, 优先级最高, 不受工具控制*/
|
||
|
||
#define ANC_EAR_ADAPTIVE_EN TCFG_AUDIO_ANC_EAR_ADAPTIVE_EN /*ANC耳道自适应使能, 耳道是变量*/
|
||
#define ANC_POWEOFF_SAVE_ADAPTIVE_DATA 1 /*保存耳道自适应数据 0 每次保存;1 关机保存*/
|
||
#define ANC_EAR_ADAPTIVE_CMP_EN ANC_ADAPTIVE_CMP_EN /*ANC耳道自适应音乐补偿使能*/
|
||
#define ANC_EAR_ADAPTIVE_EVERY_TIME 0 /*每次切ANC_ON都进行自适应*/
|
||
|
||
/*
|
||
ANC场景增益自适应配置
|
||
(场景是变量,与耳道自适应功能相互独立)
|
||
*/
|
||
#define ANC_ADAPTIVE_EN 0 /*ANC增益自适应使能*/
|
||
#define ANC_ADAPTIVE_MODE ANC_ADAPTIVE_GAIN_MODE /*ANC增益自适应模式*/
|
||
#define ANC_ADAPTIVE_TONE_EN 0 /*ANC增益自适应提示音使能*/
|
||
|
||
/*
|
||
音乐响度ANC动态增益调节, 随着音乐响度增大而减小ANC增益, 开此功能可关闭AUDIO_DRC
|
||
*/
|
||
#define ANC_MUSIC_DYNAMIC_GAIN_EN 0 /*音乐动态ANC增益使能*/
|
||
#define ANC_MUSIC_DYNAMIC_GAIN_THR -12 /*音乐动态ANC增益触发阈值(单位dB), range: (-30 ~ 0]*/
|
||
#define ANC_MUSIC_DYNAMIC_GAIN_SINGLE_FB 1 /*动态增益单独调FB增益使能*/
|
||
|
||
#if ANC_TRAIN_MODE == ANC_FB_EN
|
||
#define ANC_MODE_ENABLE ANC_OFF_BIT | ANC_ON_BIT
|
||
#else
|
||
#define ANC_MODE_ENABLE ANC_OFF_BIT | ANC_ON_BIT | ANC_TRANS_BIT
|
||
#endif/*ANC_TRAIN_MODE*/
|
||
|
||
//************************************************************************//
|
||
// ICSD ADT 相关功能配置 //
|
||
//************************************************************************//
|
||
#define AUDIO_ANC_WIDE_AREA_TAP_EVENT_SYNC 0//广域点击左右耳同步使能
|
||
|
||
/*支持开免摘的anc模式*/
|
||
#define SPEAK_TO_CHAT_ANC_MODE_ENABLE (ANC_ON_BIT)
|
||
|
||
//****************** ICSD ADT 相关功能配置 end ************************//
|
||
|
||
/*ANC工具配对码使能*/
|
||
#define ANCTOOL_NEED_PAIR_KEY 1
|
||
#define ANCTOOL_PAIR_KEY "123456" /*ANC工具默认配对码*/
|
||
|
||
/*******************ANC User Config End*******************/
|
||
|
||
/*ANC模式调试信息*/
|
||
static const char *anc_mode_str[] = {
|
||
"NULL", /*无效/非法*/
|
||
"ANC_OFF", /*关闭模式*/
|
||
"ANC_ON", /*降噪模式*/
|
||
"Transparency", /*通透模式*/
|
||
"ANC_BYPASS", /*BYPASS模式*/
|
||
"ANC_TRAIN", /*训练模式*/
|
||
"ANC_TRANS_TRAIN", /*通透训练模式*/
|
||
};
|
||
|
||
/*ANC状态调试信息*/
|
||
static const char *anc_state_str[] = {
|
||
"anc_close", /*关闭状态*/
|
||
"anc_init", /*初始化状态*/
|
||
"anc_open", /*打开状态*/
|
||
};
|
||
|
||
/*ANC MSG List*/
|
||
enum {
|
||
ANC_MSG_TRAIN_OPEN = 0xA1,
|
||
ANC_MSG_TRAIN_CLOSE,
|
||
ANC_MSG_RUN,
|
||
ANC_MSG_FADE_END,
|
||
ANC_MSG_MODE_SYNC,
|
||
ANC_MSG_TONE_SYNC,
|
||
ANC_MSG_DRC_TIMER,
|
||
ANC_MSG_DEBUG_OUTPUT,
|
||
ANC_MSG_ADAPTIVE_SYNC,
|
||
ANC_MSG_MUSIC_DYN_GAIN,
|
||
ANC_MSG_ICSD_ANC_CMD,
|
||
ANC_MSG_USER_TRAIN_INIT,
|
||
ANC_MSG_USER_TRAIN_RUN,
|
||
ANC_MSG_USER_TRAIN_SETPARAM,
|
||
ANC_MSG_USER_TRAIN_TIMEOUT,
|
||
ANC_MSG_ADT,
|
||
ANC_MSG_USER_TRAIN_END,
|
||
ANC_MSG_MIC_DATA_GET,
|
||
ANC_MSG_RESET,
|
||
ANC_MSG_SZ_FFT_OPEN,
|
||
ANC_MSG_SZ_FFT_RUN,
|
||
ANC_MSG_SZ_FFT_CLOSE,
|
||
ANC_MSG_MODE_SWITCH_IN_ANCTASK,
|
||
};
|
||
|
||
/*ANC MIC动态增益调整状态*/
|
||
enum {
|
||
ANC_MIC_DY_STA_INIT = 0, /*准备状态*/
|
||
ANC_MIC_DY_STA_START, /*进行状态*/
|
||
ANC_MIC_DY_STA_STOP, /*停止状态*/
|
||
};
|
||
|
||
#define ANC_CONFIG_LFF_EN ((ANC_TRAIN_MODE & (ANC_HYBRID_EN | ANC_FF_EN)) && (ANC_CH & ANC_L_CH))
|
||
#define ANC_CONFIG_LFB_EN ((ANC_TRAIN_MODE & (ANC_HYBRID_EN | ANC_FB_EN)) && (ANC_CH & ANC_L_CH))
|
||
#define ANC_CONFIG_RFF_EN ((ANC_TRAIN_MODE & (ANC_HYBRID_EN | ANC_FF_EN)) && (ANC_CH & ANC_R_CH))
|
||
#define ANC_CONFIG_RFB_EN ((ANC_TRAIN_MODE & (ANC_HYBRID_EN | ANC_FB_EN)) && (ANC_CH & ANC_R_CH))
|
||
|
||
/*ANC记忆信息*/
|
||
typedef struct {
|
||
u8 mode; /*当前模式*/
|
||
u8 mode_enable; /*使能的模式*/
|
||
#if INEAR_ANC_UI
|
||
u8 inear_tws_mode;
|
||
#endif/*INEAR_ANC_UI*/
|
||
//s32 coeff[488];
|
||
} anc_info_t;
|
||
|
||
|
||
#if ANC_EAR_ADAPTIVE_EN
|
||
|
||
typedef struct {
|
||
#if ANC_EAR_RECORD_EN
|
||
float record_FL[EAR_RECORD_MAX][ANC_VMDATA_FF_RECORD_SIZE];
|
||
float record_FR[EAR_RECORD_MAX][ANC_VMDATA_FF_RECORD_SIZE];
|
||
int record_num;
|
||
// u8 record_num;
|
||
#endif/*ANC_EAR_RECORD_EN*/
|
||
u8 result;
|
||
#if ANC_CONFIG_LFF_EN
|
||
float lff_gain;
|
||
anc_fr_t lff[ANC_ADAPTIVE_FF_ORDER];
|
||
#endif/*ANC_CONFIG_LFF_EN*/
|
||
#if ANC_CONFIG_LFB_EN
|
||
float lfb_gain;
|
||
anc_fr_t lfb[ANC_ADAPTIVE_FB_ORDER];
|
||
#if ANC_EAR_ADAPTIVE_CMP_EN
|
||
float lcmp_gain;
|
||
anc_fr_t lcmp[ANC_ADAPTIVE_CMP_ORDER];
|
||
#endif/*ANC_EAR_ADAPTIVE_CMP_EN*/
|
||
#endif/*ANC_CONFIG_LFB_EN*/
|
||
#if ANC_CONFIG_RFF_EN
|
||
float rff_gain;
|
||
anc_fr_t rff[ANC_ADAPTIVE_FF_ORDER];
|
||
#endif/*ANC_CONFIG_RFF_EN*/
|
||
#if ANC_CONFIG_RFB_EN
|
||
float rfb_gain;
|
||
anc_fr_t rfb[ANC_ADAPTIVE_FB_ORDER];
|
||
#if ANC_EAR_ADAPTIVE_CMP_EN
|
||
float rcmp_gain;
|
||
anc_fr_t rcmp[ANC_ADAPTIVE_CMP_ORDER];
|
||
#endif/*ANC_EAR_ADAPTIVE_CMP_EN*/
|
||
#endif/*ANC_CONFIG_RFB_EN*/
|
||
} _PACKED anc_adaptive_iir_t;
|
||
|
||
#endif/*ANC_EAR_ADAPTIVE_EN */
|
||
|
||
|
||
/*ANC初始化*/
|
||
void anc_init(void);
|
||
|
||
/*ANC训练模式*/
|
||
void anc_train_open(u8 mode, u8 debug_sel);
|
||
|
||
/*ANC关闭训练*/
|
||
void anc_train_close(void);
|
||
|
||
/*
|
||
*ANC状态获取
|
||
*return 0: idle(初始化)
|
||
*return 1: busy(ANC/通透/训练)
|
||
*/
|
||
u8 anc_status_get(void);
|
||
|
||
/*获取anc当前模式*/
|
||
u8 anc_mode_get(void);
|
||
|
||
/*获取anc记录的最新的目标ANC模式*/
|
||
u8 anc_new_target_mode_get(void);
|
||
|
||
#define ANC_DAC_CH_L 0
|
||
#define ANC_DAC_CH_R 1
|
||
/*获取anc模式,dac左右声道的增益*/
|
||
u8 anc_dac_gain_get(u8 ch);
|
||
|
||
/*获取anc模式,ff_mic的增益*/
|
||
u8 audio_anc_ffmic_gain_get(void);
|
||
|
||
/*获取anc模式,fb_mic的增益*/
|
||
u8 audio_anc_fbmic_gain_get(void);
|
||
|
||
/*获取anc模式,指定mic的增益, mic_sel:目标MIC通道*/
|
||
u8 audio_anc_mic_gain_get(u8 mic_sel);
|
||
|
||
/*ANC模式切换(切换到指定模式),并配置是否播放提示音*/
|
||
void anc_mode_switch(u8 mode, u8 tone_play);
|
||
|
||
/*在anc任务里面切换anc模式,
|
||
*避免上一次切换没有完成,这次切换被忽略的情况*/
|
||
void anc_mode_switch_in_anctask(u8 mode, u8 tone_play);
|
||
|
||
/*ANC模式同步(tws模式)*/
|
||
void anc_mode_sync(u8 *data);
|
||
|
||
void anc_poweron(void);
|
||
|
||
/*ANC poweroff*/
|
||
void anc_poweroff(void);
|
||
|
||
/*ANC模式切换(下一个模式)*/
|
||
void anc_mode_next(void);
|
||
|
||
/*ANC通过ui菜单选择anc模式,处理快速切换的情景*/
|
||
void anc_ui_mode_sel(u8 mode, u8 tone_play);
|
||
|
||
/*设置ANC支持切换的模式*/
|
||
void anc_mode_enable_set(u8 mode_enable);
|
||
|
||
/*anc coeff 长度大小获取*/
|
||
int anc_coeff_size_get(u8 mode);
|
||
|
||
void anc_coeff_size_set(u8 mode, int len);
|
||
|
||
int *anc_debug_ctr(u8 free_en);
|
||
/*
|
||
*查询当前ANC是否处于训练状态
|
||
*@return 1:处于训练状态
|
||
*@return 0:其他状态
|
||
*/
|
||
int anc_train_open_query(void);
|
||
|
||
/*ANC在线调试繁忙标志设置*/
|
||
void anc_online_busy_set(u8 en);
|
||
|
||
/*ANC在线调试繁忙标志获取*/
|
||
u8 anc_online_busy_get(void);
|
||
|
||
/*tws同步播放模式提示音,并且同步进入anc模式*/
|
||
void anc_tone_sync_play(int tone_name);
|
||
|
||
/*anc coeff读接口*/
|
||
int *anc_coeff_read(void);
|
||
|
||
/*anc coeff写接口*/
|
||
int anc_coeff_write(int *coeff, u16 len);
|
||
|
||
/*ANC挂起*/
|
||
void anc_suspend(void);
|
||
|
||
/*ANC恢复*/
|
||
void anc_resume(void);
|
||
|
||
/*通话动态MIC增益开始函数*/
|
||
void anc_dynamic_micgain_start(u8 audio_mic_gain);
|
||
|
||
/*通话动态MIC增益结束函数*/
|
||
void anc_dynamic_micgain_stop(void);
|
||
|
||
/*anc_gains参数读写接口*/
|
||
void anc_param_fill(u8 cmd, anc_gain_t *cfg);
|
||
|
||
/*ANC_DUT audio模块使能函数,用于分离功耗*/
|
||
void audio_anc_dut_enable_set(u8 enablebit);
|
||
|
||
/*ANC自适应TWS同步信息处理*/
|
||
void audio_anc_adap_sync(int ref_num, int err_num, int err);
|
||
void audio_anc_adap_num_compare(int ref_num, int err_num);
|
||
|
||
/*设置fb mic为复用mic*/
|
||
void audio_anc_mic_mana_fb_mult_set(u8 mult_flag);
|
||
|
||
//ANC MIC信息管理
|
||
void audio_anc_mic_management(audio_anc_t *param);
|
||
|
||
/*切换ANC自适应模式*/
|
||
void audio_anc_adaptive_mode_set(u8 mode, u8 lvl);
|
||
|
||
/*ANC增益调节 音乐响度检测*/
|
||
void audio_anc_music_dynamic_gain_det(s16 *data, int len);
|
||
|
||
/*ANC增益调节 音乐响度初始化*/
|
||
void audio_anc_music_dynamic_gain_init(int sr);
|
||
|
||
/*ANC增益调节 音乐响度复位*/
|
||
void audio_anc_music_dynamic_gain_reset(u8 effect_reset_en);
|
||
|
||
/*
|
||
自适应模式-重新检测
|
||
param: tws_sync_en 1 TWS同步自适应,支持TWS降噪平衡,需左右耳一起调用此接口
|
||
0 单耳自适应, 不支持TWS降噪平衡,可TWS状态下单耳自适应
|
||
*/
|
||
int audio_anc_mode_ear_adaptive(u8 tws_sync_en);
|
||
|
||
/*
|
||
自适应/普通参数切换
|
||
param: mode 0 使用普通参数; 1 使用自适应参数
|
||
tone_play 0 不播放提示音;1 播放提示音
|
||
update_flag 0 不更新效果; 1 即时更新效果
|
||
*/
|
||
int audio_anc_coeff_adaptive_set(u32 mode, u8 tone_play, u8 update_flag);
|
||
|
||
/*ANC滤波器模式循环切换*/
|
||
int audio_anc_coeff_adaptive_switch();
|
||
|
||
/*判断当前是否处于训练中*/
|
||
u8 audio_anc_adaptive_busy_get(void);
|
||
|
||
/*当前ANC滤波器模式获取 0:普通参数 1:自适应参数*/
|
||
int audio_anc_coeff_mode_get(void);
|
||
|
||
/*强制停止ANC训练 - 并用回默认参数*/
|
||
void anc_ear_adaptive_forced_exit(void);
|
||
|
||
/*自适应训练失败处理回调函数*/
|
||
void audio_anc_adaptive_fail_callback(u8 anc_err);
|
||
|
||
void audio_anc_develop_set(u8 mode);
|
||
|
||
u8 audio_anc_develop_get(void);
|
||
|
||
/*自适应主从序号*/
|
||
u8 anc_ear_adaptive_seq_get(void);
|
||
|
||
void audio_anc_param_map(u8 coeff_en, u8 gain_en);
|
||
|
||
/*
|
||
多滤波器-场景切换
|
||
param: scene 场景ID
|
||
update_flag 非ANC_OFF时,即时更新效果: 0 不更新;1 更新
|
||
Note: ID 从1 开始
|
||
*/
|
||
void audio_anc_mult_scene_set(u16 scene_id, u8 update_flag);
|
||
|
||
/*多滤波器-获取当前场景的滤波器*/
|
||
u8 audio_anc_mult_scene_get(void);
|
||
|
||
/*多滤波器-最大场景个数设置*/
|
||
void audio_anc_mult_scene_max_set(u8 scene_cnt);
|
||
|
||
/*多滤波器-最大场景个数获取*/
|
||
u8 audio_anc_mult_scene_max_get(void);
|
||
|
||
/*多滤波器-场景循环切换*/
|
||
void audio_anc_mult_scene_switch(u8 tone_flag);
|
||
|
||
/*
|
||
ANC结构设置, 下一次切模式或复位ANC时生效
|
||
param: enablebit ANC结构配置,如(ANC_FF_EN/ANC_FB_EN/ANC_HYBRID_EN)
|
||
update_flag 非ANC_OFF时,即时更新效果: 0 不更新;1 更新
|
||
*/
|
||
void audio_anc_enable_set(u8 enablebit, u8 update_flag);
|
||
|
||
//ANC产测/调试模式设置
|
||
void audio_anc_prodution_mode_set(u8 mode);
|
||
|
||
extern int anc_uart_write(u8 *buf, u8 len);
|
||
extern void ci_send_packet(u32 id, u8 *packet, int size);
|
||
extern void sys_auto_shut_down_enable(void);
|
||
extern void sys_auto_shut_down_disable(void);
|
||
|
||
#endif/*AUDIO_ANC_H*/
|