FM: add JNI Support for SoftMute Command

Change-Id: I786ae5966864035da0e7682e58f6cb05663bc368
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index dd25b1d..b9dc5a8 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -236,6 +236,8 @@
    private static final int FW_TIMEOUT = 200;
    private static final int DISABLE_SLIMBUS_DATA_PORT = 0;
    private static final int ENABLE_SLIMBUS_DATA_PORT = 1;
+   private static final int DISABLE_SOFT_MUTE = 0;
+   private static final int ENABLE_SOFT_MUTE = 1;
 
    private static Object mNotchFilterLock = new Object();
 
@@ -3850,6 +3852,16 @@
              }
          }
       }
+	  public void FmRxEvEnableSoftMute(int status)
+      {
+         Log.e(LOGTAG, "FmRxEvEnableSoftMute status = " + status);
+         if (mReceiver != null && mReceiver.isCherokeeChip()) {
+             synchronized(mEventWaitLock) {
+                 mEventReceived = true;
+                 mEventWaitLock.notify();
+             }
+         }
+      }
    };
 
 
diff --git a/fmapp2/src/com/caf/fmradio/FMTransmitterService.java b/fmapp2/src/com/caf/fmradio/FMTransmitterService.java
index 1d964c4..5e11943 100644
--- a/fmapp2/src/com/caf/fmradio/FMTransmitterService.java
+++ b/fmapp2/src/com/caf/fmradio/FMTransmitterService.java
@@ -1023,6 +1023,10 @@
       {
          Log.d(LOGTAG, "FmRxEvEnableReceiver status = " + status);
       }
+	  public void FmRxEvEnableSoftMute(int status)
+      {
+         Log.d(LOGTAG, "FmRxEvEnableReceiver status = " + status);
+      }
    };
 
 
diff --git a/helium/radio-helium.h b/helium/radio-helium.h
index 067a40b..7c7221b 100644
--- a/helium/radio-helium.h
+++ b/helium/radio-helium.h
@@ -178,6 +178,7 @@
 typedef void (*fm_get_stn_prm_cb) (int val, int status);
 typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
 typedef void (*fm_enable_slimbus_cb) (int status);
+typedef void (*fm_enable_softmute_cb) (int status);
 
 typedef struct {
     size_t  size;
@@ -214,6 +215,7 @@
     fm_get_stn_prm_cb fm_get_station_param_cb;
     fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
     fm_enable_slimbus_cb enable_slimbus_cb;
+    fm_enable_softmute_cb enable_softmute_cb;
 } fm_hal_callbacks_t;
 
 /* Opcode OCF */
@@ -1244,6 +1246,7 @@
 int hci_fm_get_station_dbg_param_req();
 int hci_fm_get_station_cmd_param_req();
 int hci_fm_enable_slimbus(uint8_t enable);
+int hci_fm_enable_softmute(uint8_t enable);
 
 struct fm_hal_t {
     struct radio_helium_device *radio;
diff --git a/helium/radio_helium_hal.c b/helium/radio_helium_hal.c
index 48ba0cb..b7951f3 100644
--- a/helium/radio_helium_hal.c
+++ b/helium/radio_helium_hal.c
@@ -448,6 +448,12 @@
     hal->jni_cb->enable_slimbus_cb(ev_buff[0]);
 }
 
+static void hci_cc_enable_softmute_rsp(char *ev_buff)
+{
+    ALOGD("%s status %d", __func__, ev_buff[0]);
+    hal->jni_cb->enable_softmute_cb(ev_buff[0]);
+}
+
 static inline void hci_cmd_complete_event(char *buff)
 {
     uint16_t opcode;
@@ -476,6 +482,8 @@
 
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_RECV_CONF_REQ):
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_MUTE_MODE_REQ):
+            hci_cc_enable_softmute_rsp(pbuf);
+            break; 
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_STEREO_MODE_REQ):
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_ANTENNA):
     case hci_recv_ctrl_cmd_op_pack(HCI_OCF_FM_SET_SIGNAL_THRESHOLD):
diff --git a/jni/android_hardware_fm.cpp b/jni/android_hardware_fm.cpp
index e71e535..e60fe3d 100644
--- a/jni/android_hardware_fm.cpp
+++ b/jni/android_hardware_fm.cpp
@@ -122,6 +122,7 @@
 typedef void (*fm_get_stn_prm_cb) (int val, int status);
 typedef void (*fm_get_stn_dbg_prm_cb) (int val, int status);
 typedef void (*fm_enable_sb_cb) (int status);
+typedef void (*fm_enable_sm_cb) (int status);
 
 static JNIEnv *mCallbackEnv = NULL;
 static jobject mCallbacksObj = NULL;
@@ -154,6 +155,7 @@
 jmethodID method_getStnParamCallback;
 jmethodID method_getStnDbgParamCallback;
 jmethodID method_enableSlimbusCallback;
+jmethodID method_enableSoftMuteCallback;
 
 static bool checkCallbackThread() {
    JNIEnv* env = AndroidRuntime::getJNIEnv();
@@ -554,6 +556,18 @@
     ALOGD("--fm_enable_slimbus_cb");
 }
 
