From b0bf837a925b2f99fb6a01d17ec189ee46fdd679 Mon Sep 17 00:00:00 2001 From: ua1zbe Date: Tue, 18 Aug 2026 15:21:29 +0300 Subject: [PATCH] Force RX meter to zero 600ms after signal ends; silence threshold --- app/src/main/java/ru/ua1zbe/svxremote/audio/OpusEngine.kt | 4 +++- app/src/main/java/ru/ua1zbe/svxremote/ui/SMeterView.kt | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ru/ua1zbe/svxremote/audio/OpusEngine.kt b/app/src/main/java/ru/ua1zbe/svxremote/audio/OpusEngine.kt index 3465bc9..f800e2e 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/audio/OpusEngine.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/audio/OpusEngine.kt @@ -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++ diff --git a/app/src/main/java/ru/ua1zbe/svxremote/ui/SMeterView.kt b/app/src/main/java/ru/ua1zbe/svxremote/ui/SMeterView.kt index 8dc2b4a..3de0721 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/ui/SMeterView.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/ui/SMeterView.kt @@ -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) }