Merge "FM: Wait to be completely closed before processing next start"
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.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 @@
}
}
};
+ private volatile int mState;
+ public static Object mLockObject = new Object();
/**
* Constructor for the receiver Object
@@ -446,7 +449,7 @@
public FmReceiver(){
mControl = new FmRxControls();
mRdsData = new FmRxRdsData (sFd);
- mRxEvents = new FmRxEventListner();
+ mRxEvents = new FmRxEventListner(this);
}
/**
@@ -461,7 +464,7 @@
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 @@
* 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 @@
}
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 @@
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");