KDocs 研发资料库
  • 音频技术应用文档入口汇总
  • 杰理WINDOWS环境安装及其他事项
  • LINUX安装和编译
  • Linux环境编译SDK教程(ubuntu18.04)
  • 音频类补丁汇总表
  • 认证资料获取汇总(最新资料后台会更新)
  • 《Hi-Res申请指南v1.0》
  • FreeRTOS 开源协议版本
  • uCOS 开源协议版本信息
  • 各个模块关键资料汇总
  • 软件调试方法
  • Makefile编译
  • 提bug的规范
  • 常规设备使用指导
  • 对外特别发布开发注意点信息汇总
  • AD697X软件问题整理
  • AC700N软件问题整理
  • AC701X耳机软件问题整理
  • 951&961软件问题整理
  • AC104X软件问题整理
  • AC128N问题整理文档
  • 可视化工具调试问题整理
  • 耳机资料汇总
  • AC704N、 AC705N相关应用
  • AC695N&AC696N&AC608N音箱问题整理
  • JL701N音箱问题整理
  • AC692X软件问题整理
  • AC706N音箱问题整理
  • JL701N音箱问题整理(可视化工具SDK)
  • JL703N音箱问题整理
  • JL709N(JL689N)音箱问题整理
  • JL7094系列-入门到进阶开发指导
  • AC210N音箱问题整理
  • 无线麦系列版本支持指南
  • AW32N无线麦问题整理
  • lAD697X&JL701X 无线麦软件共性问题整理
  • AC706N无线麦问题整理
  • AW36N无线麦问题整理
  • AC710X无线麦问题整理
  • 唤醒源获取及唤醒IO设置
  • 电源
  • LVD
  • 长按复位配置方法
  • 低功耗应用
  • TIMER
  • UART
  • SPI
  • 内部FLASH空间添加用户自定义区域
  • IIC
  • GPIO
  • MCPWM
  • SD&U盘
  • 时钟&晶振
  • GPCNT
  • IO口crossbar映射功能
  • 文件系统使用总结
  • 复用应用
  • LINEIN_AUX相关应用
  • IIS音频接口应用
  • SPDIF模式相关(HDMI_ARC、光纤、同轴)
  • PDM LINK
  • 外设相关应用
  • 蓝牙相关
  • 杰理蓝牙距离调试文档
  • TWS耳机配对方式使用及生产把控指南
  • GFP谷歌快连及其认证流程指引
  • 蓝牙发射器(bt_emitter)相关
  • BLE应用
  • 关于提升BLE传输速率说明
  • BLE测试数据
  • MUSIC 模式相关应用
  • MIDI音乐实现
  • PC相关应用
  • FM相关应用
  • AC695N_AC696N FM天线ESD静电防护措施说明V2.0_20250107
  • fm应用详细设计说明书
  • 杰理FM硬件指南-20230315
  • ADC模块
  • AUDIO相关应用
  • 新Tools的音效调试使用
  • 混响应用使用说明
  • 音效调式
  • 音箱耳机低音小音量增强实现方法
  • DAC输出功率调试
  • DAC性能测试指南
  • 针对各类底噪、电流声分析流程
  • 录音相关应用
  • OPUS编解码相关
  • RTC相关应用
  • 升级相关
  • UI相关应用
  • 通话调试流程指南
  • 通话相关应用
  • 省电容mic使用手册
  • 如何测试验证手表通话系统的语音失真 V1.0
  • AC695X_AC696X_AD697X 常见通话问题处理参考资料
  • 通话调试问题确定步骤
  • 内置触摸调试指南
  • 低功耗内置触摸介绍V2.2
  • 触摸相关文档
  • AC697X、AC698X内置触摸调试及整改方法V1.0
  • 产测相关应用
  • AC63X BLE DUT测试介绍
  • 兆华序列使用简易说明
  • JL_1T2蓝牙测试盒音频文件更换说明
  • ENC相关应用入口汇总
  • ANC相关应用入口汇总
  • JL DMS通话调试手册-V3.9.4
  • ANC-ENC结构设计要点-20240407
  • 半入耳式ANC耳机器件选型与结构设计指南V1.0
  • JL 耳道自适应调试指南
  • ANC相关问题处理
  • ANC调试文档
  • 评估蓝牙耳机通话上行降噪性能的方法 V1.0 (2)
  • FCC 或者 BQB 认证相关应用
  • BQB profile 测试中常遇到的问题点汇总
  • 蓝牙参数整理20210811
  • 杰理科技认证问题参考
  • 无线音频产品开发指南
  • 无线麦系列从入门到进阶开发指导
  • 量产烧录相关说明
  • 一拖八烧录器远程过程调用说明
  • 量产相关建议
  • EffectTool(eq)调试工具说明文档
  • AC897AD697系列的EQ调试方法-V3
  • 杰理调音指南-20220622
  • 音效模块总结
  • 简要调音步骤指引(可视化)
  • 耳机充电与通信调试指南
  • 充电仓硬件调试指南
  • 充电仓软件问题整理
  • AC951常用说明
  • AC951_AC961_开发板使用说明V1.0
  • 彩屏仓AC982 入门指导及FAQ
  • 蓝牙音频APP相关应用
  • 手机APP的简介和开发流程
  • 蓝牙音频系列-硬件设计指南
  • 静电测试及整改方法-20220706
  • TWS耳机底噪整改指南V1.2
  • 杰理蓝牙距离调试文档
  • 蓝牙RF硬件设计与调试V1.1-20250219
  • AC695N_AC696N FM天线ESD静电防护措施说明V2.0_20241228
  • 音效调试指南
  • 无线话筒K歌音箱标准开发流程
  • 杰理科技 700N TWS耳机产品标准-202303
  • 杰理科技 701N 广播产品标准-202303
  • JL-HAT ANC高效产测自适应
  • 无线话筒测试板使用介绍
  • 一拖八频偏校准使用说明
  • 领夹麦产测工具使用介绍
  • Dongle量产测试说明
  • Dongle+Tws或头戴式 SDK通过工具绑定配对功能说明文档
  • 双麦ENC产测宏配置验证方法 V1.0
  • JL耳机方案麦克风声学测试指令_V1.0
  • JL耳机方案麦克风声学测试指令_V2.0
  • JL_ENC自动测试命令_V0.0.1
  • JL蓝牙测试盒用例说明
  • LDAC自测环境搭建_ubuntu
  • 延迟小板使用手册
  • 杰理库文件的制作及添加实现过程
  • 关于 AC635N&AC636N系列免晶振兼容性补丁 说明
  • 关于 AC63系列VM兼容性修复补丁_20250224 说明
  • 关于 AC632N &AE632N_ 蓝牙& 低功耗兼容性修复补丁 说明
  • AD698N和AC638N电压优化补丁V3说明
  • 关于 AC635N&AC636N漏电和E&G版兼容联合补丁 说明
  • AD698N和AC638N电压优化补丁V2说明
  • 702相关应用
  • 2024-4-30 发布歌词显示SDK开发注意事项
  • BQB RF & FCC 认证测试固件问题汇总及源码
  • BQB profile 测试中常遇到的问题点汇总
  • 进dut测试模式方法及固件
  • 704-频偏修改bin文件合集
  • 701手表BQB PROFILE认证注意事项
  • 认证的干扰规避整改
  • 海外CRA认证报告生成说明
  • JL700N可视化工具问题处理文档
  • JL701X可视化工具问题处理文档
  • JL701N_earphone_release_v1.6.0_ANC 低功耗问题补丁
  • JL708X可视化工具问题处理文档
  • JL709N可视化工具问题处理文档
  • JLstudio可视化工具使用说明
  • 一拖二-串口_蓝牙_app在线EQ、通话参数及调试方式和内置触摸调试
  • 可视化JL701M_DONGLE_SDK添加MIC为发射源
  • 可视化JL701M_DONGLE_SDK添加按键切换usb audio与MIC发射源
  • JL701M_DONGLE_SDK_1.0.0_dongle输入linein输出dac
  • 701可视化_a2dp_to_le_demo说明
  • 耳机系列demo汇总
  • JL7018F&JL7006F_7003F AUX IIS
  • 一键连接应用
  • 普通SDK动态开关一拖二功能
  • 蓝牙分析仪(EllisysBluetoothAnalyzer)抓包例程
  • TWS配对常见应用
  • APP自定义按键的demo
  • AC700N 播歌双EQ DEMO示例及说明
  • AC698V164 MIC与蓝牙音乐共同输出DAC demo
  • 添加第三方算法以及多算法授权流程
  • 空间音频配置方法
  • 普通高低电平TWS耳机控制通讯
  • 入耳检测状态更新demo解析
  • 资源优化(非可视化的SDK)
  • 资源优化(可视化SDK)
  • 翻译耳机、语音识别应用demo
  • 耳机抗干扰问题排查和优化
  • AC698D2 抗干扰优化
  • AC696X软件问题整理
  • AC695X软件问题整理
  • AC695X软件问题整理_1722249702
  • AC608X软件问题整理
  • JL701N_2T1_DUPLEX 应用软件问题汇总
  • le_audio_1.0.0_patch05 以及之前的版本IRkey 功能异常修改
  • AC706N-le_audio-200SDK有线_无线麦录音demo
  • jl701n_le_audio_v200patch02 IO串口升级修改串口单次发送字节长度的修改办法
  • 703创建IIS 输入dac输出音频流demo
  • 703将媒体流音频同时上传PC_mic录音demo实现
  • 703四路IIS输入输出demo
  • 底噪调试
  • AW328A烧录说明
  • 文档合集
  • AC706N_wireless_mic_release_PATCH_20240712 补丁 说明
  • AC706N_wireless_mic_release_PATCH_20240726 补丁 说明
  • AC706N_wireless_mic_release_V1.0.0、1.0.1、1.0.2 补丁 说明
  • AC706N_wireless_mic_release_V1.1.2 中的2T1应用 RX端不绑定配对,TX端实现绑定配对的修改方法
  • 各系列省晶振实现方法
  • iis tx rx说明文档
  • spdif信号
  • 蓝牙电话本
  • 安卓手机同步时间补丁
  • CDC配置
  • PC模式下增加Teams唤起功能
  • 杰理HDMIARC开发实现过程
  • AC701N patch06之前的版本用第三方算法节点实现新版本的pcm delay节点功能
  • (K歌音箱)各SDK音效配置相关说明
  • 长文件录音
  • 点阵屏歌词字库相关(蓝牙歌词,普通歌词)
  • 字模提取工具说明
  • 音箱可视化彩屏-入门到进阶开发指导
  • 彩屏LVGL UI设计及工具使用
  • 使用内部UI框架进行UI调试的系列步骤
  • AD101C使用强制升级工具spi 烧录不了问题处理(测试版本)
  • AD161扩展灯板说明文档
  • 歌词显示器开发注意项
  • 使用硬件数字增益控制通话下行音量(可视化)
  • 杰理小牛产测资料
  • ENC配置说明
  • 通话调试流程指引
  • ANC相关功能demo
  • 无线麦硬件资料汇总
  • 无线麦相关应用
  • 无线麦复杂功能补丁包汇总
  • 无线话筒形态SDK程序&开发经验&问题点分享
  • 双模式结合应用问题汇总
  • 无线麦距离优化案例
  • 无线麦系列中的双工形态(duplex)演变开发对讲机方案开发资料
  • 音箱入门到进阶指导文档(编写中)
  • 蓝牙耳机品控和生产技巧
  • 982过_欠压标志获取异常
  • 如何获取最新涂鸦SDK及库文件
  • 无线话筒K歌音响-调音标准流程
  • 无线话筒产测流程

