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");