Loading hal/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,10 @@ ifneq ($(strip $(AUDIO_FEATURE_DISABLED_ANC_HEADSET)),true) LOCAL_CFLAGS += -DANC_HEADSET_ENABLED endif ifneq ($(strip $(AUDIO_FEATURE_DISABLED_FLUENCE)),true) LOCAL_CFLAGS += -DFLUENCE_ENABLED endif ifneq ($(strip $(AUDIO_FEATURE_DISABLED_PROXY_DEVICE)),true) LOCAL_CFLAGS += -DAFE_PROXY_ENABLED endif Loading hal/audio_extn/audio_extn.c +58 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ #include "audio_hw.h" #include "audio_extn.h" #include "platform.h" #include "platform_api.h" #define MAX_SLEEP_RETRY 100 #define WIFI_INIT_WAIT_SLEEP 50 Loading Loading @@ -173,6 +175,60 @@ void audio_extn_set_anc_parameters(struct audio_device *adev, } #endif /* ANC_HEADSET_ENABLED */ #ifndef FLUENCE_ENABLED #define audio_extn_set_fluence_parameters(adev, parms) (0) #define audio_extn_get_fluence_parameters(adev, query, reply) (0) #else void audio_extn_set_fluence_parameters(struct audio_device *adev, struct str_parms *parms) { int ret = 0, err; char value[32]; struct listnode *node; struct audio_usecase *usecase; err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_FLUENCE, value, sizeof(value)); ALOGV_IF(err >= 0, "%s: Set Fluence Type to %s", __func__, value); if (err >= 0) { ret = platform_set_fluence_type(adev->platform, value); if (ret != 0) { ALOGE("platform_set_fluence_type returned error: %d", ret); } else { /* *If the fluence is manually set/reset, devices *need to get updated for all the usecases *i.e. audio and voice. */ list_for_each(node, &adev->usecase_list) { usecase = node_to_item(node, struct audio_usecase, list); select_devices(adev, usecase->id); } } } } int audio_extn_get_fluence_parameters(struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { int ret = 0, err; char value[256] = {0}; err = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE, value, sizeof(value)); if (err >= 0) { ret = platform_get_fluence_type(adev->platform, value, sizeof(value)); if (ret >= 0) { ALOGV("%s: Fluence Type is %s", __func__, value); str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE, value); } else goto done; } done: return ret; } #endif /* FLUENCE_ENABLED */ #ifndef AFE_PROXY_ENABLED #define audio_extn_set_afe_proxy_parameters(adev, parms) (0) #define audio_extn_get_afe_proxy_parameters(query, reply) (0) Loading Loading @@ -372,6 +428,7 @@ void audio_extn_set_parameters(struct audio_device *adev, struct str_parms *parms) { audio_extn_set_anc_parameters(adev, parms); audio_extn_set_fluence_parameters(adev, parms); audio_extn_set_afe_proxy_parameters(adev, parms); audio_extn_fm_set_parameters(adev, parms); audio_extn_listen_set_parameters(adev, parms); Loading @@ -386,6 +443,7 @@ void audio_extn_get_parameters(const struct audio_device *adev, { char *kv_pairs = NULL; audio_extn_get_afe_proxy_parameters(query, reply); audio_extn_get_fluence_parameters(adev, query, reply); kv_pairs = str_parms_to_str(reply); ALOGD_IF(kv_pairs != NULL, "%s: returns %s", __func__, kv_pairs); Loading hal/audio_extn/audio_extn.h +10 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,16 @@ bool audio_extn_should_use_fb_anc(void); bool audio_extn_should_use_handset_anc(int in_channels); #endif #ifndef FLUENCE_ENABLED #define audio_extn_set_fluence_parameters(adev, parms) (0) #define audio_extn_get_fluence_parameters(adev, query, reply) (0) #else void audio_extn_set_fluence_parameters(struct audio_device *adev, struct str_parms *parms); int audio_extn_get_fluence_parameters(struct audio_device *adev, struct str_parms *query, struct str_parms *reply); #endif #ifndef AFE_PROXY_ENABLED #define audio_extn_set_afe_proxy_channel_mixer(adev,channel_count) (0) #define audio_extn_read_afe_proxy_channel_masks(out) (0) Loading hal/audio_hw.h +9 −7 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so" /* Flags used to initialize acdb_settings variable that goes to ACDB library */ #define NONE_FLAG 0x00000000 #define DMIC_FLAG 0x00000002 #define QMIC_FLAG 0x00000004 #define TTY_MODE_OFF 0x00000010 Loading @@ -39,6 +40,7 @@ #define TTY_MODE_VCO 0x00000040 #define TTY_MODE_HCO 0x00000080 #define TTY_MODE_CLEAR 0xFFFFFF0F #define FLUENCE_MODE_CLEAR 0xFFFFFFF0 #define ACDB_DEV_TYPE_OUT 1 #define ACDB_DEV_TYPE_IN 2 Loading hal/msm8916/platform.c +61 −19 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ struct platform_data { bool fluence_in_voice_rec; bool fluence_in_audio_rec; int fluence_type; char fluence_cap[PROPERTY_VALUE_MAX]; int btsco_sample_rate; bool slowtalk; /* Audio calibration related functions */ Loading Loading @@ -605,10 +606,10 @@ void *platform_init(struct audio_device *adev) my_data->fluence_in_audio_rec = false; my_data->fluence_type = FLUENCE_NONE; property_get("ro.qc.sdk.audio.fluencetype", value, ""); if (!strncmp("fluencepro", value, sizeof("fluencepro"))) { property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, ""); if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) { my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC; } else if (!strncmp("fluence", value, sizeof("fluence"))) { } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) { my_data->fluence_type = FLUENCE_DUAL_MIC; } else { my_data->fluence_type = FLUENCE_NONE; Loading Loading @@ -787,6 +788,63 @@ done: return ret; } int platform_set_fluence_type(void *platform, char *value) { int ret = 0; int fluence_type = FLUENCE_NONE; int fluence_flag = NONE_FLAG; struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type); /* only dual mic turn on and off is supported as of now through setparameters */ if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) { if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) || !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) { ALOGV("fluence dualmic feature enabled \n"); fluence_type = FLUENCE_DUAL_MIC; fluence_flag = DMIC_FLAG; } else { ALOGE("%s: Failed to set DUALMIC", __func__); ret = -1; goto done; } } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) { ALOGV("fluence disabled"); fluence_type = FLUENCE_NONE; } else { ALOGE("Invalid fluence value : %s",value); ret = -1; goto done; } if (fluence_type != my_data->fluence_type) { ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type); my_data->fluence_type = fluence_type; adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag; } done: return ret; } int platform_get_fluence_type(void *platform, char *value, uint32_t len) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->fluence_type == FLUENCE_QUAD_MIC) { strlcpy(value, "quadmic", len); } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) { strlcpy(value, "dualmic", len); } else if (my_data->fluence_type == FLUENCE_NONE) { strlcpy(value, "none", len); } else ret = -1; return ret; } int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id) { int ret = 0; Loading Loading @@ -1708,23 +1766,7 @@ void platform_get_parameters(void *platform, char *str = NULL; char value[256] = {0}; int ret; int fluence_type; ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value, sizeof(value)); if (ret >= 0) { if (my_data->fluence_type & FLUENCE_QUAD_MIC) { strlcpy(value, "fluencepro", sizeof(value)); } else if (my_data->fluence_type & FLUENCE_DUAL_MIC) { strlcpy(value, "fluence", sizeof(value)); } else { strlcpy(value, "none", sizeof(value)); } str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value); } memset(value, 0, sizeof(value)); ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK, value, sizeof(value)); if (ret >= 0) { Loading Loading
hal/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,10 @@ ifneq ($(strip $(AUDIO_FEATURE_DISABLED_ANC_HEADSET)),true) LOCAL_CFLAGS += -DANC_HEADSET_ENABLED endif ifneq ($(strip $(AUDIO_FEATURE_DISABLED_FLUENCE)),true) LOCAL_CFLAGS += -DFLUENCE_ENABLED endif ifneq ($(strip $(AUDIO_FEATURE_DISABLED_PROXY_DEVICE)),true) LOCAL_CFLAGS += -DAFE_PROXY_ENABLED endif Loading
hal/audio_extn/audio_extn.c +58 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ #include "audio_hw.h" #include "audio_extn.h" #include "platform.h" #include "platform_api.h" #define MAX_SLEEP_RETRY 100 #define WIFI_INIT_WAIT_SLEEP 50 Loading Loading @@ -173,6 +175,60 @@ void audio_extn_set_anc_parameters(struct audio_device *adev, } #endif /* ANC_HEADSET_ENABLED */ #ifndef FLUENCE_ENABLED #define audio_extn_set_fluence_parameters(adev, parms) (0) #define audio_extn_get_fluence_parameters(adev, query, reply) (0) #else void audio_extn_set_fluence_parameters(struct audio_device *adev, struct str_parms *parms) { int ret = 0, err; char value[32]; struct listnode *node; struct audio_usecase *usecase; err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_FLUENCE, value, sizeof(value)); ALOGV_IF(err >= 0, "%s: Set Fluence Type to %s", __func__, value); if (err >= 0) { ret = platform_set_fluence_type(adev->platform, value); if (ret != 0) { ALOGE("platform_set_fluence_type returned error: %d", ret); } else { /* *If the fluence is manually set/reset, devices *need to get updated for all the usecases *i.e. audio and voice. */ list_for_each(node, &adev->usecase_list) { usecase = node_to_item(node, struct audio_usecase, list); select_devices(adev, usecase->id); } } } } int audio_extn_get_fluence_parameters(struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { int ret = 0, err; char value[256] = {0}; err = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE, value, sizeof(value)); if (err >= 0) { ret = platform_get_fluence_type(adev->platform, value, sizeof(value)); if (ret >= 0) { ALOGV("%s: Fluence Type is %s", __func__, value); str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE, value); } else goto done; } done: return ret; } #endif /* FLUENCE_ENABLED */ #ifndef AFE_PROXY_ENABLED #define audio_extn_set_afe_proxy_parameters(adev, parms) (0) #define audio_extn_get_afe_proxy_parameters(query, reply) (0) Loading Loading @@ -372,6 +428,7 @@ void audio_extn_set_parameters(struct audio_device *adev, struct str_parms *parms) { audio_extn_set_anc_parameters(adev, parms); audio_extn_set_fluence_parameters(adev, parms); audio_extn_set_afe_proxy_parameters(adev, parms); audio_extn_fm_set_parameters(adev, parms); audio_extn_listen_set_parameters(adev, parms); Loading @@ -386,6 +443,7 @@ void audio_extn_get_parameters(const struct audio_device *adev, { char *kv_pairs = NULL; audio_extn_get_afe_proxy_parameters(query, reply); audio_extn_get_fluence_parameters(adev, query, reply); kv_pairs = str_parms_to_str(reply); ALOGD_IF(kv_pairs != NULL, "%s: returns %s", __func__, kv_pairs); Loading
hal/audio_extn/audio_extn.h +10 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,16 @@ bool audio_extn_should_use_fb_anc(void); bool audio_extn_should_use_handset_anc(int in_channels); #endif #ifndef FLUENCE_ENABLED #define audio_extn_set_fluence_parameters(adev, parms) (0) #define audio_extn_get_fluence_parameters(adev, query, reply) (0) #else void audio_extn_set_fluence_parameters(struct audio_device *adev, struct str_parms *parms); int audio_extn_get_fluence_parameters(struct audio_device *adev, struct str_parms *query, struct str_parms *reply); #endif #ifndef AFE_PROXY_ENABLED #define audio_extn_set_afe_proxy_channel_mixer(adev,channel_count) (0) #define audio_extn_read_afe_proxy_channel_masks(out) (0) Loading
hal/audio_hw.h +9 −7 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ #define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so" /* Flags used to initialize acdb_settings variable that goes to ACDB library */ #define NONE_FLAG 0x00000000 #define DMIC_FLAG 0x00000002 #define QMIC_FLAG 0x00000004 #define TTY_MODE_OFF 0x00000010 Loading @@ -39,6 +40,7 @@ #define TTY_MODE_VCO 0x00000040 #define TTY_MODE_HCO 0x00000080 #define TTY_MODE_CLEAR 0xFFFFFF0F #define FLUENCE_MODE_CLEAR 0xFFFFFFF0 #define ACDB_DEV_TYPE_OUT 1 #define ACDB_DEV_TYPE_IN 2 Loading
hal/msm8916/platform.c +61 −19 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ struct platform_data { bool fluence_in_voice_rec; bool fluence_in_audio_rec; int fluence_type; char fluence_cap[PROPERTY_VALUE_MAX]; int btsco_sample_rate; bool slowtalk; /* Audio calibration related functions */ Loading Loading @@ -605,10 +606,10 @@ void *platform_init(struct audio_device *adev) my_data->fluence_in_audio_rec = false; my_data->fluence_type = FLUENCE_NONE; property_get("ro.qc.sdk.audio.fluencetype", value, ""); if (!strncmp("fluencepro", value, sizeof("fluencepro"))) { property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, ""); if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) { my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC; } else if (!strncmp("fluence", value, sizeof("fluence"))) { } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) { my_data->fluence_type = FLUENCE_DUAL_MIC; } else { my_data->fluence_type = FLUENCE_NONE; Loading Loading @@ -787,6 +788,63 @@ done: return ret; } int platform_set_fluence_type(void *platform, char *value) { int ret = 0; int fluence_type = FLUENCE_NONE; int fluence_flag = NONE_FLAG; struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type); /* only dual mic turn on and off is supported as of now through setparameters */ if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) { if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) || !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) { ALOGV("fluence dualmic feature enabled \n"); fluence_type = FLUENCE_DUAL_MIC; fluence_flag = DMIC_FLAG; } else { ALOGE("%s: Failed to set DUALMIC", __func__); ret = -1; goto done; } } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) { ALOGV("fluence disabled"); fluence_type = FLUENCE_NONE; } else { ALOGE("Invalid fluence value : %s",value); ret = -1; goto done; } if (fluence_type != my_data->fluence_type) { ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type); my_data->fluence_type = fluence_type; adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag; } done: return ret; } int platform_get_fluence_type(void *platform, char *value, uint32_t len) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->fluence_type == FLUENCE_QUAD_MIC) { strlcpy(value, "quadmic", len); } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) { strlcpy(value, "dualmic", len); } else if (my_data->fluence_type == FLUENCE_NONE) { strlcpy(value, "none", len); } else ret = -1; return ret; } int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id) { int ret = 0; Loading Loading @@ -1708,23 +1766,7 @@ void platform_get_parameters(void *platform, char *str = NULL; char value[256] = {0}; int ret; int fluence_type; ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value, sizeof(value)); if (ret >= 0) { if (my_data->fluence_type & FLUENCE_QUAD_MIC) { strlcpy(value, "fluencepro", sizeof(value)); } else if (my_data->fluence_type & FLUENCE_DUAL_MIC) { strlcpy(value, "fluence", sizeof(value)); } else { strlcpy(value, "none", sizeof(value)); } str_parms_add_str(reply, AUDIO_PARAMETER_KEY_FLUENCE_TYPE, value); } memset(value, 0, sizeof(value)); ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK, value, sizeof(value)); if (ret >= 0) { Loading