External Modem based Voice call support

1. Enable csd client related changes
2. PCM device id update for voice call
3. AFE loopback for both voice call rx and tx path

Change-Id: I66081f003549a244548a050c2bb13796ee6c79e4
This commit is contained in:
Suprith Malligere Shankaregowda 2019-03-22 19:48:44 +05:30 committed by Derek Chen
parent 2d82b84b91
commit 7400b215d6
4 changed files with 91 additions and 3 deletions

View File

@ -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" />

View File

@ -2017,7 +2017,9 @@ static bool platform_is_i2s_ext_modem(const char *snd_card_name,
!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__,
@ -2026,6 +2028,20 @@ static bool platform_is_i2s_ext_modem(const char *snd_card_name,
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;
@ -2923,7 +2939,8 @@ void *platform_init(struct audio_device *adev)
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,
@ -3161,7 +3178,7 @@ void *platform_init(struct audio_device *adev)
/* 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")))
@ -3360,6 +3377,7 @@ acdb_init_fail:
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)) ||

View File

@ -585,6 +585,14 @@ enum {
#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

View File

@ -48,6 +48,10 @@ struct pcm_config pcm_config_voice_call = {
.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 @@ int voice_stop_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
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 voice_start_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
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 @@ int voice_start_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
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 @@ int voice_start_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
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 @@ int voice_start_usecase(struct audio_device *adev, audio_usecase_t usecase_id)
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);