audio: mute HDMI audio when not in use

Bug: 7208242
Change-Id: I6db26e7ef378ab546017a1a6e91895d9886fc18d
diff --git a/audio/Android.mk b/audio/Android.mk
index 8ce4753..cf5b7f4 100644
--- a/audio/Android.mk
+++ b/audio/Android.mk
@@ -24,6 +24,7 @@
 LOCAL_C_INCLUDES += \
 	external/tinyalsa/include \
 	external/expat/lib \
+	hardware/samsung_slsi/exynos5/include \
 	$(call include-path-for, audio-utils)
 LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils libexpat
 LOCAL_MODULE_TAGS := optional
diff --git a/audio/audio_hw.c b/audio/audio_hw.c
index 093a9ae..0e3c11f 100644
--- a/audio/audio_hw.c
+++ b/audio/audio_hw.c
@@ -31,6 +31,9 @@
 #include <hardware/audio.h>
 #include <hardware/hardware.h>
 
+#include <linux/videodev2.h>
+#include <videodev2_exynos_media.h>
+
 #include <system/audio.h>
 
 #include <tinyalsa/asoundlib.h>
@@ -378,6 +381,30 @@
 
 /* Helper functions */
 
+static int enable_hdmi_audio(int enable)
+{
+    int fd;
+    int ret;
+    struct v4l2_control ctrl;
+
+    fd = open("/dev/video16", O_RDWR);
+    if (fd < 0) {
+        ALOGE("cannot open /dev/video16 (%d)", fd);
+        return -ENOSYS;
+    }
+
+    ctrl.id = V4L2_CID_TV_ENABLE_HDMI_AUDIO;
+    ctrl.value = !!enable;
+    ret = ioctl(fd, VIDIOC_S_CTRL, &ctrl);
+
+    if (ret < 0)
+        ALOGE("V4L2_CID_TV_ENABLE_HDMI_AUDIO ioctl error (%d)", errno);
+
+    close(fd);
+
+    return ret;
+}
+
 static void select_devices(struct audio_device *adev)
 {
     int output_device_id = get_output_device_id(adev->out_device);
@@ -461,6 +488,8 @@
             adev->es305_preset = new_es305_preset;
     }
 
+    enable_hdmi_audio(adev->out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL);
+
     update_mixer_state(adev->ar);
 }