mirror of
https://github.com/antebudimir/tempus.git
synced 2025-12-31 09:33:33 +00:00
fix: Add listener to enable equalizer when audioSessionId changes (#235)
This commit is contained in:
commit
17713ee400
2 changed files with 53 additions and 11 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue