hal: add support for AudioSphere effects.
am: 8030226101

* commit '803022610168761cbd46cbe43616dbea51846b58':
  hal: add support for AudioSphere effects.
diff --git a/msm8909/hal/Android.mk b/msm8909/hal/Android.mk
index 1aeedaf..286191c 100644
--- a/msm8909/hal/Android.mk
+++ b/msm8909/hal/Android.mk
@@ -200,6 +200,10 @@
     LOCAL_SRC_FILES += audio_extn/source_track.c
 endif
 
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_AUDIOSPHERE)),true)
+    LOCAL_CFLAGS += -DAUDIOSPHERE_ENABLED
+endif
+
 LOCAL_SHARED_LIBRARIES := \
 	liblog \
 	libcutils \
diff --git a/msm8909/hal/audio_extn/audio_extn.c b/msm8909/hal/audio_extn/audio_extn.c
index 3b13d9a..67f5363 100644
--- a/msm8909/hal/audio_extn/audio_extn.c
+++ b/msm8909/hal/audio_extn/audio_extn.c
@@ -57,6 +57,8 @@
 #define AUDIO_PARAMETER_CUSTOM_STEREO  "stereo_as_dual_mono"
 /* Query offload playback instances count */
 #define AUDIO_PARAMETER_OFFLOAD_NUM_ACTIVE "offload_num_active"
+#define AUDIO_PARAMETER_KEY_ASPHERE_ENABLE   "asphere_enable"
+#define AUDIO_PARAMETER_KEY_ASPHERE_STRENGTH "asphere_strength"
 
 #ifndef FM_POWER_OPT
 #define audio_extn_fm_set_parameters(adev, parms) (0)
@@ -464,6 +466,103 @@
     return ret;
 }
 
+#ifndef AUDIOSPHERE_ENABLED
+#define audio_extn_asphere_set_parameters(adev, parms)  (0)
+#define audio_extn_asphere_get_parameters(adev, query, reply) (0)
+#else
+int32_t audio_extn_asphere_set_parameters(const struct audio_device *adev,
+                                     struct str_parms *parms)
+{
+    int ret = 0, val[2];
+    char value[32] = {0};
+    int set_enable, set_strength;
+    int enable = -1, strength = -1;
+    struct mixer_ctl *ctl = NULL;
+    const char *mixer_ctl_name = "MSM ASphere Set Param";
+    char propValue[PROPERTY_VALUE_MAX] = {0};
+    bool asphere_prop_enabled = false;
+
+    if (property_get("audio.pp.asphere.enabled", propValue, "false")) {
+        if (!strncmp("true", propValue, 4))
+            asphere_prop_enabled = true;
+    }
+
+    if (!asphere_prop_enabled) {
+        ALOGV("%s: property not set!!! not doing anything", __func__);
+        return ret;
+    }
+
+    set_enable = str_parms_get_str(parms,
+                            AUDIO_PARAMETER_KEY_ASPHERE_ENABLE,
+                            value, sizeof(value));
+    if (set_enable > 0)
+        enable = atoi(value);
+
+    set_strength = str_parms_get_str(parms,
+                            AUDIO_PARAMETER_KEY_ASPHERE_STRENGTH,
+                            value, sizeof(value));
+    if (set_strength > 0)
+        strength = atoi(value);
+
+    if (set_enable >= 0 || set_strength >= 0) {
+        ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+        if (!ctl) {
+            ALOGE("%s: could not get ctl for mixer cmd - %s",
+                  __func__, mixer_ctl_name);
+            return -EINVAL;
+        }
+        ALOGD("%s: set ctl \"%s:%d,%d\"",
+              __func__, mixer_ctl_name, enable, strength);
+        val[0] = enable;
+        val[1] = strength;
+        ret = mixer_ctl_set_array(ctl, val, sizeof(val)/sizeof(val[0]));
+        if (ret)
+            ALOGE("%s: set ctl failed!!!\"%s:%d,%d\"",
+                  __func__, mixer_ctl_name, enable, strength);
+    }
+    ALOGV("%s: exit ret %d", __func__, ret);
+    return ret;
+}
+
+int32_t audio_extn_asphere_get_parameters(const struct audio_device *adev,
+                                          struct str_parms *query,
+                                          struct str_parms *reply)
+{
+    int ret = 0, val[2] = {-1, -1};
+    char value[32] = {0};
+    int get_enable, get_strength;
+    struct mixer_ctl *ctl = NULL;
+    const char *mixer_ctl_name = "MSM ASphere Set Param";
+
+    get_enable = str_parms_get_str(query,
+                                   AUDIO_PARAMETER_KEY_ASPHERE_ENABLE,
+                                   value, sizeof(value));
+    get_strength = str_parms_get_str(query,
+                                     AUDIO_PARAMETER_KEY_ASPHERE_STRENGTH,
+                                     value, sizeof(value));
+    if (get_enable > 0 || get_strength > 0) {
+        ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+        if (!ctl) {
+            ALOGE("%s: could not get ctl for mixer cmd - %s",
+                  __func__, mixer_ctl_name);
+            return -EINVAL;
+        }
+        ret = mixer_ctl_get_array(ctl, val, sizeof(val)/sizeof(val[0]));
+        if (ret)
+            ALOGE("%s: got ctl failed!!! \"%s:%d,%d\"",
+                   __func__, mixer_ctl_name, val[0], val[1]);
+        if (get_enable > 0)
+            str_parms_add_int(reply,
+                              AUDIO_PARAMETER_KEY_ASPHERE_ENABLE, val[0]);
+        if (get_strength > 0)
+            str_parms_add_int(reply,
+                              AUDIO_PARAMETER_KEY_ASPHERE_STRENGTH, val[1]);
+    }
+    ALOGV("%s: exit ret %d", __func__, ret);
+    return ret;
+}
+#endif
+
 void audio_extn_set_parameters(struct audio_device *adev,
                                struct str_parms *parms)
 {
@@ -480,6 +579,7 @@
    audio_extn_customstereo_set_parameters(adev, parms);
    audio_extn_pm_set_parameters(parms);
    audio_extn_source_track_set_parameters(adev, parms);
+   audio_extn_asphere_set_parameters(adev, parms);
 }
 
 void audio_extn_get_parameters(const struct audio_device *adev,
@@ -491,6 +591,7 @@
     audio_extn_get_fluence_parameters(adev, query, reply);
     get_active_offload_usecases(adev, query, reply);
     audio_extn_source_track_get_parameters(adev, query, reply);
+    audio_extn_asphere_get_parameters(adev, query, reply);
     kv_pairs = str_parms_to_str(reply);
     ALOGD_IF(kv_pairs != NULL, "%s: returns %s", __func__, kv_pairs);
     free(kv_pairs);