JL700N可视化工具问题处理文档

📎 原始文档:https://www.kdocs.cn/l/cjqhoLE5ct4V JL700N可视化工具问题处理文档

  1. AC700X_tws_SDK_2.0.1使用可视化工具配置左右耳触发唤醒Siri不同步执行的处理方法 20230105 CYL image //修改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);
    ​}
    ​}
    image 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添加到挂断接通电话的同步处理函数中了。
    image
  2. AC700X_tws_SDK_2.0.1使用A手机通话中B手机来电,但不播放ring来电铃声的处理方法 20230130 CYL image 修改替换以下程序在来电铃声的判断处
    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提示音。
    image
  3. AC700X_tws_SDK_2.0.1耳机一拖二A2DP让联:取消A2DP抢播,用户通过按键自行控制两手机A2DP的接入 20230130 CYL 1.首先关闭蓝牙配置中的A2DP抢播选项
    image 2.在情景配置的按键功能中添加以下的保留前后台和切换动作,以下为demo。
    image 3.修改bt_ability.c中的程序(新版补丁程序中可能已经修复更新,需要检查一下)
    修改的两处为[媒体音频后台静音][暂停媒体音频]
    image 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

  1. 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板机中的推灯方式去改写
    imageimageimage

  2. AC700X_tws_SDK_2.0.1耳机设置超距关机时间和无连接自动关机后,与手机超距断开后真正关机时间为超距时间+无连接自动关机时间的问题 20230206 CYL image tws与手机的配对流程如下:可以参考文档1T2_SDK框架说明https://kdocs.cn/l/cdW5N8qm2qid
    image

