diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java index 0c5713b68c6546a6edd69beaf9a54722a0c053f0..002224ddd7504318a40e0fd58362ba930b6a0cdc 100644 --- a/fmapp2/src/com/caf/fmradio/FMRadioService.java +++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java @@ -212,11 +212,13 @@ public class FMRadioService extends Service private boolean mIsRecordSink = false; private static final int AUDIO_FRAMES_COUNT_TO_IGNORE = 3; private Object mRecordSinkLock = new Object(); + private Object mEventWaitLock = new Object(); private boolean mIsFMDeviceLoopbackActive = false; private File mStoragePath = null; private static final int FM_OFF_FROM_APPLICATION = 1; private static final int FM_OFF_FROM_ANTENNA = 2; + private static final int RADIO_TIMEOUT = 1500; private static Object mNotchFilterLock = new Object(); @@ -2284,6 +2286,21 @@ public class FMRadioService extends Service if (mReceiver != null) { bStatus = mReceiver.disable(this); + if (bStatus && + (mReceiver.getFMState() == mReceiver.subPwrLevel_FMTurning_Off)) { + synchronized (mEventWaitLock) { + Log.d(LOGTAG, "waiting for disable event"); + try { + mEventWaitLock.wait(RADIO_TIMEOUT); + } catch (IllegalMonitorStateException e) { + Log.e(LOGTAG, "Exception caught while waiting for event"); + e.printStackTrace(); + } catch (InterruptedException ex) { + Log.e(LOGTAG, "Exception caught while waiting for event"); + ex.printStackTrace(); + } + } + } mReceiver = null; } fmOperationsOff(); @@ -2291,7 +2308,6 @@ public class FMRadioService extends Service return(bStatus); } - private boolean fmOff(int off_from) { if (off_from == FM_OFF_FROM_APPLICATION || off_from == FM_OFF_FROM_ANTENNA) { Log.d(LOGTAG, "FM application close button pressed or antenna removed"); @@ -3025,6 +3041,9 @@ public class FMRadioService extends Service Log.d(LOGTAG, "FmRxEvDisableReceiver"); mFMOn = false; FmSharedPreferences.clearTags(); + synchronized (mEventWaitLock) { + mEventWaitLock.notify(); + } } public void FmRxEvRadioReset() { diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java index 7d6ab0d4954c46aa363b16c9c592d3ac12a84b18..5ba27c8c568482fd1feed310c71bf11f1ebe3780 100644 --- a/qcom/fmradio/FmReceiver.java +++ b/qcom/fmradio/FmReceiver.java @@ -41,7 +41,6 @@ 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 @@ -440,8 +439,6 @@ public class FmReceiver extends FmTransceiver } } }; - private volatile int mState; - public static Object mLockObject = new Object(); /** * Constructor for the receiver Object @@ -449,7 +446,7 @@ public class FmReceiver extends FmTransceiver public FmReceiver(){ mControl = new FmRxControls(); mRdsData = new FmRxRdsData (sFd); - mRxEvents = new FmRxEventListner(this); + mRxEvents = new FmRxEventListner(); } /** @@ -464,7 +461,7 @@ public class FmReceiver extends FmTransceiver public FmReceiver(String devicePath, FmRxEvCallbacksAdaptor callback) throws InstantiationException { mControl = new FmRxControls(); - mRxEvents = new FmRxEventListner(this); + mRxEvents = new FmRxEventListner(); Log.e(TAG, "FmReceiver constructor"); //registerClient(callback); @@ -579,32 +576,22 @@ public class FmReceiver extends FmTransceiver * Check for FM State. * If FMRx already on, then return. */ - - int mState = getFMState(); + int state = getFMState(); mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); mBtIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); - if (mState == FMState_Rx_Turned_On || mState == FMState_Srch_InProg) { - + if (state == FMState_Rx_Turned_On || state == FMState_Srch_InProg) { Log.d(TAG, "enable: FM already turned On and running"); return status; - }else if (mState == subPwrLevel_FMTurning_Off) { + }else if (state == subPwrLevel_FMTurning_Off) { Log.v(TAG, "FM is in the process of turning off.Pls wait for sometime."); - 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) { + return status; + }else if (state == subPwrLevel_FMRx_Starting) { Log.v(TAG, "FM is in the process of turning On.Pls wait for sometime."); return status; - }else if ((mState == FMState_Tx_Turned_On) - || (mState == subPwrLevel_FMTx_Starting)) { + }else if ((state == FMState_Tx_Turned_On) + || (state == 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 9c9bba23df06c3d963abc9285758979452cf2c46..c178f17b5271bc1db5ed98708a2daf53409dc6de 100644 --- a/qcom/fmradio/FmRxEventListner.java +++ b/qcom/fmradio/FmRxEventListner.java @@ -59,13 +59,8 @@ 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(){ @@ -218,14 +213,11 @@ class FmRxEventListner { case 18: Log.d(TAG, "Got RADIO_DISABLED"); if (FmTransceiver.getFMPowerState() == FmTransceiver.subPwrLevel_FMTurning_Off) { - 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(); - } + FmTransceiver.release("/dev/radio0"); + /*Set the state as FMOff */ + FmTransceiver.setFMPowerState(FmTransceiver.FMState_Turned_Off); + cb.FmRxEvDisableReceiver(); + Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff"); Thread.currentThread().interrupt(); } else { Log.d(TAG, "Unexpected RADIO_DISABLED recvd");