Files
99_7018_lmx/apps/earphone/aec/br28/audio_aec_online.c
2025-10-29 13:10:02 +08:00

673 lines
22 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 "audio_aec_online.h"
#include "app_online_cfg.h"
#include "config/config_target.h"
#include "system/includes.h"
#include "online_db_deal.h"
#include "timer.h"
#include "aec_user.h"
#include "audio_adc.h"
#if 1
extern void put_float(double fv);
#define AEC_ONLINE_LOG y_printf
#define AEC_ONLINE_FLOG put_float
#else
#define AEC_ONLINE_LOG(...)
#define AEC_ONLINE_FLOG(...)
#endif
#if TCFG_AEC_TOOL_ONLINE_ENABLE
extern int esco_enc_mic_gain_set(u8 gain);
extern int esco_enc_mic1_gain_set(u8 gain);
extern int esco_enc_mic2_gain_set(u8 gain);
extern int esco_enc_mic3_gain_set(u8 gain);
extern int esco_dec_dac_gain_set(u8 gain);
enum {
AEC_UPDATE_CLOSE,
AEC_UPDATE_INIT,
AEC_UPDATE_ONLINE,
};
typedef struct {
u8 update;
u8 reserved;
u16 timer;
#if TCFG_AUDIO_DUAL_MIC_ENABLE
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
AEC_DMS_CONFIG cfg;
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
DMS_FLEXIBLE_CONFIG cfg;
#endif/*TCFG_AUDIO_DMS_SEL*/
#else/*SINGLE MIC*/
AEC_CONFIG cfg;
u8 agc_en;
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
} aec_update_t;
aec_update_t *aec_update = NULL;
static void aec_update_timer_deal(void *priv)
{
AEC_ONLINE_LOG("aec_update_timer_deal");
#if TCFG_AUDIO_DUAL_MIC_ENABLE
aec_dms_cfg_update(&aec_update->cfg);
#else
aec_cfg_update(&aec_update->cfg);
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
sys_timer_del(aec_update->timer);
aec_update->timer = 0;
}
int aec_cfg_online_update(int root_cmd, void *packet)
{
if ((root_cmd != 0x3000) && (root_cmd != 0x3100) &&
(root_cmd != 0x3200) && (root_cmd != 0x3300) &&
(root_cmd != 0x3400) && (root_cmd != 0x3500)) {
return -1;
}
if (aec_update->update == AEC_UPDATE_CLOSE) {
return 0;
}
u8 update = 1;
aec_online_t *cfg = packet;
int id = cfg->id;
//AEC_ONLINE_LOG("AEC_TYPE[0x30xx:SMS 0x31xx:DMS]:%x",root_cmd);
//AEC_ONLINE_LOG("aec_cfg_id:%x,val:%d", cfg->id, (int)cfg->val_int);
//AEC_ONLINE_FLOG(cfg->val_float);
if (id >= ENC_Process_MaxFreq) {
#if TCFG_AUDIO_DUAL_MIC_ENABLE
AEC_ONLINE_LOG("ENC cfg update\n");
switch (id) {
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
case ENC_Process_MaxFreq:
AEC_ONLINE_LOG("ENC_Process_MaxFreq:%d\n", cfg->val_int);
aec_update->cfg.enc_process_maxfreq = cfg->val_int;
break;
case ENC_Process_MinFreq:
AEC_ONLINE_LOG("ENC_Process_MinFreq:%d\n", cfg->val_int);
aec_update->cfg.enc_process_minfreq = cfg->val_int;
break;
case ENC_SIR_MaxFreq:
AEC_ONLINE_LOG("ENC_SIR_MaxFreq:%d\n", cfg->val_int);
aec_update->cfg.sir_maxfreq = cfg->val_int;
break;
case ENC_MIC_Distance:
AEC_ONLINE_LOG("ENC_MIC_Distance:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.mic_distance = cfg->val_float;
break;
case ENC_Target_Signal_Degradation:
AEC_ONLINE_LOG("ENC_Target_Signal_Degradation:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.target_signal_degradation = cfg->val_float;
break;
case ENC_AggressFactor:
AEC_ONLINE_LOG("ENC_AggressFactor:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_aggressfactor = cfg->val_float;
break;
case ENC_MinSuppress:
AEC_ONLINE_LOG("ENC_MinSuppress:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_minsuppress = cfg->val_float;
break;
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
case ENC_Suppress_Pre:
AEC_ONLINE_LOG("ENC_Suppress_Pre:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_suppress_pre = cfg->val_float;
break;
case ENC_Suppress_Post:
AEC_ONLINE_LOG("ENC_Suppress_Post:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_suppress_post = cfg->val_float;
break;
case ENC_MinSuppress:
AEC_ONLINE_LOG("ENC_MinSuppress:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_minsuppress = cfg->val_float;
break;
case ENC_Disconverge_Thr:
AEC_ONLINE_LOG("ENC_Disconverge_Thr:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.enc_disconverge_erle_thr = cfg->val_float;
break;
#endif/*TCFG_AUDIO_DMS_SEL*/
default:
AEC_ONLINE_LOG("enc param default:%x\n", id, cfg->val_int);
AEC_ONLINE_FLOG(cfg->val_float);
break;
}
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
} else if (id >= AGC_NDT_FADE_IN) {
AEC_ONLINE_LOG("AGC cfg update\n");
switch (id) {
case AGC_NDT_FADE_IN:
AEC_ONLINE_LOG("AGC_NDT_FADE_IN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ndt_fade_in = cfg->val_float;
break;
case AGC_NDT_FADE_OUT:
AEC_ONLINE_LOG("AGC_NDT_FADE_OUT:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ndt_fade_out = cfg->val_float;
break;
case AGC_DT_FADE_IN:
AEC_ONLINE_LOG("AGC_DT_FADE_IN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.dt_fade_in = cfg->val_float;
break;
case AGC_DT_FADE_OUT:
AEC_ONLINE_LOG("AGC_DT_FADE_OUT:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.dt_fade_out = cfg->val_float;
break;
case AGC_NDT_MAX_GAIN:
AEC_ONLINE_LOG("AGC_NDT_MAX_GAIN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ndt_max_gain = cfg->val_float;
break;
case AGC_NDT_MIN_GAIN:
AEC_ONLINE_LOG("AGC_NDT_MIN_GAIN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ndt_min_gain = cfg->val_float;
break;
case AGC_NDT_SPEECH_THR:
AEC_ONLINE_LOG("AGC_NDT_SPEECH_THR:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ndt_speech_thr = cfg->val_float;
break;
case AGC_DT_MAX_GAIN:
AEC_ONLINE_LOG("AGC_DT_MAX_GAIN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.dt_max_gain = cfg->val_float;
break;
case AGC_DT_MIN_GAIN:
AEC_ONLINE_LOG("AGC_DT_MIN_GAIN:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.dt_min_gain = cfg->val_float;
break;
case AGC_DT_SPEECH_THR:
AEC_ONLINE_LOG("AGC_DT_SPEECH_THR:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.dt_speech_thr = cfg->val_float;
break;
case AGC_ECHO_PRESENT_THR:
AEC_ONLINE_LOG("AGC_ECHO_PRESENT_THR:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.echo_present_thr = cfg->val_float;
break;
}
} else if (id >= ANS_AggressFactor) {
AEC_ONLINE_LOG("ANS cfg update\n");
switch (id) {
#if TCFG_AUDIO_DUAL_MIC_ENABLE
case ANS_AggressFactor:
AEC_ONLINE_LOG("ANS_AggressFactor:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.aggressfactor = cfg->val_float;
break;
case ANS_MinSuppress:
AEC_ONLINE_LOG("ANS_MinSuppress:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.minsuppress = cfg->val_float;
break;
case ANS_MicNoiseLevel:
AEC_ONLINE_LOG("ANS_MicNoiseLevel:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.init_noise_lvl = cfg->val_float;
break;
#else
case ANS_AGGRESS:
AEC_ONLINE_LOG("ANS_AGGRESS:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ans_aggress = cfg->val_float;
break;
case ANS_SUPPRESS:
AEC_ONLINE_LOG("ANS_SUPPRESS:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ans_suppress = cfg->val_float;
break;
case DNS_GainFloor:
AEC_ONLINE_LOG("DNS_GainFloor:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ans_suppress = cfg->val_float;
break;
case DNS_OverDrive:
AEC_ONLINE_LOG("DNS_OverDrive:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.ans_aggress = cfg->val_float;
break;
#endif
}
} else if (id >= NLP_ProcessMaxFreq) {
AEC_ONLINE_LOG("NLP cfg update\n");
switch (id) {
#if TCFG_AUDIO_DUAL_MIC_ENABLE
case NLP_ProcessMaxFreq:
AEC_ONLINE_LOG("NLP_ProcessMaxFreq:%d\n", cfg->val_int);
aec_update->cfg.nlp_process_maxfrequency = cfg->val_int;
break;
case NLP_ProcessMinFreq:
AEC_ONLINE_LOG("NLP_ProcessMinFreq:%d\n", cfg->val_int);
aec_update->cfg.nlp_process_minfrequency = cfg->val_int;
break;
case NLP_OverDrive:
AEC_ONLINE_LOG("NLP_OverDrive:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.overdrive = cfg->val_float;
break;
#else/*SINGLE MIC*/
case NLP_AGGRESS_FACTOR:
AEC_ONLINE_LOG("NLP_AGGRESS_FACTOR:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.es_aggress_factor = cfg->val_float;
break;
case NLP_MIN_SUPPRESS:
AEC_ONLINE_LOG("NLP_MIN_SUPPRESS:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.es_min_suppress = cfg->val_float;
break;
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
}
} else if (id >= AEC_ProcessMaxFreq) {
switch (id) {
#if TCFG_AUDIO_DUAL_MIC_ENABLE
case AEC_ProcessMaxFreq:
AEC_ONLINE_LOG("AEC_ProcessMaxFreq:%d\n", cfg->val_int);
aec_update->cfg.aec_process_maxfrequency = cfg->val_int;
break;
case AEC_ProcessMinFreq:
AEC_ONLINE_LOG("AEC_ProcessMinFreq:%d\n", cfg->val_int);
aec_update->cfg.aec_process_minfrequency = cfg->val_int;
break;
case AEC_AF_Lenght:
AEC_ONLINE_LOG("AEC_AF_Lenght:%d\n", cfg->val_int);
aec_update->cfg.af_length = cfg->val_int;
break;
#else/*SINGLE MIC*/
case AEC_DT_AGGRESS:
AEC_ONLINE_LOG("AEC_DT_AGGRESS:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.aec_dt_aggress = cfg->val_float;
case AEC_REFENGTHR:
AEC_ONLINE_LOG("AEC_REFENGTHR:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.aec_refengthr = cfg->val_float;
break;
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
}
} else {
AEC_ONLINE_LOG("General cfg update\n");
switch (id) {
case GENERAL_DAC:
AEC_ONLINE_LOG("DAC_Gain:%d\n", cfg->val_int);
aec_update->cfg.dac_again = cfg->val_int;
esco_dec_dac_gain_set(cfg->val_int);
update = 0;
break;
case GENERAL_MIC:
AEC_ONLINE_LOG("Mic_Gain:%d\n", cfg->val_int);
aec_update->cfg.mic_again = cfg->val_int;
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0)
esco_enc_mic_gain_set(cfg->val_int);
#endif/*TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0*/
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1)
esco_enc_mic1_gain_set(cfg->val_int);
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1)*/
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2)
esco_enc_mic2_gain_set(cfg->val_int);
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2)*/
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3)
esco_enc_mic3_gain_set(cfg->val_int);
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3)*/
update = 0;
break;
#if (TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE)
case GENERAL_MIC_1:
AEC_ONLINE_LOG("Mic1_Gain:%d\n", cfg->val_int);
aec_update->cfg.mic1_again = cfg->val_int;
esco_enc_mic1_gain_set(cfg->val_int);
update = 0;
break;
#endif/*TCFG_AUDIO_DMS_SEL*/
case GENERAL_ModuleEnable:
#if TCFG_AUDIO_DUAL_MIC_ENABLE
AEC_ONLINE_LOG("DMS EnableBit:%x", cfg->val_int);
aec_update->cfg.enable_module = cfg->val_int;
#else
AEC_ONLINE_LOG("SMS EnableBit:%x", cfg->val_int);
aec_update->cfg.aec_mode = cfg->val_int;
/*使用新配置工具后兼容app在线调试*/
if (aec_update->cfg.aec_mode == 2) {
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
aec_update->cfg.aec_mode |= AEC_MODE_ADVANCE;
} else if (aec_update->cfg.aec_mode == 1) {
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
aec_update->cfg.aec_mode |= AEC_MODE_REDUCE;
} else {
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
}
if (aec_update->cfg.aec_mode) {
aec_update->cfg.aec_mode |= AGC_EN;
}
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
break;
case GENERAL_PC_ModuleEnable:
#if TCFG_AUDIO_DUAL_MIC_ENABLE
AEC_ONLINE_LOG("DMS EnableBit:%x", cfg->val_int);
aec_update->cfg.enable_module = cfg->val_int;
#else
AEC_ONLINE_LOG("SMS EnableBit:%x", cfg->val_int);
aec_update->cfg.aec_mode = cfg->val_int;
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
break;
case GENERAL_UL_EQ:
AEC_ONLINE_LOG("UL_EQ_EN:%d\n", cfg->val_int);
aec_update->cfg.ul_eq_en = cfg->val_int;
break;
#if TCFG_AUDIO_DUAL_MIC_ENABLE
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
case GENERAL_Global_MinSuppress:
AEC_ONLINE_LOG("GlobalMinSuppress:");
AEC_ONLINE_FLOG(cfg->val_float);
aec_update->cfg.global_minsuppress = cfg->val_float;
break;
#endif/*TCFG_AUDIO_DMS_SEL*/
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
}
}
aec_update->update = AEC_UPDATE_ONLINE;
if (update && audio_aec_status()) {
if (aec_update->timer) {
sys_timer_modify(aec_update->timer, 500);
} else {
aec_update->timer = sys_timer_add(NULL, aec_update_timer_deal, 500);
}
}
return 0;
}
int aec_cfg_online_init()
{
int ret = 0;
aec_update = zalloc(sizeof(aec_update_t));
#if TCFG_AUDIO_DUAL_MIC_ENABLE
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
ret = syscfg_read(CFG_DMS_ID, &aec_update->cfg, sizeof(AEC_DMS_CONFIG));
#else/*CVP_DNS_MODE*/
ret = syscfg_read(CFG_DMS_DNS_ID, &aec_update->cfg, sizeof(AEC_DMS_CONFIG));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
if (ret == sizeof(AEC_DMS_CONFIG)) {
aec_update->update = AEC_UPDATE_INIT;
}
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
ret = syscfg_read(CFG_DMS_FLEXIBLE_ID, &aec_update->cfg, sizeof(DMS_FLEXIBLE_CONFIG));
#else/*CVP_DNS_MODE*/
ret = syscfg_read(CFG_DMS_DNS_FLEXIBLE_ID, &aec_update->cfg, sizeof(DMS_FLEXIBLE_CONFIG));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
if (ret == sizeof(DMS_FLEXIBLE_CONFIG)) {
aec_update->update = AEC_UPDATE_INIT;
}
#endif/*TCFG_AUDIO_DMS_SEL*/
#else/*SINGLE MIC*/
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
ret = syscfg_read(CFG_AEC_ID, &aec_update->cfg, sizeof(AEC_CONFIG));
#else/*CVP_DNS_MODE*/
ret = syscfg_read(CFG_SMS_DNS_ID, &aec_update->cfg, sizeof(AEC_CONFIG));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
if (ret == sizeof(AEC_CONFIG)) {
aec_update->update = AEC_UPDATE_INIT;
}
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
return 0;
}
/*return 1有在线更新数据*/
/*return 0没有在线更新数据*/
int aec_cfg_online_update_fill(void *cfg, u16 len)
{
if (aec_update && aec_update->update) {
memcpy(cfg, &aec_update->cfg, len);
return len;
}
return 0;
}
int aec_cfg_online_exit()
{
if (aec_update) {
free(aec_update);
aec_update = NULL;
}
return 0;
}
int get_aec_config(u8 *buf, int version)
{
#if 1/*每次获取update的配置*/
if (aec_update) {
printf("cfg_size:%d\n", sizeof(aec_update->cfg));
memcpy(buf, &aec_update->cfg, sizeof(aec_update->cfg));
#if (TCFG_AUDIO_DUAL_MIC_ENABLE == 0)
AEC_CONFIG *cfg = (AEC_CONFIG *)buf;
/*单麦aec_mode: app(旧)和pc端(兼容) */
if (version == 0x01) {
printf("APP version %d", version);
if (aec_update->cfg.aec_mode & AGC_EN) {
aec_update->agc_en = 1;
} else {
aec_update->agc_en = 0;
}
if ((aec_update->cfg.aec_mode & AEC_MODE_ADVANCE) == AEC_MODE_ADVANCE) {
cfg->aec_mode = 2;
} else if ((aec_update->cfg.aec_mode & AEC_MODE_ADVANCE) == AEC_MODE_REDUCE) {
cfg->aec_mode = 1;
} else {
cfg->aec_mode = 0;
}
} else if (version == 0x02) {
printf("PC version %d", version);
}
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
return sizeof(aec_update->cfg);
}
return 0;
#else/*每次获取原始配置*/
#if TCFG_AUDIO_DUAL_MIC_ENABLE
AEC_DMS_CONFIG cfg;
int ret = syscfg_read(CFG_DMS_ID, &cfg, sizeof(AEC_DMS_CONFIG));
if (ret == sizeof(AEC_DMS_CONFIG)) {
memcpy(buf, &cfg, sizeof(AEC_DMS_CONFIG));
return sizeof(AEC_DMS_CONFIG);
} else {
return 0;
}
#else
AEC_CONFIG cfg;
int ret = syscfg_read(CFG_AEC_ID, &cfg, sizeof(AEC_CONFIG));
if (ret == sizeof(AEC_CONFIG)) {
memcpy(buf, &cfg, sizeof(AEC_CONFIG));
return sizeof(AEC_CONFIG);
} else {
return 0;
}
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
#endif
}
#endif /*TCFG_AEC_TOOL_ONLINE_ENABLE*/
/*
***********************************************************************
* 导出通话过程的数据
*
*
***********************************************************************
*/
#if (TCFG_AUDIO_DATA_EXPORT_ENABLE == AUDIO_DATA_EXPORT_USE_SPP)
enum {
AEC_RECORD_COUNT = 0x200,
AEC_RECORD_START,
AEC_RECORD_STOP,
ONLINE_OP_QUERY_RECORD_PACKAGE_LENGTH,
};
enum {
AEC_ST_INIT,
AEC_ST_START,
AEC_ST_STOP,
};
#define AEC_RECORD_CH 2
#define AEC_RECORD_MTU 200
#define RECORD_CH0_LENGTH 644
#define RECORD_CH1_LENGTH 644
#define RECORD_CH2_LENGTH 644
typedef struct {
u8 state;
u8 ch; /*export data ch num*/
u16 send_timer;
u8 packet[256];
} aec_record_t;
aec_record_t *aec_rec = NULL;
typedef struct {
int cmd;
int data;
} rec_cmd_t;
extern int audio_capture_start(void);
extern void audio_capture_stop(void);
static int aec_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size)
{
int res_data = 0;
rec_cmd_t rec_cmd;
int err = 0;
u8 parse_seq = ext_data[1];
//AEC_ONLINE_LOG("aec_spp_rx,seq:%d,size:%d\n", parse_seq, size);
//put_buf(packet, size);
memcpy(&rec_cmd, packet, sizeof(rec_cmd_t));
switch (rec_cmd.cmd) {
case AEC_RECORD_COUNT:
res_data = aec_rec->ch;
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4);
AEC_ONLINE_LOG("query record_ch num:%d\n", res_data);
break;
case AEC_RECORD_START:
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
aec_rec->state = AEC_ST_START;
audio_capture_start();
AEC_ONLINE_LOG("record_start\n");
break;
case AEC_RECORD_STOP:
AEC_ONLINE_LOG("record_stop\n");
audio_capture_stop();
aec_rec->state = AEC_ST_STOP;
app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
break;
case ONLINE_OP_QUERY_RECORD_PACKAGE_LENGTH:
if (rec_cmd.data == 0) {
res_data = RECORD_CH0_LENGTH;
} else if (rec_cmd.data == 1) {
res_data = RECORD_CH1_LENGTH;
} else {
res_data = RECORD_CH2_LENGTH;
}
AEC_ONLINE_LOG("query record ch%d packet length:%d\n", rec_cmd.data, res_data);
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4); //回复对应的通道数据长度
break;
}
return 0;
}
static void aec_export_timer(void *priv)
{
int err = 0;
if (aec_rec->state) {
putchar('.');
#if 1
static u8 data = 0;
memset(aec_rec->packet, data, 128);
data++;
#endif
err = app_online_db_send(DB_PKT_TYPE_DAT_CH0, aec_rec->packet, AEC_RECORD_MTU);
if (err) {
printf("w0_err:%d", err);
}
err = app_online_db_send(DB_PKT_TYPE_DAT_CH1, aec_rec->packet, AEC_RECORD_MTU);
if (err) {
printf("w1_err:%d", err);
}
} else {
//putchar('S');
}
}
int spp_data_export(u8 ch, u8 *buf, u16 len)
{
u8 data_ch;
if (aec_rec->state == AEC_ST_START) {
putchar('.');
if (ch == 0) {
data_ch = DB_PKT_TYPE_DAT_CH0;
} else if (ch == 1) {
data_ch = DB_PKT_TYPE_DAT_CH1;
} else {
data_ch = DB_PKT_TYPE_DAT_CH2;
}
int err = app_online_db_send_more(data_ch, buf, len);
if (err) {
r_printf("tx_err:%d", err);
//return -1;
}
return len;
} else {
//putchar('x');
return 0;
}
}
int aec_data_export_init(u8 ch)
{
aec_rec = zalloc(sizeof(aec_record_t));
//aec_rec->send_timer = sys_timer_add(NULL, aec_export_timer, 16);
aec_rec->ch = ch;
app_online_db_register_handle(DB_PKT_TYPE_EXPORT, aec_online_parse);
//app_online_db_register_handle(DB_PKT_TYPE_MIC_DUT, mic_dut_online_parse);
return 0;
}
int aec_data_export_exit()
{
if (aec_rec) {
if (aec_rec->send_timer) {
sys_timer_del(aec_rec->send_timer);
aec_rec->send_timer = 0;
}
free(aec_rec);
aec_rec = NULL;
}
return 0;
}
#endif /*TCFG_AUDIO_DATA_EXPORT_ENABLE*/
#if 0
static u8 aec_online_idle_query(void)
{
//return ((aec_rec == NULL) ? 1 : 0);
return 0;
}
REGISTER_LP_TARGET(aec_online_lp_target) = {
.name = "aec_online",
.is_idle = aec_online_idle_query,
};
#endif