JL709N(JL689N)音箱问题整理
📎 原始文档:https://www.kdocs.cn/l/ckQr8BHF2SBW JL709N(JL689N)音箱问题整理
前言:本文档整理将以各个SDK遇到的共性问题做整理汇总,可直接根据所使用的sdk版本及功能快速索引相关问题点
开发注意点
- 使用IIS功能,需要注意时钟配置 IIS只能固定主频使用
位置:功能配置-固定时钟频率
- 蓝牙PA使能配置
void rf_pa_io_set(u8 tx_io, u8 rx_io, u8 en);
共性问题
- JL709N_le_audio_1.0.0_P00.03版本 sdk 通话音频流修改为IIS输出后回音消除算法不生效
处理方法:DMA 的 len 需要多乘以4,后续版本已同步该修改点。
- latch_reset后,IO在上电后又被Deinit,导致没有保持住IO电平 示例如下:
- 在power_early_flowing内部,设置保护此io,不要让其再次被开机初始化,导致掉电平
- 并重新设置一次电平

- 未被保护的所有io,会被power_early_init((u32)gpio_config);函数,重新初始化为高阻态 重点:跟gpio_config变量有关,默认是上电后会全部初始化一次
#define PORT_TABLE(arg) u32 gpio_confi##arg[6] = {IO_PORT_PA_MASK, IO_PORT_PB_MASK,IO_PORT_PC_MASK, IO_PORT_PF_MASK, IO_PORT_PP_MASK, IO_PORT_USB_MASK}
添加保护相当于,将引脚对应的bit置0,使其不被初始化
- 非信令测试通过link_fix_tx_enable接口,设置payload不生效,设置rx mode,接收不到波形文件,收不到包 公版demo如下:
void bt_fix_txrx_api(u8 mode, u8 *mac_addr, u8 fre, u8 packet_type, u16 payload)
{
bt_dut_api(0);
local_irq_disable();
link_fix_txrx_disable();
if (mode) {
link_fix_rx_enable(mac_addr, fre, packet_type, 0xffff, 0, 9);
} else {
link_fix_tx_enable(mac_addr, fre, packet_type, 0xffff, 0, 9);
}
local_irq_enable();
}
修改如下:
- 设置payload时,需要指定payload_len;后续SDK版本会修改,默认0对应最大len
- 测试rx mode波形文件时,需要设置lt_addr,范围0-7,一般先设置7进行测试
void fix_rxtx_lt_addr_set(u8 lt_addr);
fix_rxtx_lt_addr_set(lt_addr);

void bt_bredr_non_signaling_test_rx_mode(u8 *mac_addr,u8 fre,u8 packet_type,u16 payload, u8 lt_addr)
{
// at_log("edr text rx mode:fre=%d,packet_type=%d,payload=0x%x\n",fre,packet_type,payload);
bt_dut_api(0);
local_irq_disable();
link_fix_txrx_disable();
u16 payload_len = 0;
switch (packet_type)
{
case DH1_1M:
payload_len = 27;
break;
case DH3_1M:
payload_len = 183;
break;
case DH5_1M:
payload_len = 339;
break;
case DH1_2M:
payload_len = 54;
break;
case DH3_2M:
payload_len = 367;
break;
case DH5_2M:
payload_len = 679;
break;
case DH1_3M:
payload_len = 83;
break;
case DH3_3M:
payload_len = 552;
break;
case DH5_3M:
payload_len = 1021;
break;
}
void fix_rxtx_lt_addr_set(u8 lt_addr);
fix_rxtx_lt_addr_set(lt_addr);
link_fix_rx_enable(mac_addr, fre, packet_type, payload, payload_len, 9); // 最大0xf
at_log("%s:\n actually_set fre=%d,packet_type=%d,payload=0x%x,payload_len=%d, lt_addr=%d(0~7), Power=9 (0-15)\n",
__func__, fre, packet_type, payload, payload_len, lt_addr);
local_irq_enable();
}
- JL709N_le_audio_1.0.0_00.07 苹果手机概率首次连接-默认音量不同步问题 - 20250716 CJD 【金山文档 | WPS云文档】 btstack_JL709N_1.0P00.07_修复苹果手机首次连接概率音量不同步问题
https://www.kdocs.cn/l/cjedFYcFkaCV
- 替换以上链接的bastack.a库
- 定义u8 bt_avrcp_sync_music_vol_again_by_timer = 1;变量,用于使能首次连接时,协议栈连接a2dp后,delay再次同步一包音量。 解决苹果手机概率首次连接音量不同步问题
- u8 need_default_volume = 127/2; 定义首次连接时,同步的全局默认音量值。 可以在任何位置进行全局变量定义。 可以在函数中对此值进行动态修改。

