hal: enable support for AEC on Voice Recognition path
- enable AEC for VR path for multi mic
Bug: 27906575
Change-Id: I21bf7247bed93b200169f2cb60d3ddff8631fd6e
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index d907e82..6766142 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2158,20 +2158,24 @@
lock_input_stream(in);
pthread_mutex_lock(&in->dev->lock);
if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+ in->source == AUDIO_SOURCE_VOICE_RECOGNITION ||
adev->mode == AUDIO_MODE_IN_COMMUNICATION) &&
in->enable_aec != enable &&
(memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) {
in->enable_aec = enable;
if (!enable)
platform_set_echo_reference(in->dev, enable, AUDIO_DEVICE_NONE);
- adev->enable_voicerx = enable;
- struct audio_usecase *usecase;
- struct listnode *node;
- list_for_each(node, &adev->usecase_list) {
- usecase = node_to_item(node, struct audio_usecase, list);
- if (usecase->type == PCM_PLAYBACK) {
- select_devices(adev, usecase->id);
- break;
+ if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+ adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
+ adev->enable_voicerx = enable;
+ struct audio_usecase *usecase;
+ struct listnode *node;
+ list_for_each(node, &adev->usecase_list) {
+ usecase = node_to_item(node, struct audio_usecase, list);
+ if (usecase->type == PCM_PLAYBACK) {
+ select_devices(adev, usecase->id);
+ break;
+ }
}
}
if (!in->standby)
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 89b6de5..f4f2f73 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -258,6 +258,7 @@
[SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
[SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
+ [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = "voice-rec-mic",
[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
[SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "headset-mic",
@@ -272,6 +273,8 @@
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
[SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
[SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
+ [SND_DEVICE_IN_HANDSET_TMIC_AEC] = "three-mic",
+ [SND_DEVICE_IN_HANDSET_QMIC_AEC] = "quad-mic",
};
/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
@@ -347,6 +350,7 @@
[SND_DEVICE_IN_VOICE_REC_MIC] = ACDB_ID_VOICE_REC_MIC,
[SND_DEVICE_IN_VOICE_REC_MIC_NS] = 113,
+ [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = 112,
[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 35,
[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 43,
[SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
@@ -361,6 +365,8 @@
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
[SND_DEVICE_IN_HANDSET_TMIC] = 125,
[SND_DEVICE_IN_HANDSET_QMIC] = 125,
+ [SND_DEVICE_IN_HANDSET_TMIC_AEC] = 125, /* override this for new target to 140 */
+ [SND_DEVICE_IN_HANDSET_QMIC_AEC] = 125, /* override this for new target to 140 */
};
struct name_to_index {
@@ -443,6 +449,7 @@
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_AEC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_HEADSET_MIC)},
@@ -455,6 +462,8 @@
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC_AEC)},
};
static char * backend_tag_table[SND_DEVICE_MAX] = {0};
@@ -2052,14 +2061,23 @@
if (my_data->fluence_in_voice_rec && channel_count == 1) {
if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
(my_data->source_mic_type & SOURCE_QUAD_MIC)) {
- snd_device = SND_DEVICE_IN_HANDSET_QMIC;
+ if (adev->active_input->enable_aec)
+ snd_device = SND_DEVICE_IN_HANDSET_QMIC_AEC;
+ else
+ snd_device = SND_DEVICE_IN_HANDSET_QMIC;
} else if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
(my_data->source_mic_type & SOURCE_THREE_MIC)) {
- snd_device = SND_DEVICE_IN_HANDSET_TMIC;
+ if (adev->active_input->enable_aec)
+ snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC;
+ else
+ snd_device = SND_DEVICE_IN_HANDSET_TMIC;
} else if (((my_data->fluence_type == FLUENCE_PRO_ENABLE) ||
(my_data->fluence_type == FLUENCE_ENABLE)) &&
(my_data->source_mic_type & SOURCE_DUAL_MIC)) {
- snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
+ if (adev->active_input->enable_aec)
+ snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
+ else
+ snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
}
platform_set_echo_reference(adev, true, out_device);
} else if ((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) &&
@@ -2075,7 +2093,10 @@
if (snd_device == SND_DEVICE_NONE) {
if (adev->active_input->enable_ns)
snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
- else
+ else if (adev->active_input->enable_aec) {
+ snd_device = SND_DEVICE_IN_VOICE_REC_MIC_AEC;
+ platform_set_echo_reference(adev, true, out_device);
+ } else
snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
}
} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 53474f6..7a27359 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -128,6 +128,7 @@
SND_DEVICE_IN_VOICE_REC_MIC,
SND_DEVICE_IN_VOICE_REC_MIC_NS,
+ SND_DEVICE_IN_VOICE_REC_MIC_AEC,
SND_DEVICE_IN_VOICE_REC_DMIC_STEREO,
SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE,
SND_DEVICE_IN_VOICE_REC_HEADSET_MIC,
@@ -143,6 +144,8 @@
SND_DEVICE_IN_HANDSET_TMIC,
SND_DEVICE_IN_HANDSET_QMIC,
+ SND_DEVICE_IN_HANDSET_TMIC_AEC,
+ SND_DEVICE_IN_HANDSET_QMIC_AEC,
SND_DEVICE_IN_END,
SND_DEVICE_MAX = SND_DEVICE_IN_END,