解决方法如下:
image

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内即可。

  1. 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;
}

以上接口即为一拖二场景下,获取当前活跃设备,通话中>接听/去电>播歌;通过以上接口即可获取当前活跃设备的地址,并根据地址做下一步处理。同事客户可以修改该接口,改变返回值不为活跃设备的地址,可修改为直接返回活跃设备的设备号,再通过设备号做下一步处理。【以下为使用案例】需要注意的是,一般只对挂断通话加上-指定向活跃设备发送挂断指令。
imageimageimage 7. AC700X_tws+dongle_SDK_1.0.0/1.1.0 耳机连接dongle设备,传到耳机的音频数据DAC输出峰峰值(声音小)远小于耳机连接手机蓝牙时的音频DAC输出峰峰值 20230315 CYL 改进方法为:为dongle设备SDK[JL697M_DONGLE_SDK]修改判断dongle设备插入安卓手机后,默认将蓝牙输出音频音量设为最大值。
1.首先添加安卓设备的标识参数;
image u8 android_mode: 1;
u8 res: 3;

2.添加识别为安卓设备时的标识赋值
image 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.赋值音量最大值
image if (uac_info->android_mode) {​
uac_info->spk_left_vol = vol_convert(100);
uac_info->spk_right_vol = vol_convert(100);
​}

  1. AC700X_tws_SDK_2.0.1 patch14及以前版本程序,开双micDNS降噪,优化一拖二通话时需要叠加播放提示音以及通话时操作按键功能的稳定性(概率爆ram) 20230315 CYL
  2. 修改添加以下几项参数。jlstream.h image
    u8 id;
    
    u8 sleep_reason;
 
    u8 msg_run_cnt;
    u8 wakeup_early_en;
    u8 wakeup_reason ;