u8 need_default_volume = 127/2;
u8 bt_avrcp_sync_music_vol_again_by_timer = 1; // 使能音量再次同步开关
- JL709N_le_audio_1.0.0_00.07/00.08/00.09,删除设备记忆无效,重启后仍能直接连接上-20250808-CJD
- 问题:689N-le-audio-SDK打开auracast使能后,调用API-bt_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL); 清除信息,恢复出厂设置后,再次开机仍能直接连接上手机
- 解决方案:
// 执行以下删除Link_key
delete_link_key(NULL, get_remote_dev_info_index());
// 执行以下刷新VM从RAM到存储
if(get_vm_ram_data_used_size())
{
vm_flush2flash(0);
}

- 709N_le_audio_00.08_SDK或者其它patch,超距不回连问题 - 20250901-CJD 公版流程原因如下:
- 超距后,无论是使能或者失能,都会执行对应的句柄函数conn_state_handler,当前如果没有连接,则不会回连。改为了打开可发现可连接
修改如下:分别在每个Case增加如下回连操作
// 为不影响原有流程,判断如果是超距且有回连目标的情况下,执行回连操作
if (have_page_device) {
if (page_timeout) { //回连超时插入2s手机的可发现可连接
printf("%s %d\n", __func__, __LINE__);
page_timeout = 0;
g_dual_conn.timer = sys_timeout_add(NULL, tws_wait_conn_timeout, 2000);
} else {
write_scan_conn_enable(0, 0);
dual_conn_page_device();
printf("%s %d\n", __func__, __LINE__);
}
RCSP - TWS配对成功后,音箱与手机APP连接断开(BLE连接断开)2025-09-CJD 原因:rcsp协议代码-在TWS配对成功后,没有判断当前是否有手机连接,直接重新更新BLE-Mac地址,并且主动断开BLE-关开广播,导致了APP断开
修改方法:
其中一个修改方案如下所示:(rcsp_bt_manage.c文件)
在TWS配对成功后,判断如果有手机连接,则不刷新BLE地址。不执行断开BLE,重新关开广播的操作。
另外方案:可以增加宏,如果是使用的非公共地址且是TWS主机,那么不执行相关的操作。
TWS主从退出组队,手机马上点击连接音箱显示要重新配对,配对记录被清除。(音箱打印Linkkey Lost)2025-09-CJD 根本原因:
- tws断开后,从机还没刷新为本机地址,还是使用的主机tws地址
- 从机先于主机打开了可连接,此时用户点击连接,连接上的是从机,导致没有Linkkey,提示忽略设备/重新确认配对 详细原因:
- TWS断开时,由于HCI层的事件先于TWS_EVENT_CONNECTION_DETACH事件出现,先执行了一次tws_dual_conn_state_handler()函数。导致TWS从机在此处打开了可发现可连接。(但此时从机仍然配置的是 TWS地址,也就是主机的地址)
- 如下图所示
- 在收到TWS_EVENT_CONNECTION_DETACH事件后,刷新为本地Mac地址,但并没有关开可发现,导致实际上广播并没有更新

解决方案:
int bt_tws_connction_status_event_handler(int *msg)
{
...
case TWS_EVENT_CONNECTION_DETACH:
...
#if CONFIG_TWS_USE_COMMMON_ADDR == 0
lmp_hci_write_local_address(bt_get_mac_addr());
#endif
...
// 添加以下
if (role == TWS_ROLE_SLAVE) {
// 如果是从机,则先关闭一次可发现可连接,后续再在tws_handler重新打开
// 避免在write_local_address更新的本机地址没有刷新生效,导致与主机同地址
bt_cmd_prepare(USER_CTRL_WRITE_SCAN_DISABLE, 0, NULL);
bt_cmd_prepare(USER_CTRL_WRITE_CONN_DISABLE, 0, NULL);
}
9. le_audio-JL709N-1.0.0-AC689N-demo-patch_00.12 蓝牙PA接口未定义。 使用以下接口,没有aurcast需要在其他模式广播的,在退出蓝牙模式的时候关闭。
有其他模式广播的情况,需要确保下面的接口只初始化一次。
10. OTA重启后,手机音量没有记忆-le_audio_JL709N-20251031-CJD 解决方案:
- 升级前手动更新一次协议栈保存的音量。开始升级后,会关闭写VM使能,无法写入VM
- 在升级前调用以下函数,bt_save_vol_before_ota,入参为手机地址
void bt_save_vol_before_ota(u8 *addr)
{
u8 dev_vol = bt_get_music_volume(addr);
extern void update_to_save_in_btstack(u8 *dev_addr, u8 info_type, u8 data);
update_to_save_in_btstack(addr, 4 , dev_vol);
// 不是必须的,但需要保证在失能写VM前,让btstack成功写入VM
os_time_dly(10); //延时100ms,等待btstack接收消息写入vm
}
// 一拖一时
u8 *save_addr = get_cur_connect_phone_mac_addr();
bt_save_vol_before_ota(save_addr);
或者可以改为升级前,手动断开A2DP/HFP通道,只保留SPP/BLE
原因:底层协议栈保存的音量,只有当手机蓝牙断开时,才会写一次VM。避免频繁写加大写flash压力
而正常关机时,会先断开蓝牙,再关机,所以可以保存音量。
local_tws音频流,在TWS连接模式下,无法设置立体声 local_tws音频流默认有channel_merge节点,节点的声道分配在jlstream_event_handler.c文件
注释代码如下图所示,则可以在tws模式下输出立体声。
自定义声道配置可以通过添加steromix节点进行设置
local_tws,主机在非BT-本地模式,从机在BT模式,进行TWS配对,概率出现模式不同步,从机无声-20251031-CJD 主机在iis模式 与 从机tws配对上后。主机在iis模式,从机还在蓝牙模式,没有相应地切换到sink模式。
由于从机本地时间戳比主机大,导致没有响应进入SINK模式,从机无声。
if (__this->cmd_record == CMD_TWS_ENTER_SINK_MODE_REQ || __this->cmd_record == CMD_TWS_BACK_TO_BT_MODE_REQ) {
if (__this->cmd_timestamp > cmd_timestamp) { //如果当前发送的命令的时间戳比对方请求的大,则不响应
log_info("local timestamp > remote timestamp!\n ");
break;
}
}
修改:
收到TWS断开事件后,主从两端清零本地保存的local_tws时间戳
13. 蓝牙发射器连接不上部分机器,部分机器连接上无声(JBL Go4)。 连接不上:发射器搜到了设备page状态没有取消
没有声音:音响那边需要组包发送
app_msg.h的消息体超过255,u8变量的限制后。部分按键操作会执行两个事件
bt_app_msg_handler里面使用了u8变量赋值。导致处理键值消息溢出。 修改为:
PAwR 主机BLE连接时被马上异常断开,打印 [LE-CLIENT]drop adv_report!!!43, 问题现象:
概率测到一种异常情况:
1、广播主机刚刚连接上从机BLE,然后底层马上出来一个 att disconn断开事件。由于无线干扰导致的0x3e断开BLE
2、接着ble_client_work_st状态变为 断开->重新扫描状态 0x40
3、这时又回调出一个 user_client_multi_report_search_result 搜索服务事件,打印find target_handle
4、然后直接又变成 0x43连接上。 然后状态就乱了,一直打印drop adv_report!!!43
[00:00:28.480]att disconn
[00:00:28.480][LE-CLIENT]HCI_EVENT_DISCONNECTION_COMPLETE_client: 3e
根本原因:
BLE由于干扰导致的断开后,异步线程仍然会在应用层回调user_client_multi_report_search_result-搜索结束事件,触发状态机从搜索中又变成了BLE链路连接。 状态机管理错误。
有干扰的话0x3e断开 一次是正常的 但应该会立马重新开scan 如果持续出现0x3e的话就是有问题
修改方法:
void user_client_multi_report_search_result(search_result_t *result_info)
{
// 增加以下,应用层做处理,如果已经断开了,则直接返回
if(!client_con_handle[cur_dev_cid]) {
// 20251202:修复BLE连接时由于无线环境干扰引起的0x3e断开,导致状态管理错误,主从概率无法组队上问题
// 此时直接返回,重新开scan连接
log_info("client_report_search_result: con_handle not found!!!\n");
return;
}
16. JL709_le_audio_1.2.0 维持io,U盘升级产生断言和升级成功不复位重启 20251211 TP 更换OTA文件,解决不复位问题
OTA_BR52_20251211.rar
注释掉CPU的挂起:
根本原因:
在cpu_suspend_other_core(CPU_SUSPEND_TYPE_UPDATE),会将另一个核挂起而latch_reset接口驱动里面也执行了挂起了另一个CPU。
17. JL709_le_audio_1.2.0 & 1.3.0 杰理OTA升级在回连BLE时回连失败导致升级失败 修改方法:更换OTA文件ota_修复杰理ota升级.zip,并在isd_config_rule.c中添加以下代码
EXIF_ADR = CONFIG_EXIF_ADDR;
EXIF_LEN = CONFIG_EXIF_LEN;
EXIF_OPT = CONFIG_EXIF_OPT;
- JL709_le_audio_1.2.0 使能PAWR后,蓝牙模式切到其他模式大概率死机 根本原因:重复free
解决方法:
添加以下代码
le_multi_client_hdl[i] = 0;
le_multi_client_hdl[i] = 0;
- JL709_le_audio_1.2.0 IIS 输出 + PC MIC 加入单 MIC 通话算法上行无声 音频流:
(注:24 bit 位宽使用,16bit 位宽去掉 BitWidth Conver 节点, 播放同步节点延时 50ms)
解决:

u8 pc_mic_is_open(void)
{
return (g_pc_mic_state == PC_MIC_STA_OPEN);
}
#if TCFG_AUDIO_CVP_OUTPUT_WAY_IIS_ENABLE && (defined TCFG_IIS_NODE_ENABLE)
extern u8 pc_mic_is_open(void);
int iis_sample_rate = audio_iis_get_sample_rate(audio_cvp_ref_iis_hdl_get());
if (pc_mic_is_open()) {
audio_cvp_ref_src_open(STREAM_SCENE_PC_SPK, iis_sample_rate, fmt->sample_rate, 2);
} else {
audio_cvp_ref_src_open(hdl->scene, iis_sample_rate, fmt->sample_rate, 2);
}
printf("%s, hdl->scene %d, fmt->sample_rate %d, iis_sample_rate %d", __func__, hdl->scene, fmt->sample_rate, iis_sample_rate);
#endif
JL709_le_audio_1.2.0 一拖八 烧录器中 提示是 需要选择689的才能导入
需要修改为 709芯片的标识,如下图:
#define CONFIG_CHIP_NAME JL709N
#define CONFIG_PID JL709N
JL709_le_audio_1.2.0 修复从机数据被覆盖问题 使用接口static void ble_pawr_tx_update_adv_data(const uint8_t *data, uint16_t len) 更新主机发送广播数据,在一定周期后,从机接收的广播数据会被重置成默认的数组数据pawr_tx_vendor_padv_data,没有办法维持设置的数据
btctrler_709-v120_修复从机数据被覆盖问题.zipJL709_le_audio_1.2.0 开广播连蓝牙播歌,打断播放提示音异常问题 根本原因:提示音打断本地播放后,时间戳不连续,需要添加补包处理
解决方法:对比公版修改以下文件
709-120修复开广播+蓝牙播歌+播打断提示音异常.zipJL709_le_audio_1.2.0及之前SDK,概率出现VM-id写入数据,重启后没有保存的问题——20260207-CJD 根本原因:vm模块的问题,vm模块会检查数据相同就不写到flash了,而vm_flush2flash接口刷新数据到flash时传入了带偏移的地址,导致对比的数据一直都是不正确的,有概率撞中,特别是1byte数据,撞中概率是1/256
解决方法:更新vm.a
已由远钦上传到服务器的manifest_dev/base/le_audio_develop分支,如有需要,可由远钦根据实际的分支重新导出库
以下为vm.a下载链接,适用于709N-le-audio-SDK
【金山文档 | WPS云文档】 vm_修复ram刷新到flash概率失败问题_20260206_yuanqin
https://www.kdocs.cn/l/ckzhRzWRXxby
公版SDK:Auracast+PAwR模式或者其它BLE模式下压测概率出现死机,报hmem err msg : wl access hmem excption at dev id: 0x000000AB DBG_BT_BLE——20260207-CJD 根本原因:btctrler.a底层部分有互斥点没有锁保护,这个是蓝牙外设访问到非法内存,异常log分析不了太多东西。主要还是得看一下蓝牙的dma寄存器是不是使用了错误的buffer
修改方法:底层的临界区代码增加锁保护, 叫觉栋或者俊豪根据当前实际分支导出相应的库JL709_le_audio_1.2.0 PC模式下有些电脑播放会死机 测试程序:709 le1.2.0sdk PC模式下死机、叠加iis(从机模式)卡顿 .7z
修改uac_sream.c
if (uac_speaker->spk_double_buf) {
if (len > uac_speaker->max_len || len < uac_speaker->min_len) {
log_error("len err %d %d %d\n", len, uac_speaker->max_len, uac_speaker->min_len);
return;
}
JL709_le_audio_1.2.0 PC模式下叠加IIS(从机模式)会卡顿 测试程序:https://www.kdocs.cn/l/ckQr8BHF2SBW?linkname=yOJ9v8p8pJ
注意:PC叠加IIS(从)时需要主机IIS一直保持clk信号
AC706N IIS主机在没有数据输出时需保持CLK
JL701N le audio IIS(主)TX 保持CLK
现象:在PC初始化完之后再调用iis_start()打开IIS输入会出现一直打印U同时有卡顿伴随
处理方法:
概率出现PAwR主机无法收到PAwR从机的响应数据,从机或者主机重新进入一次广播模式后,能够恢复正常 - 20260305 CJD 原因:
- 主机开BIS的前几个周期没有及时更新pawr数据,导致从机没扫到。
- 公版流程为先Create BIS,再执行PAwR-TX-init 修改为:
app_auracast_source_open -> app_speaker_start_pawr -> auracast_source_create 的流程顺序

- JL709_le_audio_1.2.0 Auracast-TX修改加密密钥-从机21分钟后同步不上主机-20260511-CJD
原因:Auracast主机有个计数变量,21分钟就会溢出导致异常,从而从机同步不上。
修改方案:
替换以下btctrler.a库:觉栋提供
https://www.kdocs.cn/l/crVPojCQll4q
并修改代码:规避一个死机问题
附上TX修改加密密钥测试代码:
// TX广播模式下-通过事件调用以下,修改密钥
void user_modify_auracast_source_info(void)
{
printf("last source info:\n");
printf("last_user_broadcast_code:%s\n", user_config.broadcast_code);
printf("last_user_broadcast_name:%s\n", user_config.broadcast_name);
printf("last_user_broadcast_id:%x\n", user_config.broadcast_id);
printf("last_user_encryption:%d\n", user_config.encryption);
// 修改code为5678,修改name为"JL_Auracast",修改id为0x12345678,修改加密为1
sprintf(user_config.broadcast_code, "5678");
sprintf(user_config.broadcast_name, "JL_Auracast");
user_config.broadcast_id = 0x123456;
user_config.encryption = 1;
printf("new source info:\n");
printf("new_user_broadcast_code:%s\n", user_config.broadcast_code);
printf("new_user_broadcast_name:%s\n", user_config.broadcast_name);
printf("new_user_broadcast_id:%x\n", user_config.broadcast_id);
printf("new_user_encryption:%d\n", user_config.encryption);
app_auracast_suspend();
app_auracast_resume();
}
- JL709_le_audio_1.2.0 - SPDIF-OUT输出,开启广播模式后,声音异常,一直打印spdif_master_isr里的putchar('D') - 20260407-CJD
先基于709-120公版移植廷阳的git修改后:

- 内部链接:http://192.168.1.245/freebrand/support/visualization/le_audio/jl709nle_audio_1.0.0/-/tree/spdifout-jl709n_le_audio_1.0.0
- 外部链接:Files · feature_spdif · JL-Studio / Leaudio / 709N / JL709N_le_audio_1.0.0 · GitLab 重点注意:
1、A2DP-RX需要转本地时钟;
2、配置SPDIF和DAC同时输出时,DAC必须要在音频分流器节点的最下面的节点,DAC必须要主设备,SPDIF节点配置为从设备(所有模式的配置页都要配置)
基于以上再修改如下所示:

JL709_le_audio_1.2.0 关闭通话开启仅电量显示宏后,连接蓝牙30S左右断连,部分苹果手机挂断电话后打印不断。 现象:异常打印:
处理办法:
btctrler_棉鸿_觉栋_修改709120_开仅电量显示宏后异常问题.7z
修改没有自动跳转给手机通话链路:
JL709_le_audio_1.2.0 部分环境干扰较大时 aruacast sink 扫描状态下连接 ble 导致的 edr 出现 lmp timeout 断开 异常 log:
处理补丁:
JL709_le_audio_1.2.0_btctrler_20260607.zip
问题处理
- JL709N_le_audio_1.0.0_P00.07 蓝牙后台其它模式播放中-唤醒安卓手机语音助手-识别完后播放手机端的语音不完整(苹果手机测试正常) - 20250705 CJD 公版流程以及安卓手机的SIRI流程说明:
- 在Linein或者本地音乐模式播放中,用户发送启动SIRI命令,手机端启动SCO流程后。 音箱会判断是由于通话启动的原因,返回蓝牙模式。 同时启动定时器,轮询检测如果通话状态结束后,会立即返回本地模式
- 苹果手机的SIRI是一直处于通话状态。 但是安卓手机的语音助手分为两个阶段:
- 阶段一是使用sco链路作语音识别
- 阶段二是:语音识别后播放,这个过程使用A2DP进行播放 问题原因:在安卓语音识别后,音箱就切换回本地模式,导致丢掉了部分播放。接着又因为蓝牙播放能量,抢占回到蓝牙模式,接续播放
修改如下:判断如果远端是安卓手机,且是语音助手引起的切回蓝牙模式,则不启动通话后台返回检测
if (g_bt_hdl.background.backmode == BACKGROUND_GOBACK_WITH_PHONE && g_bt_hdl.background.goback_mode != APP_MODE_SINK) {
log_info("bt_background_goback_with_phone\n");
// 如果是安卓手机,且是语音助手引起的切回蓝牙模式
// 那么则不启动定时检测 通话状态,避免安卓手机语音助手刚识别完,通话状态结束,就马上切回Linein模式
if(app_var.siri_stu && app_var.remote_dev_company == 0)
{
// 有个现象注意:
// 安卓手机如果没有手动关掉助手界面,那么返回Linein模式会较晚,因为手机端没有触发A2DP_STOP
// 设备需要随时响应,用户可能接着点击 连续说话
// 如果用户手动关掉了助手界面,那么返回Linein模式会较快,正常
}
else
{
background_goback_with_phone();
}
}
- 修改系统模式音频流为IIS+DAC叠加输出时,同时叠加开机有耗时操作时,出现开机播放提示音杂音的优化
提示音解码帧长改成20ms
if (info->scene == STREAM_SCENE_TONE){
info->frame_time = 20;
info->task_name = "file_dec";
}
提示音改双线程堆数
jlstream_add_thread(player->stream, NULL);
jlstream_add_thread(player->stream, NULL);
提示音改双线程以及解码帧长改成20ms,测试开机提示音播空可以解决。
弊端是播提示音时会增加ram的消耗。
- 使能单MIC通话,PC模式开Auracast广播-PC打开语音通话,报RAM不足死机,vmalloc_ 147 一、根本原因:
PC MIC通话算法占用RAM资源多,与Auracast一起打开会有RAM不足的问题
二、处理方案:
基于公版增加流程:
1、在pc_mic_recoder_open前,挂起广播
2、在pc_mic_recoder_close后,恢复广播

案例分享:(仅作为功能演示demo使用)
iis输出配置 jl709n_le_audio_1.0.0-p0007-iis-dac输出.7z
注意:全局采样率需要设置48K不然会报需要把主频设置为192MHz
配置iis io引脚


添加iis节点
1.把iis节点加入到音频流框图中,如果是多设备同时输出需要设置设备的主从(一般dac为主、iis为从)
2.设置设备的主从
如果iis设置为从设备、dac设置为主设备播放时声音异常(卡顿、无声)这个bug需要反馈给原厂,暂时可以把iis、dac设置为Disable进行调试(该方法不能用于生产环境)
声音输出时的异常打印
添加自定义MODE 效果:按键切换模式可以在BT、linein、music、mytask等模式之间切换
jl709n_le_audio_1.0.0_patch_01_添加mytask.7zMULTI CH IIS RX,多通道IIS输入节点使用示例
- 音频流使能勾选和连接对应的通道


- 代码里修改音频流句柄为通过节点名字获取, 节点名字要对应可视化音频流里面的名字。

- Auracast Dongle UDisk
功能概述
Auracast Dongle UDisk 是一个控制虚拟U盘功能的宏定义,用于在JL709N LE Audio SDK中实现将音频流实时转换为虚拟U盘文件系统的功能。
硬件:
- 需要搭配 JL7096M系列芯片使用
- JL7096M Auracast 收发器方案标准原理图
软件:
公版SDK默认有配置Dongle UDisk 的选项
对应代码的宏为:TCFG_VIR_UDISK_ENABLE
功能切换消息:APP_MSG_CHANGE_AURACAST_DONGLE_MODE
//auracast_dongle_mode 模式说明
//0、没开广播
//1、开着广播发射
//2、开着广播接收
void le_audio_dongle_sw_mode()
虚拟磁盘实现
文件: SDK/apps/common/fat_nor/virtual_disk.c
- 主要功能: 模拟FAT32文件系统,处理文件读写请求
- 关键设备操作:
const struct device_operations vir_udisk0_ops = {
.init = usb_vir_init, // 初始化
.online = usb_vir_online, // 设备在线检测
.open = usb_vir_open, // 打开设备
.read = usb_vir_read, // 读取数据
.write = usb_vir_write, // 写入数据(空实现)
.ioctl = usb_vir_ioctrl, // IO控制
.close = usb_vir_close, // 关闭设备
};
设备注册
文件: SDK/apps/common/dev_manager/dev_reg.c
- 主要功能: 将虚拟U盘注册到系统设备管理器
#if TCFG_VIR_UDISK_ENABLE
// 虚拟U盘
{
/*logo*/ "vir_udisk0",
/*name*/ "vir_udisk0",
/*storage_path*/ "storage/vir_udisk0",
/*root_path*/ "storage/vir_udisk0/C/",
/*fs_type*/ "fat",
},
#endif
功能流程
初始化流程
- 系统启动时,通过TCFG_VIR_UDISK_ENABLE宏启用虚拟U盘功能
- 设备注册: 虚拟U盘设备通过dev_reg.c注册到系统 USB读写流程
- 上位机读取请求:
- 通过virtual_file_read函数处理读取请求
- 从循环缓冲区enc_cbuffer中读取数据
- 如果数据不足,填充静音MP3数据
- 同步处理(如果启用):
- 监控上位机读取速度与音频流速度的差异
- 通过调整采样率(sync_d_sample_rate)进行同步补偿
- 定期检测缓存状态,调整同步策略
数据流向
音频源 → virtual_udisk_handle_frame → 循环缓存enc_cbuffer → virtual_file_read → USB主机
↑
|
USB读取请求