hal: Implement tx mute in HFP usecase

Add support for tx mute in HFP use case

CRs-Fixed: 1068669
Change-Id: I28602fcb8e061b3ca196db0e82908bbdf9266f98
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 069feda..b57bb81 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -459,9 +459,11 @@
 #ifndef HFP_ENABLED
 #define audio_extn_hfp_is_active(adev)                  (0)
 #define audio_extn_hfp_get_usecase()                    (-1)
+#define hfp_set_mic_mute(dev, state)                    (0)
 #else
 bool audio_extn_hfp_is_active(struct audio_device *adev);
 audio_usecase_t audio_extn_hfp_get_usecase();
+int hfp_set_mic_mute(struct audio_device *dev, bool state);
 #endif
 
 #ifndef DEV_ARBI_ENABLED
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index 5a45b80..243d48d 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -302,6 +302,26 @@
         return false;
 }
 
+int hfp_set_mic_mute(struct audio_device *adev, bool state)
+{
+    struct mixer_ctl *ctl;
+    const char *mixer_ctl_name = "HFP TX Mute";
+    uint32_t set_values[ ] = {0};
+
+    ALOGI("%s: enter, state=%d", __func__, state);
+
+    set_values[0] = state;
+    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
+    if (!ctl) {
+        ALOGE("%s: Could not get ctl for mixer cmd - %s",
+               __func__, mixer_ctl_name);
+        return -EINVAL;
+    }
+    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
+    ALOGV("%s: exit", __func__);
+    return 0;
+}
+
 audio_usecase_t audio_extn_hfp_get_usecase()
 {
     return hfpmod.ucid;
diff --git a/hal/voice.c b/hal/voice.c
index f86483e..b84c7b7 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -417,11 +417,13 @@
     int err = 0;
 
     adev->voice.mic_mute = state;
-    if (adev->mode == AUDIO_MODE_IN_CALL)
+    if (audio_extn_hfp_is_active(adev)) {
+        err = hfp_set_mic_mute(adev, state);
+    } else if (adev->mode == AUDIO_MODE_IN_CALL) {
         err = platform_set_mic_mute(adev->platform, state);
-    if (adev->mode == AUDIO_MODE_IN_COMMUNICATION)
+    } else if (adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
         err = voice_extn_compress_voip_set_mic_mute(adev, state);
-
+    }
     return err;
 }