Force RX meter to zero 600ms after signal ends; silence threshold
This commit is contained in:
@@ -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++
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user