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", "src/**/*.kt",
], ],
platform_apis: true, platform_apis: true,
jni_libs: ["libaudiohack"],
certificate: "platform", certificate: "platform",
static_libs: [ static_libs: [
"androidx.core_core", "androidx.core_core",

View file

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

View file

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

View file

@ -1,25 +1,57 @@
package com.eurekateam.fmradio 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 { class NativeFMInterface {
external fun openFMDevice(): Int private val mDevCtl : IFMDevControl
external fun getFMFreq(fd: Int): Long private val mSysfsCtl : IFMSysfsSupport
external fun setFMFreq(fd: Int, freq: Int): Int private var mSysfs = false
external fun setFMVolume(fd: Int, volume: Int /* 1 - 15 */): Int
external fun setFMMute(fd: Int, mute: Boolean): Int init {
external fun getFmUpper(fd: Int): Int mDevCtl = IFMDevControl.Stub.asInterface(ServiceManager.waitForDeclaredService("vendor.eureka.hardware.fmradio.IFMDevControl/default"))
external fun getFMLower(fd: Int): Int mSysfsCtl = IFMSysfsSupport.Stub.asInterface(ServiceManager.waitForDeclaredService("vendor.eureka.hardware.fmradio.IFMSysfsSupport/default"))
external fun getRMSSI(fd: Int): Int mSysfs = mSysfsCtl.isAvailable()
external fun getFMTracks(fd: Int): LongArray }
external fun setFMStereo(fd: Int): Int
external fun setFMMono(fd: Int): Int fun openFMDevice(): Int {
external fun setFMThread(fd: Int, run: Boolean): Int mDevCtl.open()
external fun setFMBoot(fd: Int) return 1
external fun getNextChannel(fd: Int): Int }
external fun getBeforeChannel(fd: Int): Int
external fun getAudioChannel(fd: Int): Boolean // Stereo == true, Mono == false fun getFMFreq(a: Int): Long = mDevCtl.getValue(GetType.GET_TYPE_FM_FREQ).toLong()
external fun stopSearching(fd: Int) fun setFMFreq(a: Int, freq: Int) = mDevCtl.setValue(SetType.SET_TYPE_FM_FREQ, freq)
external fun setFMRSSI(fd: Int, rssi: Long): Int fun setFMVolume(a: Int, volume: Int) = mDevCtl.setValue(SetType.SET_TYPE_FM_VOLUME, volume)
external fun closeFMDevice(fd: Int) fun setFMMute(a: Int, mute: Boolean) = mDevCtl.setValue(SetType.SET_TYPE_FM_MUTE, if (mute) 1 else 0)
external fun getSysfsSupport(): Boolean fun getFmUpper(a: Int) : Int = mDevCtl.getValue(GetType.GET_TYPE_FM_UPPER_LIMIT)
external fun setAudioRoute(speaker: Boolean): Int 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 { } else {
mFreqCurrent = mFMInterface.getFMLower(fd) mFreqCurrent = mFMInterface.getFMLower(fd)
} }
mFMInterface.setFMBoot(fd)
mFreqCurrent = mFMInterface.getFMFreq(fd).toInt() mFreqCurrent = mFMInterface.getFMFreq(fd).toInt()
mFMInterface.setFMFreq(fd, mFreqCurrent) mFMInterface.setFMFreq(fd, mFreqCurrent)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
@ -395,7 +394,7 @@ class MainFragment :
var mFreqCurrent = -1 var mFreqCurrent = -1
private var mFMPower = false private var mFMPower = false
var mHeadSetPlugged: HeadsetState = HeadsetState.HEADSET_STATE_DISCONNECTED var mHeadSetPlugged: HeadsetState = HeadsetState.HEADSET_STATE_DISCONNECTED
var mTracks: LongArray = emptyArray<Long>().toLongArray() var mTracks: IntArray = emptyArray<Int>().toIntArray()
fun mRefreshTracks() { fun mRefreshTracks() {
NativeFMInterface().setFMFreq(fd, NativeFMInterface().getFMLower(fd)) NativeFMInterface().setFMFreq(fd, NativeFMInterface().getFMLower(fd))
mTracks = NativeFMInterface().getFMTracks(fd) mTracks = NativeFMInterface().getFMTracks(fd)
@ -403,13 +402,13 @@ class MainFragment :
(mFreqCurrent != -1).let { NativeFMInterface().setFMFreq(fd, mFreqCurrent) } (mFreqCurrent != -1).let { NativeFMInterface().setFMFreq(fd, mFreqCurrent) }
} }
fun getIndex(): Int { fun getIndex(): Int {
return mTracks.indexOf(mFreqCurrent.toLong()) return mTracks.indexOf(mFreqCurrent)
} }
val mFavStats = HashMap<Int, Boolean>(30) 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. * 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 * But most likely the channel count is less then 30, so remaining values
* are filled with zero. * are filled with zero.
@ -417,14 +416,14 @@ class MainFragment :
* @param array The target Long array * @param array The target Long array
* @return Long array with zeros removed * @return Long array with zeros removed
*/ */
private fun removeZeros(array: LongArray): LongArray { private fun removeZeros(array: IntArray): IntArray {
val mArray: MutableList<Long> = emptyList<Long>().toMutableList() val mArray: MutableList<Int> = emptyList<Int>().toMutableList()
Log.d("removeZeros: Got array size ${array.size}") Log.d("removeZeros: Got array size ${array.size}")
for (i in array.indices) { for (i in array.indices) {
if (array[i] > 0L) { if (array[i] > 0L) {
mArray.add(array[i]) mArray.add(array[i])
} }
} }
return mArray.toLongArray() return mArray.toIntArray()
} }
} }