[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