From 3d3cdeae35cd7d225016344030b8ef700cc68253 Mon Sep 17 00:00:00 2001 From: Kamal Negi <kamaln@codeaurora.org> Date: Mon, 27 Jun 2016 19:54:56 +0530 Subject: [PATCH] wait for disable event callback to complete After sending the disable request, wait for disable event callback to complete. If we enable fm before disable callback has been completed, state of FM is TURNING OFF, hence enable FM gets failed. Change-Id: I49fa255d2c8dcec2d5f60df350a40e69fa3cee9c --- .../src/com/caf/fmradio/FMRadioService.java | 21 ++++++++++++++++++- qcom/fmradio/FmRxEventListner.java | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java index 0c5713b..002224d 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/FmRxEventListner.java b/qcom/fmradio/FmRxEventListner.java index 0ad7c0c..c178f17 100644 --- a/qcom/fmradio/FmRxEventListner.java +++ b/qcom/fmradio/FmRxEventListner.java @@ -214,9 +214,9 @@ class FmRxEventListner { 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); + cb.FmRxEvDisableReceiver(); Log.v(TAG, "RxEvtList: CURRENT-STATE : FMTurningOff ---> NEW-STATE : FMOff"); Thread.currentThread().interrupt(); } else { -- GitLab