hal: add support for AudioSphere effects
Add support to set and get AudioSphere parameters.
AudioSphere post processing is supported on stereo
speakers to add virtualization effect to audio
playback.
Change-Id: I85c5ce44b109cb51fce19df0f438ecf6a6d7661e
diff --git a/hal/Android.mk b/hal/Android.mk
index 99b6b39..efdde67 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -199,6 +199,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/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 688e265..c46c225 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -77,6 +77,8 @@
/* Query offload playback instances count */
#define AUDIO_PARAMETER_OFFLOAD_NUM_ACTIVE "offload_num_active"
#define AUDIO_PARAMETER_HPX "HPX"
+#define AUDIO_PARAMETER_KEY_ASPHERE_ENABLE "asphere_enable"
+#define AUDIO_PARAMETER_KEY_ASPHERE_STRENGTH "asphere_strength"
#ifndef FM_ENABLED
#define audio_extn_fm_set_parameters(adev, parms) (0)
@@ -530,6 +532,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)
{
@@ -547,6 +646,7 @@
audio_extn_hpx_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,
@@ -560,6 +660,7 @@
audio_extn_dts_eagle_get_parameters(adev, query, reply);
audio_extn_hpx_get_parameters(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);