From 43a4f71274fca4bbe0915e6990d7dd3fe249bd0d Mon Sep 17 00:00:00 2001 From: Smriti Gupta <smritig@codeaurora.org> Date: Fri, 10 Jun 2016 12:51:21 +0530 Subject: [PATCH] FM: Wait to be completely closed before processing next start Wait for FM to be completely closed before processing next start. Earlier, FM application was not getting started sometimes on plug out and plug in. Change-Id: I4e29095b1bb4652fadc34a760eea37fdf15ec155 CRs-Fixed: 1026888 --- qcom/fmradio/FmReceiver.java | 31 +++++++++++++++++++++--------- qcom/fmradio/FmRxEventListner.java | 18 ++++++++++++----- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java index 5ba27c8..7d6ab0d 100644 --- a/qcom/fmradio/FmReceiver.java +++ b/qcom/fmradio/FmReceiver.java @@ -41,6 +41,7 @@ import android.content.Intent; import android.net.wifi.WifiManager; import android.content.IntentFilter; import android.bluetooth.BluetoothAdapter; +import java.lang.Object; /** * This class contains all interfaces and types needed to @@ -439,6 +440,8 @@ public class FmReceiver extends FmTransceiver } } }; + private volatile int mState; + public static Object mLockObject = new Object(); /** * Constructor for the receiver Object @@ -446,7 +449,7 @@ public class FmReceiver extends FmTransceiver public FmReceiver(){ mControl = new FmRxControls(); mRdsData = new FmRxRdsData (sFd); - mRxEvents = new FmRxEventListner(); + mRxEvents = new FmRxEventListner(this); } /** @@ -461,7 +464,7 @@ public class FmReceiver extends FmTransceiver public FmReceiver(String devicePath, FmRxEvCallbacksAdaptor callback) throws InstantiationException { mControl = new FmRxControls(); - mRxEvents = new FmRxEventListner(); + mRxEvents = new FmRxEventListner(this); Log.e(TAG, "FmReceiver constructor"); //registerClient(callback); @@ -576,22 +579,32 @@ public class FmReceiver extends FmTransceiver * Check for FM State. * If FMRx already on, then return. */ - int state = getFMState(); + + int mState = getFMState(); mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); mBtIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); - if (state == FMState_Rx_Turned_On || state == FMState_Srch_InProg) { + if (mState == FMState_Rx_Turned_On || mState == FMState_Srch_InProg) { + Log.d(TAG, "enable: FM already turned On and running"); return status; - }else if (state == subPwrLevel_FMTurning_Off) { + }else if (mState == subPwrLevel_FMTurning_Off) { Log.v(TAG, "FM is in the process of turning off.Pls wait for sometime."); - return status; - }else if (state == subPwrLevel_FMRx_Starting) { + synchronized(mLockObject){ + try { + if (getFMState() != FMState_Turned_Off) { + mLockObject.wait(); + } + } catch (InterruptedException e) { + Log.e(TAG, "Error in waiting on mLockObject" + e); + } + } + }else if (mState == subPwrLevel_FMRx_Starting) { Log.v(TAG, "FM is in the process of turning On.Pls wait for sometime."); return status; - }else if ((state == FMState_Tx_Turned_On) - || (state == subPwrLevel_FMTx_Starting)) { + }else if ((mState == FMState_Tx_Turned_On) + || (mState == subPwrLevel_FMTx_Starting)) { Log.v(TAG, "FM Tx is turned on or in the process of turning on."); return status; } diff --git a/qcom/fmradio/FmRxEventListner.java b/qcom/fmradio/FmRxEventListner.java index 0ad7c0c..9c9bba2 100644 --- a/qcom/fmradio/FmRxEventListner.java +++ b/qcom/fmradio/FmRxEventListner.java @@ -59,8 +59,13 @@ class FmRxEventListner { } private Thread mThread; + private FmReceiver mReceiver; private static final String TAG = "FMRadio"; + public FmRxEventListner(FmReceiver receiver) { + mReceiver = receiver; + } + public void startListner (final int fd, final FmRxEvCallbacks cb) { /* start a thread and listen for messages */ mThread = new Thread(){ @@ -213,11 +218,14 @@ class FmRxEventListner { case 18: Log.d(TAG, "Got RADIO_DISABLED"); if (FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMTurning_Off) { - FmTransceiver.release("/dev/radio0"); - cb.FmRxEvDisableReceiver(); - /*Set the state as FMOff */ - FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off); - Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff"); + synchronized(FmReceiver.mLockObject) { + FmTransceiver.release("/dev/radio0"); + cb.FmRxEvDisableReceiver(); + /*Set the state as FMOff */ + FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off); + Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff"); + FmReceiver.mLockObject.notify(); + } Thread.currentThread().interrupt(); } else { Log.d(TAG, "Unexpected RADIO_DISABLED recvd"); -- GitLab