diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java index 5ba27c8c568482fd1feed310c71bf11f1ebe3780..7d6ab0d4954c46aa363b16c9c592d3ac12a84b18 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 0ad7c0ccb03c1c69499cc41b1d5e3e633d0deb55..9c9bba23df06c3d963abc9285758979452cf2c46 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");