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.
 
 
 
 
 
 
FFmpegAndroid/app/src/main/java/com/frank/ffmpeg/activity/EqualizerActivity.kt

121 lines
4.2 KiB

package com.frank.ffmpeg.activity
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.util.Pair
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.frank.ffmpeg.AudioPlayer
import com.frank.ffmpeg.R
import com.frank.ffmpeg.adapter.EqualizerAdapter
import com.frank.ffmpeg.listener.OnSeeBarListener
import java.lang.StringBuilder
import java.util.ArrayList
class EqualizerActivity : BaseActivity(), OnSeeBarListener {
// unit: Hz gain:0-20
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1b | 2b | 3b | 4b | 5b | 6b | 7b | 8b | 9b |
| 65 | 92 | 131 | 185 | 262 | 370 | 523 | 740 | 1047 |
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 10b | 11b | 12b | 13b | 14b | 15b | 16b | 17b | 18b |
| 1480 | 2093 | 2960 | 4186 | 5920 | 8372 | 11840 | 16744 | 20000 |
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
private val bandsList = intArrayOf(
65, 92, 131, 185, 262, 370,
523, 740, 1047, 1480, 2093, 2960,
4180, 5920, 8372, 11840, 16744, 20000)
private val selectBandList = IntArray(bandsList.size)
private val minEQLevel = 0
private var filterThread: Thread? = null
private var mAudioPlayer: AudioPlayer? = null
private var equalizerAdapter: EqualizerAdapter? = null
private var audioPath = Environment.getExternalStorageDirectory().path + "/know_play.mp3"
override val layoutId: Int
get() = R.layout.activity_equalizer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initView()
setupEqualizer()
doEqualize()
}
private fun initView() {
val equalizerView = findViewById<RecyclerView>(R.id.list_equalizer)
val layoutManager = LinearLayoutManager(this)
layoutManager.orientation = RecyclerView.VERTICAL
equalizerView.layoutManager = layoutManager
equalizerAdapter = EqualizerAdapter(this, this)
equalizerView.adapter = equalizerAdapter
}
private fun setupEqualizer() {
val equalizerList = ArrayList<Pair<*, *>>()
val maxEQLevel = 20
for (element in bandsList) {
val centerFreq = "$element Hz"
val pair = Pair.create(centerFreq, 0)
equalizerList.add(pair)
}
if (equalizerAdapter != null) {
equalizerAdapter!!.setMaxProgress(maxEQLevel - minEQLevel)
equalizerAdapter!!.setEqualizerList(equalizerList)
}
mAudioPlayer = AudioPlayer()
}
private fun doEqualize() {
doEqualize(0, 0)
}
private fun doEqualize(index: Int, progress: Int) {
if (filterThread == null) {
val filter = "superequalizer=6b=4:8b=5:10b=5"
filterThread = Thread(Runnable {
mAudioPlayer!!.play(audioPath, filter)
})
filterThread!!.start()
} else {
if (index < 0 || index >= selectBandList.size) return
selectBandList[index] = progress
val builder = StringBuilder()
builder.append("superequalizer=")
for (i in selectBandList.indices) {
if (selectBandList[i] > 0) {
builder.append(i + 1).append("b=").append(selectBandList[i]).append(":")
}
}
builder.deleteCharAt(builder.length - 1)
Log.e("Equalizer", "update filter=$builder")
mAudioPlayer!!.again(builder.toString())
}
}
override fun onProgress(index: Int, progress: Int) {
doEqualize(index, progress)
}
override fun onViewClick(view: View) {
}
override fun onSelectedFile(filePath: String) {
audioPath = filePath
}
override fun onDestroy() {
super.onDestroy()
if (filterThread != null) {
mAudioPlayer!!.release()
filterThread?.interrupt()
filterThread = null
}
}
}