2.将通话算法部分放flash中
image 2. 优化通话时按键操作-【如果】有使用长按保持hold 做按键事件触发,比如长按保持加减音量等,按照下方修改 image 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

  1. AC700X_tws+dongle_SDK_1.1.0 可视化工具配置长按3S、5S没有作用 20230428 CKS 1.1.0SDK,少了处理函数,把1.0.0的拷贝过去即可
    image

  2. AC700X_tws1t2_SDK_2.0.2 可视化工具编译失败 20230508 FSW 2.0.2版本编译时出现如下错误
    image 需要从2.0.1版本拷贝anc_coeff.bin和anc_gains.bin放到SDK\cpu\br36\tools\目录下

  3. AC700X_tws1t2_SDK_2.0.1 可视化工具,DAC输出改为右声道,进游戏模式播歌卡顿 20230526 JWK image 配置为右声道,实际是开了左右声道的(因为不支持单独打开右声道),所以需要多加一路dac_buff

  4. AC700X_tws1t2_SDK_2.0.1 可视化工具,使能双麦通话ENC和ANC时通话声音变小 20230526 JWK image 客户在可视化工具配的是单端隔直电容模式,但是可视化工具修改的MIC工作模式会被代码里强行重定义成差分隔直电容模式,需要在代码里更改客户样机配置的模式

  5. 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);
    }
    
}
  1. 可视化工具多个EQ效果切换 20230612 FSW 先添加EQ效果
    imageimageimage 使用如下接口切换添加好的多个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);
}
  1. AC700X_tws_SDK_2.0.1/2.0.2,TWS同步关机概率性一只耳机关机不成功 20230613 LJW image
  2. 给低延时模式配置一个独立的EQ效果 20230614 FSW image
  3. AC700X_tws_SDK_2.0.2开ANC无效果 20230619 GFH ANC初始化太早,通话mic的配置还没读进来所以ANC麦开不起来导致

