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) шкала должна быть в нуле // скрытия потерь (conceal) шкала должна быть в нуле
val real = System.currentTimeMillis() - lastRealPacketTime < 400 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) { if (dbgOut < 5) {
Log.d(TAG, "out ${pcm.size}B") Log.d(TAG, "out ${pcm.size}B")
dbgOut++ dbgOut++

View File

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