universal7885: FMRadio: Adapt to AIDL

This commit is contained in:
roynatech2544 2022-10-06 14:11:09 +00:00
commit 365fa56736
5 changed files with 62 additions and 30 deletions

View file

@ -4,6 +4,7 @@ android_app {
"src/**/*.kt",
],
platform_apis: true,
jni_libs: ["libaudiohack"],
certificate: "platform",
static_libs: [
"androidx.core_core",

View file

@ -19,7 +19,7 @@ import com.eurekateam.fmradio.utils.Log
class FMRadioService : Service() {
private lateinit var mContext: Context
private lateinit var mAudioManager: AudioManager
private lateinit var mTracks: LongArray
private lateinit var mTracks: IntArray
private lateinit var mNativeFMInterface: NativeFMInterface
override fun onBind(intent: Intent?): IBinder? {
return null

View file

@ -47,7 +47,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var mAlertImage: AppCompatImageView
private lateinit var mAudioManager: AudioManager
override fun onCreate(savedInstanceState: Bundle?) {
System.loadLibrary("fmnative_jni")
System.loadLibrary("audiohack")
MainFragment.fd = mFMInterface.openFMDevice()
mAlertView = (getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater)
.inflate(R.layout.alertdialog, null)

View file

@ -1,25 +1,57 @@
package com.eurekateam.fmradio
import vendor.eureka.hardware.fmradio.IFMDevControl
import vendor.eureka.hardware.fmradio.IFMSysfsSupport
import vendor.eureka.hardware.fmradio.GetType
import vendor.eureka.hardware.fmradio.SetType
import vendor.eureka.hardware.fmradio.Direction
import android.os.ServiceManager
class NativeFMInterface {
external fun openFMDevice(): Int
external fun getFMFreq(fd: Int): Long
external fun setFMFreq(fd: Int, freq: Int): Int
external fun setFMVolume(fd: Int, volume: Int /* 1 - 15 */): Int
external fun setFMMute(fd: Int, mute: Boolean): Int
external fun getFmUpper(fd: Int): Int
external fun getFMLower(fd: Int): Int
external fun getRMSSI(fd: Int): Int
external fun getFMTracks(fd: Int): LongArray
external fun setFMStereo(fd: Int): Int
external fun setFMMono(fd: Int): Int
external fun setFMThread(fd: Int, run: Boolean): Int
external fun setFMBoot(fd: Int)
external fun getNextChannel(fd: Int): Int
external fun getBeforeChannel(fd: Int): Int
external fun getAudioChannel(fd: Int): Boolean // Stereo == true, Mono == false
external fun stopSearching(fd: Int)
external fun setFMRSSI(fd: Int, rssi: Long): Int
external fun closeFMDevice(fd: Int)
external fun getSysfsSupport(): Boolean
external fun setAudioRoute(speaker: Boolean): Int
private val mDevCtl : IFMDevControl
private val mSysfsCtl : IFMSysfsSupport
private var mSysfs = false
init {
mDevCtl = IFMDevControl.Stub.asInterface(ServiceManager.waitForDeclaredService("vendor.eureka.hardware.fmradio.IFMDevControl/default"))
mSysfsCtl = IFMSysfsSupport.Stub.asInterface(ServiceManager.waitForDeclaredService("vendor.eureka.hardware.fmradio.IFMSysfsSupport/default"))
mSysfs = mSysfsCtl.isAvailable()
}
fun openFMDevice(): Int {
mDevCtl.open()
return 1
}
fun getFMFreq(a: Int): Long = mDevCtl.getValue(GetType.GET_TYPE_FM_FREQ).toLong()
fun setFMFreq(a: Int, freq: Int) = mDevCtl.setValue(SetType.SET_TYPE_FM_FREQ, freq)
fun setFMVolume(a: Int, volume: Int) = mDevCtl.setValue(SetType.SET_TYPE_FM_VOLUME, volume)
fun setFMMute(a: Int, mute: Boolean) = mDevCtl.setValue(SetType.SET_TYPE_FM_MUTE, if (mute) 1 else 0)
fun getFmUpper(a: Int) : Int = mDevCtl.getValue(GetType.GET_TYPE_FM_UPPER_LIMIT)
fun getFMLower(a: Int): Int = mDevCtl.getValue(GetType.GET_TYPE_FM_LOWER_LIMIT)
fun getRMSSI(a: Int): Int = mDevCtl.getValue(GetType.GET_TYPE_FM_RMSSI)
fun getFMTracks(fd: Int): IntArray = if (mSysfs) {
var mRes = intArrayOf()
for (a in 1..30) {
mSysfsCtl.adjustFreqByStep(Direction.UP)
var freq = mSysfsCtl.getFreqFromSysfs()
if (mRes.contains(freq)) continue else mRes += freq
}
mRes
} else mDevCtl.getFreqsList()
fun setFMThread(a: Int, run: Boolean) = mDevCtl.setValue(SetType.SET_TYPE_FM_THREAD, if (run) 1 else 0)
fun getNextChannel(a: Int): Int = if (mSysfs) {
mSysfsCtl.adjustFreqByStep(Direction.UP)
mSysfsCtl.getFreqFromSysfs()
} else mDevCtl.getValue(GetType.GET_TYPE_FM_NEXT_CHANNEL)
fun getBeforeChannel(a: Int): Int = if (mSysfs) {
mSysfsCtl.adjustFreqByStep(Direction.DOWN)
mSysfsCtl.getFreqFromSysfs()
} else mDevCtl.getValue(GetType.GET_TYPE_FM_BEFORE_CHANNEL)
fun stopSearching(a: Int) = mDevCtl.setValue(SetType.SET_TYPE_FM_SEARCH_CANCEL, 0)
fun setFMRSSI(a: Int, rssi: Long) = mDevCtl.setValue(SetType.SET_TYPE_FM_RMSSI, rssi.toInt())
fun closeFMDevice(fd: Int) = mDevCtl.close()
fun getSysfsSupport(): Boolean = mSysfs
external fun setAudioRoute(speaker: Boolean): Int
}

View file

@ -166,7 +166,6 @@ class MainFragment :
} else {
mFreqCurrent = mFMInterface.getFMLower(fd)
}
mFMInterface.setFMBoot(fd)
mFreqCurrent = mFMInterface.getFMFreq(fd).toInt()
mFMInterface.setFMFreq(fd, mFreqCurrent)
withContext(Dispatchers.Main) {
@ -395,7 +394,7 @@ class MainFragment :
var mFreqCurrent = -1
private var mFMPower = false
var mHeadSetPlugged: HeadsetState = HeadsetState.HEADSET_STATE_DISCONNECTED
var mTracks: LongArray = emptyArray<Long>().toLongArray()
var mTracks: IntArray = emptyArray<Int>().toIntArray()
fun mRefreshTracks() {
NativeFMInterface().setFMFreq(fd, NativeFMInterface().getFMLower(fd))
mTracks = NativeFMInterface().getFMTracks(fd)
@ -403,13 +402,13 @@ class MainFragment :
(mFreqCurrent != -1).let { NativeFMInterface().setFMFreq(fd, mFreqCurrent) }
}
fun getIndex(): Int {
return mTracks.indexOf(mFreqCurrent.toLong())
return mTracks.indexOf(mFreqCurrent)
}
val mFavStats = HashMap<Int, Boolean>(30)
}
/**
* Helper function to remove zero values on a [LongArray].
* Helper function to remove zero values on a [IntArray].
* Since we don't know the channel count, we initialize it with size 30.
* But most likely the channel count is less then 30, so remaining values
* are filled with zero.
@ -417,14 +416,14 @@ class MainFragment :
* @param array The target Long array
* @return Long array with zeros removed
*/
private fun removeZeros(array: LongArray): LongArray {
val mArray: MutableList<Long> = emptyList<Long>().toMutableList()
private fun removeZeros(array: IntArray): IntArray {
val mArray: MutableList<Int> = emptyList<Int>().toMutableList()
Log.d("removeZeros: Got array size ${array.size}")
for (i in array.indices) {
if (array[i] > 0L) {
mArray.add(array[i])
}
}
return mArray.toLongArray()
return mArray.toIntArray()
}
}