fix: Add listener to enable equalizer when audioSessionId changes (#235)

This commit is contained in:
eddyizm 2025-11-06 15:40:39 -08:00 committed by GitHub
commit 17713ee400
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 53 additions and 11 deletions

View file

@ -82,6 +82,7 @@ class MediaService : MediaLibraryService() {
private const val CUSTOM_COMMAND_TOGGLE_REPEAT_MODE_ALL = private const val CUSTOM_COMMAND_TOGGLE_REPEAT_MODE_ALL =
"android.media3.session.demo.REPEAT_ALL" "android.media3.session.demo.REPEAT_ALL"
const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER" const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER"
const val ACTION_EQUALIZER_UPDATED = "com.cappielloantonio.tempo.service.EQUALIZER_UPDATED"
} }
fun updateMediaItems() { fun updateMediaItems() {
@ -283,16 +284,7 @@ class MediaService : MediaLibraryService() {
private fun initializeEqualizerManager() { private fun initializeEqualizerManager() {
equalizerManager = EqualizerManager() equalizerManager = EqualizerManager()
val audioSessionId = player.audioSessionId val audioSessionId = player.audioSessionId
if (equalizerManager.attachToSession(audioSessionId)) { attachEqualizerIfPossible(audioSessionId)
val enabled = Preferences.isEqualizerEnabled()
equalizerManager.setEnabled(enabled)
val bands = equalizerManager.getNumberOfBands()
val savedLevels = Preferences.getEqualizerBandLevels(bands)
for (i in 0 until bands) {
equalizerManager.setBandLevel(i.toShort(), savedLevels[i])
}
}
} }
private fun initializeMediaLibrarySession() { private fun initializeMediaLibrarySession() {
@ -426,6 +418,10 @@ class MediaService : MediaLibraryService() {
customLayout = librarySessionCallback.buildCustomLayout(player) customLayout = librarySessionCallback.buildCustomLayout(player)
mediaLibrarySession.setCustomLayout(customLayout) mediaLibrarySession.setCustomLayout(customLayout)
} }
override fun onAudioSessionIdChanged(audioSessionId: Int) {
attachEqualizerIfPossible(audioSessionId)
}
}) })
if (player.isPlaying) { if (player.isPlaying) {
scheduleWidgetUpdates() scheduleWidgetUpdates()
@ -541,6 +537,21 @@ class MediaService : MediaLibraryService() {
widgetUpdateScheduled = false widgetUpdateScheduled = false
} }
private fun attachEqualizerIfPossible(audioSessionId: Int): Boolean {
if (audioSessionId == 0 || audioSessionId == -1) return false
val attached = equalizerManager.attachToSession(audioSessionId)
if (attached) {
val enabled = Preferences.isEqualizerEnabled()
equalizerManager.setEnabled(enabled)
val bands = equalizerManager.getNumberOfBands()
val savedLevels = Preferences.getEqualizerBandLevels(bands)
for (i in 0 until bands) {
equalizerManager.setBandLevel(i.toShort(), savedLevels[i])
}
sendBroadcast(Intent(ACTION_EQUALIZER_UPDATED))
}
return attached
}
private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false) private fun getRenderersFactory() = DownloadUtil.buildRenderersFactory(this, false)

View file

@ -3,7 +3,9 @@ package com.cappielloantonio.tempo.ui.fragment
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.BroadcastReceiver
import android.os.Bundle import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import android.view.Gravity import android.view.Gravity
@ -12,6 +14,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.* import android.widget.*
import androidx.annotation.OptIn import androidx.annotation.OptIn
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import com.cappielloantonio.tempo.R import com.cappielloantonio.tempo.R
@ -28,6 +31,17 @@ class EqualizerFragment : Fragment() {
private lateinit var safeSpace: Space private lateinit var safeSpace: Space
private val bandSeekBars = mutableListOf<SeekBar>() private val bandSeekBars = mutableListOf<SeekBar>()
private var receiverRegistered = false
private val equalizerUpdatedReceiver = object : BroadcastReceiver() {
@OptIn(UnstableApi::class)
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == MediaService.ACTION_EQUALIZER_UPDATED) {
initUI()
restoreEqualizerPreferences()
}
}
}
private val connection = object : ServiceConnection { private val connection = object : ServiceConnection {
@OptIn(UnstableApi::class) @OptIn(UnstableApi::class)
override fun onServiceConnected(className: ComponentName, service: IBinder) { override fun onServiceConnected(className: ComponentName, service: IBinder) {
@ -49,12 +63,29 @@ class EqualizerFragment : Fragment() {
intent.action = MediaService.ACTION_BIND_EQUALIZER intent.action = MediaService.ACTION_BIND_EQUALIZER
requireActivity().bindService(intent, connection, Context.BIND_AUTO_CREATE) requireActivity().bindService(intent, connection, Context.BIND_AUTO_CREATE)
} }
if (!receiverRegistered) {
ContextCompat.registerReceiver(
requireContext(),
equalizerUpdatedReceiver,
IntentFilter(MediaService.ACTION_EQUALIZER_UPDATED),
ContextCompat.RECEIVER_NOT_EXPORTED
)
receiverRegistered = true
}
} }
override fun onStop() { override fun onStop() {
super.onStop() super.onStop()
requireActivity().unbindService(connection) requireActivity().unbindService(connection)
equalizerManager = null equalizerManager = null
if (receiverRegistered) {
try {
requireContext().unregisterReceiver(equalizerUpdatedReceiver)
} catch (_: Exception) {
// ignore if not registered
}
receiverRegistered = false
}
} }
override fun onCreateView( override fun onCreateView(
@ -234,4 +265,4 @@ class EqualizerFragment : Fragment() {
} }
private fun Int.dpToPx(context: Context): Int = private fun Int.dpToPx(context: Context): Int =
(this * context.resources.displayMetrics.density).toInt() (this * context.resources.displayMetrics.density).toInt()