hal: Add support for IEC61937 HDMI pass-through

Add IEC61937 format for apq8098 compress pass-through.

Change-Id: I958509a7f7ab856092756e91e5e7f2eefeb70809
diff --git a/hal/audio_extn/passthru.c b/hal/audio_extn/passthru.c
index 24208ab..61575dd 100644
--- a/hal/audio_extn/passthru.c
+++ b/hal/audio_extn/passthru.c
@@ -52,7 +52,8 @@
     AUDIO_FORMAT_E_AC3_JOC,
     AUDIO_FORMAT_DTS,
     AUDIO_FORMAT_DTS_HD,
-    AUDIO_FORMAT_DOLBY_TRUEHD
+    AUDIO_FORMAT_DOLBY_TRUEHD,
+    AUDIO_FORMAT_IEC61937
 };
 
 /*
@@ -269,9 +270,12 @@
     if (audio_extn_passthru_is_passt_supported(adev, out)) {
         ALOGV("%s:PASSTHROUGH", __func__);
         out->compr_config.codec->compr_passthr = PASSTHROUGH;
-    } else if (audio_extn_passthru_is_convert_supported(adev, out)){
+    } else if (audio_extn_passthru_is_convert_supported(adev, out)) {
         ALOGV("%s:PASSTHROUGH CONVERT", __func__);
         out->compr_config.codec->compr_passthr = PASSTHROUGH_CONVERT;
+    } else if (out->format == AUDIO_FORMAT_IEC61937) {
+        ALOGV("%s:PASSTHROUGH IEC61937", __func__);
+        out->compr_config.codec->compr_passthr = PASSTHROUGH_IEC61937;
     } else {
         ALOGV("%s:NO PASSTHROUGH", __func__);
         out->compr_config.codec->compr_passthr = LEGACY_PCM;
diff --git a/hal/audio_extn/qaf.c b/hal/audio_extn/qaf.c
index d0a9a95..bf731f6 100644
--- a/hal/audio_extn/qaf.c
+++ b/hal/audio_extn/qaf.c
@@ -370,7 +370,8 @@
                 case AUDIO_FORMAT_E_AC3:
                 case AUDIO_FORMAT_DTS:
                 case AUDIO_FORMAT_DTS_HD:
-                case AUDIO_FORMAT_DOLBY_TRUEHD: {
+                case AUDIO_FORMAT_DOLBY_TRUEHD:
+                case AUDIO_FORMAT_IEC61937: {
                     is_enabled = true;
                     break;
                 }
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 38cfe35..e22cd1f 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -143,6 +143,7 @@
     STRING_TO_ENUM(AUDIO_FORMAT_DTS),
     STRING_TO_ENUM(AUDIO_FORMAT_DTS_HD),
     STRING_TO_ENUM(AUDIO_FORMAT_DOLBY_TRUEHD),
+    STRING_TO_ENUM(AUDIO_FORMAT_IEC61937),
 #ifdef AUDIO_EXTN_FORMATS_ENABLED
     STRING_TO_ENUM(AUDIO_FORMAT_E_AC3_JOC),
     STRING_TO_ENUM(AUDIO_FORMAT_WMA),
@@ -1266,6 +1267,9 @@
     case AUDIO_FORMAT_DOLBY_TRUEHD:
         id = SND_AUDIOCODEC_TRUEHD;
         break;
+    case AUDIO_FORMAT_IEC61937:
+        id = SND_AUDIOCODEC_IEC61937;
+        break;
     case AUDIO_FORMAT_DSD:
         id = SND_AUDIOCODEC_DSD;
         break;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 0b4ba95..327d328 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -302,6 +302,7 @@
     STRING_TO_ENUM(AUDIO_FORMAT_DOLBY_TRUEHD),
     STRING_TO_ENUM(AUDIO_FORMAT_DTS),
     STRING_TO_ENUM(AUDIO_FORMAT_DTS_HD),
+    STRING_TO_ENUM(AUDIO_FORMAT_IEC61937)
 };
 
 //list of all supported sample rates by HDMI specification.
@@ -528,7 +529,8 @@
         format == AUDIO_FORMAT_VORBIS ||
         format == AUDIO_FORMAT_WMA ||
         format == AUDIO_FORMAT_WMA_PRO ||
-        format == AUDIO_FORMAT_APTX)
+        format == AUDIO_FORMAT_APTX ||
+        format == AUDIO_FORMAT_IEC61937)
            return true;
 
     return false;
@@ -1336,6 +1338,11 @@
         out->supported_formats[i++] = AUDIO_FORMAT_DTS_HD;
     }
 
+    if (platform_is_edid_supported_format(out->dev->platform, AUDIO_FORMAT_IEC61937)) {
+        ALOGV(":%s HDMI supports IEC61937 format", __func__);
+        out->supported_formats[i++] = AUDIO_FORMAT_IEC61937;
+    }
+
 
     // check sample rate caps
     i = 0;
@@ -4220,6 +4227,7 @@
          */
         if (audio_extn_passthru_is_passthrough_stream(out) ||
                 (config->format == AUDIO_FORMAT_DSD) ||
+                (config->format == AUDIO_FORMAT_IEC61937) ||
                 config->offload_info.has_video ||
                 !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
             check_and_set_gapless_mode(adev, false);
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 39da7e4..3c3c717 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -6340,9 +6340,13 @@
         ALOGV("%s:PCM", __func__);
         format = LPCM;
         break;
+    case AUDIO_FORMAT_IEC61937:
+        ALOGV("%s:IEC61937", __func__);
+        format = 0;
+        break;
     default:
         format =  -1;
-        ALOGE("%s:invalid format:%d", __func__,format);
+        ALOGE("%s:invalid format:0x%x", __func__, audio_format);
         break;
     }
     return format;
