hal: Add support for Fluence Far Field Voice
Add support for 6mic Fluence pre-processing of
captured stream using Far Field Voice (FFV) algorithm.
Change-Id: I7a643014f3e090482db7772dce2fc812fd469b2d
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 3e7b69c..6dfa0eb 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -393,7 +393,7 @@
{PLAYBACK_INTERACTIVE_STRM_DEVICE7, PLAYBACK_INTERACTIVE_STRM_DEVICE7},
[USECASE_AUDIO_PLAYBACK_INTERACTIVE_STREAM8] =
{PLAYBACK_INTERACTIVE_STRM_DEVICE8, PLAYBACK_INTERACTIVE_STRM_DEVICE8},
-
+ [USECASE_AUDIO_EC_REF_LOOPBACK] = {-1, -1}, /* pcm id updated from platform info file */
};
/* Array to store sound devices */
@@ -537,6 +537,10 @@
[SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "three-mic",
[SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "quad-mic",
[SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "headset-mic",
+ [SND_DEVICE_IN_HANDSET_6MIC] = "handset-6mic",
+ [SND_DEVICE_IN_HANDSET_8MIC] = "handset-8mic",
+ [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = "ec-ref-loopback-mono",
+ [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = "ec-ref-loopback-stereo",
};
// Platform specific backend bit width table
@@ -679,6 +683,10 @@
[SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 145,
[SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 146,
[SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = 147,
+ [SND_DEVICE_IN_HANDSET_6MIC] = 4,
+ [SND_DEVICE_IN_HANDSET_8MIC] = 4,
+ [SND_DEVICE_IN_EC_REF_LOOPBACK_MONO] = 4,
+ [SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO] = 4
};
struct name_to_index {
@@ -823,6 +831,10 @@
{TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_6MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_8MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_MONO)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO)},
};
static char * backend_tag_table[SND_DEVICE_MAX] = {0};
@@ -869,6 +881,7 @@
{TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_AFE_PROXY)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_AFE_PROXY)},
+ {TO_NAME_INDEX(USECASE_AUDIO_EC_REF_LOOPBACK)},
};
#define NO_COLS 2
@@ -1986,6 +1999,8 @@
{
// support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
switch (my_data->max_mic_count) {
+ case 6:
+ my_data->source_mic_type |= SOURCE_HEX_MIC;
case 4:
my_data->source_mic_type |= SOURCE_QUAD_MIC;
case 3:
@@ -2184,7 +2199,9 @@
be_dai_name_table = NULL;
property_get("ro.vendor.audio.sdk.fluencetype", my_data->fluence_cap, "");
- if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
+ if (!strncmp("fluenceffv", my_data->fluence_cap, sizeof("fluenceffv"))) {
+ my_data->fluence_type = FLUENCE_HEX_MIC | FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
+ } else if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
} else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
my_data->fluence_type = FLUENCE_DUAL_MIC;
@@ -2432,6 +2449,7 @@
/* Read one time ssr property */
audio_extn_ssr_update_enabled();
+ audio_extn_ffv_update_enabled();
audio_extn_spkr_prot_init(adev);
/* init dap hal */
@@ -2679,6 +2697,10 @@
if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
+
+ if ((snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_MONO) ||
+ (snd_device == SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO))
+ audio_extn_ffv_append_ec_ref_dev_name(device_name);
} else {
strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
return -EINVAL;
@@ -2835,7 +2857,9 @@
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- if (my_data->fluence_type == FLUENCE_QUAD_MIC) {
+ if (my_data->fluence_type == FLUENCE_HEX_MIC) {
+ strlcpy(value, "hexmic", len);
+ } else 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);
@@ -4288,9 +4312,13 @@
}
} else if (source == AUDIO_SOURCE_MIC) {
if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
- channel_count == 1 ) {
+ channel_count == 1) {
if(my_data->fluence_in_audio_rec) {
- if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
+ if ((my_data->fluence_type & FLUENCE_HEX_MIC) &&
+ (my_data->source_mic_type & SOURCE_HEX_MIC) &&
+ (audio_extn_ffv_get_stream() == adev->active_input)) {
+ snd_device = audio_extn_ffv_get_capture_snd_device();
+ } else if ((my_data->fluence_type & FLUENCE_QUAD_MIC) &&
(my_data->source_mic_type & SOURCE_QUAD_MIC)) {
snd_device = SND_DEVICE_IN_HANDSET_QMIC;
platform_set_echo_reference(adev, true, out_device);
@@ -4781,6 +4809,7 @@
audio_extn_usb_set_sidetone_gain(parms, value, len);
audio_extn_hfp_set_parameters(my_data->adev, parms);
true_32_bit_set_params(parms, value, len);
+ audio_extn_ffv_set_parameters(my_data->adev, parms);
ALOGV("%s: exit with code(%d)", __func__, ret);
return ret;
}
@@ -7232,6 +7261,20 @@
}
}
+int platform_get_ec_ref_loopback_snd_device(int channel_count)
+{
+ snd_device_t snd_device;
+
+ if (channel_count == 1)
+ snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_MONO;
+ else if (channel_count == 2)
+ snd_device = SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO;
+ else
+ snd_device = SND_DEVICE_NONE;
+
+ return snd_device;
+}
+
int platform_set_sidetone(struct audio_device *adev,
snd_device_t out_snd_device,
bool enable,
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index a53a38f..d9f203c 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -25,6 +25,7 @@
FLUENCE_NONE,
FLUENCE_DUAL_MIC = 0x1,
FLUENCE_QUAD_MIC = 0x2,
+ FLUENCE_HEX_MIC = 0x4,
};
enum {
@@ -37,6 +38,7 @@
SOURCE_DUAL_MIC = 0x2, /* Target contains 2 mics */
SOURCE_THREE_MIC = 0x4, /* Target contains 3 mics */
SOURCE_QUAD_MIC = 0x8, /* Target contains 4 mics */
+ SOURCE_HEX_MIC = 0x16, /* Target contains 6 mics */
};
enum {
@@ -222,6 +224,10 @@
SND_DEVICE_IN_UNPROCESSED_THREE_MIC,
SND_DEVICE_IN_UNPROCESSED_QUAD_MIC,
SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC,
+ SND_DEVICE_IN_HANDSET_6MIC,
+ SND_DEVICE_IN_HANDSET_8MIC,
+ SND_DEVICE_IN_EC_REF_LOOPBACK_MONO,
+ SND_DEVICE_IN_EC_REF_LOOPBACK_STEREO,
SND_DEVICE_IN_END,
SND_DEVICE_MAX = SND_DEVICE_IN_END,