JL700N可视化工具问题处理文档
📎 原始文档:https://www.kdocs.cn/l/cjqhoLE5ct4V JL700N可视化工具问题处理文档
- AC700X_tws_SDK_2.0.1使用可视化工具配置左右耳触发唤醒Siri不同步执行的处理方法 20230105 CYL
//修改action_open_siri()接口的内容
static void action_open_siri(struct scene_param *param)
{
struct scene_private_data *priv = (struct scene_private_data *)param->user_type;
if (priv->local_action && tws_api_get_role() == TWS_ROLE_SLAVE) {
tws_master_call_btstack_api(API_OPEN_SIRI);
} else {
call_btstack_api(0x80 | API_OPEN_SIRI, 0);
}
}
static void call_btstack_api(int api, int err) 接口 需要添加这一段
case API_OPEN_SIRI:
user_send_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
break;
最后添加API_OPEN_SIRI到枚举中,以上做法即将open_siri添加到挂断接通电话的同步处理函数中了。
- AC700X_tws_SDK_2.0.1使用A手机通话中B手机来电,但不播放ring来电铃声的处理方法 20230130 CYL
修改替换以下程序在来电铃声的判断处
if (g_bt_hdl.inband_ringtone) {
u8 *other_addr = get_other_dev_addr(bt_addr) ;
put_buf(other_addr, 6);
y_printf("call_status<%d>\n",get_call_status_for_addr(other_addr));
if (device && ((BT_CALL_ACTIVE == get_call_status_for_addr(other_addr)))){
sys_timeout_add(g_bt_hdl.phone_ring_addr, phone_second_call_ring_play_start, 2000);
}
if (after_conn == 2) { //强制播本地铃声
sys_timeout_add(g_bt_hdl.phone_ring_addr, phone_second_call_ring_play_start, 2000);
}
}
需要注意的是:手机来电铃声(是手机设置的铃声,不是ring提示音)是跟随esco链路传到耳机的,下方的g_bt_hdl.inband_ringtone参数是代表-来电手机方是否支持传过来手机铃声;
get_inband_ringtone_flag_for_addr 接口即获取手机是否支持标识。该标识(即支不支持将手机铃声传过来)是随着手机而定的,有些手机会标识为1,但是也不会传铃声过来。标识为0时即不会传铃声过来,程序会默认播放来电铃声ring提示音。
- AC700X_tws_SDK_2.0.1耳机一拖二A2DP让联:取消A2DP抢播,用户通过按键自行控制两手机A2DP的接入 20230130 CYL 1.首先关闭蓝牙配置中的A2DP抢播选项
2.在情景配置的按键功能中添加以下的保留前后台和切换动作,以下为demo。
3.修改bt_ability.c中的程序(新版补丁程序中可能已经修复更新,需要检查一下)
修改的两处为[媒体音频后台静音][暂停媒体音频]
static bool is_state_a2dp_mute(void *device, struct scene_param *param)
{
u8 *bt_addr = btstack_get_device_mac_addr(device);
int result = bt_slience_detect_get_result(bt_addr);
if (result == BT_SLIENCE_NO_DETECTING) {
return false;
}
return true;
}
//修改bt_action_a2dp_pause接口部分
#if TCFG_A2DP_PREEMPTED_ENABLE
if (slience == BT_SLIENCE_HAVE_ENERGY) {
btstack_device_control(device, USER_CTRL_PAUSE_MUSIC);
}
#else
if (slience != BT_SLIENCE_NO_DETECTING) {
btstack_device_control(device, USER_CTRL_PAUSE_MUSIC);
}
#endif
AC700X_tws+dongle_SDK_1.0.0+AC697_dongle_SDK手机发射器dongle配置驱动点亮LED,使用io驱动非PWM驱动 20230130 CYL 目前可视化dongle-SDK的UI推灯没有像以前一样使用pwm_led.c驱动,所以LED推灯是直接用IO简单驱动,配置方法可以按照上方截图去配置,可以根据demo去创建一些显示方式。同时可以依据可视化dongle_SDK中board_ac897n_dongle_1t2_cfg.h板机中的推灯方式去改写



AC700X_tws_SDK_2.0.1耳机设置超距关机时间和无连接自动关机后,与手机超距断开后真正关机时间为超距时间+无连接自动关机时间的问题 20230206 CYL
tws与手机的配对流程如下:可以参考文档1T2_SDK框架说明https://kdocs.cn/l/cdW5N8qm2qid
解决方法如下:
void bt_disconnect_shut_down_handler(){
if (get_total_connect_dev() == 0) { //已经没有设备连接
sys_auto_shut_down_enable();
}
}
sys_timeout_add(NULL, bt_disconnect_shut_down_handler, 100);
注意:接收到BT_STATUS_FIRST_DISCONNECT和BT_STATUS_SECOND_DISCONNECT消息时,手机与耳机并没有正在断开连接,所以在获取连接数量时,需要进行延时一段时间,100ms内即可。
- AC700X_tws_SDK和AC700X_tws+dongle_SDK_1.0.0获取当前活跃设备,并对活跃设备做下一步操作:歌曲播放暂停/通话的接听挂断等(优化对活跃设备精准控制) 20230311 CYL 注意:编译报错时以700可视化判断活跃设备 20230911 CKS为准
#define MAX_DEVICE_NUM 2
u8 *user_get_active_device()
{
s16 i = 0;
s16 cnt = 0;
u8 *bt_esco_addr = NULL;
void *active_dev = NULL;
void *devices[MAX_DEVICE_NUM];
int device_num = btstack_get_conn_devices(devices, 2);
printf("device_num<%d>\n",device_num);
if (device_num == 1) {
active_dev = devices[0];
} else if (device_num >= MAX_DEVICE_NUM) {
for (i = 0; i < device_num; i++) { //通话优先级最高
if ((btstack_get_call_esco_status(devices[i]) == BT_ESCO_STATUS_OPEN)) { //esco链路是否已连接成功
active_dev = devices[i];
break;
}
}
if (active_dev == NULL) {
for (i = 0; i < device_num; i++) {
if (btstack_get_call_status(devices[i]) != BT_CALL_HANGUP && btstack_get_call_status(devices[i]) != BT_SIRI_STATE) { //通话状态或siri状态
active_dev = devices[i];
cnt++;
}
}
if (cnt >= MAX_DEVICE_NUM) { //如果有两个设备以上都是通话状态,获取库里的active设备
active_dev = get_bt_current_conn(0);
}
}
if (active_dev == NULL) {
for (i = 0; i < device_num; i++) { //A2DP播歌优先级最低
if (a2dp_player_is_playing(btstack_get_device_mac_addr(devices[i]))) {
active_dev = devices[i];
break;
}
}
}
if (active_dev == NULL) { //所有设备都处于待机状态,则获取库里的active设备
active_dev = get_bt_current_conn(0);
}
}
bt_esco_addr = btstack_get_device_mac_addr(active_dev);
printf("active_dev:");
put_buf(bt_esco_addr, 6);
return bt_esco_addr;
}
以上接口即为一拖二场景下,获取当前活跃设备,通话中>接听/去电>播歌;通过以上接口即可获取当前活跃设备的地址,并根据地址做下一步处理。同事客户可以修改该接口,改变返回值不为活跃设备的地址,可修改为直接返回活跃设备的设备号,再通过设备号做下一步处理。【以下为使用案例】需要注意的是,一般只对挂断通话加上-指定向活跃设备发送挂断指令。