@@ -6385,6 +6389,9 @@
     int i, ret;
     unsigned char format_id = platform_map_to_edid_format(format);
 
+    if (format == AUDIO_FORMAT_IEC61937)
+        return true;
+
     if (format_id <= 0) {
         ALOGE("%s invalid edid format mappting for :%x" ,__func__, format);
         return false;
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 76f9d78..28fe62b 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -392,7 +392,10 @@
     LEGACY_PCM = 0,
     PASSTHROUGH,
     PASSTHROUGH_CONVERT,
-    PASSTHROUGH_DSD
+    PASSTHROUGH_DSD,
+    LISTEN,
+    PASSTHROUGH_GEN,
+    PASSTHROUGH_IEC61937
 };
 /*
  * ID for setting mute and lateny on the device side
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index e354deb..0b0dd92 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -6051,9 +6051,13 @@
         ALOGV("%s:PCM", __func__);
         format = LPCM;
         break;
+    case AUDIO_FORMAT_IEC61937:
+        ALOGV("%s:IEC61937", __func__);
+        format = 0;
+        break;
     default:
         format =  -1;
-        ALOGE("%s:invalid format:%d", __func__,format);
+        ALOGE("%s:invalid format: 0x%x", __func__, audio_format);
         break;
     }
     return format;
@@ -6122,6 +6126,9 @@
     int i, ret;
     unsigned char format_id = platform_map_to_edid_format(format);
 
+    if (format == AUDIO_FORMAT_IEC61937)
+        return true;
+
     if (format_id <= 0) {
         ALOGE("%s invalid edid format mappting for :%x" ,__func__, format);
         return false;
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index b4dcfe3..ae50ce7 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -494,7 +494,10 @@
     LEGACY_PCM = 0,
     PASSTHROUGH,
     PASSTHROUGH_CONVERT,
-    PASSTHROUGH_DSD
+    PASSTHROUGH_DSD,
+    LISTEN,
+    PASSTHROUGH_GEN,
+    PASSTHROUGH_IEC61937
 };
 /*
  * ID for setting mute and lateny on the device side
diff --git a/qahw_api/test/qahw_playback_test.c b/qahw_api/test/qahw_playback_test.c
index b1b238f..96f0c5f 100644
--- a/qahw_api/test/qahw_playback_test.c
+++ b/qahw_api/test/qahw_playback_test.c
@@ -85,7 +85,8 @@
     FILE_DTS,
     FILE_MP2,
     FILE_APTX,
-    FILE_TRUEHD
+    FILE_TRUEHD,
+    FILE_IEC61937
 };
 
 typedef enum {
@@ -1127,6 +1128,9 @@
         case FILE_TRUEHD:
             stream_info->config.offload_info.format = AUDIO_FORMAT_DOLBY_TRUEHD;
             break;
+        case FILE_IEC61937:
+            stream_info->config.offload_info.format = AUDIO_FORMAT_IEC61937;
+            break;
         default:
            fprintf(log_file, "Does not support given filetype\n");
            fprintf(stderr, "Does not support given filetype\n");