|
|
f5a2777abf
|
feat(rtc+ble): A+B+C 三件套 RTC 偶发连接失败修复 + BLE 配网 reboot 修复 (移植自 Baji)
============ 问题与修复 ============
### 问题 1: 配网模式按 BOOT 进入配网 → 设备 reboot
日志:
E BT_OSI: future_new unable to allocate memory for the semaphore.
assert failed: future_ready future.c:64 (future != NULL)
根因:
BLE Bluedroid 协议栈初始化时, future_new 分配 semaphore 失败 → 后续 future_ready
拿到 NULL → assert. 跟 Baji 的 vQueueDelete(NULL) 同性质 — DRAM 不足.
Kapi 用 LVGL (~50-80 KB DRAM) + RTC SDK 静态 .bss (~30-50 KB),
BLE Bluedroid stack 抢不到所需内存.
修复 (sdkconfig):
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
让 BLE Bluedroid 全局变量动态分配优先走 PSRAM, 释放 ~30 KB DRAM
给 controller / GATT / WiFi 使用. 修复后 BLE 配网正常.
### A+B+C 三件套 (移植自 Baji commit 70f0cdd, 解决 RTC 偶发连接失败)
[A] sdkconfig: CONFIG_LWIP_MAX_SOCKETS=10 → 20
根治火山 RTC SDK 启动时 lwIP socket fd 不足触发 SocketConnection-Lite.c:191
bind local ip failed → ICE 协商失败 → wait connect bits=0x0 超时.
[B] application.h/cc + volc_rtc_protocol.h/cc: 失败 3 次后销毁 + 重建 engine
新增 VolcRtcProtocol::ForceRebuildEngine() public 方法.
application.cc 加 audio_channel_retry_count_ 重试计数,
OpenAudioChannel 连续失败 3 次时调用 ForceRebuildEngine 清理 SDK 状态.
应对 A 修复后仍可能出现的 SDK 内部状态污染 (ICE Agent 异常等).
[C] volc_rtc_protocol.cc: DIAG_RTC_BIND_ENABLE 一键开关诊断埋点
在 join_room 前/后 + ForceRebuildEngine 前/后打印 lwIP socket fd / heap /
psram / WiFi rssi / errno, 偶发失败时直接定位根因.
验证完成后改 0 关闭, 编译器消除 #if 块, 零运行时开销.
============ 文件改动 ============
sdkconfig:
+CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y (BLE 配网修复)
+CONFIG_LWIP_MAX_SOCKETS=10 → 20 (方案 A)
main/application.h:
+int audio_channel_retry_count_ = 0; (RTC 重试计数)
main/application.cc:
OpenAudioChannel 失败处加重试计数 + 连续失败 3 次调 ForceRebuildEngine,
static_cast<VolcRtcProtocol*>(protocol_.get()) (ESP-IDF 默认 -fno-rtti).
main/protocols/volc_rtc_protocol.h:
+void ForceRebuildEngine() 声明.
main/protocols/volc_rtc_protocol.cc:
+DIAG_RTC_BIND_ENABLE 开关 + diag_count_used_sockets() 工具函数,
+OpenAudioChannel Pre-Join / Post-Fail DIAG 埋点,
+ForceRebuildEngine() 实现 (volc_rtc_stop + volc_rtc_destroy + 等 2 秒 + 触发重建).
============ 关联资源 ============
Baji commit 70f0cdd: feat(rtc): 偶发连接失败完整修复 (A+B+C 三件套)
Baji commit bffd316: feat(provisioning): BLE 配网完整修复
全局 CLAUDE.md "BLE 配网 DRAM 紧张完整排查流程" 章节
项目记忆 project_ble_provisioning_issues.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-21 15:15:34 +08:00 |
|
|
|
b1577d8418
|
fix: 软 RTC 退出待命音三连修 + 尾音延迟
问题与修复(按发现顺序):
【问题1】AudioLoop guard 冻结 OnAudioOutput → 待命音队列永远不被消费
- 现象: WaitForAudioPlayback 3秒超时, 无声
- 根因: EnterIdleHibernate Step 0 设 hibernating_=true, AudioLoop 顶层
if(hibernating_) continue 会同时跳过 OnAudioInput + OnAudioOutput,
PlaySound 入队的 Opus 永远不解码。
- 修复: guard 下沉到 OnAudioInput 入口(仅 input 侧关 codec 有 bad_alloc 风险),
OnAudioOutput 自带 codec->output_enabled() 保护。
【问题2】volc_rtc_stop 副作用关 I2S 通道 → codec 状态错位
- 现象: 听到杂音而非待命音; i2s_channel_disable "not enabled yet" 错误
- 根因: 火山 RTC SDK 的 stop 内部关闭 ES8311 I2S, 但 codec class 内部
output_enabled_ 标志仍是 true → 状态错位, PlaySound 写入到 disabled 的 I2S。
- 修复: EnterIdleHibernate 在 PlaySound 前显式 EnableOutput(false→true)
强制重新激活 I2S, 并灌 200ms silence 覆盖 DMA 残留。
【问题3 - 真因】protocol downlink_is_pcm_ 标志位污染 → Opus 被当 PCM 字节流写出
- 现象: 杂音仍在
- 根因: 火山 RTC 下行音频是 PCM, DataCallback 设 downlink_is_pcm_=true。
LeaveRoom 没重置这个 flag, 后续 hibernate 中 PlaySound 入队的 Opus 包,
OnAudioOutput 读到 protocol_->downlink_is_pcm() 返回 true →
treat_as_pcm=true → 跳过 opus_decoder, 直接把 Opus 编码字节当 int16
PCM 样本写到 codec → 杂音。
- 修复: VolcRtcProtocol::LeaveRoom 末尾重置 downlink_is_pcm_=false +
first_downlink_logged_=false。唤醒重连后 DataCallback 收到首包会立即
重新设置该 flag, 不影响欢迎语 PCM 播放。
【问题4】WaitForAudioPlayback 完成 ≠ DMA 输出完成 → 尾音被截
- 现象: 待命音能听见但提前结束约 1 秒
- 根因: WaitForAudioPlayback 只判断 audio_decode_queue_ 出队完毕。
OnAudioOutput 是 background_task Schedule 异步执行 codec write,
队列空 ≠ codec 写完; codec.Write 返回 ≠ I2S DMA + ES8311 FIFO 输出完毕。
- 修复: WaitForAudioPlayback 之后追加 background_task->WaitForCompletion +
vTaskDelay(1000) 让 DMA 尾音自然衰减, 才关 player_pipeline。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-15 18:29:09 +08:00 |
|
|
|
a3a476f857
|
feat: Phase 6 软退出方案 C+ — 修复待命音无声 + 唤醒重连失败
问题(上次提交 d5239cf 之后实测):
1. EnterIdleHibernate 触发的 LeaveRoom() 顺手关闭了 codec output:
LeaveRoom → on_audio_channel_closed_ → player_pipeline_close → EnableOutput(false)
导致后续 PlaySound(P3_KAKA_DAIMING) 入队后 AudioLoop 写不出声音,
WaitForAudioPlayback 3 秒超时退出, 用户听不到待命音。
2. LeaveRoom 调用 volc_rtc_destroy 后 rtc_handle_ = nullptr,
WakeFromHibernate → ToggleChatState → OpenAudioChannel 直接返回 false,
触发 2 秒重试循环, 同时每次失败回退 idle 都重新 PlaySound,
codec 状态震荡产生杂音, 服务端 AI 任务也无法重新加入房间。
方案 C+ 修复:
- Protocol::LeaveRoom() 新增 bool notify_closed=true 参数 (默认行为不变)。
- VolcRtcProtocol::LeaveRoom(notify_closed):
* 只 volc_rtc_stop, 不 volc_rtc_destroy, 保留 rtc_handle_ 供唤醒复用。
* notify_closed=false 时跳过 on_audio_channel_closed_, 不连带关 codec。
- EnterIdleHibernate:
* 调用 LeaveRoom(false) → codec output 保留。
* 手动 background_task_->WaitForCompletion + 清空队列 + 关麦克风。
* SetDeviceState(idle) 后 PlaySound 真正能播出来。
* WaitForAudioPlayback 完才 player_pipeline_close (这里再正常关 output)。
- WakeFromHibernate:
* 先放下 hibernating_ 让 AudioLoop guard 通过, 再 ToggleChatState。
* 因 rtc_handle_ 仍有效, OpenAudioChannel 走 volc_rtc_start 重启路径,
on_audio_channel_opened_ 回调重开 player_pipeline + 灌 200ms silence。
编译: kapi.bin 0x2e6330 (3.04MB), 分区 42% 空闲。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-15 17:43:29 +08:00 |
|
|
|
180057d427
|
设备注册RTC服务时,设备名称从Wi-Fi的MAC地址改为使用蓝牙的MAC地址
|
2026-03-05 13:31:59 +08:00 |
|
|
|
b9bbcc456c
|
1、新增HTTPS故事播放功能(SendStoryRequest通过蓝牙MAC请求故事API,支持intro+body两段式无缝播放);
2、新增HttpsPlaybackFromUrl通用HTTPS音频下载播放方法,obtain_story同时支持HTTPS URL和WebSocket两种方式;
3、新增RTC↔HTTPS双向音频切换三标志位状态机(opus_playback_active_/https_playback_active_/https_playback_abort_),HTTPS播放期间静默丢弃RTC PCM包,OnAudioOutput捕获is_opus_frame防止残留Opus帧杂音;
4、新增AbortHttpsPlayback中止方法,使用独立高优先级任务(priority=10)执行DMA flush;
5、协议层新增OnBotMessage回调,Bot下行消息立即中止HTTPS播放;volc_rtc_protocol移除is_binary依赖改为直接前缀检测,新增info前缀和subv跳过逻辑;
6、新增subtitle字幕消息解析,通过bot_前缀区分USER/AI,用户说话时立即中止HTTPS播放;
7、AbortSpeaking新增HTTPS中止信号和DMA缓冲区flush;
8、Kconfig新增STORY_API_URL故事播放API地址配置;
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-03-05 11:27:07 +08:00 |
|
|
|
a54773f71a
|
Kapi_RTC版本初始化
|
2026-01-20 16:55:17 +08:00 |
|