diff --git a/universal7885-common/apps/FMRadio/Android.bp b/universal7885-common/apps/FMRadio/Android.bp index 52ea885..71c34be 100644 --- a/universal7885-common/apps/FMRadio/Android.bp +++ b/universal7885-common/apps/FMRadio/Android.bp @@ -4,6 +4,7 @@ android_app { "src/**/*.kt", ], platform_apis: true, + jni_libs: ["libaudiohack"], certificate: "platform", static_libs: [ "androidx.core_core", diff --git a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/FMRadioService.kt b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/FMRadioService.kt index 292b272..992ef98 100644 --- a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/FMRadioService.kt +++ b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/FMRadioService.kt @@ -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 diff --git a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/MainActivity.kt b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/MainActivity.kt index f291f65..a659bdf 100644 --- a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/MainActivity.kt +++ b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/MainActivity.kt @@ -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) diff --git a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/NativeFMInterface.kt b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/NativeFMInterface.kt index 5ecf180..d2cacc6 100644 --- a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/NativeFMInterface.kt +++ b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/NativeFMInterface.kt @@ -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 } diff --git a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/fragments/MainFragment.kt b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/fragments/MainFragment.kt index 5a0fde8..954db7a 100644 --- a/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/fragments/MainFragment.kt +++ b/universal7885-common/apps/FMRadio/src/com/eurekateam/fmradio/fragments/MainFragment.kt @@ -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().toLongArray() + var mTracks: IntArray = emptyArray().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(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 = emptyList().toMutableList() + private fun removeZeros(array: IntArray): IntArray { + val mArray: MutableList = emptyList().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() } }