hal: add external echo reference to ecns-hfp calls
* Add ec_car_state to switch between single-mic
and multi-mic ecns hfp calls.
* Add the capability to have an echo reference for
both single-mic and multi-mic ecns hfp call.
* New snd device is introduced for multi-mic ecns hfp.
Change-Id: I5a8c869cf6854020e15efb61cbaf78f3f027e1ee
Signed-off-by: Guodong Hu <guodhu@codeaurora.org>
Signed-off-by: Derek Chen <chenche@codeaurora.org>
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 264c6f6..aded977 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -149,6 +149,7 @@
#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_EC_CAR_STATE "ec_car_state"
#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
@@ -302,6 +303,7 @@
bool hifi_audio;
bool is_i2s_ext_modem;
bool is_acdb_initialized;
+ bool ec_car_state;
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool is_bcl_speaker;
@@ -656,6 +658,7 @@
[SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = "voice-speaker-tmic",
[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp",
+ [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = "voice-speaker-mic-hfp-mmsecns",
[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
[SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
[SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
@@ -906,6 +909,7 @@
[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB] = 171,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
+ [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = 131,
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
[SND_DEVICE_IN_SPDIF] = 143,
[SND_DEVICE_IN_HDMI_MIC] = 143,
@@ -1142,6 +1146,7 @@
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_SB)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPDIF)},
{TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
@@ -1893,6 +1898,9 @@
else if (out_device & AUDIO_DEVICE_OUT_USB_HEADSET)
strlcat(ec_ref_mixer_path, " usb-headphones",
MIXER_PATH_MAX_LENGTH);
+ else if (out_device & AUDIO_DEVICE_OUT_BUS)
+ strlcpy(ec_ref_mixer_path, "multi-mic-echo-reference",
+ MIXER_PATH_MAX_LENGTH);
if (audio_route_apply_and_update_path(adev->audio_route,
ec_ref_mixer_path) == 0)
@@ -2184,6 +2192,7 @@
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_STEREO_AND_VOICE_ANC_FB_HEADSET] = strdup("speaker-and-headphones");
backend_tag_table[SND_DEVICE_OUT_VOICE_HEARING_AID] = strdup("hearing-aid");
+ backend_tag_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("bt-sco-mmsecns");
hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
@@ -2341,6 +2350,7 @@
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_SB] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = strdup("SLIMBUS_0_TX");
+ hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP_MMSECNS] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_TMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
@@ -3103,6 +3113,7 @@
my_data->spkr_ch_map = NULL;
my_data->use_sprk_default_sample_rate = true;
my_data->fluence_in_voice_comm = false;
+ my_data->ec_car_state = false;
platform_reset_edid_info(my_data);
//set max volume step for voice call
@@ -7280,6 +7291,21 @@
return ret;
}
+bool platform_get_eccarstate(void *platform)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+ return my_data->ec_car_state;
+}
+
+static int platform_set_eccarstate(struct platform_data *my_data, bool state)
+{
+ int ret = 0;
+ ALOGD("Setting EC Car state: %d", state);
+ my_data->ec_car_state = state;
+
+ return ret;
+}
+
static int update_external_device_status(struct platform_data *my_data,
char* event_name, bool status)
{
@@ -7713,6 +7739,18 @@
}
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ value, len);
+ if (err >= 0) {
+ bool state = false;
+ if (!strncmp("true", value, sizeof("true"))) {
+ state = true;
+ ALOGD("%s: Value of EC CAR STATE set to true!", __func__);
+ }
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_EC_CAR_STATE);
+ platform_set_eccarstate(my_data, state);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_RELOAD_ACDB,
value, len);
if (err >= 0) {
@@ -8081,6 +8119,13 @@
str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
}
+ ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ value, sizeof(value));
+ if (ret >= 0) {
+ str_parms_add_str(reply, AUDIO_PARAMETER_KEY_EC_CAR_STATE,
+ my_data->ec_car_state? "true" : "false");
+ }
+
ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_DP_FOR_VOICE_USECASE,
value, sizeof(value));