You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.3 KiB
129 lines
4.3 KiB
package com.frank.androidmedia.controller
|
|
|
|
import android.R
|
|
import android.content.Context
|
|
import android.media.audiofx.BassBoost
|
|
import android.media.audiofx.Equalizer
|
|
import android.media.audiofx.PresetReverb
|
|
import android.util.Log
|
|
import android.util.Pair
|
|
import android.view.View
|
|
import android.widget.AdapterView
|
|
import android.widget.ArrayAdapter
|
|
import android.widget.SeekBar
|
|
import android.widget.Spinner
|
|
import com.frank.androidmedia.listener.AudioEffectCallback
|
|
import java.util.ArrayList
|
|
|
|
/**
|
|
* AudioEffect: Equalizer、PresetReverb
|
|
*
|
|
* @author frank
|
|
* @date 2022/3/23
|
|
*/
|
|
open class AudioEffectController(audioEffectCallback: AudioEffectCallback) {
|
|
|
|
companion object {
|
|
val TAG: String = AudioEffectController::class.java.simpleName
|
|
}
|
|
|
|
private var bands: Short = 0
|
|
private var minEQLevel: Short = 0
|
|
private var mEqualizer: Equalizer? = null
|
|
|
|
private var mPresetReverb: PresetReverb? = null
|
|
private val reverbValues = ArrayList<String>()
|
|
|
|
private var mBass: BassBoost? = null
|
|
|
|
private var mAudioEffectCallback: AudioEffectCallback? = null
|
|
|
|
private val presetReverb = arrayOf("None", "SmallRoom", "MediumRoom", "LargeRoom",
|
|
"MediumHall", "LargeHall", "Plate")
|
|
|
|
init {
|
|
mAudioEffectCallback = audioEffectCallback
|
|
}
|
|
|
|
/**
|
|
* Setup AudioEffect of Equalizer, which has centerFrequency、band、bandLevel
|
|
*/
|
|
fun setupEqualizer(audioSessionId: Int) {
|
|
val equalizerList = ArrayList<Pair<*, *>>()
|
|
mEqualizer = Equalizer(0, audioSessionId)
|
|
mEqualizer!!.enabled = true
|
|
// band level: min and max
|
|
minEQLevel = mEqualizer!!.bandLevelRange[0]//min level
|
|
val maxEQLevel = mEqualizer!!.bandLevelRange[1] // max level
|
|
bands = mEqualizer!!.numberOfBands
|
|
for (i in 0 until bands) {
|
|
val centerFreq = (mEqualizer!!.getCenterFreq(i.toShort()) / 1000).toString() + " Hz"
|
|
val pair = Pair.create(centerFreq, mEqualizer!!.getBandLevel(i.toShort()) - minEQLevel)
|
|
equalizerList.add(pair)
|
|
}
|
|
mAudioEffectCallback?.setEqualizerList(maxEQLevel - minEQLevel, equalizerList)
|
|
}
|
|
|
|
/**
|
|
* Setup preset style, which associates to Equalizer
|
|
*/
|
|
fun setupPresetStyle(context: Context, spinnerStyle: Spinner) {
|
|
for (i in 0 until mEqualizer!!.numberOfPresets) {
|
|
reverbValues.add(mEqualizer!!.getPresetName(i.toShort()))
|
|
}
|
|
|
|
spinnerStyle.adapter = ArrayAdapter(context, R.layout.simple_spinner_item, reverbValues)
|
|
spinnerStyle.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
|
override fun onItemSelected(arg0: AdapterView<*>, arg1: View, arg2: Int, arg3: Long) {
|
|
try {
|
|
mEqualizer!!.usePreset(arg2.toShort())
|
|
val seekBarList: List<SeekBar>? = mAudioEffectCallback?.getSeeBarList()
|
|
if (bands > 0 && seekBarList != null && mEqualizer != null) {
|
|
for (band in 0 until bands) {
|
|
seekBarList[band].progress = mEqualizer!!.getBandLevel(band.toShort()) - minEQLevel
|
|
}
|
|
}
|
|
|
|
} catch (e: Exception) {
|
|
Log.e(TAG, "preset style error=$e")
|
|
}
|
|
|
|
}
|
|
|
|
override fun onNothingSelected(arg0: AdapterView<*>) {}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Setup AudioEffect of BassBoost
|
|
*/
|
|
fun setupBassBoost(audioSessionId: Int, barBassBoost: SeekBar) {
|
|
mBass = BassBoost(0, audioSessionId)
|
|
mBass!!.enabled = true
|
|
// 0~1000
|
|
barBassBoost.max = 1000
|
|
barBassBoost.progress = 0
|
|
barBassBoost.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
|
|
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
|
|
// set the strength of bass boost
|
|
mBass!!.setStrength(progress.toShort())
|
|
}
|
|
|
|
override fun onStartTrackingTouch(seekBar: SeekBar) {}
|
|
|
|
override fun onStopTrackingTouch(seekBar: SeekBar) {}
|
|
})
|
|
}
|
|
|
|
fun onEqualizerProgress(index: Int, progress: Int) {
|
|
mEqualizer!!.setBandLevel(index.toShort(), (progress + minEQLevel).toShort())
|
|
}
|
|
|
|
fun release() {
|
|
mBass?.release()
|
|
mEqualizer?.release()
|
|
mPresetReverb?.release()
|
|
}
|
|
|
|
|
|
} |