image

  1. 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;
    }
}
  1. 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);
    }
}
  1. 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
    }
}

  1. 700N可视化工具SDK2.0.1(PATCH18)接听通话耳机端声音很小,需要加一次音量恢复正常 20230824 FSW 替换库rebuild
    【金山文档】 btstack-tws-1t2-v201-patch18-修复HFP音量问题
    https://kdocs.cn/l/ccLgmX6XocKa

  2. 700可视化判断活跃设备 20230911 CKS

  3. 添加代码

/*************************************************************/
//   获取活跃设备
/*************************************************************/
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;
}
  1. 使用方法(以下是demo,自己根据需要灵活运用) imageimage
  2. AC700X_tws+dongle_SDK_1.1.0同时连手机、dongle播歌,电话打入dongle,爆RAM GFH 同时连手机、dongle播歌,电话打入dongle,爆RAM
    image 见资源优化(可视化SDK).otl
  3. 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;
    }
}
  1. 动态mic增益开关打不开问题处理 20231113 FSW 用以下方法替代
    image

  2. 处理一拖二播歌时唤醒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);
    ​}

  3. AC700X_tws_SDK_2.0.2 呼吸灯不同步,概率变暗很快 20231120 JWK 【金山文档】 修复因为添加双IO推双灯的代码,prev_breath_time没有考虑周期重置赋值导致的呼吸灯效只有一半的bug
    金山文档

  4. dongle接PS4声音小的问题 20231120 FSW image

  5. 可视化SDK两边耳机同时操作按键发起配对 20231201 FSW 见:TWS配对常见应用.otl:可视化SDK两边耳机同时操作按键发起配对

  6. 700v202(patch_06)部分手机关闭siri后按键失效 20231216 GFH 替换库:可视化700v202(patch_06)btstack-AC700-tws1t2-ptach06.zip

  7. 700v202(patch_06.04)使能透传,软关机异常死机20240122 LJW 替换库:btctrler-TWS耳机_AC700N-demo_2.0.2(patch_06.04)_-修复使能ble关机死机.7z

  8. 700v202(patch_06.05)使用bt_osc_offset_ext_save保存频偏不能立即生效,复位才生效 20240125 CKS 替换库:使用bt_osc_offset_ext_save保存频偏不能立即生效,复位才生效

  9. 可视化实现多带WDRC 20240202 FSW image

  10. 通话中允许回连和可连接 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);
  1. 可视化使用默认音量表(需求自定义音量等级时使用)20240221 FSW 见:自定义数字音量的方法
  2. 可视化SDK添加高低音接口 20240222 FSW 见:AUDIO相关应用.otl
  3. 可视化SDK通话时,远端不说话时近端喇叭有吱吱声,远端说话时近端又会有沙沙声 20240222 FSW 先添加噪声门
    image 噪声门参数参考
    image 然后提高通话的系统时钟
    image
  4. 双BLE做两路RCSP,修改profile以及处理自定义数据的方法 20240229 FSW 见JL701X可视化工具问题处理文档.otl第23点
  5. 700N可视化让播流程,同时连接手机和部分笔记本电脑,电脑暂停后不能切换到手机播放问题 20240411 FSW 原因是这部分笔记本电脑暂停后,数据流没有停止,并且数据流能量不为0(能量为2),需要修改能量判断条件(会影响兼容性)
    image
  6. 可视化SDK使用测试盒配对,会有概率配对不上 20240426 FSW 见JL701X可视化工具问题处理文档.otl第29点
  7. 可视化SDK V2.0.2,比patch08低的版本,测试盒升级提示“08”错误(flash数据校验失败)问题 20240520 FSW 删掉可视化安装目录下的2.0.2版本sdk,然后在可视化上面重新下载SDK,重新创建一个patch08的工程,然后把patch08的ota.bin拷贝到项目代码里面,再升级
    image
  8. 可视化SDK单左耳或者单右耳使用都是只播了左声道 20240524 FSW image
  9. 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);
    }
}

