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