|
|
@ -144,6 +144,9 @@ object BleService { |
|
|
private val isAudioSending = AtomicBoolean(false) |
|
|
private val isAudioSending = AtomicBoolean(false) |
|
|
// 上一包音频实际发送的时间戳(ms),仅用于发送节拍日志统计间隔;-1 表示尚未发送过 |
|
|
// 上一包音频实际发送的时间戳(ms),仅用于发送节拍日志统计间隔;-1 表示尚未发送过 |
|
|
private var lastAudioSendTime = -1L |
|
|
private var lastAudioSendTime = -1L |
|
|
|
|
|
// 上一次真正 BLE write(gatt.writeCharacteristic)的时间戳(ms),用于逐包日志统计相邻 write 间隔; |
|
|
|
|
|
// 与 lastAudioSendTime(拍级)区分:一拍拆多写时这里能反映每个真实 BLE 包的下发节奏。-1 表示尚未 write 过 |
|
|
|
|
|
private var lastBleWriteTime = -1L |
|
|
// 下行写入连续失败(底层发送缓冲拥塞)的计数,用于节流告警与恢复提示;写成功即清零 |
|
|
// 下行写入连续失败(底层发送缓冲拥塞)的计数,用于节流告警与恢复提示;写成功即清零 |
|
|
private var writeFailRetryCount = 0 |
|
|
private var writeFailRetryCount = 0 |
|
|
// 因静音帧模板尚未就绪而暂缓下发的连续拍数,用于节流告警;一旦模板就绪即清零 |
|
|
// 因静音帧模板尚未就绪而暂缓下发的连续拍数,用于节流告警;一旦模板就绪即清零 |
|
|
@ -1694,6 +1697,7 @@ object BleService { |
|
|
var writeCount = 0 |
|
|
var writeCount = 0 |
|
|
var congested = false |
|
|
var congested = false |
|
|
while (sentFrames < n) { |
|
|
while (sentFrames < n) { |
|
|
|
|
|
val startFrame = sentFrames |
|
|
val chunkFrames = minOf(framesPerWrite, n - sentFrames) |
|
|
val chunkFrames = minOf(framesPerWrite, n - sentFrames) |
|
|
val packet = buildInterleavedPacket(sentFrames, chunkFrames, frameBytes, leftFrames, rightFrames, silence) |
|
|
val packet = buildInterleavedPacket(sentFrames, chunkFrames, frameBytes, leftFrames, rightFrames, silence) |
|
|
// 同步写入,拿到真实的成功/失败:false=底层发送缓冲已满(拥塞),作为背压信号 |
|
|
// 同步写入,拿到真实的成功/失败:false=底层发送缓冲已满(拥塞),作为背压信号 |
|
|
@ -1704,6 +1708,16 @@ object BleService { |
|
|
sentFrames += chunkFrames |
|
|
sentFrames += chunkFrames |
|
|
sentBytes += packet.size |
|
|
sentBytes += packet.size |
|
|
writeCount++ |
|
|
writeCount++ |
|
|
|
|
|
// 逐包(每次真正 BLE write)的大小与相邻间隔:size=本包字节数(=2×chunkFrames×frameBytes,lrlr 交织)、 |
|
|
|
|
|
// Δw=距上次 write 间隔ms、off=本包起始帧号(一拍拆多写时用来核对交织续接)。 |
|
|
|
|
|
// Δw 无论真实/静音都更新以保持准确;日志仅在有真实译音时逐包打,纯静音沿用拍级节流不刷屏。 |
|
|
|
|
|
val wnow = System.currentTimeMillis() |
|
|
|
|
|
val wDelta = if (lastBleWriteTime < 0) 0 else wnow - lastBleWriteTime |
|
|
|
|
|
lastBleWriteTime = wnow |
|
|
|
|
|
if (hasRealAudio) { |
|
|
|
|
|
CallLog.i(TAG, "BLE write seq=$packetSeq #$writeCount size=${packet.size}B Δw=${wDelta}ms " + |
|
|
|
|
|
"帧=${chunkFrames}/声道(lrlr) off=$startFrame") |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (congested) { |
|
|
if (congested) { |
|
|
@ -1815,6 +1829,7 @@ object BleService { |
|
|
audioBuffer.clear() // 清空音频缓冲区 |
|
|
audioBuffer.clear() // 清空音频缓冲区 |
|
|
packetSeq = 0 // 复位下行包序号 |
|
|
packetSeq = 0 // 复位下行包序号 |
|
|
lastAudioSendTime = -1L // 重置发送节拍计时,下次首包 Δ 从 0 开始 |
|
|
lastAudioSendTime = -1L // 重置发送节拍计时,下次首包 Δ 从 0 开始 |
|
|
|
|
|
lastBleWriteTime = -1L // 重置逐包 write 计时,下次首个 BLE write 的 Δw 从 0 开始 |
|
|
writeFailRetryCount = 0 // 重置写入拥塞计数 |
|
|
writeFailRetryCount = 0 // 重置写入拥塞计数 |
|
|
silenceNotReadyCount = 0 |
|
|
silenceNotReadyCount = 0 |
|
|
silentPacketCount = 0 |
|
|
silentPacketCount = 0 |
|
|
|