7. AC700X_tws+dongle_SDK_1.0.0/1.1.0 耳机连接dongle设备,传到耳机的音频数据DAC输出峰峰值(声音小)远小于耳机连接手机蓝牙时的音频DAC输出峰峰值 20230315 CYL 改进方法为:为dongle设备SDK[JL697M_DONGLE_SDK]修改判断dongle设备插入安卓手机后,默认将蓝牙输出音频音量设为最大值。
1.首先添加安卓设备的标识参数;
u8 android_mode: 1;
u8 res: 3;
2.添加识别为安卓设备时的标识赋值
case 0x04://set res
switch(HIBYTE(setup->wValue)) {
case UAC_FU_VOLUME:
if (HIBYTE(setup->wIndex) == SPK_FEATURE_UNIT_ID) {
printf("android_mode====");
uac_info->android_mode = 1;
} else if (HIBYTE(setup->wIndex) == MIC_FEATURE_UNIT_ID) {
printf("android_mode====");
uac_info->android_mode = 1;
}
break;
}
break;
3.赋值音量最大值
if (uac_info->android_mode) {
uac_info->spk_left_vol = vol_convert(100);
uac_info->spk_right_vol = vol_convert(100);
}
- AC700X_tws_SDK_2.0.1 patch14及以前版本程序,开双micDNS降噪,优化一拖二通话时需要叠加播放提示音以及通话时操作按键功能的稳定性(概率爆ram) 20230315 CYL
- 修改添加以下几项参数。jlstream.h

u8 id;
u8 sleep_reason;
u8 msg_run_cnt;
u8 wakeup_early_en;
u8 wakeup_reason ;
2.将通话算法部分放flash中
2. 优化通话时按键操作-【如果】有使用长按保持hold 做按键事件触发,比如长按保持加减音量等,按照下方修改
3. 替换以下库文件: 20230307-双micDNS通话-优化爆ram和提高稳定性替换库文件 https://kdocs.cn/l/ccwu8QW7hFHp
9. AC700X_tws+dongle_SDK_1.1.0 耳机连接dongle,超距直到卡顿后回来不会回复,音乐卡顿一会儿就没声音了 20230412 CKS 在工具上直接打补丁,或者手动替换下面文件
【金山文档】 AC700X_tws+dongle_SDK_1.1.0_连dongle超距无声问题修改
https://kdocs.cn/l/ciZdbJbtHrsU
AC700X_tws+dongle_SDK_1.1.0 可视化工具配置长按3S、5S没有作用 20230428 CKS 1.1.0SDK,少了处理函数,把1.0.0的拷贝过去即可

AC700X_tws1t2_SDK_2.0.2 可视化工具编译失败 20230508 FSW 2.0.2版本编译时出现如下错误
需要从2.0.1版本拷贝anc_coeff.bin和anc_gains.bin放到SDK\cpu\br36\tools\目录下AC700X_tws1t2_SDK_2.0.1 可视化工具,DAC输出改为右声道,进游戏模式播歌卡顿 20230526 JWK
配置为右声道,实际是开了左右声道的(因为不支持单独打开右声道),所以需要多加一路dac_buffAC700X_tws1t2_SDK_2.0.1 可视化工具,使能双麦通话ENC和ANC时通话声音变小 20230526 JWK
客户在可视化工具配的是单端隔直电容模式,但是可视化工具修改的MIC工作模式会被代码里强行重定义成差分隔直电容模式,需要在代码里更改客户样机配置的模式AC700X_tws+dongle_SDK_1.1.0 可视化工具连接dongle后无法唤醒siri 20230612 JWK 原来的action_open_siri发送的是不区分设备地址的接口命令,连上dongle后无法发送到手机
加上设备判断代码修改如下
static void action_open_siri(struct scene_param *param)
{
void *devices[2] = {NULL, NULL};
int num = btstack_get_conn_devices(devices, 2);
printf("bt_device: %p, %p devices num =%d\n", devices[0], devices[1],num);
put_buf(btstack_get_device_mac_addr(devices[0]), 6);
put_buf(btstack_get_device_mac_addr(devices[1]), 6);
if (btstack_get_dev_type_for_addr(devices[0]) == REMOTE_DEV_DONGLE_SPEAK)//设备1是dongle
{
printf("is dongle open siri\n");
bt_cmd_prepare_for_addr(devices[1], USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);//设备2是手机,发命令给设备2
}
else if(btstack_get_dev_type_for_addr(devices[1]) == REMOTE_DEV_DONGLE_SPEAK)//设备2是dongle
{
printf("is dongle open siri\n");
bt_cmd_prepare_for_addr(devices[0], USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);//设备1是手机,发命令给设备1
}
else //只有一台连接设备,设备为手机,不区分地址发送siri命令
{
printf("is phone open siri\n");
bt_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
}
}
- 可视化工具多个EQ效果切换 20230612 FSW 先添加EQ效果


使用如下接口切换添加好的多个EQ
#define CFG_FILE_MAX_EQ_NUM 3//有多少个EQ效果这里就填多少
static u8 curr_eq_index = 0;
void eq_effect_switch(u8 index)
{
if(index == 0xff){
curr_eq_index++;
}
else{
curr_eq_index = index;
}
if(curr_eq_index >= CFG_FILE_MAX_EQ_NUM){
curr_eq_index = 0;
}
eq_file_cfg_switch("MusicEqBt", curr_eq_index);
}
- AC700X_tws_SDK_2.0.1/2.0.2,TWS同步关机概率性一只耳机关机不成功 20230613 LJW

- 给低延时模式配置一个独立的EQ效果 20230614 FSW

- AC700X_tws_SDK_2.0.2开ANC无效果 20230619 GFH ANC初始化太早,通话mic的配置还没读进来所以ANC麦开不起来导致

