Force RX meter to zero 600ms after signal ends; silence threshold

This commit is contained in:
ua1zbe
2026-08-18 15:21:29 +03:00
parent 88739f17a9
commit b0bf837a92
2 changed files with 7 additions and 1 deletions

View File

@@ -212,7 +212,9 @@ class OpusEngine(
// Уровень показываем только для реальных пакетов: во время
// скрытия потерь (conceal) шкала должна быть в нуле
val real = System.currentTimeMillis() - lastRealPacketTime < 400
onLevel(SRC_SPEAKER, if (real) pcmLevel(pcm) else 0f)
val lvl = if (real) pcmLevel(pcm) else 0f
// Порог тишины: шум декодера и паузы речи — в ноль
onLevel(SRC_SPEAKER, if (lvl < 0.02f) 0f else lvl)
if (dbgOut < 5) {
Log.d(TAG, "out ${pcm.size}B")
dbgOut++

View File

@@ -44,10 +44,13 @@ class SMeterView @JvmOverloads constructor(
private var target = 0f
private var shown = 0f
private var peak = 0f
private var lastActive = 0L
private val handler = Handler(Looper.getMainLooper())
private val ticker = object : Runnable {
override fun run() {
// Гарантированный сброс: если сигнала не было 600 мс — в ноль
if (System.currentTimeMillis() - lastActive > 600 && target != 0f) target = 0f
// Сглаживание уровня и медленный спад пика
shown += (target - shown) * 0.35f
if (Math.abs(target - shown) < 0.002f) shown = target
@@ -64,6 +67,7 @@ class SMeterView @JvmOverloads constructor(
}
fun setLevel(level: Float) {
if (level > 0.01f) lastActive = System.currentTimeMillis()
target = level.coerceIn(0f, 1f)
}