[Android] New equalizer: add band listener and snapping

Nicolas Pomepuy git at videolan.org
Fri Jul 25 11:46:42 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Fri Jun  6 08:12:22 2025 +0200| [b30c120e32de2f431de36b68bf4021b5b336c0e6] | committer: Nicolas Pomepuy

New equalizer: add band listener and snapping

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

 .../vlc/gui/dialogs/EqualizerFragmentDialog.kt     | 65 +++++++++++++++++++++-
 1 file changed, 63 insertions(+), 2 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 8132ed07fc..d80e3361a2 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
@@ -49,6 +49,8 @@ import org.videolan.vlc.PlaybackService
 import org.videolan.vlc.R
 import org.videolan.vlc.databinding.DialogEqualizerBinding
 import org.videolan.vlc.gui.view.EqualizerBar
+import org.videolan.vlc.interfaces.OnEqualizerBarChangeListener
+import kotlin.math.absoluteValue
 import kotlin.math.roundToInt
 
 
@@ -195,8 +197,7 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment() {
             bar.layoutParams = params
             eqBandsViews.add(bar)
             bar.setSliderId(View.generateViewId())
-            //todo
-//            bar.setListener(BandListener(i))
+            bar.setListener(BandListener(i))
         }
         for (i in 0 until bandCount) {
             if (i > 0) eqBandsViews[i].nextFocusLeftId = eqBandsViews[i - 1].getSliderId()
@@ -324,6 +325,66 @@ class EqualizerFragmentDialog : VLCBottomSheetDialogFragment() {
         }
     }
 
+    /**
+     * Band listener
+     *
+     * @property index the band index
+     * @constructor Create empty Band listener
+     */
+    private inner class BandListener(private val index: Int) : OnEqualizerBarChangeListener {
+
+        private var oldBands: MutableList<Int> = ArrayList()
+
+
+        override fun onProgressChanged(value: Float, fromUser: Boolean) {
+            if (!fromUser)
+                return
+            equalizer.setAmp(index, value)
+            if (!binding.equalizerButton.isChecked)
+                binding.equalizerButton.isChecked = true
+
+            val pos = getCurrentPosition()
+            if (getEqualizerType(pos) == TYPE_PRESET) {
+                state.update(getCurrentPosition(), false)
+            } else if (getEqualizerType(pos) == TYPE_CUSTOM) {
+                state.update(pos, false)
+            }
+
+            /**
+             * Snap bands
+             */
+            if (binding.snapBands.isChecked && oldBands.isNotEmpty()) {
+                val delta = eqBandsViews[index].getProgress() - oldBands[index]
+                for (i in eqBandsViews.indices) {
+                    if (i == index) {
+                        continue
+                    }
+                    eqBandsViews[i].setProgress((oldBands[i] + delta / ((i - index).absoluteValue.let { it * it * it } + 1)).coerceIn(0, EqualizerBar.RANGE * 2))
+
+                    if (binding.equalizerButton.isChecked) {
+
+                        equalizer.setAmp(i, eqBandsViews[i].getValue())
+                    }
+
+                }
+            }
+
+            if (binding.equalizerButton.isChecked) PlaybackService.equalizer.value = equalizer
+
+        }
+
+        override fun onStartTrackingTouch() {
+            oldBands.clear()
+            for (eqBandsView in eqBandsViews) {
+                oldBands.add(eqBandsView.getProgress())
+            }
+        }
+
+        override fun onStopTrackingTouch() {
+            oldBands.clear()
+        }
+    }
+
 }
 
 



More information about the Android mailing list