image 45. AC700N TWS 2.0.2 patch8 AI配置RCSP(杰理之家),连上手机BLE,设备不会主动发起MTU交换请求 20240607 LZY 问题:设备连接手机不主动发起设备交互请求,手机又不主动下发交互,导致发送的包长不对
解决:更换btstack库
700N patch 8 AI配置RSCP(杰理之家),连上手机BLE,设备不会主动发起MTU交换请求.zip
代码添加下图内容
image

  1. 一拖二状态下,两台手机都在播抖音,耳机音频会频繁切换 20240618 FSW 见JL701X可视化工具问题处理文档.otl第46点

  2. 700N patch08手机快速拖动音量条爆RAM 20240628 CKS imageimage TWS的加这个
    image

  3. 部分补丁版本出现SPP在线调试用不了的问题 20240708 FSW 见:JL701X可视化工具问题处理文档.otl 第49点

  4. 省电容MIC开机trim会死机的问题 20240716 FSW image

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

  6. TWS耳机 AC700N-demo 2.0.2(patch_08),可视化SDK AD按键部分配置读取错误,Key电阻数值异常,取消外部上拉无效,长按复位使能

取消外部上拉无效,Key value数值异常 log如图,
image 当前解决方法:
在const struct adkey_platform_data *get_adkey_platform_data()
相关代码修改读取回的配置
imageimage 还要加多长按复位的设置,否则默认长按复位

  1. ac700N(Patch08)音频流程设置为自定义,连接笔记本电脑后,用windows自带播放器,修改音量后随机出现爆音现象 20240715 CGP 将\SDK\audio\common\audio_dvol.h 的 DIGITAL_VOLUME_LEVEL_MAX 宏改为 对应的音量等级 途中为16
    imageimage 数组可改可不改
    image

  2. 涂鸦、数传和APP_ONLINE_DEBUG共存的修改 20240730 FSW 见:JL701X可视化工具问题处理文档.otl -- 第62点

  3. 来电时,耳机播耳机自带铃声,按键接听时想要播提示音再执行接听,但是提示音播不出来 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;
        }
    }
}

imageimage 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);
    }
}

image 56. AC700 202 P08,双IO推双灯,红蓝交替闪异常 202040808 CKS 替换SDK目录下led文件夹内文件
led.rar
修改下图
image 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 image 改蓝牙库,定时器从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;
}
  1. V2.0.2 patch 8.03 音频节点跳过 20240821 LZY imageimage 7000 tws patch8.03
    image a2dp close的时候要删除断点,等到open的时候恢复
    imageimage
  2. 灯闪概率不同步问题 20240822 FSW 根据灯的周期修改下面这个宏,比如灯是2秒1闪,可以修改为4000
#define PLED_FISRT_SYNC_TIME        11000//ms
  1. 获取当前播歌的是不是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{
    //手机
}

  1. 三方通话接口使用方法 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!!!");
        }
  1. AC700 202 PATCH08 抗干扰测试下音乐变调 20240826 CKS 抗干扰测试下音乐变调
    换以下库修改,注意是变调的时候会变成直接卡顿
    AC700_202_patch08_抗干扰变调.zip

  2. AC700 3.0.0(patch01)样机使用导出stream.bin的方式去调音,点击音频配置下载到设备时掉线。---泓毅 原因:写flash触发ASSERT 死机。
    修改方法:调试工具写falsh时解除flash的写保护。
    imageimageimage

  3. AC700 2.0.2(patch08)样机使能杰里之家,单耳入仓出仓,杰里之家电量显示异常。---LZY 换以下库修改tishi
    杰里之家app一拖二ble主从切换.zip
    image

  4. 700N TWS dongle V1.1.0 patch13,dongle播歌时,蓝牙来电(不支持手机自带铃声),耳机铃声播不出来 20240904 FSW 来电时,dongle音频还没停止,而耳机来电铃声默认是在通话场景下播放的,导致无法打断dongle播放,需要在音乐场景下添加铃声音频流,dongle播放时在音乐场景下跑铃声音频流
    imageimageimage 添加铃声打断播放接口

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);
}

