hal: add Dolby DD+ support for AC3/EAC3

- Enhance offload formats to support AC3/EAC3.
- update HMDI profile check to make sure that
  Dolby playback goes through compress offload
  path.

Change-Id: Id8d1738305c117ccdf01c61bb5f4dd17e106b40b
diff --git a/hal/Android.mk b/hal/Android.mk
index abafb85..86f92d9 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -87,6 +87,11 @@
     LOCAL_SRC_FILES += audio_extn/compress_capture.c
 endif
 
+ifneq ($(strip $(AUDIO_FEATURE_DISABLED_DS1_DOLBY_DDP)),true)
+    LOCAL_CFLAGS += -DDS1_DOLBY_DDP_ENABLED
+    LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
+endif
+
 LOCAL_SHARED_LIBRARIES := \
 	liblog \
 	libcutils \
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 0c8918a..2c7fbca 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -29,6 +29,8 @@
 #include "audio_hw.h"
 #include "audio_extn.h"
 
+#include "sound/compress_params.h"
+
 #define MAX_SLEEP_RETRY 100
 #define WIFI_INIT_WAIT_SLEEP 50
 
@@ -256,3 +258,57 @@
     return 0;
 }
 #endif /* AUXPCM_BT_ENABLED */
+
+
+#ifdef DS1_DOLBY_DDP_ENABLED
+
+bool audio_extn_dolby_is_supported_format(audio_format_t format)
+{
+    if (format == AUDIO_FORMAT_AC3 ||
+            format == AUDIO_FORMAT_EAC3)
+        return true;
+    else
+        return false;
+}
+
+int audio_extn_dolby_get_snd_codec_id(audio_format_t format)
+{
+    int id = 0;
+
+    switch (format) {
+    case AUDIO_FORMAT_AC3:
+        id = SND_AUDIOCODEC_AC3;
+        break;
+    case AUDIO_FORMAT_EAC3:
+        id = SND_AUDIOCODEC_EAC3;
+        break;
+    default:
+        ALOGE("%s: Unsupported audio format :%x", __func__, format);
+    }
+
+    return id;
+}
+
+int audio_extn_dolby_set_DMID(struct audio_device *adev)
+{
+    struct mixer_ctl *ctl;
+    const char *mixer_ctl_name = "DS1 Security";
+    char c_dmid[128] = {0};
+    int i_dmid, ret;
+
+    property_get("dmid",c_dmid,"0");
+    i_dmid = atoi(c_dmid);
+
+    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;
+    }
+    ALOGV("%s Dolby device manufacturer id is:%d",__func__,i_dmid);
+    ret = mixer_ctl_set_value(ctl, 0, i_dmid);
+
+    return ret;
+}
+#endif /* DS1_DOLBY_DDP_ENABLED */
+
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 7d04c6d..23b165f 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -157,4 +157,14 @@
 void audio_extn_compr_cap_deinit();
 #endif
 
+#ifndef DS1_DOLBY_DDP_ENABLED
+#define audio_extn_dolby_is_supported_format(format)    (0)
+#define audio_extn_dolby_get_snd_codec_id(format)       (0)
+#define audio_extn_dolby_set_DMID(adev)                 (0)
+#else
+bool audio_extn_dolby_is_supported_format(audio_format_t format);
+int audio_extn_dolby_get_snd_codec_id(audio_format_t format);
+int audio_extn_dolby_set_DMID(struct audio_device *adev);
+#endif
+
 #endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 5537115..de56759 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -165,7 +165,7 @@
         id = SND_AUDIOCODEC_AAC;
         break;
     default:
-        ALOGE("%s: Unsupported audio format", __func__);
+        ALOGE("%s: Unsupported audio format :%x", __func__, format);
     }
 
     return id;
@@ -2022,7 +2022,8 @@
             ret = -EINVAL;
             goto error_open;
         }
-        if (!is_supported_format(config->offload_info.format)) {
+        if (!is_supported_format(config->offload_info.format) &&
+                !audio_extn_dolby_is_supported_format(config->offload_info.format)) {
             ALOGE("%s: Unsupported audio format", __func__);
             ret = -EINVAL;
             goto error_open;
@@ -2045,7 +2046,11 @@
         out->stream.drain = out_drain;
         out->stream.flush = out_flush;
 
-        out->compr_config.codec->id =
+        if (audio_extn_dolby_is_supported_format(config->offload_info.format))
+            out->compr_config.codec->id =
+                audio_extn_dolby_get_snd_codec_id(config->offload_info.format);
+        else
+            out->compr_config.codec->id =
                 get_snd_codec_id(config->offload_info.format);
         out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
         out->compr_config.fragments = COMPRESS_OFFLOAD_NUM_FRAGMENTS;
@@ -2065,6 +2070,16 @@
         ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
                 __func__, config->offload_info.version,
                 config->offload_info.bit_rate);
+
+        if (audio_extn_dolby_is_supported_format(out->format)) {
+            ret = audio_extn_dolby_set_DMID(adev);
+            if (ret != 0) {
+                ALOGE("%s: Dolby DMID cannot be set error:%d",
+                      __func__, ret);
+                goto error_open;
+            }
+        }
+
     } else if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
         ret = voice_check_and_set_incall_music_usecase(adev, out);
         if (ret != 0) {