- AC700N-demo 1.1.0 (patch_07) 配置混合馈,FB麦无ANC效果 20230625 JWK 原因:配置了FBMIC的供电,但没有实际的代码执行
解决办法:增加数字麦IO供电流程
void audio_mic_pwr_ctl(audio_mic_pwr_t state)
{
int i;
struct adc_file_cfg *cfg = audio_adc_file_get_cfg();
switch (state) {
case MIC_PWR_OFF:
if (audio_adc_is_active()) {
printf("MIC_IO_PWR AUDIO_ADC is useing !\n");
return;
}
printf("MIC_IO_PWR close\n");
case MIC_PWR_INIT:
/*mic供电IO配置:输出0*/
for (i = 0; i < AUDIO_ADC_MIC_MAX_NUM; i++) {
if (cfg->mic_en_map & BIT(i)) {
if ((cfg->param[i].mic_bias_sel == 0) && (cfg->param[i].power_io != 0)) {
u32 gpio = uuid2gpio(cfg->param[i].power_io);
gpio_set_mode(IO_PORT_SPILT(gpio), PORT_OUTPUT_LOW);
}
}
}
/*
//测试发现 少数MIC在开机的时候,需要将MIC_IN拉低,否则工作异常
gpio_set_mode(IO_PORT_SPILT(IO_PORTA_01), PORT_OUTPUT_LOW); //MIC0
gpio_set_mode(IO_PORT_SPILT(IO_PORTA_08), PORT_OUTPUT_LOW); //MIC1
*/
#if (defined TCFG_AUDIO_MIC2_PWR_PORT) && TCFG_AUDIO_MIC2_PWR_PORT
gpio_set_mode(IO_PORT_SPILT(TCFG_AUDIO_MIC2_PWR_PORT), PORT_OUTPUT_LOW);
#endif
break;
case MIC_PWR_ON:
/*mic供电IO配置:输出1*/
for (i = 0; i < AUDIO_ADC_MIC_MAX_NUM; i++) {
if (cfg->mic_en_map & BIT(i)) {
if ((cfg->param[i].mic_bias_sel == 0) && (cfg->param[i].power_io != 0)) {
u32 gpio = uuid2gpio(cfg->param[i].power_io);
gpio_set_mode(IO_PORT_SPILT(gpio), PORT_OUTPUT_HIGH);
}
}
}
#if (defined TCFG_AUDIO_MIC2_PWR_PORT) && TCFG_AUDIO_MIC2_PWR_PORT
gpio_set_mode(IO_PORT_SPILT(TCFG_AUDIO_MIC2_PWR_PORT), PORT_OUTPUT_HIGH);
#endif
break;
break;
case MIC_PWR_DOWN:
break;
}
}
- AC700X_tws_SDK_2.0.2使用右声道时开ANC无效果 20230626 GFH 原因:右声道ANC麦没配置
解决方法:替换如下函数
void audio_anc_mic_management(audio_anc_t *param)
{
int i, j;
u8 double_mult_flag = 0;
struct adc_file_cfg *cfg = audio_adc_file_get_cfg();
for (i = 0; i < 4; i++) {
if (param->mic_type[i] == A_MIC0) {
param->mic_param[0].en = 1;
param->mic_param[0].type = i;
if (cfg->mic_en_map & AUDIO_ADC_MIC_0) {
param->mic_param[0].mult_flag = 1;
}
}
if (param->mic_type[i] == A_MIC1) {
param->mic_param[1].en = 1;
param->mic_param[1].type = i;
if (cfg->mic_en_map & AUDIO_ADC_MIC_1) {
param->mic_param[1].mult_flag = 1;
}
}
}
for (i = 0; i < 2; i++) {
anc_hdl->param.mic_param[i].mic_p.mic_mode = cfg->param[i].mic_mode;
anc_hdl->param.mic_param[i].mic_p.mic_ain_sel = cfg->param[i].mic_ain_sel;
anc_hdl->param.mic_param[i].mic_p.mic_bias_sel = cfg->param[i].mic_bias_sel;
anc_hdl->param.mic_param[i].mic_p.mic_bias_rsel = cfg->param[i].mic_bias_rsel;
anc_hdl->param.mic_param[i].mic_p.mic_dcc = cfg->param[i].mic_dcc;
if ((param->ch == (ANC_L_CH | ANC_R_CH)) && param->mic_param[i].mult_flag) {
for (j = 0; j < 2; j++) {
if ((param->mic_param[j].type + 1) % 2) {
param->mic_param[j].mult_flag = 1;
}
}
}
}
param->mic_param[0].gain = param->gains.ref_mic_gain;
param->mic_param[1].gain = param->gains.err_mic_gain;
for (i = 0; i < 2; i++) {
g_printf("mic%d en %d, gain %d, type %d, mult_flag %d\n", i, param->mic_param[i].en, \
param->mic_param[i].gain, param->mic_param[i].type, param->mic_param[i].mult_flag);
}
}
- AC700X_tws_SDK_2.0.2一拖二状态下,播歌时按键控制音量只控制最后连接的手机 20230701 JWK 原因:发送音量加减命令是不区分设备地址发送的
解决办法:增加判断当前播歌设备,往指定设备发送音量加减命令
void volume_up(u8 inc)
{
u8 test_box_vol_up = 0x41;
s8 cur_vol = 0;
u8 call_status = bt_get_call_status();
u8 cur_state;
s16 max_volume;
u8 addr[6];
u8 *bt_addr = NULL;
if (a2dp_player_get_btaddr(addr)) {
bt_addr = addr;
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
}
if ((tone_player_runing() || ring_player_runing()) && volume_flag) {
if (bt_get_call_status() == BT_CALL_INCOMING) {
volume_up_down_direct(1);
}
return;
}
/*打电话出去彩铃要可以调音量大小*/
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) {
cur_state = APP_AUDIO_STATE_CALL;
max_volume = app_audio_volume_max_query(AppVol_BT_CALL);
} else {
cur_state = APP_AUDIO_STATE_MUSIC;
max_volume = app_audio_volume_max_query(AppVol_BT_MUSIC);
}
cur_vol = app_audio_get_volume(cur_state);
if (bt_get_remote_test_flag()) {
//bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_up); //音量加
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_TEST_KEY, 1, &test_box_vol_up); //音量加
}
/* if (cur_vol >= app_audio_get_max_volume()) { */
if (cur_vol >= max_volume) {
audio_event_to_user(AUDIO_EVENT_VOL_MAX); //触发vol max事件
if (bt_get_call_status() != BT_CALL_HANGUP) {
/*本地音量最大,如果手机音量还没最大,继续加,以防显示不同步*/
if (g_bt_hdl.phone_vol < 15) {
if (bt_get_curr_channel_state() & HID_CH) {
//bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HID_VOL_UP, 0, NULL);
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
} else {
//bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
}
}
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 1);
//bt_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL);
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 1);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
#else
app_audio_volume_up(inc);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
printf("vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
if (bt_get_call_status() != BT_CALL_HANGUP) {
if (bt_get_curr_channel_state() & HID_CH) {
//bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HID_VOL_UP, 0, NULL);
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
} else {
//bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
}
} else {
#if TCFG_BT_VOL_SYNC_ENABLE
//bt_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
#endif
}
}
void volume_down(u8 dec)
{
u8 test_box_vol_down = 0x42;
u8 call_status = bt_get_call_status();
u8 cur_state;
u8 addr[6];
u8 *bt_addr = NULL;
if (a2dp_player_get_btaddr(addr)) {
bt_addr = addr;
printf("bt_addr = %x %x %x %x %x %x\n",bt_addr[0],bt_addr[1],bt_addr[2],bt_addr[3],bt_addr[4],bt_addr[5]);
}
if ((tone_player_runing() || ring_player_runing()) && volume_flag) {
if (bt_get_call_status() == BT_CALL_INCOMING) {
volume_up_down_direct(-1);
}
return;
}
if (bt_get_remote_test_flag()) {
//bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_down); //音量减
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_TEST_KEY, 1, &test_box_vol_down); //音量减
}
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) {
cur_state = APP_AUDIO_STATE_CALL;
} else {
cur_state = APP_AUDIO_STATE_MUSIC;
}
/* if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) <= 0) { */
if (app_audio_get_volume(cur_state) <= 0) {
audio_event_to_user(AUDIO_EVENT_VOL_MIN); //触发vol mix事件
if (bt_get_call_status() != BT_CALL_HANGUP) {
/*
*本地音量最小,如果手机音量还没最小,继续减
*注意:有些手机通话最小音量是1(GREE G0245D)
*/
if (g_bt_hdl.phone_vol > 1) {
if (bt_get_curr_channel_state() & HID_CH) {
//bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HID_VOL_DOWN, 0, NULL);
} else {
//bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
}
}
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 0);
//bt_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
#endif
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 0);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
#else
app_audio_volume_down(dec);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
printf("vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
if (bt_get_call_status() != BT_CALL_HANGUP) {
if (bt_get_curr_channel_state() & HID_CH) {
//bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HID_VOL_DOWN, 0, NULL);
} else {
//bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
}
} else {
#if TCFG_BT_VOL_SYNC_ENABLE
/* opid_play_vol_sync_fun(&app_var.music_volume, 0); */
if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) == 0) {
app_audio_volume_down(0);
}
//bt_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
bt_cmd_prepare_for_addr(bt_addr,USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
#endif
}
}
700N可视化工具SDK2.0.1(PATCH18)接听通话耳机端声音很小,需要加一次音量恢复正常 20230824 FSW 替换库rebuild
【金山文档】 btstack-tws-1t2-v201-patch18-修复HFP音量问题
https://kdocs.cn/l/ccLgmX6XocKa700可视化判断活跃设备 20230911 CKS
添加代码
/*************************************************************/
// 获取活跃设备
/*************************************************************/
int custom_get_call_addr(u8 *btaddr)
{
void *devices[2];
int num = btstack_get_conn_devices(devices, 2);
for (u8 i = 0; i < num; i++) {
printf("btstack_bt_get_call_status(devices[i]):%d", btstack_bt_get_call_status(devices[i]));
if (btstack_bt_get_call_status(devices[i]) != BT_CALL_HANGUP) { //这里可以进一步判断两个设备的通话状态,判断用哪一个设备
memcpy(btaddr, btstack_get_device_mac_addr(devices[i]), 6);
return 1;
}
}
return 0;
}
u8 user_get_active_device_addr(u8 *bt_addr)
{
u8 addr_all_ff[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
if (esco_player_get_btaddr(bt_addr)) { //有ESCO状态
printf("esco player now!!!");
put_buf(bt_addr, 6);
return 1;
} else if (bt_get_call_status() != BT_CALL_HANGUP) { //有HFP状态
if (custom_get_call_addr(bt_addr)) {
printf("hfp player now!!!");
put_buf(bt_addr, 6);
return 1;
}
} else if (a2dp_player_get_btaddr(bt_addr)) { //有A2DP状态
printf("a2dp player now!!!");
put_buf(bt_addr, 6);
return 1;
} else {
printf("no active device now!!!");
memcpy(bt_addr, addr_all_ff, 6);
put_buf(bt_addr, 6);
}
return 0;
}
- 使用方法(以下是demo,自己根据需要灵活运用)


- AC700X_tws+dongle_SDK_1.1.0同时连手机、dongle播歌,电话打入dongle,爆RAM GFH 同时连手机、dongle播歌,电话打入dongle,爆RAM
见资源优化(可视化SDK).otl - dac开关状态以及功放控制 20231012 FSW 添加下面的代码到SDK中,底层会调用
#define DAC_ANALOG_OPEN_PREPARE 1//开dac前
#define DAC_ANALOG_OPEN_FINISH 2//开dac后
#define DAC_ANALOG_CLOSE_PREPARE 3//关dac前
#define DAC_ANALOG_CLOSE_FINISH 4//关dac后
void audio_dac_power_state(u8 state)
{
switch(state){
case DAC_ANALOG_OPEN_FINISH:
pa_umute();
break;
case DAC_ANALOG_CLOSE_PREPARE:
pa_mute();
break;
}
}
动态mic增益开关打不开问题处理 20231113 FSW 用以下方法替代

处理一拖二播歌时唤醒siri,会出现前一次和后一次唤醒的不是同一台手机的问题 20231120 FSW 加入700可视化判断活跃设备 20230911 CKS的修改,同时修改下面的函数
static void action_open_siri(struct scene_param *param)
{
u8 addr[6];
user_get_active_device_addr(addr);
if(is_siri_open()){
bt_cmd_prepare_for_addr(addr, USER_CTRL_HFP_GET_SIRI_CLOSE, 0, NULL);
// bt_cmd_prepare(USER_CTRL_HFP_GET_SIRI_CLOSE, 0, NULL);
return;
}
bt_cmd_prepare_for_addr(addr, USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
// bt_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
}AC700X_tws_SDK_2.0.2 呼吸灯不同步,概率变暗很快 20231120 JWK 【金山文档】 修复因为添加双IO推双灯的代码,prev_breath_time没有考虑周期重置赋值导致的呼吸灯效只有一半的bug
金山文档dongle接PS4声音小的问题 20231120 FSW

可视化SDK两边耳机同时操作按键发起配对 20231201 FSW 见:TWS配对常见应用.otl:可视化SDK两边耳机同时操作按键发起配对
700v202(patch_06)部分手机关闭siri后按键失效 20231216 GFH 替换库:可视化700v202(patch_06)btstack-AC700-tws1t2-ptach06.zip
700v202(patch_06.04)使能透传,软关机异常死机20240122 LJW 替换库:btctrler-TWS耳机_AC700N-demo_2.0.2(patch_06.04)_-修复使能ble关机死机.7z
700v202(patch_06.05)使用bt_osc_offset_ext_save保存频偏不能立即生效,复位才生效 20240125 CKS 替换库:使用bt_osc_offset_ext_save保存频偏不能立即生效,复位才生效
可视化实现多带WDRC 20240202 FSW

通话中允许回连和可连接 20240221 FSW 以下接口在蓝牙初始化成功之后调用
//通话过程中是否可以被手机回连,en: 1可以被手机回连,0不可被手机回连
void set_sort_with_1_edr_esco_with_page_scan(u8 en);
//通话过程中是否可以发起回连手机,en: 1可以回连手机,0不可回连手机
void set_sort_with_1_edr_esco_with_page(u8 en);
- 可视化使用默认音量表(需求自定义音量等级时使用)20240221 FSW 见:自定义数字音量的方法
- 可视化SDK添加高低音接口 20240222 FSW 见:AUDIO相关应用.otl
- 可视化SDK通话时,远端不说话时近端喇叭有吱吱声,远端说话时近端又会有沙沙声 20240222 FSW 先添加噪声门
噪声门参数参考
然后提高通话的系统时钟
- 双BLE做两路RCSP,修改profile以及处理自定义数据的方法 20240229 FSW 见JL701X可视化工具问题处理文档.otl第23点
- 700N可视化让播流程,同时连接手机和部分笔记本电脑,电脑暂停后不能切换到手机播放问题 20240411 FSW 原因是这部分笔记本电脑暂停后,数据流没有停止,并且数据流能量不为0(能量为2),需要修改能量判断条件(会影响兼容性)

- 可视化SDK使用测试盒配对,会有概率配对不上 20240426 FSW 见JL701X可视化工具问题处理文档.otl第29点
- 可视化SDK V2.0.2,比patch08低的版本,测试盒升级提示“08”错误(flash数据校验失败)问题 20240520 FSW 删掉可视化安装目录下的2.0.2版本sdk,然后在可视化上面重新下载SDK,重新创建一个patch08的工程,然后把patch08的ota.bin拷贝到项目代码里面,再升级

- 可视化SDK单左耳或者单右耳使用都是只播了左声道 20240524 FSW

- tws状态下anc切换提示音不同步问题 20240605 FSW 原因是tws状态下SDK没有使用tws同步的提示音播放接口
//以下代码为新增代码
void anc_tone_play_cb_deal(int priv, enum stream_event event)
{
anc_tone_play_cb(priv, event);
}
REGISTER_TWS_TONE_CALLBACK(anc_tone_play) = {
.func_uuid = (u32)anc_tone_play_cb,
.callback = anc_tone_play_cb_deal,
};
//以上代码为新增代码
//修改下面的函数
static void anc_tone_play_and_mode_switch(u8 mode, u8 preemption, u8 cb_sel)
{
if (cb_sel) {
/*ANC打开情况下,播提示音的同时,anc效果淡出*/
if (anc_hdl->state == ANC_STA_OPEN) {
audio_anc_fade(0, anc_hdl->param.anc_fade_en, 1);
}
if(tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED){
if (tws_api_get_role() == TWS_ROLE_MASTER){
if (mode == ANC_ON) {
tws_play_tone_file_callback(get_tone_files()->anc_on, 400, (u32)anc_tone_play_cb);
} else if (mode == ANC_TRANSPARENCY) {
tws_play_tone_file_callback(get_tone_files()->anc_trans, 400, (u32)anc_tone_play_cb);
} else if (mode == ANC_OFF) {
tws_play_tone_file_callback(get_tone_files()->anc_off, 400, (u32)anc_tone_play_cb);
}
}
}
else{
if (mode == ANC_ON) {
play_tone_file_callback(get_tone_files()->anc_on, NULL, anc_tone_play_cb);
} else if (mode == ANC_TRANSPARENCY) {
play_tone_file_callback(get_tone_files()->anc_trans, NULL, anc_tone_play_cb);
} else if (mode == ANC_OFF) {
play_tone_file_callback(get_tone_files()->anc_off, NULL, anc_tone_play_cb);
}
}
anc_hdl->tone_mode = anc_hdl->param.mode;
} else {
/* tone_play_index(index, preemption); */
if (mode == ANC_ON) {
play_tone_file(get_tone_files()->anc_on);
} else if (mode == ANC_TRANSPARENCY) {
play_tone_file(get_tone_files()->anc_trans);
} else if (mode == ANC_OFF) {
play_tone_file(get_tone_files()->anc_off);
}
anc_mode_switch_deal(anc_hdl->param.mode);
}
}
45. AC700N TWS 2.0.2 patch8 AI配置RCSP(杰理之家),连上手机BLE,设备不会主动发起MTU交换请求 20240607 LZY 问题:设备连接手机不主动发起设备交互请求,手机又不主动下发交互,导致发送的包长不对
解决:更换btstack库
700N patch 8 AI配置RSCP(杰理之家),连上手机BLE,设备不会主动发起MTU交换请求.zip
代码添加下图内容
一拖二状态下,两台手机都在播抖音,耳机音频会频繁切换 20240618 FSW 见JL701X可视化工具问题处理文档.otl第46点
700N patch08手机快速拖动音量条爆RAM 20240628 CKS

TWS的加这个
部分补丁版本出现SPP在线调试用不了的问题 20240708 FSW 见:JL701X可视化工具问题处理文档.otl 第49点
省电容MIC开机trim会死机的问题 20240716 FSW

700N tws 一拖二 V202 patch_08的PC模式mic上行添加算法后上行无声 20240719 FSW



TWS耳机 AC700N-demo 2.0.2(patch_08),可视化SDK AD按键部分配置读取错误,Key电阻数值异常,取消外部上拉无效,长按复位使能
取消外部上拉无效,Key value数值异常 log如图,
当前解决方法:
在const struct adkey_platform_data *get_adkey_platform_data()
相关代码修改读取回的配置
还要加多长按复位的设置,否则默认长按复位
ac700N(Patch08)音频流程设置为自定义,连接笔记本电脑后,用windows自带播放器,修改音量后随机出现爆音现象 20240715 CGP 将\SDK\audio\common\audio_dvol.h 的 DIGITAL_VOLUME_LEVEL_MAX 宏改为 对应的音量等级 途中为16

数组可改可不改
涂鸦、数传和APP_ONLINE_DEBUG共存的修改 20240730 FSW 见:JL701X可视化工具问题处理文档.otl -- 第62点
来电时,耳机播耳机自带铃声,按键接听时想要播提示音再执行接听,但是提示音播不出来 20240808 FSW
void bt_stop_ring_tone(void)
{
if (g_bt_hdl.phone_ring_flag) {
g_bt_hdl.phone_ring_flag = 0;
tone_ring_player_stop();
if (g_bt_hdl.phone_timer_id) {
sys_timeout_del(g_bt_hdl.phone_timer_id);
g_bt_hdl.phone_timer_id = 0;
}
}
}

55. 耳机一拖二连接两台手机,手机A播放视频的过程中,手机B来电接听,挂断后会唤醒手机A的音乐播放器 202040808 FSW
static void check_a2dp_play_state(void *device)
{
u8 *bt_addr = btstack_get_device_mac_addr(device);
int playing = a2dp_player_is_playing(bt_addr);
if (!playing) {
btstack_device_control(device, USER_CTRL_AVCTP_OPID_PLAY);
}
}
56. AC700 202 P08,双IO推双灯,红蓝交替闪异常 202040808 CKS 替换SDK目录下led文件夹内文件
led.rar
修改下图
57. AC700 202 patch08,任意IO做通信脚,测试盒串口升级失败 202040813 LJW 修改:
2024-08-08_BR36耳机任意IO串口升级补丁.zip
示例:
700-202-patch08-任意IO测试盒串口升级测试示例.7z
58. AC700_202_PATCH08,测试打开SIRI的时候系统有回调了置2,但是又很快置0了 20240813 LZY
改蓝牙库,定时器从0.5s改成2
btstack-AC700-202-P8-修改Siri.zip
59. AC700_202_PATCH08,使能提示音淡出后,在播放一个长的提示音途中,再来一个提示音(比如按键),音乐音量变小 20240813 LZY 原因:背景音乐在第一次降低到10,第二次降低到6,导致提示音播放完恢复的时候只恢复到10,比原先小声
解决方式:在淡出中记录背景音乐,叠加后,背景音量保持不变
static s16 last_vol = -1;
dvol_handle *audio_digital_vol_open(struct audio_vol_params params)
{
u16 vol = params.vol;
u16 vol_max = params.vol_max;
u16 fade_step = params.fade_step;
s16 vol_limit = params.vol_limit;
dvol_log("dvol_open:%d-%d-%d-%d\n", vol, vol_max, fade_step, vol_limit);
dvol_handle *dvol = NULL;
dvol = zalloc(sizeof(dvol_handle));
if (dvol) {
u8 vol_level;
dvol->bit_wide = params.bit_wide;
dvol->fade = DIGITAL_FADE_EN;
dvol->vol = (vol > vol_max) ? vol_max : vol;
if (vol > vol_max) {
printf("[warning]cur digital_vol(%d) > digital_vol_max(%d)!!", vol, vol_max);
}
dvol->vol_max = vol_max;
if (vol_limit == -1) {
dvol->vol_limit = digital_vol_max;
} else {
dvol->vol_limit = (vol_limit > digital_vol_max) ? digital_vol_max : vol_limit;
}
vol_level = dvol->vol * dvol->vol_limit / vol_max;
dvol->vol_target = dig_vol_table[vol_level];
dvol->vol_fade = dvol->vol_target;
dvol->fade_step = fade_step;
dvol->toggle = 1;
spin_lock(&dvol_attr.lock);
list_add(&dvol->entry, &dvol_attr.dvol_head);
#if BG_DVOL_FADE_ENABLE
dvol->vol_bk = -1;
if (dvol_attr.bg_dvol_fade_out) {
dvol_handle *hdl;
list_for_each_entry(hdl, &dvol_attr.dvol_head, entry) {
if (hdl != dvol) {
hdl->vol_bk = hdl->vol;
if (hdl->vol >= BG_DVOL_MAX) {
hdl->vol -= BG_DVOL_MAX_FADE;
} else if (hdl->vol >= BG_DVOL_MID) {
hdl->vol -= BG_DVOL_MID_FADE;
} else if (hdl->vol >= BG_DVOL_MIN) {
hdl->vol -= BG_DVOL_MIN_FADE;
} else {
hdl->vol_bk = -1;
continue;
}
if (last_vol == -1){
last_vol = hdl->vol_bk;
}else{
hdl->vol_bk = last_vol;
}
u8 vol_level = hdl->vol * hdl->vol_limit / hdl->vol_max;
if (hdl->vol_table_default) {
hdl->vol_target = dig_vol_table[vol_level];
} else {
if (vol_level == 0) {
hdl->vol_target = 0;
} else {
if (!dvol->vol_table) {
u16 step = (hdl->cfg_level_max - 1 > 0) ? (hdl->cfg_level_max - 1) : 1;
float step_db = (hdl->cfg_vol_max - hdl->cfg_vol_min) / (float)step;
float hdl_db = hdl->cfg_vol_min + (vol_level - 1) * step_db;
float hdl_gain = eq_db2mag(hdl_db);//dB转换倍数
hdl->vol_target = (s16)(DVOL_MAX_FLOAT * hdl_gain + 0.5f);
/* printf("vol param:%d,%d,%d,%d,%d",(int)hdl_gain,hdl->vol_target,(int)step_db,hdl->cfg_level_max - vol_level,(int)hdl_db); */
} else {
dvol->vol_target = dvol->vol_table[vol_level - 1];
}
}
}
//y_printf("bg_dvol fade_out:%x,vol_bk:%d,vol_set:%d,tartget:%d",hdl,hdl->vol_bk,hdl->vol,hdl->vol_target);
}
}
}else{
last_vol = -1;
}
#endif/*BG_DVOL_FADE_ENABLE*/
spin_unlock(&dvol_attr.lock);
/*dvol_log("dvol_open:%x-%d-%d-%d\n", dvol, dvol->vol, dvol->vol_max, fade_step);*/
}
return dvol;
}
- V2.0.2 patch 8.03 音频节点跳过 20240821 LZY

7000 tws patch8.03
a2dp close的时候要删除断点,等到open的时候恢复

- 灯闪概率不同步问题 20240822 FSW 根据灯的周期修改下面这个宏,比如灯是2秒1闪,可以修改为4000
#define PLED_FISRT_SYNC_TIME 11000//ms
- 获取当前播歌的是不是dongle 20240822 FSW
u8 addr[6];
int ret = a2dp_player_get_btaddr(addr);
if(ret == 0){
//没播歌
}
else if(btstack_get_dev_type_for_addr(addr) == REMOTE_DEV_DONGLE_SPEAK){
//dongle
}
else{
//手机
}
- 三方通话接口使用方法 20240822 FSW 如果编译报错,先更新到最新版本SDK
#define SECOND_CALL_CCWA_COME BIT(0)
#define SECOND_CALL_IN BIT(1) //三方打入
#define SECOND_CALL_OUT BIT(2) //三方打出
#define SECOND_CALL_HELD BIT(3) //两个通话
int get_second_call_status_for_addr(u8 *addr);
//以单击接听挂断为例
u8 user_active_addr[6];
u8 *bt_other_addr = NULL;
user_get_active_device_addr(user_active_addr); //见本文23.700可视化判断活跃设备 20230911 CKS
bt_other_addr = btstack_get_other_dev_addr(user_active_addr);
int second_call_status = get_second_call_status_for_addr(user_active_addr);
int active_a2dp_status = a2dp_player_get_btaddr(user_active_addr);
case APP_MSG_POWER_KEY_ONE_CLICK:
printf("key one click\n");
flash_log_printf("[key]:%d\n", remap_msg[0]);
if ((bt_get_call_status_for_addr(user_active_addr) == BT_CALL_OUTGOING) || (bt_get_call_status_for_addr(user_active_addr) == BT_CALL_ALERT)) {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
} else if (bt_get_call_status_for_addr(user_active_addr) == BT_CALL_INCOMING) {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
} else if (bt_get_call_status_for_addr(user_active_addr) == BT_CALL_ACTIVE) {
if (bt_get_call_status_for_addr(bt_other_addr) == BT_CALL_ACTIVE) {
if (second_call_status == SECOND_CALL_IN) {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_THREE_WAY_ANSWER2, 0, NULL);
} else{
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
}
} else {
if (second_call_status == SECOND_CALL_IN) {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
} else {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
}
}
} else if (bt_get_call_status_for_addr(user_active_addr) == BT_CALL_HANGUP) {
bt_cmd_prepare_for_addr(user_active_addr, USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
} else {
printf("unknown!!!");
}
AC700 202 PATCH08 抗干扰测试下音乐变调 20240826 CKS 抗干扰测试下音乐变调
换以下库修改,注意是变调的时候会变成直接卡顿
AC700_202_patch08_抗干扰变调.zipAC700 3.0.0(patch01)样机使用导出stream.bin的方式去调音,点击音频配置下载到设备时掉线。---泓毅 原因:写flash触发ASSERT 死机。
修改方法:调试工具写falsh时解除flash的写保护。


AC700 2.0.2(patch08)样机使能杰里之家,单耳入仓出仓,杰里之家电量显示异常。---LZY 换以下库修改tishi
杰里之家app一拖二ble主从切换.zip
700N TWS dongle V1.1.0 patch13,dongle播歌时,蓝牙来电(不支持手机自带铃声),耳机铃声播不出来 20240904 FSW 来电时,dongle音频还没停止,而耳机来电铃声默认是在通话场景下播放的,导致无法打断dongle播放,需要在音乐场景下添加铃声音频流,dongle播放时在音乐场景下跑铃声音频流


添加铃声打断播放接口
int play_ring_file_alone(const char *file_name)
{
struct tone_player *player;
printf("%s\n", __func__);
if (g_ring_player) {
return -EBUSY;
}
player = zalloc(sizeof(*player));
if (!player) {
return -ENOMEM;
}
int err = tone_player_init(player, file_name);
if (err) {
tone_player_free(player);
return err;
}
player->scene = STREAM_SCENE_RING;
player->coexist = STREAM_COEXIST_DISABLE;
return ring_player_start(player);
}



jlstream_set_coexist(player->stream, player->coexist);


if (coexist == STREAM_COEXIST_AUTO) {
err = play_ring_file(file_list[0]);
}
else{
err = play_ring_file_alone(file_list[0]);
}
来电铃声改为打断播放
tws_play_ring_file_alone
AC700 2.0.2(patch08)在SNIFF模式下tws同步播放提示音反应慢 --- 泓毅 原因:sniff状态下,tws同步提示音多花了500ms,做不了瞬间同步完成。可优化措施(功耗略微增加):
适当把sniff下的 interval 改短;

适当把提示音等待退sniff时间 delay_msec 改短;

AC700 2.0.2(patch08)公版程序使能tws纯监听模式宏TWS_PURE_MONITOR_MODE之后,一拖二状态主机入仓关盖,主从切不过来,会卡十几秒 --- 泓毅 修改方法:
- CONFIG_TWS_FORWARD_RUN_SLOT 改成48

- 志英提供蓝牙ctrl库处理: 主耳入仓切主从失败修改蓝牙库.zip
- CONFIG_TWS_FORWARD_RUN_SLOT 改成48
AC700 3.0.0(patch_01) 打开双备份升级功能,使用测试盒无线升级,升级到99%后会提示失败,但是耳机实际升级成功 --- 泓毅 替换下面的库修复:
https://www.kdocs.cn/l/coJ6sZfqVTRHAC700 3.0.0(patch_01)客户开发的是头戴耳机,开双备份使用杰理之家ota升级失败 --- 泓毅 现象:
原因:SDK里面开了tws,但是tws没连。所以app过来获取耳机状态时候回复了TWS未连接给APP
处理方法:关掉TWS功能即可
700N的TWS dongle SDK V1.1.0 patch13,优化了RAM之后,还会有概率出现反复开关通话会爆RAM问题 20240910 FSW 主要原因跟内存碎片多有关,导致通话算法想要申请大块内存申请不到,优化方向是将部分大块内存的申请改为全局,部分通话算法资源放回RAM,以下是验证有效的修改





AC700N v2.0.2(patch_08)同时开启在线调试(ANC、EQ等)和自定义SPP UUID的时候,只有一个生效。20240914 ZJC 参考下面链接的修改
【金山文档 | WPS云文档】 AC700N可视化同时开启在线调试(ANC、EQ等)和自定义SPP UUID
https://kdocs.cn/l/cqYEknrHWiSmAC700 3.0.0(patch_01)公版打开双麦+DNS,通话一段时间后会报错除0死机异常 -- 泓毅 修改如下:
分别替换2个.c文件 br36_双麦通话同步除0死机问题处理_20240913.zip
添加如下定义处理编译报错

AC700 3.0.0(patch_01)公版用测试盒ota升级,会把VM信息擦除 -- 泓毅 可排查点:
isd_config_rule.c:根据需求VM大小固定VM地址、CONFIG_VM_OPT置1
lib_update_config.c:把support_vm_data_keep标志使能
AC700 V200 patch08 tws一拖二的情况下,概率性出现A设备通话挂断的时候B设备恢复播歌无声的修复 原因:默认一拖二场景配置里面的恢复A2DP依赖的是esco状态,而有个暂停A2DP播放是依赖的蓝牙通话状态,会存在后者穿插在前者之后的情况,导致A2DP被打开后又被暂停,使得后续蓝牙一直丢数导致的异常
修改方案:将暂停行为的判断条件也修改为是ESCO状态,做场景互斥
杰理之家APP只修改耳机EQ模式,不修改自定义EQ,会导致耳机第二次开机回连后APP显示的EQ模式不对 20241028 FSW

AC700N-demo2.0.2(patch_08)摩托罗拉手机GFP弹窗连接,概率性出现连接失败 20241105 LJW 替换btstack.a
TWS耳机 AC700N-demo2.0.2(patch_08)_摩托罗拉gfp弹窗连接失败补丁_btstack.a.7z耳机连接某些设备(例如飞利浦的电视),在设备上调节音量,耳机音量大小没有变化 20241108 FSW

带有产测设备二次校准ANC功能的流程,在ANC参数初始化阶段,需要进行各种增益的参数保护和防异常处理,此处举例ANC的trans gain的防异常处理demo 应用背景:
anc的通透gain大小,美格信设备会根据样机和金机的ff曲线差异,进行对应的ff gain增益补偿
ff gain增益补偿后,会对trans gain进行相同大小的gain补偿,因此ff的gain与通透的gain差值是固定的 如图位置在anc读完本地参数后,进行校验

#define FF_TRANS_DELTA_GAIN (-1.0f)//dB
#define TRANS_GAIN_CHECK_FAIL_DB (-2.5f)//db
#define TRANS_GAIN_CHECK_MAX_DB (3.0f)//db
#define TRANS_GAIN_CHECK_MIN_DB (-3.0f)//db
extern float ln_float(float x);
extern float eq_db2mag(float x);
static float mag2db(float mag)
{
float delta = 8.68588924f;
float result = ln_float(mag);
// printf("%s->ln float:\n", __func__);
// put_float(result);
result = result * delta;
return result;
}
static float anc_trans_gain_check(float trans_gain, float ff_gain)
{
printf("%s->trans_gain:\n", __func__);
float cur_trans_db = mag2db(trans_gain);
float new_trans_gain = trans_gain;
#if CONFIG_DEBUG_ENABLE
put_float(cur_trans_db);//没开打印的时候不要打印浮点
put_float(ff_gain);
#endif
if(cur_trans_db > TRANS_GAIN_CHECK_MAX_DB || (cur_trans_db < TRANS_GAIN_CHECK_MIN_DB)) {
printf("%s->gain warning, check\n", __func__);
float cur_ff_db = mag2db(ff_gain);
#if CONFIG_DEBUG_ENABLE
put_float(cur_ff_db);
#endif
//计算新的trans gain,由ff gain-固定差值dB
float result_db = cur_ff_db + FF_TRANS_DELTA_GAIN;
#if CONFIG_DEBUG_ENABLE
printf("%s->get result db:\n", __func__);
put_float(result_db);
#endif
if(result_db > TRANS_GAIN_CHECK_MAX_DB || (result_db < TRANS_GAIN_CHECK_MIN_DB)) {
printf("%s->check again fail!!!, set defaul\n", __func__);
result_db = TRANS_GAIN_CHECK_FAIL_DB;
}
new_trans_gain = eq_db2mag(result_db);
#if CONFIG_DEBUG_ENABLE
printf("%s->set new_trans_gain:\n", __func__);
put_float(new_trans_gain);
#endif
}
return new_trans_gain;
}
AC700N-demo2.0.2(patch_08),通话数据经过NLP处理后有尾音的问题 20241115 LJW

AC700N1.1.0(Patch_13) tws+dongle,耳机MIC声音传到dengle 的DAC输 20241120 CKS
先按文档修改,再加变采样 https://p.kdocs.cn/s/CGEJCBAABE


AC700 300 patch02,来电报号不完整,被铃声打断 20241120 CKS
来电报号过程中,esco建立停掉了报号铃声
改为esco建立后再开始报号

AC700 300 patch01,通话开page scan功耗高3ma 20241205 JWK 替换蓝牙库:btctrler_AC700N_earphone_tws1t2_3.0.0_1202_fix2
修改方法:库里面把通话状态下开pagescan的窗口做了调整。AC700 v300 patch01,进了游戏模式后,测到的延时数据跟没进的时候是一样的。(不开tws功能) --泓毅 原因:不开tws这里调用的接口库里面返回值是0,故如果先进游戏模式,后打开音频流时,这里会把游戏模式标志位清掉。
修改:加TWS功能宏包住,或者直接注释掉。
另补充低延时相关问题几个可排查点:
1、参数配置
2、开启音频流打印延时参数
3、实际延时打印
4、旧SDK还需确认下delay_report有没开,v300默认有开
86. AC700 v300 patch01,realme手机打开游戏自动进游戏模式功能添加 --泓毅 修改:移植keep-a即可,或者peak。功能宏:USER_REALME_AUTO_GAME_MODE_SW
注意:
1、如果项目不带realme APP功能,则需要使能一下realme_hfp_cmd_support。
2、测试时需使用realme手机,并且游戏需选择大型游戏,例王者荣耀/和平精英等等。很多小程序里面的游戏是不会触发的。
3、触发时realme手机会发HFP指令过来,应用层关注这个回调即可。
4、如果log看到自动进了游戏模式,但是实际不生效时,可以参数85点:“AC700 v300 patch01,进了游戏模式后,测到的延时数据跟没进的时候是一样的。(不开tws功能) ”
87. AC700 v300 patch02.01,打开透传,点击通知图标,耳机进入低功耗后,ble会断连--LZY 替换库文件
3.0.0透传ble断连.zip
88. AC700N可视化v3.0.0,双IO双灯状态不对 ZJC 问题原因:灯驱动分为硬件驱动和软件驱动,软件驱动不支持同时控制两个灯,硬件驱动只能同时让灯亮同样的状态。
解决方案:根据实际需求选择软件驱动还是硬件驱动
89. 可视化播开机提示音导致开机回连慢(大于3秒)。-- 泓毅 原因:播完提示音后才切的蓝牙模式,导致BT_STATUS_INIT_OK蓝牙初始化慢了。
修改:直接开机提示音放到蓝牙模式这个地方播。直接跑poweron_task_start();
回连数据:从听到提示音开始计时,到手机显示连接。平均在3秒内
90. AC700 300 概率不亮开机灯-- 泓毅 原因:刚开始执行开机灯显,就来了个led中断把开机灯显关了。具体根因需跟踪如下PMS系统问题单
杰理工程系统--用户端--主要事务/客户常规问题-事故分析
临时规避:
方法1:把led周期拆成2个或2个以上,原因未知。(缺陷是盯着看时能看出来灯显不连续)
方法2:用时间戳过滤掉开机灯显的中断,具体时间可微调。
91. 700N TWS dongle V1.1.0 patch13 dongle插入小米手机识别慢(要10秒才识别,显示耳机图标) 在dongle端修改如下
92. TWS耳机_AC700N_2.0.2(patch_08.04),提示音使用wav格式,编译报错 --LJW 
//wav解码声道配置,
//0:不限制解码输出声道数,按照配置的支持最大解码声道(CONFIG_DEC_SUPPORT_CHANNELS)解码,超过就返回不支持。
//1:无论声道数是多少,限制解码输出前面2个声道,多声道的文件可能跑不过来;
const int WAV_DECODER_OUTPUT_CHANNEL_LIMIT = 0;
const int const_audio_codec_wav_checkdst_enable = 1; //如果wav解码前面有经过dts解码库做过格式检查,就把这个设成0
const int const_audio_codec_wav_dec_support_aiff = 0; //是否支持aif,因为get_aif_ops跟 wav解码 是 共用run函数(有分叉),所以需要通过const才能优化掉
const int const_audio_codec_wav_dec_support_24bit = MEDIA_24BIT_ENABLE; //24bit开关
const int const_audio_codec_wav_dec_support_AB_Repeat_en = 1; //是否支持AB点跟循环
const int const_audio_codec_wav_dec_supoort_POS_play = 1; //是否支持指定位置播放
//<ADPCM Type>
const int const_sel_adpcm_type = 0;//1:使用imaen_adpcm, 0:msen_adpcm
//***********************
//* M4A Codec *
//***********************
const int const_audio_m4a_dec16_fifo_precision = 16; // 24 或者 16
- AC700 300 patch0202,连接苹果手机和苹果平板。平板播歌,手机打电话,耳机调音量调的是平板的声音 20250829 CKS 将加减音量发送指令的接口,全部替换成使用地址发送的接口

/*************************************************************/
// 获取活跃设备
/*************************************************************/
int custom_get_call_addr(u8 *btaddr)
{
void *devices[2];
int num = btstack_get_conn_devices(devices, 2);
for (u8 i = 0; i < num; i++) {
printf("btstack_bt_get_call_status(devices[i]):%d", btstack_bt_get_call_status(devices[i]));
if (btstack_bt_get_call_status(devices[i]) != BT_CALL_HANGUP) { //这里可以进一步判断两个设备的通话状态,判断用哪一个设备
memcpy(btaddr, btstack_get_device_mac_addr(devices[i]), 6);
return 1;
}
}
return 0;
}
u8 user_get_active_device_addr(u8 *bt_addr)
{
u8 addr_all_ff[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
if (esco_player_get_btaddr(bt_addr)) { //有ESCO状态
printf("esco player now!!!");
put_buf(bt_addr, 6);
return 1;
} else if (bt_get_call_status() != BT_CALL_HANGUP) { //有HFP状态
if (custom_get_call_addr(bt_addr)) {
printf("hfp player now!!!");
put_buf(bt_addr, 6);
return 1;
}
} else if (a2dp_player_get_btaddr(bt_addr)) { //有A2DP状态
printf("a2dp player now!!!");
put_buf(bt_addr, 6);
return 1;
} else {
printf("no active device now!!!");
memcpy(bt_addr, addr_all_ff, 6);
put_buf(bt_addr, 6);
}
return 0;
}
void bt_volume_up(u8 inc)
{
u8 test_box_vol_up = 0x41;
s8 cur_vol = 0;
// u8 call_status = bt_get_call_status();
u8 cur_state;
s16 max_volume;
u8 data[6];
// a2dp_player_get_btaddr(data);
//确定一个唯一活跃设备
user_get_active_device_addr(data);
u8 call_status = bt_get_call_status_for_addr(data);
if ((tone_player_runing() || ring_player_runing())) {
// if (bt_get_call_status() == BT_CALL_INCOMING) {
// volume_up_down_direct(1);
// }
if (call_status == BT_CALL_INCOMING) {
volume_up_down_direct(1);
}
return;
}
/*打电话出去彩铃要可以调音量大小*/
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) {
cur_state = APP_AUDIO_STATE_CALL;
max_volume = app_audio_volume_max_query(AppVol_BT_CALL);
} else {
cur_state = APP_AUDIO_STATE_MUSIC;
max_volume = app_audio_volume_max_query(AppVol_BT_MUSIC);
}
cur_vol = app_audio_get_volume(cur_state);
if (bt_get_remote_test_flag()) {
bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_up); //音量加
}
/* if (cur_vol >= app_audio_get_max_volume()) { */
if (cur_vol >= max_volume) {
audio_event_to_user(AUDIO_EVENT_VOL_MAX); //触发vol max事件
// if (bt_get_call_status() != BT_CALL_HANGUP) {
// /*本地音量最大,如果手机音量还没最大,继续加,以防显示不同步*/
// if (g_bt_hdl.phone_vol < 15) {
// if (bt_get_curr_channel_state() & HID_CH) {
// bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
// } else {
// bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
// }
// }
// return;
// }
if (call_status != BT_CALL_HANGUP) {
/*本地音量最大,如果手机音量还没最大,继续加,以防显示不同步*/
if (g_bt_hdl.phone_vol < 15) {
if (bt_get_curr_channel_state_for_addr(data) & HID_CH) {
bt_cmd_prepare_for_addr(data, USER_CTRL_HID_VOL_UP, 0, NULL);
} else {
bt_cmd_prepare_for_addr(data, USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
}
}
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 1);
bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 1);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
#else
app_audio_volume_up(inc);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
printf("vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
// if (bt_get_call_status() != BT_CALL_HANGUP) {
// if (bt_get_curr_channel_state() & HID_CH) {
// bt_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
// } else {
// bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
// }
// }
if (call_status != BT_CALL_HANGUP) {
if (bt_get_curr_channel_state_for_addr(data) & HID_CH) {
bt_cmd_prepare_for_addr(data, USER_CTRL_HID_VOL_UP, 0, NULL);
} else {
bt_cmd_prepare_for_addr(data, USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
}
} else {
#if TCFG_BT_VOL_SYNC_ENABLE
bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量
#endif
}
}
void bt_volume_down(u8 dec)
{
u8 test_box_vol_down = 0x42;
// u8 call_status = bt_get_call_status();
u8 cur_state;
u8 data[6];
// a2dp_player_get_btaddr(data);
//确定一个唯一活跃设备
user_get_active_device_addr(data);
u8 call_status = bt_get_call_status_for_addr(data);
if ((tone_player_runing() || ring_player_runing())) {
// if (bt_get_call_status() == BT_CALL_INCOMING) {
// volume_up_down_direct(-1);
// }
if (call_status == BT_CALL_INCOMING) {
volume_up_down_direct(-1);
}
return;
}
if (bt_get_remote_test_flag()) {
bt_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_down); //音量减
}
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) {
cur_state = APP_AUDIO_STATE_CALL;
} else {
cur_state = APP_AUDIO_STATE_MUSIC;
}
/* if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) <= 0) { */
if (app_audio_get_volume(cur_state) <= 0) {
audio_event_to_user(AUDIO_EVENT_VOL_MIN); //触发vol mix事件
// if (call_status != BT_CALL_HANGUP) {
// /*
// *本地音量最小,如果手机音量还没最小,继续减
// *注意:有些手机通话最小音量是1(GREE G0245D)
// */
// if (g_bt_hdl.phone_vol > 1) {
// // if (bt_get_curr_channel_state() & HID_CH) {
// // bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
// // } else {
// // bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
// // }
// }
// return;
// }
if (call_status != BT_CALL_HANGUP) {
/*
*本地音量最小,如果手机音量还没最小,继续减
*注意:有些手机通话最小音量是1(GREE G0245D)
*/
if (g_bt_hdl.phone_vol > 1) {
if (bt_get_curr_channel_state_for_addr(data) & HID_CH) {
bt_cmd_prepare_for_addr(data, USER_CTRL_HID_VOL_DOWN, 0, NULL);
} else {
bt_cmd_prepare_for_addr(data, USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
}
}
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 0);
bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
#endif
return;
}
#if TCFG_BT_VOL_SYNC_ENABLE
opid_play_vol_sync_fun(&app_var.music_volume, 0);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
#else
app_audio_volume_down(dec);
#endif/*TCFG_BT_VOL_SYNC_ENABLE*/
printf("vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
// if (call_status != BT_CALL_HANGUP) {
// if (bt_get_curr_channel_state() & HID_CH) {
// bt_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
// } else {
// bt_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
// }
// }
if (call_status != BT_CALL_HANGUP) {
if (bt_get_curr_channel_state_for_addr(data) & HID_CH) {
bt_cmd_prepare_for_addr(data, USER_CTRL_HID_VOL_DOWN, 0, NULL);
} else {
bt_cmd_prepare_for_addr(data, USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
}
} else {
#if TCFG_BT_VOL_SYNC_ENABLE
/* opid_play_vol_sync_fun(&app_var.music_volume, 0); */
if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) == 0) {
app_audio_volume_down(0);
}
bt_cmd_prepare_for_addr(data, USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
#endif
}
}
- AC700 202 patch08,一拖二苹果手机播歌,苹果电脑后台待机,概率蓝牙连接断开 20250829 CKS AC700 202 patch08,一拖二苹果手机播歌,苹果电脑后台待机,概率蓝牙连接断开修改.rar