hal: ensure voip tx update base on the rx path
Voip does not use primary output in rx path. When voip
rx device change, voip tx path is not updated accordingly.
Fix it by selecting voip tx device base on the rx path,
otherwise base on primary output device.
CRs-Fixed: 2289517
Change-Id: Ic078eb057be40dd4338ade70f541bb056c19dfca
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 4ae9097..482ffd6 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2131,9 +2131,15 @@
if (out_snd_device == SND_DEVICE_NONE) {
out_snd_device = platform_get_output_snd_device(adev->platform,
usecase->stream.out);
- if (usecase->stream.out == adev->primary_output &&
- adev->active_input &&
- out_snd_device != usecase->out_snd_device) {
+ voip_usecase = get_usecase_from_list(adev, USECASE_AUDIO_PLAYBACK_VOIP);
+ if (voip_usecase == NULL)
+ voip_usecase = get_usecase_from_list(adev, adev->primary_output->usecase);
+
+ if ((usecase->stream.out != NULL &&
+ voip_usecase != NULL &&
+ usecase->stream.out->usecase == voip_usecase->id) &&
+ adev->active_input &&
+ out_snd_device != usecase->out_snd_device) {
select_devices(adev, adev->active_input->usecase);
}
}
@@ -2149,9 +2155,12 @@
if (adev->active_input &&
(adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
(adev->mode == AUDIO_MODE_IN_COMMUNICATION &&
- adev->active_input->source == AUDIO_SOURCE_MIC)) &&
- adev->primary_output && !adev->primary_output->standby) {
- out_device = adev->primary_output->devices;
+ adev->active_input->source == AUDIO_SOURCE_MIC))) {
+ voip_usecase = get_usecase_from_list(adev, USECASE_AUDIO_PLAYBACK_VOIP);
+ if (voip_usecase != NULL && voip_usecase->stream.out != NULL)
+ out_device = voip_usecase->stream.out->devices;
+ else if (adev->primary_output && !adev->primary_output->standby)
+ out_device = adev->primary_output->devices;
platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
} else if (usecase->id == USECASE_AUDIO_RECORD_AFE_PROXY) {
out_device = AUDIO_DEVICE_OUT_TELEPHONY_TX;
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 3d9a7e0..e5cb9b4 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -4655,6 +4655,16 @@
(mode == AUDIO_MODE_IN_COMMUNICATION)) {
if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
in_device = AUDIO_DEVICE_IN_BACK_MIC;
+ else if (out_device & AUDIO_DEVICE_OUT_EARPIECE)
+ in_device = AUDIO_DEVICE_IN_BUILTIN_MIC;
+ else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET)
+ in_device = AUDIO_DEVICE_IN_WIRED_HEADSET;
+ else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE)
+ in_device = AUDIO_DEVICE_IN_USB_DEVICE;
+
+ in_device = ((out_device == AUDIO_DEVICE_NONE) ?
+ AUDIO_DEVICE_IN_BUILTIN_MIC : in_device) & ~AUDIO_DEVICE_BIT_IN;
+
if (adev->active_input) {
snd_device = get_snd_device_for_voice_comm(my_data, out_device, in_device);
}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 9283115..2753ff8 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -4490,6 +4490,16 @@
(mode == AUDIO_MODE_IN_COMMUNICATION)) {
if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
in_device = AUDIO_DEVICE_IN_BACK_MIC;
+ else if (out_device & AUDIO_DEVICE_OUT_EARPIECE)
+ in_device = AUDIO_DEVICE_IN_BUILTIN_MIC;
+ else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET)
+ in_device = AUDIO_DEVICE_IN_WIRED_HEADSET;
+ else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE)
+ in_device = AUDIO_DEVICE_IN_USB_DEVICE;
+
+ in_device = ((out_device == AUDIO_DEVICE_NONE) ?
+ AUDIO_DEVICE_IN_BUILTIN_MIC : in_device) & ~AUDIO_DEVICE_BIT_IN;
+
if (adev->active_input) {
snd_device = get_snd_device_for_voice_comm(my_data, out_device, in_device);
}