hal: Add support for turning fluence on/off

- To turn on/off fluence we need to change the build prop
file and changes will take effect after reboot. There is no
option to turn it on/off without rebooting the target.
- Add set_params support to turn it on and off.
An option is given to user to select the dualmic fluence
based on which set_parms is invoked.

Change-Id: I51d580af820d8e0b1bd1384c941ffba3f96813ca
CRs-Fixed: 605087
This commit is contained in:
Venkata Narendra Kumar Gutta 2014-03-27 19:47:56 +05:30
parent 85a9de84e3
commit 88fd0bc938
7 changed files with 205 additions and 45 deletions

View File

@ -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

View File

@ -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
@ -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)
@ -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);
@ -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);

View File

@ -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)

View File

@ -32,13 +32,15 @@
#define OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH "/system/lib/soundfx/libqcompostprocbundle.so"
/* Flags used to initialize acdb_settings variable that goes to ACDB library */
#define DMIC_FLAG 0x00000002
#define QMIC_FLAG 0x00000004
#define TTY_MODE_OFF 0x00000010
#define TTY_MODE_FULL 0x00000020
#define TTY_MODE_VCO 0x00000040
#define TTY_MODE_HCO 0x00000080
#define TTY_MODE_CLEAR 0xFFFFFF0F
#define NONE_FLAG 0x00000000
#define DMIC_FLAG 0x00000002
#define QMIC_FLAG 0x00000004
#define TTY_MODE_OFF 0x00000010
#define TTY_MODE_FULL 0x00000020
#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

View File

@ -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 */
@ -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;
@ -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;
@ -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) {

View File

@ -113,6 +113,7 @@ struct platform_data {
bool fluence_in_audio_rec;
int fluence_type;
int fluence_mode;
char fluence_cap[PROPERTY_VALUE_MAX];
int btsco_sample_rate;
bool slowtalk;
bool is_i2s_ext_modem;
@ -681,10 +682,10 @@ void *platform_init(struct audio_device *adev)
my_data->fluence_type = FLUENCE_NONE;
my_data->fluence_mode = FLUENCE_ENDFIRE;
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;
@ -874,6 +875,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;
@ -1824,24 +1882,8 @@ void platform_get_parameters(void *platform,
char *str = NULL;
char value[256] = {0};
int ret;
int fluence_type;
char *kv_pairs = NULL;
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) {

View File

@ -28,6 +28,8 @@ int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
void platform_add_backend_name(char *mixer_path, snd_device_t snd_device);
int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type);
int platform_get_snd_device_index(char *snd_device_index_name);
int platform_set_fluence_type(void *platform, char *value);
int platform_get_fluence_type(void *platform, char *value, uint32_t len);
int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id);
int platform_send_audio_calibration(void *platform, snd_device_t snd_device);
int platform_switch_voice_call_device_pre(void *platform);