hal: Add support for AAC ADTS offload playback
-In byte stream mode input bistream is configured with AAC ADTS format
-Add change to configure ADSP in ADTS format if input is in ADTS format
Change-Id: Ie423af6847e4bfd49722239105aaba4fecf9469b
diff --git a/hal/Android.mk b/hal/Android.mk
index 0545423..d01533f 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -195,6 +195,10 @@
LOCAL_CFLAGS += -DPCM_OFFLOAD_ENABLED_24
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_AAC_ADTS_OFFLOAD)),true)
+ LOCAL_CFLAGS += -DAAC_ADTS_OFFLOAD_ENABLED
+endif
+
ifeq ($(strip $(AUDIO_FEATURE_ENABLED_DEV_ARBI)),true)
LOCAL_CFLAGS += -DDEV_ARBI_ENABLED
LOCAL_SRC_FILES += audio_extn/dev_arbi.c
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 9391bec..fae114e 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -85,6 +85,16 @@
#define AUDIO_FORMAT_APE 0x1D000000UL
#endif
+#ifndef AAC_ADTS_OFFLOAD_ENABLED
+#define AUDIO_FORMAT_AAC_ADTS 0x1E000000UL
+#define AUDIO_FORMAT_AAC_ADTS_LC (AUDIO_FORMAT_AAC_ADTS |\
+ AUDIO_FORMAT_AAC_SUB_LC)
+#define AUDIO_FORMAT_AAC_ADTS_HE_V1 (AUDIO_FORMAT_AAC_ADTS |\
+ AUDIO_FORMAT_AAC_SUB_HE_V1)
+#define AUDIO_FORMAT_AAC_ADTS_HE_V2 (AUDIO_FORMAT_AAC_ADTS |\
+ AUDIO_FORMAT_AAC_SUB_HE_V2)
+#endif
+
#ifndef COMPRESS_METADATA_NEEDED
#define audio_extn_parse_compress_metadata(out, parms) (0)
#else
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index dac6c26..b3e6331 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright (C) 2014 The Android Open Source Project
@@ -122,6 +122,10 @@
STRING_TO_ENUM(AUDIO_FORMAT_AAC_LC),
STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V1),
STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V2),
+ STRING_TO_ENUM(AUDIO_FORMAT_AAC_ADTS),
+ STRING_TO_ENUM(AUDIO_FORMAT_AAC_SUB_LC),
+ STRING_TO_ENUM(AUDIO_FORMAT_AAC_SUB_HE_V1),
+ STRING_TO_ENUM(AUDIO_FORMAT_AAC_SUB_HE_V2),
#endif
};
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index e64d318..b9e1da0 100755
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -285,6 +285,9 @@
format == AUDIO_FORMAT_AAC_LC ||
format == AUDIO_FORMAT_AAC_HE_V1 ||
format == AUDIO_FORMAT_AAC_HE_V2 ||
+ format == AUDIO_FORMAT_AAC_ADTS_LC ||
+ format == AUDIO_FORMAT_AAC_ADTS_HE_V1 ||
+ format == AUDIO_FORMAT_AAC_ADTS_HE_V2 ||
format == AUDIO_FORMAT_PCM_16_BIT_OFFLOAD ||
format == AUDIO_FORMAT_PCM_24_BIT_OFFLOAD ||
format == AUDIO_FORMAT_FLAC ||
@@ -309,6 +312,9 @@
case AUDIO_FORMAT_AAC:
id = SND_AUDIOCODEC_AAC;
break;
+ case AUDIO_FORMAT_AAC_ADTS:
+ id = SND_AUDIOCODEC_AAC;
+ break;
case AUDIO_FORMAT_PCM_OFFLOAD:
id = SND_AUDIOCODEC_PCM;
break;
@@ -1811,15 +1817,6 @@
return -EINVAL;
}
- ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_FORMAT, value, sizeof(value));
- if (ret >= 0) {
- if (atoi(value) == SND_AUDIOSTREAMFORMAT_MP4ADTS) {
- out->compr_config.codec->format = SND_AUDIOSTREAMFORMAT_MP4ADTS;
- ALOGV("ADTS format is set in offload mode");
- }
- out->send_new_metadata = 1;
- }
-
ret = audio_extn_parse_compress_metadata(out, parms);
ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_SAMPLE_RATE, value, sizeof(value));
@@ -2910,8 +2907,10 @@
/*TODO: Do we need to change it for passthrough */
out->compr_config.codec->format = SND_AUDIOSTREAMFORMAT_RAW;
- if (config->offload_info.format == AUDIO_FORMAT_AAC)
- out->compr_config.codec->format = SND_AUDIOSTREAMFORMAT_RAW;
+ if ((config->offload_info.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC)
+ out->compr_config.codec->format = SND_AUDIOSTREAMFORMAT_RAW;
+ if ((config->offload_info.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC_ADTS)
+ out->compr_config.codec->format = SND_AUDIOSTREAMFORMAT_MP4ADTS;
if (config->offload_info.format == AUDIO_FORMAT_PCM_16_BIT_OFFLOAD)
out->compr_config.codec->format = SNDRV_PCM_FORMAT_S16_LE;
if(config->offload_info.format == AUDIO_FORMAT_PCM_24_BIT_OFFLOAD)
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 5d0eac5..7280a8c 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -4292,6 +4292,10 @@
ALOGV("%s:AAC", __func__);
format = AAC;
break;
+ case AUDIO_FORMAT_AAC_ADTS:
+ ALOGV("%s:AAC_ADTS", __func__);
+ format = AAC;
+ break;
case AUDIO_FORMAT_E_AC3:
ALOGV("%s:E_AC3", __func__);
format = DOLBY_DIGITAL_PLUS;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 53f9833..6f27abc 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -3762,6 +3762,10 @@
ALOGV("%s:AAC", __func__);
format = AAC;
break;
+ case AUDIO_FORMAT_AAC_ADTS:
+ ALOGV("%s:AAC_ADTS", __func__);
+ format = AAC;
+ break;
case AUDIO_FORMAT_E_AC3:
ALOGV("%s:E_AC3", __func__);
format = DOLBY_DIGITAL_PLUS;
diff --git a/policy_hal/Android.mk b/policy_hal/Android.mk
index 2ef080b..d5a362a 100644
--- a/policy_hal/Android.mk
+++ b/policy_hal/Android.mk
@@ -47,6 +47,10 @@
LOCAL_CFLAGS += -DAUDIO_EXTN_FORMATS_ENABLED
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_AAC_ADTS_OFFLOAD)),true)
+ LOCAL_CFLAGS += -DAAC_ADTS_OFFLOAD_ENABLED
+endif
+
LOCAL_MODULE := libaudiopolicymanager
include $(BUILD_SHARED_LIBRARY)
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index 2791b6d..7a78999 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -405,10 +405,11 @@
//check if it's multi-channel FLAC/ALAC/WMA format with sample rate > 48k
if ((popcount(offloadInfo.channel_mask) > 2) &&
(((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_FLAC) ||
- (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_ALAC) && offloadInfo.sample_rate > 48000) ||
- (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) && offloadInfo.sample_rate > 48000) ||
- (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && offloadInfo.sample_rate > 48000))) {
- ALOGD("offload disabled for multi-channel FLAC/ALAC/WMA clips with sample rate > 48kHz");
+ (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_ALAC) && (offloadInfo.sample_rate > 48000)) ||
+ (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA) && (offloadInfo.sample_rate > 48000)) ||
+ (((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) && (offloadInfo.sample_rate > 48000)) ||
+ ((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC_ADTS))) {
+ ALOGD("offload disabled for multi-channel FLAC/ALAC/WMA/AAC_ADTS clips with sample rate > 48kHz");
return false;
}
#endif
@@ -440,6 +441,7 @@
((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_WMA_PRO) ||
((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_ALAC) ||
((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_APE) ||
+ ((offloadInfo.format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC_ADTS) ||
#endif
pcmOffload)
return false;
diff --git a/policy_hal/AudioPolicyManager.h b/policy_hal/AudioPolicyManager.h
index 13af8e7..fdb6f82 100644
--- a/policy_hal/AudioPolicyManager.h
+++ b/policy_hal/AudioPolicyManager.h
@@ -32,6 +32,10 @@
#define AUDIO_FORMAT_APE 0x1D000000UL
#endif
+#ifndef AAC_ADTS_OFFLOAD_ENABLED
+#define AUDIO_FORMAT_AAC_ADTS 0x1E000000UL
+#endif
+
#ifndef AFE_PROXY_ENABLED
#define AUDIO_DEVICE_OUT_PROXY 0x1000000
#endif