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) {