[Android] Fix equalizer preamp visual lag and room call flood

Nicolas Pomepuy git at videolan.org
Thu Jun 4 12:32:44 UTC 2026


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Tue Jun  2 08:47:01 2026 +0200| [57759806d3ff2ca27ff1a7534813a4b2828a6027] | committer: Nicolas Pomepuy

Fix equalizer preamp visual lag and room call flood

Fixes #3336

> https://code.videolan.org/videolan/vlc-android/commit/57759806d3ff2ca27ff1a7534813a4b2828a6027
---

 .../vlc/gui/dialogs/EqualizerFragmentDialog.kt     |  2 +-
 .../videolan/vlc/viewmodels/EqualizerViewModel.kt  | 30 +++++++++++++++++-----
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
index 77b9e396b2..bc86138ccc 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/EqualizerFragmentDialog.kt
@@ -376,7 +376,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment(), Slider.OnChangeL
     override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
         if (!fromUser) return
         viewModel.saveInHistory(-1)
-        viewModel.updateCurrentPreamp(requireActivity(), binding.equalizerPreamp.value)
+        viewModel.updateCurrentPreamp(binding.equalizerPreamp.value)
     }
 
 
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
index 60cec438d2..27ff875a33 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/EqualizerViewModel.kt
@@ -35,6 +35,9 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.asLiveData
 import androidx.lifecycle.viewModelScope
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 import org.videolan.libvlc.MediaPlayer
 import org.videolan.resources.AndroidDevices
@@ -68,6 +71,12 @@ class EqualizerViewModel(context: Context, private val equalizerRepository: Equa
     var presetToDelete:EqualizerWithBands? = null
     private var oldEqualizer: EqualizerWithBands? = null
 
+    private val preampFlow = MutableSharedFlow<Float>(
+        replay = 0,
+        extraBufferCapacity = 1,
+        onBufferOverflow = BufferOverflow.DROP_OLDEST
+    )
+
     val equalizerUnfilteredEntries = equalizerRepository.equalizerEntriesUnfiltered.asLiveData()
     val equalizerEntries = MediatorLiveData<List<EqualizerWithBands>>().apply {
         addSource(equalizerUnfilteredEntries) {
@@ -93,6 +102,19 @@ class EqualizerViewModel(context: Context, private val equalizerRepository: Equa
         viewModelScope.launch(Dispatchers.IO) {
             currentEqualizerId = equalizerRepository.getCurrentEqualizer(context).equalizerEntry.id
         }
+        // Collect the preamp values and limit the update to once every 100ms to prevent visual lag and too much room calls
+        viewModelScope.launch(Dispatchers.IO) {
+            preampFlow.collect { f ->
+                val currentEqualizer = equalizerEntries.value?.firstOrNull { it.equalizerEntry.id == currentEqualizerId }
+                if (currentEqualizer != null && currentEqualizer.equalizerEntry.preamp != f) {
+                    equalizerRepository.addOrUpdateEqualizerWithBands(
+                        context,
+                        currentEqualizer.copy(equalizerEntry = currentEqualizer.equalizerEntry.copy(preamp = f).apply { id = currentEqualizer.equalizerEntry.id })
+                    )
+                }
+                delay(100)
+            }
+        }
     }
 
     fun insert(context: Context, equalizerWithBands: EqualizerWithBands) = viewModelScope.launch(Dispatchers.IO) {
@@ -139,12 +161,8 @@ class EqualizerViewModel(context: Context, private val equalizerRepository: Equa
         return equalizerEntries.value!!.first { it.equalizerEntry.id == currentEqualizerId }
     }
 
-    fun updateCurrentPreamp(context: Context, f: Float) = viewModelScope.launch(Dispatchers.IO) {
-        val currentEqualizer = getCurrentEqualizer()
-        equalizerRepository.addOrUpdateEqualizerWithBands(
-            context,
-            currentEqualizer.copy(equalizerEntry = currentEqualizer.equalizerEntry.copy(preamp = f).apply { id = currentEqualizer.equalizerEntry.id })
-        )
+    fun updateCurrentPreamp(f: Float) {
+        preampFlow.tryEmit(f)
     }
 
     fun updateEqualizerBands(context: Context, bands: List<EqualizerBand>) = viewModelScope.launch(Dispatchers.IO) {



More information about the Android mailing list