mirror of
https://github.com/chararomandroid/android_device_samsung_a20
synced 2026-08-23 12:35: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",
|
"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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
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
|
external fun setAudioRoute(speaker: Boolean): Int
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue