hal: Add support for Fluence Broadside
ADSP supports Fluence Broadside algorithm in Speaker Phone mode
for voice call and audio recording usecases. Add support for
the same in audio HAL.
Change-Id: Iaa6c2c4621bf0b93b9be92748f70a0fc33a74a90
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 4360967..f487c27 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -116,6 +116,7 @@
bool fluence_in_audio_rec;
int fluence_type;
char fluence_cap[PROPERTY_VALUE_MAX];
+ int fluence_mode;
bool slowtalk;
/* Audio calibration related functions */
void *acdb_handle;
@@ -248,6 +249,11 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
+ [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
+ [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
+ [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
+ [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = "speaker-dmic-broadside",
+ [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = "speaker-dmic-broadside",
};
/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
@@ -321,6 +327,11 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
+ [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
+ [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
+ [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
+ [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = 121,
+ [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = 120,
};
struct snd_device_index {
@@ -661,6 +672,7 @@
my_data->fluence_in_voice_rec = false;
my_data->fluence_in_audio_rec = false;
my_data->fluence_type = FLUENCE_NONE;
+ my_data->fluence_mode = FLUENCE_ENDFIRE;
property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
@@ -691,6 +703,11 @@
if (!strncmp("true", value, sizeof("true"))) {
my_data->fluence_in_spkr_mode = true;
}
+
+ property_get("persist.audio.fluence.mode",value,"");
+ if (!strncmp("broadside", value, sizeof("broadside"))) {
+ my_data->fluence_mode = FLUENCE_BROADSIDE;
+ }
}
my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
@@ -1415,7 +1432,10 @@
snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
} else {
adev->acdb_settings |= DMIC_FLAG;
- snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
+ if (my_data->fluence_mode == FLUENCE_BROADSIDE)
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE;
+ else
+ snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
}
} else {
snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
@@ -1455,7 +1475,10 @@
if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
my_data->fluence_in_spkr_mode) {
- snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
+ if (my_data->fluence_mode == FLUENCE_BROADSIDE)
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
+ else
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
adev->acdb_settings |= DMIC_FLAG;
} else
snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
@@ -1471,8 +1494,12 @@
set_echo_reference(adev->mixer, EC_REF_RX);
} else if (adev->active_input->enable_aec) {
if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
- if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
- snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
+ if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
+ my_data->fluence_in_spkr_mode) {
+ if (my_data->fluence_mode == FLUENCE_BROADSIDE)
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE;
+ else
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
adev->acdb_settings |= DMIC_FLAG;
} else
snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
@@ -1488,8 +1515,12 @@
set_echo_reference(adev->mixer, EC_REF_RX);
} else if (adev->active_input->enable_ns) {
if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
- if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
- snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
+ if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
+ my_data->fluence_in_spkr_mode) {
+ if (my_data->fluence_mode == FLUENCE_BROADSIDE)
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE;
+ else
+ snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
adev->acdb_settings |= DMIC_FLAG;
} else
snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index f12697c..6a5df69 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -26,6 +26,11 @@
FLUENCE_QUAD_MIC = 0x2,
};
+enum {
+ FLUENCE_ENDFIRE = 0x1,
+ FLUENCE_BROADSIDE = 0x2,
+};
+
/*
* Below are the devices for which is back end is same, SLIMBUS_0_RX.
* All these devices are handled by the internal HW codec. We can
@@ -120,6 +125,11 @@
SND_DEVICE_IN_HANDSET_STEREO_DMIC,
SND_DEVICE_IN_SPEAKER_STEREO_DMIC,
SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
+ SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE,
+ SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE,
+ SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE,
+ SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE,
+ SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE,
SND_DEVICE_IN_END,
SND_DEVICE_MAX = SND_DEVICE_IN_END,