Setup equalizer
This commit is contained in:
parent
2c0dad101c
commit
709c2205e5
5 changed files with 69 additions and 20 deletions
|
@ -1,7 +1,6 @@
|
|||
package com.simplemobiletools.musicplayer.activities
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.media.MediaPlayer
|
||||
import android.media.audiofx.Equalizer
|
||||
import android.os.Bundle
|
||||
import android.widget.SeekBar
|
||||
|
@ -16,10 +15,11 @@ import com.simplemobiletools.commons.views.MySeekBar
|
|||
import com.simplemobiletools.musicplayer.R
|
||||
import com.simplemobiletools.musicplayer.extensions.config
|
||||
import com.simplemobiletools.musicplayer.helpers.EQUALIZER_PRESET_CUSTOM
|
||||
import com.simplemobiletools.musicplayer.services.MusicService
|
||||
import com.simplemobiletools.musicplayer.services.playback.SimpleEqualizer
|
||||
import kotlinx.android.synthetic.main.activity_equalizer.*
|
||||
import kotlinx.android.synthetic.main.equalizer_band.view.*
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class EqualizerActivity : SimpleActivity() {
|
||||
private var bands = HashMap<Short, Int>()
|
||||
|
@ -42,15 +42,12 @@ class EqualizerActivity : SimpleActivity() {
|
|||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun initMediaPlayer() {
|
||||
val equalizer = MusicService.mEqualizer ?: run {
|
||||
val audioSessionId = MusicService.mPlayer?.getAudioSessionId() ?: MediaPlayer().audioSessionId
|
||||
Equalizer(0, audioSessionId)
|
||||
}
|
||||
val equalizer = SimpleEqualizer.instance
|
||||
try {
|
||||
if (!equalizer.enabled) {
|
||||
equalizer.enabled = true
|
||||
}
|
||||
} catch (e: IllegalStateException) {
|
||||
} catch (ignored: IllegalStateException) {
|
||||
}
|
||||
|
||||
setupBands(equalizer)
|
||||
|
@ -65,6 +62,7 @@ class EqualizerActivity : SimpleActivity() {
|
|||
equalizer_preset.setTextColor(presetTextColor)
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun setupBands(equalizer: Equalizer) {
|
||||
val minValue = equalizer.bandLevelRange[0]
|
||||
val maxValue = equalizer.bandLevelRange[1]
|
||||
|
@ -92,16 +90,16 @@ class EqualizerActivity : SimpleActivity() {
|
|||
this.equalizer_band_seek_bar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
|
||||
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
|
||||
if (fromUser) {
|
||||
val newProgress = Math.round(progress / 100.0) * 100
|
||||
this@apply.equalizer_band_seek_bar.progress = newProgress.toInt()
|
||||
val newProgress = (progress / 100.0).roundToInt() * 100
|
||||
this@apply.equalizer_band_seek_bar.progress = newProgress
|
||||
|
||||
val newValue = newProgress + minValue
|
||||
try {
|
||||
if ((MusicService.mEqualizer ?: equalizer).getBandLevel(band.toShort()) != newValue.toShort()) {
|
||||
(MusicService.mEqualizer ?: equalizer).setBandLevel(band.toShort(), newValue.toShort())
|
||||
bands[band.toShort()] = newValue.toInt()
|
||||
if (equalizer.getBandLevel(band.toShort()) != newValue.toShort()) {
|
||||
equalizer.setBandLevel(band.toShort(), newValue.toShort())
|
||||
bands[band.toShort()] = newValue
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
} catch (ignored: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -169,10 +167,10 @@ class EqualizerActivity : SimpleActivity() {
|
|||
|
||||
bandSeekBars[band].progress = progress!!.toInt()
|
||||
val newValue = progress + minValue
|
||||
(MusicService.mEqualizer ?: equalizer).setBandLevel(band.toShort(), newValue.toShort())
|
||||
equalizer.setBandLevel(band.toShort(), newValue.toShort())
|
||||
}
|
||||
} else {
|
||||
val presetName = (MusicService.mEqualizer ?: equalizer).getPresetName(presetId.toShort())
|
||||
val presetName = equalizer.getPresetName(presetId.toShort())
|
||||
if (presetName.isEmpty()) {
|
||||
config.equalizerPreset = EQUALIZER_PRESET_CUSTOM
|
||||
equalizer_preset.text = getString(R.string.custom)
|
||||
|
@ -180,11 +178,11 @@ class EqualizerActivity : SimpleActivity() {
|
|||
equalizer_preset.text = presetName
|
||||
}
|
||||
|
||||
(MusicService.mEqualizer ?: equalizer).usePreset(presetId.toShort())
|
||||
equalizer.usePreset(presetId.toShort())
|
||||
|
||||
val lowestBandLevel = (MusicService.mEqualizer ?: equalizer).bandLevelRange?.get(0)
|
||||
for (band in 0 until (MusicService.mEqualizer ?: equalizer).numberOfBands) {
|
||||
val level = (MusicService.mEqualizer ?: equalizer).getBandLevel(band.toShort()).minus(lowestBandLevel!!)
|
||||
val lowestBandLevel = equalizer.bandLevelRange?.get(0)
|
||||
for (band in 0 until equalizer.numberOfBands) {
|
||||
val level = equalizer.getBandLevel(band.toShort()).minus(lowestBandLevel!!)
|
||||
bandSeekBars[band].progress = level
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ class PlaybackService : MediaLibraryService() {
|
|||
releaseMediaSession()
|
||||
clearListener()
|
||||
stopSleepTimer()
|
||||
SimpleEqualizer.release()
|
||||
}
|
||||
|
||||
private fun initializeLibrary() {
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
package com.simplemobiletools.musicplayer.services.playback
|
||||
|
||||
import android.content.Context
|
||||
import android.media.audiofx.Equalizer
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.simplemobiletools.commons.extensions.toast
|
||||
import com.simplemobiletools.musicplayer.R
|
||||
import com.simplemobiletools.musicplayer.extensions.config
|
||||
import com.simplemobiletools.musicplayer.helpers.EQUALIZER_PRESET_CUSTOM
|
||||
import com.simplemobiletools.musicplayer.services.playback.player.SimpleMusicPlayer
|
||||
|
||||
@UnstableApi
|
||||
object SimpleEqualizer {
|
||||
lateinit var instance: Equalizer
|
||||
internal set
|
||||
|
||||
fun setupEqualizer(context: Context, player: SimpleMusicPlayer) {
|
||||
try {
|
||||
val preset = context.config.equalizerPreset
|
||||
instance = Equalizer(0, player.exoPlayer.audioSessionId)
|
||||
if (!instance.enabled) {
|
||||
instance.enabled = true
|
||||
}
|
||||
|
||||
if (preset != EQUALIZER_PRESET_CUSTOM) {
|
||||
instance.usePreset(preset.toShort())
|
||||
} else {
|
||||
val minValue = instance.bandLevelRange[0]
|
||||
val bandType = object : TypeToken<HashMap<Short, Int>>() {}.type
|
||||
val equalizerBands = Gson().fromJson<HashMap<Short, Int>>(context.config.equalizerBands, bandType) ?: HashMap()
|
||||
|
||||
for ((key, value) in equalizerBands) {
|
||||
val newValue = value + minValue
|
||||
if (instance.getBandLevel(key) != newValue.toShort()) {
|
||||
instance.setBandLevel(key, newValue.toShort())
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ignored: Exception) {
|
||||
context.toast(R.string.unknown_error_occurred)
|
||||
}
|
||||
}
|
||||
|
||||
fun release() = instance.release()
|
||||
}
|
|
@ -17,6 +17,7 @@ import com.simplemobiletools.musicplayer.extensions.config
|
|||
import com.simplemobiletools.musicplayer.extensions.setRepeatMode
|
||||
import com.simplemobiletools.musicplayer.helpers.SEEK_INTERVAL_MS
|
||||
import com.simplemobiletools.musicplayer.services.playback.PlaybackService
|
||||
import com.simplemobiletools.musicplayer.services.playback.SimpleEqualizer
|
||||
import com.simplemobiletools.musicplayer.services.playback.getCustomLayout
|
||||
import com.simplemobiletools.musicplayer.services.playback.getMediaSessionCallback
|
||||
|
||||
|
@ -37,6 +38,7 @@ internal fun PlaybackService.initializeSessionAndPlayer(handleAudioFocus: Boolea
|
|||
setPlaybackSpeed(config.playbackSpeed)
|
||||
shuffleModeEnabled = config.isShuffleEnabled
|
||||
mediaSession.setCustomLayout(getCustomLayout())
|
||||
SimpleEqualizer.setupEqualizer(this@initializeSessionAndPlayer, player)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,9 +3,10 @@ package com.simplemobiletools.musicplayer.services.playback.player
|
|||
import androidx.media3.common.ForwardingPlayer
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import androidx.media3.exoplayer.ExoPlayer
|
||||
|
||||
@UnstableApi
|
||||
class SimpleMusicPlayer(player: Player) : ForwardingPlayer(player) {
|
||||
class SimpleMusicPlayer(val exoPlayer: ExoPlayer) : ForwardingPlayer(exoPlayer) {
|
||||
|
||||
/**
|
||||
* The default implementation only advertises the seek to next and previous item in the case
|
||||
|
|
Loading…
Reference in a new issue