imageimageimage

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

imageimage

            if (coexist == STREAM_COEXIST_AUTO) {
                err = play_ring_file(file_list[0]);
            }
            else{
                err = play_ring_file_alone(file_list[0]);
            }

来电铃声改为打断播放
image

tws_play_ring_file_alone
  1. AC700 2.0.2(patch08)在SNIFF模式下tws同步播放提示音反应慢 --- 泓毅 原因:sniff状态下,tws同步提示音多花了500ms,做不了瞬间同步完成。可优化措施(功耗略微增加):

  2. 适当把sniff下的 interval 改短;
    image

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

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

    1. CONFIG_TWS_FORWARD_RUN_SLOT 改成48 image
    2. 志英提供蓝牙ctrl库处理: 主耳入仓切主从失败修改蓝牙库.zip
  5. AC700 3.0.0(patch_01) 打开双备份升级功能,使用测试盒无线升级,升级到99%后会提示失败,但是耳机实际升级成功 --- 泓毅 替换下面的库修复:
    https://www.kdocs.cn/l/coJ6sZfqVTRH

  6. AC700 3.0.0(patch_01)客户开发的是头戴耳机,开双备份使用杰理之家ota升级失败 --- 泓毅 现象:
    image 原因:SDK里面开了tws,但是tws没连。所以app过来获取耳机状态时候回复了TWS未连接给APP
    image 处理方法:关掉TWS功能即可
    image

  7. 700N的TWS dongle SDK V1.1.0 patch13,优化了RAM之后,还会有概率出现反复开关通话会爆RAM问题 20240910 FSW 主要原因跟内存碎片多有关,导致通话算法想要申请大块内存申请不到,优化方向是将部分大块内存的申请改为全局,部分通话算法资源放回RAM,以下是验证有效的修改
    imageimageimageimageimage

  8. AC700N v2.0.2(patch_08)同时开启在线调试(ANC、EQ等)和自定义SPP UUID的时候,只有一个生效。20240914 ZJC 参考下面链接的修改
    【金山文档 | WPS云文档】 AC700N可视化同时开启在线调试(ANC、EQ等)和自定义SPP UUID
    https://kdocs.cn/l/cqYEknrHWiSm

  9. AC700 3.0.0(patch_01)公版打开双麦+DNS,通话一段时间后会报错除0死机异常 -- 泓毅 修改如下:

  10. 分别替换2个.c文件 br36_双麦通话同步除0死机问题处理_20240913.zip

  11. 添加如下定义处理编译报错 image

  12. AC700 3.0.0(patch_01)公版用测试盒ota升级,会把VM信息擦除 -- 泓毅 可排查点:

  13. isd_config_rule.c:根据需求VM大小固定VM地址、CONFIG_VM_OPT置1

  14. lib_update_config.c:把support_vm_data_keep标志使能

  15. AC700 V200 patch08 tws一拖二的情况下,概率性出现A设备通话挂断的时候B设备恢复播歌无声的修复 原因:默认一拖二场景配置里面的恢复A2DP依赖的是esco状态,而有个暂停A2DP播放是依赖的蓝牙通话状态,会存在后者穿插在前者之后的情况,导致A2DP被打开后又被暂停,使得后续蓝牙一直丢数导致的异常
    修改方案:将暂停行为的判断条件也修改为是ESCO状态,做场景互斥
    image

  16. 杰理之家APP只修改耳机EQ模式,不修改自定义EQ,会导致耳机第二次开机回连后APP显示的EQ模式不对 20241028 FSW image

  17. AC700N-demo2.0.2(patch_08)摩托罗拉手机GFP弹窗连接,概率性出现连接失败 20241105 LJW 替换btstack.a
    TWS耳机 AC700N-demo2.0.2(patch_08)_摩托罗拉gfp弹窗连接失败补丁_btstack.a.7z

  18. 耳机连接某些设备(例如飞利浦的电视),在设备上调节音量,耳机音量大小没有变化 20241108 FSW image

  19. 带有产测设备二次校准ANC功能的流程,在ANC参数初始化阶段,需要进行各种增益的参数保护和防异常处理,此处举例ANC的trans gain的防异常处理demo 应用背景:

  20. anc的通透gain大小,美格信设备会根据样机和金机的ff曲线差异,进行对应的ff gain增益补偿

  21. ff gain增益补偿后,会对trans gain进行相同大小的gain补偿,因此ff的gain与通透的gain差值是固定的 如图位置在anc读完本地参数后,进行校验
    image


