hal: enable sidetone for VoIP calls on voice path

Add support for sidetone for VoIP calls on voice path.
Enable/disbale sidetone during VoIP call set up/tear down
and also during device switch.

CRs-fixed: 890371
Change-Id: Ib79eed79ddcd2bfed1d9bc322195036736a67cb2
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 821b339..3fa45fe 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -918,8 +918,14 @@
         (usecase->in_snd_device != SND_DEVICE_NONE) &&
         (usecase->out_snd_device != SND_DEVICE_NONE)) {
         status = platform_switch_voice_call_device_pre(adev->platform);
-        /* Disable sidetone only if voice call already exists */
-        if (voice_is_call_state_active(adev))
+    }
+
+    if (((usecase->type == VOICE_CALL) ||
+         (usecase->type == VOIP_CALL)) &&
+        (usecase->out_snd_device != SND_DEVICE_NONE)) {
+        /* Disable sidetone only if voice/voip call already exists */
+        if (voice_is_call_state_active(adev) ||
+            voice_extn_compress_voip_is_started(adev))
             voice_set_sidetone(adev, usecase->out_snd_device, false);
     }
 
@@ -963,8 +969,9 @@
                                                         out_snd_device,
                                                         in_snd_device);
         enable_audio_route_for_voice_usecases(adev, usecase);
-        /* Enable sidetone only if voice call already exists */
-        if (voice_is_call_state_active(adev))
+        /* Enable sidetone only if voice/voip call already exists */
+        if (voice_is_call_state_active(adev) ||
+            voice_extn_compress_voip_is_started(adev))
             voice_set_sidetone(adev, out_snd_device, true);
     }
 
diff --git a/hal/voice_extn/compress_voip.c b/hal/voice_extn/compress_voip.c
index 14af6fc..c249018 100644
--- a/hal/voice_extn/compress_voip.c
+++ b/hal/voice_extn/compress_voip.c
@@ -294,6 +294,7 @@
                   __func__, USECASE_COMPRESS_VOIP_CALL);
             return -EINVAL;
         }
+        voice_set_sidetone(adev, uc_info->out_snd_device, false);
 
         /* 1. Close the PCM devices */
         if (voip_data.pcm_rx) {
@@ -365,6 +366,19 @@
             goto error_start_voip;
         }
 
+        ALOGD("%s: Opening PCM capture device card_id(%d) device_id(%d)",
+              __func__, adev->snd_card, pcm_dev_tx_id);
+        voip_data.pcm_tx = pcm_open(adev->snd_card,
+                                    pcm_dev_tx_id,
+                                    PCM_IN, voip_config);
+        if (voip_data.pcm_tx && !pcm_is_ready(voip_data.pcm_tx)) {
+            ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_tx));
+            pcm_close(voip_data.pcm_tx);
+            voip_data.pcm_tx = NULL;
+            ret = -EIO;
+            goto error_start_voip;
+        }
+
         ALOGD("%s: Opening PCM playback device card_id(%d) device_id(%d)",
               __func__, adev->snd_card, pcm_dev_rx_id);
         voip_data.pcm_rx = pcm_open(adev->snd_card,
@@ -374,35 +388,19 @@
             ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_rx));
             pcm_close(voip_data.pcm_rx);
             voip_data.pcm_rx = NULL;
-            ret = -EIO;
-            goto error_start_voip;
-        }
-
-        ALOGD("%s: Opening PCM capture device card_id(%d) device_id(%d)",
-              __func__, adev->snd_card, pcm_dev_tx_id);
-        voip_data.pcm_tx = pcm_open(adev->snd_card,
-                                    pcm_dev_tx_id,
-                                    PCM_IN, voip_config);
-        if (voip_data.pcm_tx && !pcm_is_ready(voip_data.pcm_tx)) {
-            ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_tx));
-            pcm_close(voip_data.pcm_rx);
-            voip_data.pcm_tx = NULL;
-            if (voip_data.pcm_rx) {
-                pcm_close(voip_data.pcm_rx);
-                voip_data.pcm_rx = NULL;
+            if (voip_data.pcm_tx) {
+                pcm_close(voip_data.pcm_tx);
+                voip_data.pcm_tx = NULL;
             }
             ret = -EIO;
             goto error_start_voip;
         }
-        pcm_start(voip_data.pcm_rx);
+
         pcm_start(voip_data.pcm_tx);
+        pcm_start(voip_data.pcm_rx);
 
+        voice_set_sidetone(adev, uc_info->out_snd_device, true);
         voice_extn_compress_voip_set_volume(adev, adev->voice.volume);
-
-        if (ret < 0) {
-            ALOGE("%s: error %d\n", __func__, ret);
-            goto error_start_voip;
-        }
     } else {
         ALOGV("%s: voip usecase is already enabled", __func__);
         if (voip_data.out_stream)
@@ -813,3 +811,13 @@
     }
     return ret;
 }
+
+bool voice_extn_compress_voip_is_started(struct audio_device *adev)
+{
+    bool ret = false;
+    if (voice_extn_compress_voip_is_active(adev) &&
+        voip_data.pcm_tx && voip_data.pcm_rx)
+        ret = true;
+
+    return ret;
+}
diff --git a/hal/voice_extn/voice_extn.h b/hal/voice_extn/voice_extn.h
index 4a04adb..af0ad08 100644
--- a/hal/voice_extn/voice_extn.h
+++ b/hal/voice_extn/voice_extn.h
@@ -145,6 +145,7 @@
 bool voice_extn_compress_voip_is_active(struct audio_device *adev);
 bool voice_extn_compress_voip_is_format_supported(audio_format_t format);
 bool voice_extn_compress_voip_is_config_supported(struct audio_config *config);
+bool voice_extn_compress_voip_is_started(struct audio_device *adev);
 #else
 static int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream __unused)
 {
@@ -264,6 +265,12 @@
     ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__);
     return true;
 }
+
+static bool voice_extn_compress_voip_is_started(struct audio_device *adev __unused)
+{
+    ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__);
+    return false;
+}
 #endif
 
 #endif //VOICE_EXTN_H