hal: Fix EC not working in VoIP calls

Ensure the EC reference path is reset while switching device
for VoIP calls.

Bug: 17986908
Change-Id: I7eca6842ee2ba298493cb1cd479f90318a437e12
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 2f97e96..c7daf09 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -551,7 +551,8 @@
                                             usecase->stream.out->devices);
                 if (usecase->stream.out == adev->primary_output &&
                         adev->active_input &&
-                        adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+                        adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
+                        out_snd_device != usecase->out_snd_device) {
                     select_devices(adev, adev->active_input->usecase);
                 }
             }
@@ -563,6 +564,7 @@
                 if (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
                         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/msm8974/platform.c b/hal/msm8974/platform.c
index 7248098..7ba0bf0 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -87,6 +87,7 @@
     struct csd_data *csd;
     bool ext_speaker;
     bool ext_earpiece;
+    char ec_ref_mixer_path[64];
 };
 
 static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
@@ -409,23 +410,24 @@
 
 void platform_set_echo_reference(struct audio_device *adev, bool enable, audio_devices_t out_device)
 {
-    char mixer_path[50] = { 0 } ;
+    struct platform_data *my_data = (struct platform_data *)adev->platform;
     snd_device_t snd_device = SND_DEVICE_NONE;
-    struct listnode *node;
-    struct audio_usecase *usecase;
 
-    strcpy(mixer_path, "echo-reference");
-    if (out_device != AUDIO_DEVICE_NONE) {
-        snd_device = platform_get_output_snd_device(adev->platform, out_device);
-        platform_add_backend_name(adev->platform, mixer_path, snd_device);
+    if (strcmp(my_data->ec_ref_mixer_path, "")) {
+        ALOGV("%s: diabling %s", __func__, my_data->ec_ref_mixer_path);
+        audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
     }
 
-    if (enable)
-        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
-    else
-        audio_route_reset_and_update_path(adev->audio_route, mixer_path);
+    if (enable) {
+        strcpy(my_data->ec_ref_mixer_path, "echo-reference");
+        if (out_device != AUDIO_DEVICE_NONE) {
+            snd_device = platform_get_output_snd_device(adev->platform, out_device);
+            platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device);
+        }
 
-    ALOGV("Setting EC Reference: %d for %s", enable, mixer_path);
+        ALOGD("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
+        audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
+    }
 }
 
 static struct csd_data *open_csd_client(bool i2s_ext_modem)
@@ -1419,7 +1421,7 @@
                } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
                    snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
                }
-                platform_set_echo_reference(adev, true, out_device);
+               platform_set_echo_reference(adev, true, out_device);
             } else if (adev->active_input->enable_ns) {
                 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
                     if (my_data->fluence_in_spkr_mode &&