|
|
@ -150,6 +150,9 @@ object BleService { |
|
|
private var lastRightSeq = -1L |
|
|
private var lastRightSeq = -1L |
|
|
// 下行写入连续失败(底层发送缓冲拥塞)的计数,用于节流告警与恢复提示;写成功即清零 |
|
|
// 下行写入连续失败(底层发送缓冲拥塞)的计数,用于节流告警与恢复提示;写成功即清零 |
|
|
private var writeFailRetryCount = 0 |
|
|
private var writeFailRetryCount = 0 |
|
|
|
|
|
// 延迟追踪:右声道(对方译音)每句首包写到 BLE 的时刻,配合 azure_speech 侧 [LAT-TRACE] 点1/点2 |
|
|
|
|
|
// 相减即得 app 内部"收到译音→写到耳机"耗时;间隔>700ms 视为新一句,避免逐包刷屏 |
|
|
|
|
|
private var latLastBleRightTs = 0L |
|
|
// 写失败(拥塞)后的退避时长(ms):给底层发送缓冲腾空的时间,再重试同一包,期间绝不丢包 |
|
|
// 写失败(拥塞)后的退避时长(ms):给底层发送缓冲腾空的时间,再重试同一包,期间绝不丢包 |
|
|
private const val WRITE_RETRY_BACKOFF_MS = 5L |
|
|
private const val WRITE_RETRY_BACKOFF_MS = 5L |
|
|
|
|
|
|
|
|
@ -1484,6 +1487,15 @@ object BleService { |
|
|
Log.i(TAG, "音频下行发送 ch=$chTag seq=$seq Δ=${deltaMs}ms size=${audioChunk.size}B " + |
|
|
Log.i(TAG, "音频下行发送 ch=$chTag seq=$seq Δ=${deltaMs}ms size=${audioChunk.size}B " + |
|
|
"lastSeq(L=$lastLeftSeq,R=$lastRightSeq)$gapTag " + |
|
|
"lastSeq(L=$lastLeftSeq,R=$lastRightSeq)$gapTag " + |
|
|
"hold(L=${leftHoldBuffer.size},R=${rightHoldBuffer.size}) queue=${audioSendQueue.size}") |
|
|
"hold(L=${leftHoldBuffer.size},R=${rightHoldBuffer.size}) queue=${audioSendQueue.size}") |
|
|
|
|
|
|
|
|
|
|
|
// [LAT-TRACE] 点3:右声道(对方译音)首包写到 BLE 耳机(每句首包)。 |
|
|
|
|
|
// 与 azure_speech 的 [LAT-TRACE] 点2(app收到译音) 同时钟相减 = app 内部下行耗时。 |
|
|
|
|
|
if (channelByte == OpusAudioManager.CHANNEL_RIGHT) { |
|
|
|
|
|
if (now - latLastBleRightTs > 700) { |
|
|
|
|
|
Log.i(TAG, "[LAT-TRACE] 3.译音写到BLE(右/对方) ts=$now seq=$seq") |
|
|
|
|
|
} |
|
|
|
|
|
latLastBleRightTs = now |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 固定节拍:睡到 nextSendAt 这个绝对时刻,把 poll/发送耗时算进同一周期,间隔不随它们抖动。 |
|
|
// 固定节拍:睡到 nextSendAt 这个绝对时刻,把 poll/发送耗时算进同一周期,间隔不随它们抖动。 |
|
|
@ -1548,6 +1560,7 @@ object BleService { |
|
|
lastLeftSeq = -1L // 重置左右声道包序追踪 |
|
|
lastLeftSeq = -1L // 重置左右声道包序追踪 |
|
|
lastRightSeq = -1L |
|
|
lastRightSeq = -1L |
|
|
writeFailRetryCount = 0 // 重置写入拥塞计数 |
|
|
writeFailRetryCount = 0 // 重置写入拥塞计数 |
|
|
|
|
|
latLastBleRightTs = 0L // 重置延迟追踪计时 |
|
|
Log.i(TAG, "音频发送线程已停止,队列和缓冲区已清空") |
|
|
Log.i(TAG, "音频发送线程已停止,队列和缓冲区已清空") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|