Merge "configs: Declare low-latency and pro audio capability"
diff --git a/configs/msmsteppe_au/mixer_paths_adp.xml b/configs/msmsteppe_au/mixer_paths_adp.xml
index e2de539..4ac4798 100644
--- a/configs/msmsteppe_au/mixer_paths_adp.xml
+++ b/configs/msmsteppe_au/mixer_paths_adp.xml
@@ -755,6 +755,11 @@
<path name="compress-offload-playback4" />
</path>
+ <path name="voice-call">
+ <!-- Added AFE loopback ctrl path for CS-Voice call-->
+ <ctl name="TERT_TDM_RX_0 Port Mixer AUX_PCM_UL_TX" value="1" />
+ <ctl name="AUX_PCM_RX Port Mixer TERT_TDM_TX_0" value="1" />
+ </path>
<path name="compress-offload-playback4 afe-proxy">
<ctl name="AFE_PCM_RX Audio Mixer MultiMedia11" value="1" />
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index c7d2090..0988ad1 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -2019,7 +2019,9 @@
!strncmp(snd_card_name, "sdx-tavil-i2s-snd-card",
sizeof("sdx-tavil-i2s-snd-card")) ||
!strncmp(snd_card_name, "sda845-tavil-i2s-snd-card",
- sizeof("sda845-tavil-i2s-snd-card"))) {
+ sizeof("sda845-tavil-i2s-snd-card")) ||
+ !strncmp(snd_card_name, "sa6155-adp-star-snd-card",
+ sizeof("sa6155-adp-star-snd-card"))) {
plat_data->is_i2s_ext_modem = true;
}
ALOGV("%s, is_i2s_ext_modem:%d soundcard name is %s",__func__,
@@ -2028,6 +2030,20 @@
return plat_data->is_i2s_ext_modem;
}
+static bool is_auto_snd_card(const char *snd_card_name)
+{
+ bool is_auto_snd_card = false;
+
+ if (!strncmp(snd_card_name, "sa6155-adp-star-snd-card",
+ sizeof("sa6155-adp-star-snd-card"))) {
+ is_auto_snd_card = true;
+ ALOGV("%s : Auto snd card detected: soundcard name is %s",__func__,
+ snd_card_name);
+ }
+
+ return is_auto_snd_card;
+}
+
static void set_platform_defaults(struct platform_data * my_data)
{
int32_t dev;
@@ -2925,7 +2941,8 @@
return NULL;
}
- if (platform_is_i2s_ext_modem(snd_card_name, my_data)) {
+ if (platform_is_i2s_ext_modem(snd_card_name, my_data) &&
+ !is_auto_snd_card(snd_card_name)) {
ALOGD("%s: Call MIXER_XML_PATH_I2S", __func__);
adev->audio_route = audio_route_init(adev->snd_card,
@@ -3163,7 +3180,7 @@
/* Initialize ACDB ID's */
- if (my_data->is_i2s_ext_modem)
+ if (my_data->is_i2s_ext_modem && !is_auto_snd_card(snd_card_name))
platform_info_init(PLATFORM_INFO_XML_PATH_I2S, my_data, PLATFORM);
else if (!strncmp(snd_card_name, "sdm660-snd-card-skush",
sizeof("sdm660-snd-card-skush")))
@@ -3362,6 +3379,7 @@
property_get("ro.baseband", baseband, "");
if ((!strncmp("apq8084", platform, sizeof("apq8084")) ||
!strncmp("msm8996", platform, sizeof("msm8996")) ||
+ !strncmp("sm6150", platform, sizeof("sm6150")) ||
!strncmp("sdx", platform, sizeof("sdx")) ||
!strncmp("sdm845", platform, sizeof("sdm845"))) &&
( !strncmp("mdm", baseband, (sizeof("mdm")-1)) ||
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 13f85e6..7b4647a 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -586,6 +586,14 @@
#define VOLTE_CALL_PCM_DEVICE 15
#define QCHAT_CALL_PCM_DEVICE 37
#define VOWLAN_CALL_PCM_DEVICE 16
+#elif PLATFORM_AUTO
+#define HOST_LESS_RX_ID 41
+#define HOST_LESS_TX_ID 42
+#define VOICE_CALL_PCM_DEVICE 8
+#define VOICE2_CALL_PCM_DEVICE -1
+#define VOLTE_CALL_PCM_DEVICE -1
+#define QCHAT_CALL_PCM_DEVICE -1
+#define VOWLAN_CALL_PCM_DEVICE -1
#else
#define VOICE_CALL_PCM_DEVICE 2
#define VOICE2_CALL_PCM_DEVICE 22
diff --git a/hal/platform_info.c b/hal/platform_info.c
index 8ee8b07..827c558 100644
--- a/hal/platform_info.c
+++ b/hal/platform_info.c
@@ -653,6 +653,8 @@
}
str_parms_add_str(my_data.kvpairs, (char*)attr[1], (char*)attr[3]);
+ if (my_data.caller == PLATFORM)
+ platform_set_parameters(my_data.platform, my_data.kvpairs);
done:
return;
}
@@ -1387,9 +1389,6 @@
section = ROOT;
} else if (strcmp(tag_name, "config_params") == 0) {
section = ROOT;
- if (my_data.caller == PLATFORM) {
- platform_set_parameters(my_data.platform, my_data.kvpairs);
- }
} else if (strcmp(tag_name, "operator_specific") == 0) {
section = ROOT;
} else if (strcmp(tag_name, "interface_names") == 0) {
diff --git a/hal/voice.c b/hal/voice.c
index 006dd08..c686686 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -48,6 +48,10 @@
.format = PCM_FORMAT_S16_LE,
};
+#ifdef PLATFORM_AUTO
+struct pcm *voice_loopback_tx = NULL;
+struct pcm *voice_loopback_rx = NULL;
+#endif
static struct voice_session *voice_get_session_from_use_case(struct audio_device *adev,
audio_usecase_t usecase_id)
{
@@ -182,6 +186,16 @@
session->pcm_tx = NULL;
}
+#ifdef PLATFORM_AUTO
+ if(voice_loopback_rx) {
+ pcm_close(voice_loopback_rx);
+ voice_loopback_rx = NULL;
+ }
+ if(voice_loopback_tx) {
+ pcm_close(voice_loopback_tx);
+ voice_loopback_tx = NULL;
+ }
+#endif
/* 2. Get and set stream specific mixer controls */
disable_audio_route(adev, uc_info);
@@ -201,6 +215,9 @@
int ret = 0;
struct audio_usecase *uc_info;
int pcm_dev_rx_id, pcm_dev_tx_id;
+#ifdef PLATFORM_AUTO
+ int pcm_dev_loopback_rx_id, pcm_dev_loopback_tx_id;
+#endif
uint32_t sample_rate = 8000;
struct voice_session *session = NULL;
struct pcm_config voice_config = pcm_config_voice_call;
@@ -246,6 +263,10 @@
select_devices(adev, usecase_id);
+#ifdef PLATFORM_AUTO
+ pcm_dev_loopback_rx_id = HOST_LESS_RX_ID;
+ pcm_dev_loopback_tx_id = HOST_LESS_TX_ID;
+#endif
pcm_dev_rx_id = platform_get_pcm_device_id(uc_info->id, PCM_PLAYBACK);
pcm_dev_tx_id = platform_get_pcm_device_id(uc_info->id, PCM_CAPTURE);
@@ -287,6 +308,28 @@
goto error_start_voice;
}
+#ifdef PLATFORM_AUTO
+ voice_loopback_rx = pcm_open(adev->snd_card,
+ pcm_dev_loopback_rx_id,
+ PCM_OUT, &voice_config);
+ if (voice_loopback_rx < 0 || !pcm_is_ready(voice_loopback_rx)) {
+ ALOGE("%s: Either could not open pcm_dev_loopback_rx_id %d or %s",
+ __func__, pcm_dev_loopback_rx_id, pcm_get_error(voice_loopback_rx));
+ ret = -EIO;
+ goto error_start_voice;
+ }
+
+ voice_loopback_tx = pcm_open(adev->snd_card,
+ pcm_dev_loopback_tx_id,
+ PCM_IN, &voice_config);
+ if (voice_loopback_tx < 0 || !pcm_is_ready(voice_loopback_tx)) {
+ ALOGE("%s: Either could not open pcm_dev_loopback_tx_id or %s",
+ __func__, pcm_dev_loopback_tx_id, pcm_get_error(voice_loopback_tx));
+ ret = -EIO;
+ goto error_start_voice;
+ }
+#endif
+
if(adev->mic_break_enabled)
platform_set_mic_break_det(adev->platform, true);
@@ -302,6 +345,20 @@
goto error_start_voice;
}
+#ifdef PLATFORM_AUTO
+ ret = pcm_start(voice_loopback_tx);
+ if (ret != 0) {
+ ALOGE("%s: %s", __func__, pcm_get_error(voice_loopback_tx));
+ goto error_start_voice;
+ }
+
+ ret = pcm_start(voice_loopback_rx);
+ if (ret != 0) {
+ ALOGE("%s: %s", __func__, pcm_get_error(voice_loopback_rx));
+ goto error_start_voice;
+ }
+#endif
+
/* Enable aanc only when no calls are active */
if (!voice_is_call_state_active(adev))
voice_check_and_update_aanc_path(adev, uc_info->out_snd_device, true);