+static void fm_enable_softmute_cb(int status)
+{
+    ALOGD("++fm_enable_softmute_cb");
+
+    if (!checkCallbackThread())
+        return;
+
+    mCallbackEnv->CallVoidMethod(mCallbacksObj, method_enableSoftMuteCallback, status);
+    ALOGD("--fm_enable_softmute_cb");
+}
+
+
 typedef struct {
    size_t  size;
 
@@ -589,6 +603,7 @@
    fm_get_stn_prm_cb fm_get_station_param_cb;
    fm_get_stn_dbg_prm_cb fm_get_station_debug_param_cb;
    fm_enable_sb_cb fm_enable_slimbus_cb;
+   fm_enable_sm_cb fm_enable_softmute_cb;
 } fm_vendor_callbacks_t;
 
 typedef struct {
@@ -631,7 +646,8 @@
     fm_set_blend_cb,
     fm_get_station_param_cb,
     fm_get_station_debug_param_cb,
-    fm_enable_slimbus_cb
+    fm_enable_slimbus_cb,
+    fm_enable_softmute_cb
 };
 #endif
 /* native interface */
@@ -1583,6 +1599,17 @@
     return err;
 }
 
+static jint android_hardware_fmradio_FmReceiverJNI_enableSoftMuteNative
+ (JNIEnv * env, jobject thiz, jint fd, jint val)
+{
+    ALOGD("%s: val = %d\n", __func__, val);
+    int err = JNI_ERR;
+#ifdef FM_SOC_TYPE_CHEROKEE
+    err = vendor_interface->set_fm_ctrl(V4L2_CID_PRV_SOFT_MUTE, val);
+#endif
+    return err;
+}
+
 static void classInitNative(JNIEnv* env, jclass clazz) {
 
     ALOGI("ClassInit native called \n");
@@ -1627,6 +1654,7 @@
     method_getStnParamCallback = env->GetMethodID(javaClassRef, "getStnParamCallback", "(II)V");
     method_getStnDbgParamCallback = env->GetMethodID(javaClassRef, "getStnDbgParamCallback", "(II)V");
     method_enableSlimbusCallback = env->GetMethodID(javaClassRef, "enableSlimbusCallback", "(I)V");
+    method_enableSoftMuteCallback = env->GetMethodID(javaClassRef, "enableSoftMuteCallback", "(I)V");
 
     return;
 error:
@@ -1733,6 +1761,8 @@
              (void*)android_hardware_fmradio_FmReceiverJNI_configurePerformanceParams},
         { "enableSlimbus", "(II)I",
              (void*)android_hardware_fmradio_FmReceiverJNI_enableSlimbusNative},
+        { "enableSoftMute", "(II)I",
+             (void*)android_hardware_fmradio_FmReceiverJNI_enableSoftMuteNative},
 };
 
 int register_android_hardware_fm_fmradio(JNIEnv* env)
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index b15d512..4957fef 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -3083,4 +3083,8 @@
        Log.d(TAG, "EnableSlimbus :enable =" + enable);
        mControl.enableSlimbus(sFd, enable);
    }
+   public void EnableSoftMute(int enable) {
+       Log.d(TAG, "enableSoftMute :enable =" + enable);
+       mControl.enableSoftMute(sFd, enable);
+   }
 }
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index 1487b7c..3e39e9a 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -134,6 +134,13 @@
         Log.d(TAG, "--enableSlimbusCallback" );
     }
 
+	public void enableSoftMuteCallback(int status)
+    {
+        Log.d(TAG, "++enableSoftMuteCallback" );
+        FmReceiver.mCallback.FmRxEvEnableSoftMute(status);
+        Log.d(TAG, "--enableSoftMuteCallback" );
+    }
+
     public void RtPlusCallback(byte[] rtplus) {
         Log.d(TAG, "RtPlusCallback enter " );
         if (rtplus == null) {
@@ -555,4 +562,5 @@
     static native int setSpurDataNative(int fd, short  buff[], int len);
     static native void configurePerformanceParams(int fd);
     static native int enableSlimbus(int fd, int val);
+    static native int enableSoftMute(int fd, int val);
 }
diff --git a/qcom/fmradio/FmRxControls.java b/qcom/fmradio/FmRxControls.java
index a3eba2a..47c384c 100644
--- a/qcom/fmradio/FmRxControls.java
+++ b/qcom/fmradio/FmRxControls.java
@@ -795,4 +795,13 @@
        else
            return false;
    }
+   public boolean enableSoftMute(int fd, int enable) {
+       int ret;
+       Log.d(TAG, "enableSoftMute : enable = " + enable);
+       ret = FmReceiverJNI.enableSoftMute(fd, enable);
+       if (ret == 0)
+           return true;
+       else
+           return false;
+   }
 }
diff --git a/qcom/fmradio/FmRxEvCallbacks.java b/qcom/fmradio/FmRxEvCallbacks.java
index 31a8312..668ad25 100644
--- a/qcom/fmradio/FmRxEvCallbacks.java
+++ b/qcom/fmradio/FmRxEvCallbacks.java
@@ -48,4 +48,5 @@
     public void FmRxEvERTInfo();
     public void FmRxEvECCInfo();
     public void FmRxEvEnableSlimbus(int status);
+	public void FmRxEvEnableSoftMute(int status);
 }
diff --git a/qcom/fmradio/FmRxEvCallbacksAdaptor.java b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
index 213cf43..94e4c34 100644
--- a/qcom/fmradio/FmRxEvCallbacksAdaptor.java
+++ b/qcom/fmradio/FmRxEvCallbacksAdaptor.java
@@ -62,4 +62,5 @@
     public void FmRxGetStationParam(int val, int status) {};
     public void FmRxGetStationDbgParam(int val, int status) {};
     public void FmRxEvEnableSlimbus(int status) {};
+	public void FmRxEvEnableSoftMute(int status) {};
 }