mirror of
https://github.com/chararomandroid/android_device_samsung_a20
synced 2026-08-21 19:55:33 -04:00
universal7885: FMRadio: Adapt to AIDL
This commit is contained in:
parent
6fdc377216
commit
365fa56736
5 changed files with 62 additions and 30 deletions
|
|
@ -4,6 +4,7 @@ android_app {
|
|||
"src/**/*.kt",
|
||||
],
|
||||
platform_apis: true,
|
||||
jni_libs: ["libaudiohack"],
|
||||
certificate: "platform",
|
||||
static_libs: [
|
||||
"androidx.core_core",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue