Merge "fm: wait for enable event to complete" into fm.lnx.2.1-dev
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index a780cbe..3846589 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -153,7 +153,6 @@
 
 static bool checkCallbackThread() {
    JNIEnv* env = AndroidRuntime::getJNIEnv();
-   ALOGE("Callback env check fail: env: %p, callback: %p", env, mCallbackEnv);
    if (mCallbackEnv != env || mCallbackEnv == NULL)
    {
        ALOGE("Callback env check fail: env: %p, callback: %p", env, mCallbackEnv);
@@ -176,18 +175,27 @@
 void fm_tune_cb(int Freq)
 {
     ALOGD("TUNE:Freq:%d", Freq);
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_tuneCallback, (jint) Freq);
 }
 
 void fm_seek_cmpl_cb(int Freq)
 {
     ALOGI("SEEK_CMPL: Freq: %d", Freq);
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_seekCmplCallback, (jint) Freq);
 }
 
 void fm_scan_next_cb()
 {
     ALOGI("SCAN_NEXT");
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_scanNxtCallback);
 }
 
@@ -196,6 +204,9 @@
     ALOGI("SRCH_LIST");
     jbyteArray srch_buffer = NULL;
 
+    if (!checkCallbackThread())
+        return;
+
     srch_buffer = mCallbackEnv->NewByteArray(STD_BUF_SIZE);
     if (srch_buffer == NULL) {
         ALOGE(" af list allocate failed :");
@@ -209,12 +220,18 @@
 void fm_stereo_status_cb(bool stereo)
 {
     ALOGI("STEREO: %d", stereo);
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_stereostsCallback, (jboolean) stereo);
 }
 
 void fm_rds_avail_status_cb(bool rds_avl)
 {
     ALOGD("fm_rds_avail_status_cb: %d", rds_avl);
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_rdsAvlStsCallback, (jboolean) rds_avl);
 }
 
@@ -223,10 +240,8 @@
     ALOGD("AF_LIST");
     jbyteArray af_buffer = NULL;
 
-    if (!checkCallbackThread()) {
-        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+    if (!checkCallbackThread())
         return;
-    }
 
     af_buffer = mCallbackEnv->NewByteArray(STD_BUF_SIZE);
     if (af_buffer == NULL) {
@@ -245,10 +260,8 @@
     jbyteArray rt_buff = NULL;
     int i,len;
 
-    if (!checkCallbackThread()) {
-        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+    if (!checkCallbackThread())
         return;
-    }
 
     len  = (int)(rt[0] & 0xFF);
     ALOGD(" rt data len=%d :",len);
@@ -273,10 +286,8 @@
     jbyteArray ps_data = NULL;
     int i,len;
     int numPs;
-    if (!checkCallbackThread()) {
-        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+    if (!checkCallbackThread())
         return;
-    }
 
     numPs  = (int)(ps[0] & 0xFF);
     len = (numPs *8)+5;
@@ -307,6 +318,9 @@
 
     len =  (int)(rt_plus[0] & 0xFF);
     ALOGD(" rt plus len=%d :",len);
+    if (!checkCallbackThread())
+        return;
+
     RtPlus = mCallbackEnv->NewByteArray(len);
     if (RtPlus == NULL) {
         ALOGE(" rt plus data allocate failed :");
@@ -323,10 +337,8 @@
     jbyteArray ert_buff = NULL;
     int i,len;
 
-    if (!checkCallbackThread()) {
-        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+    if (!checkCallbackThread())
         return;
-    }
 
     len = (int)(ert[0] & 0xFF);
     len = len+3;
@@ -350,10 +362,8 @@
     jbyteArray ecc_buff = NULL;
     int i,len;
 
-    if (!checkCallbackThread()) {
-        ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
+    if (!checkCallbackThread())
         return;
-    }
 
     len = (int)(ecc[0] & 0xFF);
 
@@ -382,6 +392,9 @@
 void fm_disabled_cb()
 {
     ALOGE("DISABLE");
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_disableCallback);
 }
 
@@ -424,6 +437,9 @@
 {
     ALOGD("Get signal Thres callback");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getSigThCallback, val, status);
 }
 
@@ -431,6 +447,9 @@
 {
     ALOGD("fm_get_ch_det_thr_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getChDetThrCallback, val, status);
 }
 
@@ -438,6 +457,9 @@
 {
     ALOGD("fm_set_ch_det_thr_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setChDetThrCallback, status);
 }
 
@@ -445,6 +467,9 @@
 {
     ALOGD("fm_def_data_read_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataRdCallback, val, status);
 }
 
@@ -452,6 +477,9 @@
 {
     ALOGD("fm_def_data_write_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_defDataWrtCallback, status);
 }
 
@@ -459,6 +487,9 @@
 {
     ALOGD("fm_get_blend_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getBlendCallback, val, status);
 }
 
@@ -466,6 +497,9 @@
 {
     ALOGD("fm_set_blend_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_setBlendCallback, status);
 }
 
@@ -473,6 +507,9 @@
 {
     ALOGD("fm_get_station_param_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnParamCallback, val, status);
 }
 
@@ -480,6 +517,9 @@
 {
     ALOGD("fm_get_station_debug_param_cb");
 
+    if (!checkCallbackThread())
+        return;
+
     mCallbackEnv->CallVoidMethod(mCallbacksObj, method_getStnDbgParamCallback, val, status);
 }
 
@@ -594,6 +634,7 @@
        snprintf(versionStr, sizeof(versionStr), "%d", cap.version);
        property_set("hw.fm.version", versionStr);
     } else {
+       close(fd);
        return FM_JNI_FAILURE;
     }