#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;
}

  1. AC700N-demo2.0.2(patch_08),通话数据经过NLP处理后有尾音的问题 20241115 LJW image

  2. AC700N1.1.0(Patch_13) tws+dongle,耳机MIC声音传到dengle 的DAC输 20241120 CKS

  3. 先按文档修改,再加变采样 https://p.kdocs.cn/s/CGEJCBAABE
    imageimage

  4. AC700 300 patch02,来电报号不完整,被铃声打断 20241120 CKS

  5. 来电报号过程中,esco建立停掉了报号铃声

  6. 改为esco建立后再开始报号 image

  7. AC700 300 patch01,通话开page scan功耗高3ma 20241205 JWK 替换蓝牙库:btctrler_AC700N_earphone_tws1t2_3.0.0_1202_fix2
    修改方法:库里面把通话状态下开pagescan的窗口做了调整。

  8. AC700 v300 patch01,进了游戏模式后,测到的延时数据跟没进的时候是一样的。(不开tws功能) --泓毅 原因:不开tws这里调用的接口库里面返回值是0,故如果先进游戏模式,后打开音频流时,这里会把游戏模式标志位清掉。
    image 修改:加TWS功能宏包住,或者直接注释掉。

另补充低延时相关问题几个可排查点:
1、参数配置
image 2、开启音频流打印延时参数
image 3、实际延时打印
image 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。
image 2、测试时需使用realme手机,并且游戏需选择大型游戏,例王者荣耀/和平精英等等。很多小程序里面的游戏是不会触发的。
3、触发时realme手机会发HFP指令过来,应用层关注这个回调即可。
image 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 问题原因:灯驱动分为硬件驱动和软件驱动,软件驱动不支持同时控制两个灯,硬件驱动只能同时让灯亮同样的状态。
image 解决方案:根据实际需求选择软件驱动还是硬件驱动
image 89. 可视化播开机提示音导致开机回连慢(大于3秒)。-- 泓毅 原因:播完提示音后才切的蓝牙模式,导致BT_STATUS_INIT_OK蓝牙初始化慢了。
image 修改:直接开机提示音放到蓝牙模式这个地方播。直接跑poweron_task_start();
imageimage 回连数据:从听到提示音开始计时,到手机显示连接。平均在3秒内
90. AC700 300 概率不亮开机灯-- 泓毅 原因:刚开始执行开机灯显,就来了个led中断把开机灯显关了。具体根因需跟踪如下PMS系统问题单
杰理工程系统--用户端--主要事务/客户常规问题-事故分析
临时规避:
方法1:把led周期拆成2个或2个以上,原因未知。(缺陷是盯着看时能看出来灯显不连续)
image 方法2:用时间戳过滤掉开机灯显的中断,具体时间可微调。
image 91. 700N TWS dongle V1.1.0 patch13 dongle插入小米手机识别慢(要10秒才识别,显示耳机图标) 在dongle端修改如下
image 92. TWS耳机_AC700N_2.0.2(patch_08.04),提示音使用wav格式,编译报错 --LJW image

//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
  1. AC700 300 patch0202,连接苹果手机和苹果平板。平板播歌,手机打电话,耳机调音量调的是平板的声音 20250829 CKS 将加减音量发送指令的接口,全部替换成使用地址发送的接口
    image
/*************************************************************/
//   获取活跃设备
/*************************************************************/
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
    }
}
  1. AC700 202 patch08,一拖二苹果手机播歌,苹果电脑后台待机,概率蓝牙连接断开 20250829 CKS AC700 202 patch08,一拖二苹果手机播歌,苹果电脑后台待机,概率蓝牙连接断开修改.rar

本文档包含以下子页面

  • AC700N可视化同时开启在线调试(ANC、EQ等)和自定义SPP UUID
Prev
海外CRA认证报告生成说明
Next
JL701X可视化工具问题处理文档