Merge "fifo: improve blocking and hysteresis"
diff --git a/audio/include/system/audio-base.h b/audio/include/system/audio-base.h
index a291788..2967ae9 100644
--- a/audio/include/system/audio-base.h
+++ b/audio/include/system/audio-base.h
@@ -30,9 +30,9 @@
     AUDIO_STREAM_ACCESSIBILITY = 10,
     AUDIO_STREAM_REROUTING = 11,
     AUDIO_STREAM_PATCH = 12,
-    AUDIO_STREAM_PUBLIC_CNT = 10, // (AUDIO_STREAM_TTS + 1)
-    AUDIO_STREAM_FOR_POLICY_CNT = 12, // AUDIO_STREAM_PATCH
-    AUDIO_STREAM_CNT = 13, // (AUDIO_STREAM_PATCH + 1)
+    AUDIO_STREAM_PUBLIC_CNT = 10, // (TTS + 1)
+    AUDIO_STREAM_FOR_POLICY_CNT = 12, // PATCH
+    AUDIO_STREAM_CNT = 13, // (PATCH + 1)
 } audio_stream_type_t;
 
 typedef enum {
@@ -47,7 +47,7 @@
     AUDIO_SOURCE_REMOTE_SUBMIX = 8,
     AUDIO_SOURCE_UNPROCESSED = 9,
     AUDIO_SOURCE_CNT = 10,
-    AUDIO_SOURCE_MAX = 9, // (AUDIO_SOURCE_CNT - 1)
+    AUDIO_SOURCE_MAX = 9, // (CNT - 1)
     AUDIO_SOURCE_FM_TUNER = 1998,
     AUDIO_SOURCE_HOTWORD = 1999,
 } audio_source_t;
@@ -98,22 +98,22 @@
     AUDIO_FORMAT_AAC_SUB_HE_V2 = 256u, // 0x100
     AUDIO_FORMAT_AAC_SUB_ELD = 512u, // 0x200
     AUDIO_FORMAT_VORBIS_SUB_NONE = 0u, // 0x0
-    AUDIO_FORMAT_PCM_16_BIT = 1u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_16_BIT)
-    AUDIO_FORMAT_PCM_8_BIT = 2u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_8_BIT)
-    AUDIO_FORMAT_PCM_32_BIT = 3u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_32_BIT)
-    AUDIO_FORMAT_PCM_8_24_BIT = 4u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_8_24_BIT)
-    AUDIO_FORMAT_PCM_FLOAT = 5u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_FLOAT)
-    AUDIO_FORMAT_PCM_24_BIT_PACKED = 6u, // (AUDIO_FORMAT_PCM | AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED)
-    AUDIO_FORMAT_AAC_MAIN = 67108865u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_MAIN)
-    AUDIO_FORMAT_AAC_LC = 67108866u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_LC)
-    AUDIO_FORMAT_AAC_SSR = 67108868u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_SSR)
-    AUDIO_FORMAT_AAC_LTP = 67108872u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_LTP)
-    AUDIO_FORMAT_AAC_HE_V1 = 67108880u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_HE_V1)
-    AUDIO_FORMAT_AAC_SCALABLE = 67108896u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_SCALABLE)
-    AUDIO_FORMAT_AAC_ERLC = 67108928u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_ERLC)
-    AUDIO_FORMAT_AAC_LD = 67108992u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_LD)
-    AUDIO_FORMAT_AAC_HE_V2 = 67109120u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_HE_V2)
-    AUDIO_FORMAT_AAC_ELD = 67109376u, // (AUDIO_FORMAT_AAC | AUDIO_FORMAT_AAC_SUB_ELD)
+    AUDIO_FORMAT_PCM_16_BIT = 1u, // (PCM | PCM_SUB_16_BIT)
+    AUDIO_FORMAT_PCM_8_BIT = 2u, // (PCM | PCM_SUB_8_BIT)
+    AUDIO_FORMAT_PCM_32_BIT = 3u, // (PCM | PCM_SUB_32_BIT)
+    AUDIO_FORMAT_PCM_8_24_BIT = 4u, // (PCM | PCM_SUB_8_24_BIT)
+    AUDIO_FORMAT_PCM_FLOAT = 5u, // (PCM | PCM_SUB_FLOAT)
+    AUDIO_FORMAT_PCM_24_BIT_PACKED = 6u, // (PCM | PCM_SUB_24_BIT_PACKED)
+    AUDIO_FORMAT_AAC_MAIN = 67108865u, // (AAC | AAC_SUB_MAIN)
+    AUDIO_FORMAT_AAC_LC = 67108866u, // (AAC | AAC_SUB_LC)
+    AUDIO_FORMAT_AAC_SSR = 67108868u, // (AAC | AAC_SUB_SSR)
+    AUDIO_FORMAT_AAC_LTP = 67108872u, // (AAC | AAC_SUB_LTP)
+    AUDIO_FORMAT_AAC_HE_V1 = 67108880u, // (AAC | AAC_SUB_HE_V1)
+    AUDIO_FORMAT_AAC_SCALABLE = 67108896u, // (AAC | AAC_SUB_SCALABLE)
+    AUDIO_FORMAT_AAC_ERLC = 67108928u, // (AAC | AAC_SUB_ERLC)
+    AUDIO_FORMAT_AAC_LD = 67108992u, // (AAC | AAC_SUB_LD)
+    AUDIO_FORMAT_AAC_HE_V2 = 67109120u, // (AAC | AAC_SUB_HE_V2)
+    AUDIO_FORMAT_AAC_ELD = 67109376u, // (AAC | AAC_SUB_ELD)
 } audio_format_t;
 
 enum {
@@ -144,16 +144,16 @@
     AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 32768u, // 0x8000
     AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 65536u, // 0x10000
     AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 131072u, // 0x20000
-    AUDIO_CHANNEL_OUT_MONO = 1u, // AUDIO_CHANNEL_OUT_FRONT_LEFT
-    AUDIO_CHANNEL_OUT_STEREO = 3u, // (AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT)
-    AUDIO_CHANNEL_OUT_QUAD = 51u, // (((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_BACK_LEFT) | AUDIO_CHANNEL_OUT_BACK_RIGHT)
-    AUDIO_CHANNEL_OUT_QUAD_BACK = 51u, // AUDIO_CHANNEL_OUT_QUAD
-    AUDIO_CHANNEL_OUT_QUAD_SIDE = 1539u, // (((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_SIDE_LEFT) | AUDIO_CHANNEL_OUT_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_5POINT1 = 63u, // (((((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_FRONT_CENTER) | AUDIO_CHANNEL_OUT_LOW_FREQUENCY) | AUDIO_CHANNEL_OUT_BACK_LEFT) | AUDIO_CHANNEL_OUT_BACK_RIGHT)
-    AUDIO_CHANNEL_OUT_5POINT1_BACK = 63u, // AUDIO_CHANNEL_OUT_5POINT1
-    AUDIO_CHANNEL_OUT_5POINT1_SIDE = 1551u, // (((((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_FRONT_CENTER) | AUDIO_CHANNEL_OUT_LOW_FREQUENCY) | AUDIO_CHANNEL_OUT_SIDE_LEFT) | AUDIO_CHANNEL_OUT_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_7POINT1 = 1599u, // (((((((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_FRONT_CENTER) | AUDIO_CHANNEL_OUT_LOW_FREQUENCY) | AUDIO_CHANNEL_OUT_BACK_LEFT) | AUDIO_CHANNEL_OUT_BACK_RIGHT) | AUDIO_CHANNEL_OUT_SIDE_LEFT) | AUDIO_CHANNEL_OUT_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_ALL = 262143u, // (((((((((((((((((AUDIO_CHANNEL_OUT_FRONT_LEFT | AUDIO_CHANNEL_OUT_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_FRONT_CENTER) | AUDIO_CHANNEL_OUT_LOW_FREQUENCY) | AUDIO_CHANNEL_OUT_BACK_LEFT) | AUDIO_CHANNEL_OUT_BACK_RIGHT) | AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER) | AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER) | AUDIO_CHANNEL_OUT_BACK_CENTER) | AUDIO_CHANNEL_OUT_SIDE_LEFT) | AUDIO_CHANNEL_OUT_SIDE_RIGHT) | AUDIO_CHANNEL_OUT_TOP_CENTER) | AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT) | AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER) | AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT) | AUDIO_CHANNEL_OUT_TOP_BACK_LEFT) | AUDIO_CHANNEL_OUT_TOP_BACK_CENTER) | AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT)
+    AUDIO_CHANNEL_OUT_MONO = 1u, // OUT_FRONT_LEFT
+    AUDIO_CHANNEL_OUT_STEREO = 3u, // (OUT_FRONT_LEFT | OUT_FRONT_RIGHT)
+    AUDIO_CHANNEL_OUT_QUAD = 51u, // (((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_BACK_LEFT) | OUT_BACK_RIGHT)
+    AUDIO_CHANNEL_OUT_QUAD_BACK = 51u, // OUT_QUAD
+    AUDIO_CHANNEL_OUT_QUAD_SIDE = 1539u, // (((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_SIDE_LEFT) | OUT_SIDE_RIGHT)
+    AUDIO_CHANNEL_OUT_5POINT1 = 63u, // (((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_LOW_FREQUENCY) | OUT_BACK_LEFT) | OUT_BACK_RIGHT)
+    AUDIO_CHANNEL_OUT_5POINT1_BACK = 63u, // OUT_5POINT1
+    AUDIO_CHANNEL_OUT_5POINT1_SIDE = 1551u, // (((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_LOW_FREQUENCY) | OUT_SIDE_LEFT) | OUT_SIDE_RIGHT)
+    AUDIO_CHANNEL_OUT_7POINT1 = 1599u, // (((((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_LOW_FREQUENCY) | OUT_BACK_LEFT) | OUT_BACK_RIGHT) | OUT_SIDE_LEFT) | OUT_SIDE_RIGHT)
+    AUDIO_CHANNEL_OUT_ALL = 262143u, // (((((((((((((((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_LOW_FREQUENCY) | OUT_BACK_LEFT) | OUT_BACK_RIGHT) | OUT_FRONT_LEFT_OF_CENTER) | OUT_FRONT_RIGHT_OF_CENTER) | OUT_BACK_CENTER) | OUT_SIDE_LEFT) | OUT_SIDE_RIGHT) | OUT_TOP_CENTER) | OUT_TOP_FRONT_LEFT) | OUT_TOP_FRONT_CENTER) | OUT_TOP_FRONT_RIGHT) | OUT_TOP_BACK_LEFT) | OUT_TOP_BACK_CENTER) | OUT_TOP_BACK_RIGHT)
     AUDIO_CHANNEL_IN_LEFT = 4u, // 0x4
     AUDIO_CHANNEL_IN_RIGHT = 8u, // 0x8
     AUDIO_CHANNEL_IN_FRONT = 16u, // 0x10
@@ -168,22 +168,25 @@
     AUDIO_CHANNEL_IN_Z_AXIS = 8192u, // 0x2000
     AUDIO_CHANNEL_IN_VOICE_UPLINK = 16384u, // 0x4000
     AUDIO_CHANNEL_IN_VOICE_DNLINK = 32768u, // 0x8000
-    AUDIO_CHANNEL_IN_MONO = 16u, // AUDIO_CHANNEL_IN_FRONT
-    AUDIO_CHANNEL_IN_STEREO = 12u, // (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT)
-    AUDIO_CHANNEL_IN_FRONT_BACK = 48u, // (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK)
-    AUDIO_CHANNEL_IN_ALL = 65532u, // (((((((((((((AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT) | AUDIO_CHANNEL_IN_FRONT) | AUDIO_CHANNEL_IN_BACK) | AUDIO_CHANNEL_IN_LEFT_PROCESSED) | AUDIO_CHANNEL_IN_RIGHT_PROCESSED) | AUDIO_CHANNEL_IN_FRONT_PROCESSED) | AUDIO_CHANNEL_IN_BACK_PROCESSED) | AUDIO_CHANNEL_IN_PRESSURE) | AUDIO_CHANNEL_IN_X_AXIS) | AUDIO_CHANNEL_IN_Y_AXIS) | AUDIO_CHANNEL_IN_Z_AXIS) | AUDIO_CHANNEL_IN_VOICE_UPLINK) | AUDIO_CHANNEL_IN_VOICE_DNLINK)
-    AUDIO_INTERLEAVE_LEFT = 0u, // 0
-    AUDIO_INTERLEAVE_RIGHT = 1u, // 1
+    AUDIO_CHANNEL_IN_MONO = 16u, // IN_FRONT
+    AUDIO_CHANNEL_IN_STEREO = 12u, // (IN_LEFT | IN_RIGHT)
+    AUDIO_CHANNEL_IN_FRONT_BACK = 48u, // (IN_FRONT | IN_BACK)
+    AUDIO_CHANNEL_IN_ALL = 65532u, // (((((((((((((IN_LEFT | IN_RIGHT) | IN_FRONT) | IN_BACK) | IN_LEFT_PROCESSED) | IN_RIGHT_PROCESSED) | IN_FRONT_PROCESSED) | IN_BACK_PROCESSED) | IN_PRESSURE) | IN_X_AXIS) | IN_Y_AXIS) | IN_Z_AXIS) | IN_VOICE_UPLINK) | IN_VOICE_DNLINK)
     AUDIO_CHANNEL_COUNT_MAX = 30u, // 30
-    AUDIO_CHANNEL_INDEX_HDR = 2147483648u, // (AUDIO_CHANNEL_REPRESENTATION_INDEX << AUDIO_CHANNEL_COUNT_MAX)
-    AUDIO_CHANNEL_INDEX_MASK_1 = 2147483649u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 1) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_2 = 2147483651u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 2) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_3 = 2147483655u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 3) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_4 = 2147483663u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 4) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_5 = 2147483679u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 5) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_6 = 2147483711u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 6) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_7 = 2147483775u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 7) - 1))
-    AUDIO_CHANNEL_INDEX_MASK_8 = 2147483903u, // (AUDIO_CHANNEL_INDEX_HDR | ((1 << 8) - 1))
+    AUDIO_CHANNEL_INDEX_HDR = 2147483648u, // (REPRESENTATION_INDEX << COUNT_MAX)
+    AUDIO_CHANNEL_INDEX_MASK_1 = 2147483649u, // (INDEX_HDR | ((1 << 1) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_2 = 2147483651u, // (INDEX_HDR | ((1 << 2) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_3 = 2147483655u, // (INDEX_HDR | ((1 << 3) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_4 = 2147483663u, // (INDEX_HDR | ((1 << 4) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_5 = 2147483679u, // (INDEX_HDR | ((1 << 5) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_6 = 2147483711u, // (INDEX_HDR | ((1 << 6) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_7 = 2147483775u, // (INDEX_HDR | ((1 << 7) - 1))
+    AUDIO_CHANNEL_INDEX_MASK_8 = 2147483903u, // (INDEX_HDR | ((1 << 8) - 1))
+};
+
+enum {
+    AUDIO_INTERLEAVE_LEFT = 0,
+    AUDIO_INTERLEAVE_RIGHT = 1,
 };
 
 typedef enum {
@@ -194,7 +197,7 @@
     AUDIO_MODE_IN_CALL = 2,
     AUDIO_MODE_IN_COMMUNICATION = 3,
     AUDIO_MODE_CNT = 4,
-    AUDIO_MODE_MAX = 3, // (AUDIO_MODE_CNT - 1)
+    AUDIO_MODE_MAX = 3, // (CNT - 1)
 } audio_mode_t;
 
 enum {
@@ -212,7 +215,7 @@
     AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 256u, // 0x100
     AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 512u, // 0x200
     AUDIO_DEVICE_OUT_AUX_DIGITAL = 1024u, // 0x400
-    AUDIO_DEVICE_OUT_HDMI = 1024u, // AUDIO_DEVICE_OUT_AUX_DIGITAL
+    AUDIO_DEVICE_OUT_HDMI = 1024u, // OUT_AUX_DIGITAL
     AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 2048u, // 0x800
     AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 4096u, // 0x1000
     AUDIO_DEVICE_OUT_USB_ACCESSORY = 8192u, // 0x2000
@@ -227,38 +230,38 @@
     AUDIO_DEVICE_OUT_SPEAKER_SAFE = 4194304u, // 0x400000
     AUDIO_DEVICE_OUT_IP = 8388608u, // 0x800000
     AUDIO_DEVICE_OUT_BUS = 16777216u, // 0x1000000
-    AUDIO_DEVICE_OUT_DEFAULT = 1073741824u, // AUDIO_DEVICE_BIT_DEFAULT
-    AUDIO_DEVICE_OUT_ALL = 1107296255u, // (((((((((((((((((((((((((AUDIO_DEVICE_OUT_EARPIECE | AUDIO_DEVICE_OUT_SPEAKER) | AUDIO_DEVICE_OUT_WIRED_HEADSET) | AUDIO_DEVICE_OUT_WIRED_HEADPHONE) | AUDIO_DEVICE_OUT_BLUETOOTH_SCO) | AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) | AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) | AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) | AUDIO_DEVICE_OUT_HDMI) | AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) | AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) | AUDIO_DEVICE_OUT_USB_ACCESSORY) | AUDIO_DEVICE_OUT_USB_DEVICE) | AUDIO_DEVICE_OUT_REMOTE_SUBMIX) | AUDIO_DEVICE_OUT_TELEPHONY_TX) | AUDIO_DEVICE_OUT_LINE) | AUDIO_DEVICE_OUT_HDMI_ARC) | AUDIO_DEVICE_OUT_SPDIF) | AUDIO_DEVICE_OUT_FM) | AUDIO_DEVICE_OUT_AUX_LINE) | AUDIO_DEVICE_OUT_SPEAKER_SAFE) | AUDIO_DEVICE_OUT_IP) | AUDIO_DEVICE_OUT_BUS) | AUDIO_DEVICE_OUT_DEFAULT)
-    AUDIO_DEVICE_OUT_ALL_A2DP = 896u, // ((AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)
-    AUDIO_DEVICE_OUT_ALL_SCO = 112u, // ((AUDIO_DEVICE_OUT_BLUETOOTH_SCO | AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT)
-    AUDIO_DEVICE_OUT_ALL_USB = 24576u, // (AUDIO_DEVICE_OUT_USB_ACCESSORY | AUDIO_DEVICE_OUT_USB_DEVICE)
-    AUDIO_DEVICE_IN_COMMUNICATION = 2147483649u, // (AUDIO_DEVICE_BIT_IN | 0x1)
-    AUDIO_DEVICE_IN_AMBIENT = 2147483650u, // (AUDIO_DEVICE_BIT_IN | 0x2)
-    AUDIO_DEVICE_IN_BUILTIN_MIC = 2147483652u, // (AUDIO_DEVICE_BIT_IN | 0x4)
-    AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = 2147483656u, // (AUDIO_DEVICE_BIT_IN | 0x8)
-    AUDIO_DEVICE_IN_WIRED_HEADSET = 2147483664u, // (AUDIO_DEVICE_BIT_IN | 0x10)
-    AUDIO_DEVICE_IN_AUX_DIGITAL = 2147483680u, // (AUDIO_DEVICE_BIT_IN | 0x20)
-    AUDIO_DEVICE_IN_HDMI = 2147483680u, // AUDIO_DEVICE_IN_AUX_DIGITAL
-    AUDIO_DEVICE_IN_VOICE_CALL = 2147483712u, // (AUDIO_DEVICE_BIT_IN | 0x40)
-    AUDIO_DEVICE_IN_TELEPHONY_RX = 2147483712u, // AUDIO_DEVICE_IN_VOICE_CALL
-    AUDIO_DEVICE_IN_BACK_MIC = 2147483776u, // (AUDIO_DEVICE_BIT_IN | 0x80)
-    AUDIO_DEVICE_IN_REMOTE_SUBMIX = 2147483904u, // (AUDIO_DEVICE_BIT_IN | 0x100)
-    AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = 2147484160u, // (AUDIO_DEVICE_BIT_IN | 0x200)
-    AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = 2147484672u, // (AUDIO_DEVICE_BIT_IN | 0x400)
-    AUDIO_DEVICE_IN_USB_ACCESSORY = 2147485696u, // (AUDIO_DEVICE_BIT_IN | 0x800)
-    AUDIO_DEVICE_IN_USB_DEVICE = 2147487744u, // (AUDIO_DEVICE_BIT_IN | 0x1000)
-    AUDIO_DEVICE_IN_FM_TUNER = 2147491840u, // (AUDIO_DEVICE_BIT_IN | 0x2000)
-    AUDIO_DEVICE_IN_TV_TUNER = 2147500032u, // (AUDIO_DEVICE_BIT_IN | 0x4000)
-    AUDIO_DEVICE_IN_LINE = 2147516416u, // (AUDIO_DEVICE_BIT_IN | 0x8000)
-    AUDIO_DEVICE_IN_SPDIF = 2147549184u, // (AUDIO_DEVICE_BIT_IN | 0x10000)
-    AUDIO_DEVICE_IN_BLUETOOTH_A2DP = 2147614720u, // (AUDIO_DEVICE_BIT_IN | 0x20000)
-    AUDIO_DEVICE_IN_LOOPBACK = 2147745792u, // (AUDIO_DEVICE_BIT_IN | 0x40000)
-    AUDIO_DEVICE_IN_IP = 2148007936u, // (AUDIO_DEVICE_BIT_IN | 0x80000)
-    AUDIO_DEVICE_IN_BUS = 2148532224u, // (AUDIO_DEVICE_BIT_IN | 0x100000)
-    AUDIO_DEVICE_IN_DEFAULT = 3221225472u, // (AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT)
-    AUDIO_DEVICE_IN_ALL = 3223322623u, // (((((((((((((((((((((AUDIO_DEVICE_IN_COMMUNICATION | AUDIO_DEVICE_IN_AMBIENT) | AUDIO_DEVICE_IN_BUILTIN_MIC) | AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) | AUDIO_DEVICE_IN_WIRED_HEADSET) | AUDIO_DEVICE_IN_HDMI) | AUDIO_DEVICE_IN_TELEPHONY_RX) | AUDIO_DEVICE_IN_BACK_MIC) | AUDIO_DEVICE_IN_REMOTE_SUBMIX) | AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET) | AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) | AUDIO_DEVICE_IN_USB_ACCESSORY) | AUDIO_DEVICE_IN_USB_DEVICE) | AUDIO_DEVICE_IN_FM_TUNER) | AUDIO_DEVICE_IN_TV_TUNER) | AUDIO_DEVICE_IN_LINE) | AUDIO_DEVICE_IN_SPDIF) | AUDIO_DEVICE_IN_BLUETOOTH_A2DP) | AUDIO_DEVICE_IN_LOOPBACK) | AUDIO_DEVICE_IN_IP) | AUDIO_DEVICE_IN_BUS) | AUDIO_DEVICE_IN_DEFAULT)
-    AUDIO_DEVICE_IN_ALL_SCO = 2147483656u, // AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET
-    AUDIO_DEVICE_IN_ALL_USB = 2147489792u, // (AUDIO_DEVICE_IN_USB_ACCESSORY | AUDIO_DEVICE_IN_USB_DEVICE)
+    AUDIO_DEVICE_OUT_DEFAULT = 1073741824u, // BIT_DEFAULT
+    AUDIO_DEVICE_OUT_ALL = 1107296255u, // (((((((((((((((((((((((((OUT_EARPIECE | OUT_SPEAKER) | OUT_WIRED_HEADSET) | OUT_WIRED_HEADPHONE) | OUT_BLUETOOTH_SCO) | OUT_BLUETOOTH_SCO_HEADSET) | OUT_BLUETOOTH_SCO_CARKIT) | OUT_BLUETOOTH_A2DP) | OUT_BLUETOOTH_A2DP_HEADPHONES) | OUT_BLUETOOTH_A2DP_SPEAKER) | OUT_HDMI) | OUT_ANLG_DOCK_HEADSET) | OUT_DGTL_DOCK_HEADSET) | OUT_USB_ACCESSORY) | OUT_USB_DEVICE) | OUT_REMOTE_SUBMIX) | OUT_TELEPHONY_TX) | OUT_LINE) | OUT_HDMI_ARC) | OUT_SPDIF) | OUT_FM) | OUT_AUX_LINE) | OUT_SPEAKER_SAFE) | OUT_IP) | OUT_BUS) | OUT_DEFAULT)
+    AUDIO_DEVICE_OUT_ALL_A2DP = 896u, // ((OUT_BLUETOOTH_A2DP | OUT_BLUETOOTH_A2DP_HEADPHONES) | OUT_BLUETOOTH_A2DP_SPEAKER)
+    AUDIO_DEVICE_OUT_ALL_SCO = 112u, // ((OUT_BLUETOOTH_SCO | OUT_BLUETOOTH_SCO_HEADSET) | OUT_BLUETOOTH_SCO_CARKIT)
+    AUDIO_DEVICE_OUT_ALL_USB = 24576u, // (OUT_USB_ACCESSORY | OUT_USB_DEVICE)
+    AUDIO_DEVICE_IN_COMMUNICATION = 2147483649u, // (BIT_IN | 0x1)
+    AUDIO_DEVICE_IN_AMBIENT = 2147483650u, // (BIT_IN | 0x2)
+    AUDIO_DEVICE_IN_BUILTIN_MIC = 2147483652u, // (BIT_IN | 0x4)
+    AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = 2147483656u, // (BIT_IN | 0x8)
+    AUDIO_DEVICE_IN_WIRED_HEADSET = 2147483664u, // (BIT_IN | 0x10)
+    AUDIO_DEVICE_IN_AUX_DIGITAL = 2147483680u, // (BIT_IN | 0x20)
+    AUDIO_DEVICE_IN_HDMI = 2147483680u, // IN_AUX_DIGITAL
+    AUDIO_DEVICE_IN_VOICE_CALL = 2147483712u, // (BIT_IN | 0x40)
+    AUDIO_DEVICE_IN_TELEPHONY_RX = 2147483712u, // IN_VOICE_CALL
+    AUDIO_DEVICE_IN_BACK_MIC = 2147483776u, // (BIT_IN | 0x80)
+    AUDIO_DEVICE_IN_REMOTE_SUBMIX = 2147483904u, // (BIT_IN | 0x100)
+    AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = 2147484160u, // (BIT_IN | 0x200)
+    AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = 2147484672u, // (BIT_IN | 0x400)
+    AUDIO_DEVICE_IN_USB_ACCESSORY = 2147485696u, // (BIT_IN | 0x800)
+    AUDIO_DEVICE_IN_USB_DEVICE = 2147487744u, // (BIT_IN | 0x1000)
+    AUDIO_DEVICE_IN_FM_TUNER = 2147491840u, // (BIT_IN | 0x2000)
+    AUDIO_DEVICE_IN_TV_TUNER = 2147500032u, // (BIT_IN | 0x4000)
+    AUDIO_DEVICE_IN_LINE = 2147516416u, // (BIT_IN | 0x8000)
+    AUDIO_DEVICE_IN_SPDIF = 2147549184u, // (BIT_IN | 0x10000)
+    AUDIO_DEVICE_IN_BLUETOOTH_A2DP = 2147614720u, // (BIT_IN | 0x20000)
+    AUDIO_DEVICE_IN_LOOPBACK = 2147745792u, // (BIT_IN | 0x40000)
+    AUDIO_DEVICE_IN_IP = 2148007936u, // (BIT_IN | 0x80000)
+    AUDIO_DEVICE_IN_BUS = 2148532224u, // (BIT_IN | 0x100000)
+    AUDIO_DEVICE_IN_DEFAULT = 3221225472u, // (BIT_IN | BIT_DEFAULT)
+    AUDIO_DEVICE_IN_ALL = 3223322623u, // (((((((((((((((((((((IN_COMMUNICATION | IN_AMBIENT) | IN_BUILTIN_MIC) | IN_BLUETOOTH_SCO_HEADSET) | IN_WIRED_HEADSET) | IN_HDMI) | IN_TELEPHONY_RX) | IN_BACK_MIC) | IN_REMOTE_SUBMIX) | IN_ANLG_DOCK_HEADSET) | IN_DGTL_DOCK_HEADSET) | IN_USB_ACCESSORY) | IN_USB_DEVICE) | IN_FM_TUNER) | IN_TV_TUNER) | IN_LINE) | IN_SPDIF) | IN_BLUETOOTH_A2DP) | IN_LOOPBACK) | IN_IP) | IN_BUS) | IN_DEFAULT)
+    AUDIO_DEVICE_IN_ALL_SCO = 2147483656u, // IN_BLUETOOTH_SCO_HEADSET
+    AUDIO_DEVICE_IN_ALL_USB = 2147489792u, // (IN_USB_ACCESSORY | IN_USB_DEVICE)
 };
 
 typedef enum {
@@ -308,7 +311,7 @@
     AUDIO_PORT_CONFIG_CHANNEL_MASK = 2u, // 0x2
     AUDIO_PORT_CONFIG_FORMAT = 4u, // 0x4
     AUDIO_PORT_CONFIG_GAIN = 8u, // 0x8
-    AUDIO_PORT_CONFIG_ALL = 15u, // (((AUDIO_PORT_CONFIG_SAMPLE_RATE | AUDIO_PORT_CONFIG_CHANNEL_MASK) | AUDIO_PORT_CONFIG_FORMAT) | AUDIO_PORT_CONFIG_GAIN)
+    AUDIO_PORT_CONFIG_ALL = 15u, // (((SAMPLE_RATE | CHANNEL_MASK) | FORMAT) | GAIN)
 };
 
 typedef enum {
diff --git a/audio/include/system/audio.h b/audio/include/system/audio.h
index ad556d7..72a7e13 100644
--- a/audio/include/system/audio.h
+++ b/audio/include/system/audio.h
@@ -916,6 +916,17 @@
     }
 }
 
+// Unique effect ID (can be generated from the following site:
+//  http://www.itu.int/ITU-T/asn1/uuid.html)
+// This struct is used for effects identification and in soundtrigger.
+typedef struct audio_uuid_s {
+    uint32_t timeLow;
+    uint16_t timeMid;
+    uint16_t timeHiAndVersion;
+    uint16_t clockSeq;
+    uint8_t node[6];
+} audio_uuid_t;
+
 __END_DECLS
 
 #endif  // ANDROID_AUDIO_CORE_H
diff --git a/audio/include/system/audio_effect-base.h b/audio/include/system/audio_effect-base.h
new file mode 100644
index 0000000..3495eed
--- /dev/null
+++ b/audio/include/system/audio_effect-base.h
@@ -0,0 +1,98 @@
+// This file is autogenerated by hidl-gen. Do not edit manually.
+
+#ifndef HIDL_GENERATED_android_hardware_audio_effect_V2_0_EXPORTED_CONSTANTS_H_
+#define HIDL_GENERATED_android_hardware_audio_effect_V2_0_EXPORTED_CONSTANTS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+    EFFECT_FLAG_TYPE_SHIFT = 0,
+    EFFECT_FLAG_TYPE_SIZE = 3,
+    EFFECT_FLAG_TYPE_MASK = 7, // (((1 << TYPE_SIZE) - 1) << TYPE_SHIFT)
+    EFFECT_FLAG_TYPE_INSERT = 0, // (0 << TYPE_SHIFT)
+    EFFECT_FLAG_TYPE_AUXILIARY = 1, // (1 << TYPE_SHIFT)
+    EFFECT_FLAG_TYPE_REPLACE = 2, // (2 << TYPE_SHIFT)
+    EFFECT_FLAG_TYPE_PRE_PROC = 3, // (3 << TYPE_SHIFT)
+    EFFECT_FLAG_TYPE_POST_PROC = 4, // (4 << TYPE_SHIFT)
+    EFFECT_FLAG_INSERT_SHIFT = 3, // (TYPE_SHIFT + TYPE_SIZE)
+    EFFECT_FLAG_INSERT_SIZE = 3,
+    EFFECT_FLAG_INSERT_MASK = 56, // (((1 << INSERT_SIZE) - 1) << INSERT_SHIFT)
+    EFFECT_FLAG_INSERT_ANY = 0, // (0 << INSERT_SHIFT)
+    EFFECT_FLAG_INSERT_FIRST = 8, // (1 << INSERT_SHIFT)
+    EFFECT_FLAG_INSERT_LAST = 16, // (2 << INSERT_SHIFT)
+    EFFECT_FLAG_INSERT_EXCLUSIVE = 24, // (3 << INSERT_SHIFT)
+    EFFECT_FLAG_VOLUME_SHIFT = 6, // (INSERT_SHIFT + INSERT_SIZE)
+    EFFECT_FLAG_VOLUME_SIZE = 3,
+    EFFECT_FLAG_VOLUME_MASK = 448, // (((1 << VOLUME_SIZE) - 1) << VOLUME_SHIFT)
+    EFFECT_FLAG_VOLUME_CTRL = 64, // (1 << VOLUME_SHIFT)
+    EFFECT_FLAG_VOLUME_IND = 128, // (2 << VOLUME_SHIFT)
+    EFFECT_FLAG_VOLUME_NONE = 0, // (0 << VOLUME_SHIFT)
+    EFFECT_FLAG_DEVICE_SHIFT = 9, // (VOLUME_SHIFT + VOLUME_SIZE)
+    EFFECT_FLAG_DEVICE_SIZE = 3,
+    EFFECT_FLAG_DEVICE_MASK = 3584, // (((1 << DEVICE_SIZE) - 1) << DEVICE_SHIFT)
+    EFFECT_FLAG_DEVICE_IND = 512, // (1 << DEVICE_SHIFT)
+    EFFECT_FLAG_DEVICE_NONE = 0, // (0 << DEVICE_SHIFT)
+    EFFECT_FLAG_INPUT_SHIFT = 12, // (DEVICE_SHIFT + DEVICE_SIZE)
+    EFFECT_FLAG_INPUT_SIZE = 2,
+    EFFECT_FLAG_INPUT_MASK = 12288, // (((1 << INPUT_SIZE) - 1) << INPUT_SHIFT)
+    EFFECT_FLAG_INPUT_DIRECT = 4096, // (1 << INPUT_SHIFT)
+    EFFECT_FLAG_INPUT_PROVIDER = 8192, // (2 << INPUT_SHIFT)
+    EFFECT_FLAG_INPUT_BOTH = 12288, // (3 << INPUT_SHIFT)
+    EFFECT_FLAG_OUTPUT_SHIFT = 14, // (INPUT_SHIFT + INPUT_SIZE)
+    EFFECT_FLAG_OUTPUT_SIZE = 2,
+    EFFECT_FLAG_OUTPUT_MASK = 49152, // (((1 << OUTPUT_SIZE) - 1) << OUTPUT_SHIFT)
+    EFFECT_FLAG_OUTPUT_DIRECT = 16384, // (1 << OUTPUT_SHIFT)
+    EFFECT_FLAG_OUTPUT_PROVIDER = 32768, // (2 << OUTPUT_SHIFT)
+    EFFECT_FLAG_OUTPUT_BOTH = 49152, // (3 << OUTPUT_SHIFT)
+    EFFECT_FLAG_HW_ACC_SHIFT = 16, // (OUTPUT_SHIFT + OUTPUT_SIZE)
+    EFFECT_FLAG_HW_ACC_SIZE = 2,
+    EFFECT_FLAG_HW_ACC_MASK = 196608, // (((1 << HW_ACC_SIZE) - 1) << HW_ACC_SHIFT)
+    EFFECT_FLAG_HW_ACC_SIMPLE = 65536, // (1 << HW_ACC_SHIFT)
+    EFFECT_FLAG_HW_ACC_TUNNEL = 131072, // (2 << HW_ACC_SHIFT)
+    EFFECT_FLAG_AUDIO_MODE_SHIFT = 18, // (HW_ACC_SHIFT + HW_ACC_SIZE)
+    EFFECT_FLAG_AUDIO_MODE_SIZE = 2,
+    EFFECT_FLAG_AUDIO_MODE_MASK = 786432, // (((1 << AUDIO_MODE_SIZE) - 1) << AUDIO_MODE_SHIFT)
+    EFFECT_FLAG_AUDIO_MODE_IND = 262144, // (1 << AUDIO_MODE_SHIFT)
+    EFFECT_FLAG_AUDIO_MODE_NONE = 0, // (0 << AUDIO_MODE_SHIFT)
+    EFFECT_FLAG_AUDIO_SOURCE_SHIFT = 20, // (AUDIO_MODE_SHIFT + AUDIO_MODE_SIZE)
+    EFFECT_FLAG_AUDIO_SOURCE_SIZE = 2,
+    EFFECT_FLAG_AUDIO_SOURCE_MASK = 3145728, // (((1 << AUDIO_SOURCE_SIZE) - 1) << AUDIO_SOURCE_SHIFT)
+    EFFECT_FLAG_AUDIO_SOURCE_IND = 1048576, // (1 << AUDIO_SOURCE_SHIFT)
+    EFFECT_FLAG_AUDIO_SOURCE_NONE = 0, // (0 << AUDIO_SOURCE_SHIFT)
+    EFFECT_FLAG_OFFLOAD_SHIFT = 22, // (AUDIO_SOURCE_SHIFT + AUDIO_SOURCE_SIZE)
+    EFFECT_FLAG_OFFLOAD_SIZE = 1,
+    EFFECT_FLAG_OFFLOAD_MASK = 4194304, // (((1 << OFFLOAD_SIZE) - 1) << OFFLOAD_SHIFT)
+    EFFECT_FLAG_OFFLOAD_SUPPORTED = 4194304, // (1 << OFFLOAD_SHIFT)
+    EFFECT_FLAG_NO_PROCESS_SHIFT = 23, // (OFFLOAD_SHIFT + OFFLOAD_SIZE)
+    EFFECT_FLAG_NO_PROCESS_SIZE = 1,
+    EFFECT_FLAG_NO_PROCESS_MASK = 8388608, // (((1 << NO_PROCESS_SIZE) - 1) << NO_PROCESS_SHIFT)
+    EFFECT_FLAG_NO_PROCESS = 8388608, // (1 << NO_PROCESS_SHIFT)
+};
+
+typedef enum {
+    EFFECT_BUFFER_ACCESS_WRITE = 0,
+    EFFECT_BUFFER_ACCESS_READ = 1,
+    EFFECT_BUFFER_ACCESS_ACCUMULATE = 2,
+} effect_buffer_access_e;
+
+enum {
+    EFFECT_CONFIG_BUFFER = 1, // 0x0001
+    EFFECT_CONFIG_SMP_RATE = 2, // 0x0002
+    EFFECT_CONFIG_CHANNELS = 4, // 0x0004
+    EFFECT_CONFIG_FORMAT = 8, // 0x0008
+    EFFECT_CONFIG_ACC_MODE = 16, // 0x0010
+    EFFECT_CONFIG_ALL = 31, // ((((BUFFER | SMP_RATE) | CHANNELS) | FORMAT) | ACC_MODE)
+};
+
+typedef enum {
+    EFFECT_FEATURE_AUX_CHANNELS = 0,
+    EFFECT_FEATURE_CNT = 1,
+} effect_feature_e;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // HIDL_GENERATED_android_hardware_audio_effect_V2_0_EXPORTED_CONSTANTS_H_
diff --git a/audio/include/system/audio_effect.h b/audio/include/system/audio_effect.h
new file mode 100644
index 0000000..f4e982a
--- /dev/null
+++ b/audio/include/system/audio_effect.h
@@ -0,0 +1,526 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_AUDIO_EFFECT_CORE_H
+#define ANDROID_AUDIO_EFFECT_CORE_H
+
+#include "audio.h"
+#include "audio_effect-base.h"
+
+__BEGIN_DECLS
+
+/////////////////////////////////////////////////
+//      Common Definitions
+/////////////////////////////////////////////////
+
+//
+//--- Effect descriptor structure effect_descriptor_t
+//
+
+// This format is used for both "type" and "uuid" fields of the effect descriptor structure.
+// - When used for effect type and the engine is implementing and effect corresponding to a standard
+// OpenSL ES interface, this ID must be the one defined in OpenSLES_IID.h for that interface.
+// - When used as uuid, it should be a unique UUID for this particular implementation.
+typedef audio_uuid_t effect_uuid_t;
+
+// Maximum length of character strings in structures defines by this API.
+#define EFFECT_STRING_LEN_MAX 64
+
+// NULL UUID definition (matches SL_IID_NULL_)
+#define EFFECT_UUID_INITIALIZER { 0xec7178ec, 0xe5e1, 0x4432, 0xa3f4, \
+                                  { 0x46, 0x57, 0xe6, 0x79, 0x52, 0x10 } }
+static const effect_uuid_t EFFECT_UUID_NULL_ = EFFECT_UUID_INITIALIZER;
+static const effect_uuid_t * const EFFECT_UUID_NULL = &EFFECT_UUID_NULL_;
+static const char * const EFFECT_UUID_NULL_STR = "ec7178ec-e5e1-4432-a3f4-4657e6795210";
+
+// The effect descriptor contains necessary information to facilitate the enumeration of the effect
+// engines present in a library.
+typedef struct effect_descriptor_s {
+    effect_uuid_t type;     // UUID of to the OpenSL ES interface implemented by this effect
+    effect_uuid_t uuid;     // UUID for this particular implementation
+    uint32_t apiVersion;    // Version of the effect control API implemented
+    uint32_t flags;         // effect engine capabilities/requirements flags (see below)
+    uint16_t cpuLoad;       // CPU load indication (see below)
+    uint16_t memoryUsage;   // Data Memory usage (see below)
+    char    name[EFFECT_STRING_LEN_MAX];   // human readable effect name
+    char    implementor[EFFECT_STRING_LEN_MAX];    // human readable effect implementor name
+} effect_descriptor_t;
+
+/////////////////////////////////////////////////
+//      Effect control interface
+/////////////////////////////////////////////////
+
+//
+//--- Standardized command codes for command() function
+//
+enum effect_command_e {
+   EFFECT_CMD_INIT,                 // initialize effect engine
+   EFFECT_CMD_SET_CONFIG,           // configure effect engine (see effect_config_t)
+   EFFECT_CMD_RESET,                // reset effect engine
+   EFFECT_CMD_ENABLE,               // enable effect process
+   EFFECT_CMD_DISABLE,              // disable effect process
+   EFFECT_CMD_SET_PARAM,            // set parameter immediately (see effect_param_t)
+   EFFECT_CMD_SET_PARAM_DEFERRED,   // set parameter deferred
+   EFFECT_CMD_SET_PARAM_COMMIT,     // commit previous set parameter deferred
+   EFFECT_CMD_GET_PARAM,            // get parameter
+   EFFECT_CMD_SET_DEVICE,           // set audio device (see audio.h, audio_devices_t)
+   EFFECT_CMD_SET_VOLUME,           // set volume
+   EFFECT_CMD_SET_AUDIO_MODE,       // set the audio mode (normal, ring, ...)
+   EFFECT_CMD_SET_CONFIG_REVERSE,   // configure effect engine reverse stream(see effect_config_t)
+   EFFECT_CMD_SET_INPUT_DEVICE,     // set capture device (see audio.h, audio_devices_t)
+   EFFECT_CMD_GET_CONFIG,           // read effect engine configuration
+   EFFECT_CMD_GET_CONFIG_REVERSE,   // read configure effect engine reverse stream configuration
+   EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS,// get all supported configurations for a feature.
+   EFFECT_CMD_GET_FEATURE_CONFIG,   // get current feature configuration
+   EFFECT_CMD_SET_FEATURE_CONFIG,   // set current feature configuration
+   EFFECT_CMD_SET_AUDIO_SOURCE,     // set the audio source (see audio.h, audio_source_t)
+   EFFECT_CMD_OFFLOAD,              // set if effect thread is an offload one,
+                                    // send the ioHandle of the effect thread
+   EFFECT_CMD_FIRST_PROPRIETARY = 0x10000 // first proprietary command code
+};
+
+//==================================================================================================
+// command: EFFECT_CMD_INIT
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Initialize effect engine: All configurations return to default
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_SET_CONFIG
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Apply new audio parameters configurations for input and output buffers
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_config_t)
+//  data: effect_config_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_RESET
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Reset the effect engine. Keep configuration but resets state and buffer content
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_ENABLE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Enable the process. Called by the framework before the first call to process()
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_DISABLE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Disable the process. Called by the framework after the last call to process()
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_SET_PARAM
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set a parameter and apply it immediately
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_param_t) + size of param and value
+//  data: effect_param_t + param + value. See effect_param_t definition below for value offset
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_SET_PARAM_DEFERRED
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set a parameter but apply it only when receiving EFFECT_CMD_SET_PARAM_COMMIT command
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_param_t) + size of param and value
+//  data: effect_param_t + param + value. See effect_param_t definition below for value offset
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_SET_PARAM_COMMIT
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Apply all previously received EFFECT_CMD_SET_PARAM_DEFERRED commands
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_GET_PARAM
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Get a parameter value
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_param_t) + size of param
+//  data: effect_param_t + param
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(effect_param_t) + size of param and value
+//  data: effect_param_t + param + value. See effect_param_t definition below for value offset
+//==================================================================================================
+// command: EFFECT_CMD_SET_DEVICE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set the rendering device the audio output path is connected to. See audio.h, audio_devices_t
+//  for device values.
+//  The effect implementation must set EFFECT_FLAG_DEVICE_IND flag in its descriptor to receive this
+//  command when the device changes
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t)
+//  data: uint32_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_SET_VOLUME
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set and get volume. Used by audio framework to delegate volume control to effect engine.
+//  The effect implementation must set EFFECT_FLAG_VOLUME_IND or EFFECT_FLAG_VOLUME_CTRL flag in
+//  its descriptor to receive this command before every call to process() function
+//  If EFFECT_FLAG_VOLUME_CTRL flag is set in the effect descriptor, the effect engine must return
+//  the volume that should be applied before the effect is processed. The overall volume (the volume
+//  actually applied by the effect engine multiplied by the returned value) should match the value
+//  indicated in the command.
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: n * sizeof(uint32_t)
+//  data: volume for each channel defined in effect_config_t for output buffer expressed in
+//      8.24 fixed point format
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: n * sizeof(uint32_t) / 0
+//  data: - if EFFECT_FLAG_VOLUME_CTRL is set in effect descriptor:
+//              volume for each channel defined in effect_config_t for output buffer expressed in
+//              8.24 fixed point format
+//        - if EFFECT_FLAG_VOLUME_CTRL is not set in effect descriptor:
+//              N/A
+//  It is legal to receive a null pointer as pReplyData in which case the effect framework has
+//  delegated volume control to another effect
+//==================================================================================================
+// command: EFFECT_CMD_SET_AUDIO_MODE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set the audio mode. The effect implementation must set EFFECT_FLAG_AUDIO_MODE_IND flag in its
+//  descriptor to receive this command when the audio mode changes.
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t)
+//  data: audio_mode_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_SET_CONFIG_REVERSE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Apply new audio parameters configurations for input and output buffers of reverse stream.
+//  An example of reverse stream is the echo reference supplied to an Acoustic Echo Canceler.
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_config_t)
+//  data: effect_config_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(int)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_SET_INPUT_DEVICE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set the capture device the audio input path is connected to. See audio.h, audio_devices_t
+//  for device values.
+//  The effect implementation must set EFFECT_FLAG_DEVICE_IND flag in its descriptor to receive this
+//  command when the device changes
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t)
+//  data: uint32_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_GET_CONFIG
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Read audio parameters configurations for input and output buffers
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(effect_config_t)
+//  data: effect_config_t
+//==================================================================================================
+// command: EFFECT_CMD_GET_CONFIG_REVERSE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Read audio parameters configurations for input and output buffers of reverse stream
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 0
+//  data: N/A
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(effect_config_t)
+//  data: effect_config_t
+//==================================================================================================
+// command: EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Queries for supported configurations for a particular feature (e.g. get the supported
+// combinations of main and auxiliary channels for a noise suppressor).
+// The command parameter is the feature identifier (See effect_feature_e for a list of defined
+// features) followed by the maximum number of configuration descriptor to return.
+// The reply is composed of:
+//  - status (uint32_t):
+//          - 0 if feature is supported
+//          - -ENOSYS if the feature is not supported,
+//          - -ENOMEM if the feature is supported but the total number of supported configurations
+//          exceeds the maximum number indicated by the caller.
+//  - total number of supported configurations (uint32_t)
+//  - an array of configuration descriptors.
+// The actual number of descriptors returned must not exceed the maximum number indicated by
+// the caller.
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: 2 x sizeof(uint32_t)
+//  data: effect_feature_e + maximum number of configurations to return
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 2 x sizeof(uint32_t) + n x sizeof (<config descriptor>)
+//  data: status + total number of configurations supported + array of n config descriptors
+//==================================================================================================
+// command: EFFECT_CMD_GET_FEATURE_CONFIG
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Retrieves current configuration for a given feature.
+// The reply status is:
+//      - 0 if feature is supported
+//      - -ENOSYS if the feature is not supported,
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t)
+//  data: effect_feature_e
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(uint32_t) + sizeof (<config descriptor>)
+//  data: status + config descriptor
+//==================================================================================================
+// command: EFFECT_CMD_SET_FEATURE_CONFIG
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Sets current configuration for a given feature.
+// The reply status is:
+//      - 0 if feature is supported
+//      - -ENOSYS if the feature is not supported,
+//      - -EINVAL if the configuration is invalid
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t) + sizeof (<config descriptor>)
+//  data: effect_feature_e + config descriptor
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(uint32_t)
+//  data: status
+//==================================================================================================
+// command: EFFECT_CMD_SET_AUDIO_SOURCE
+//--------------------------------------------------------------------------------------------------
+// description:
+//  Set the audio source the capture path is configured for (Camcorder, voice recognition...).
+//  See audio.h, audio_source_t for values.
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(uint32_t)
+//  data: uint32_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: 0
+//  data: N/A
+//==================================================================================================
+// command: EFFECT_CMD_OFFLOAD
+//--------------------------------------------------------------------------------------------------
+// description:
+//  1.indicate if the playback thread the effect is attached to is offloaded or not
+//  2.update the io handle of the playback thread the effect is attached to
+//--------------------------------------------------------------------------------------------------
+// command format:
+//  size: sizeof(effect_offload_param_t)
+//  data: effect_offload_param_t
+//--------------------------------------------------------------------------------------------------
+// reply format:
+//  size: sizeof(uint32_t)
+//  data: uint32_t
+//--------------------------------------------------------------------------------------------------
+// command: EFFECT_CMD_FIRST_PROPRIETARY
+//--------------------------------------------------------------------------------------------------
+// description:
+//  All proprietary effect commands must use command codes above this value. The size and format of
+//  command and response fields is free in this case
+//==================================================================================================
+
+// Audio buffer descriptor used by process(), bufferProvider() functions and buffer_config_t
+// structure. Multi-channel audio is always interleaved. The channel order is from LSB to MSB with
+// regard to the channel mask definition in audio.h, audio_channel_mask_t e.g :
+// Stereo: left, right
+// 5 point 1: front left, front right, front center, low frequency, back left, back right
+// The buffer size is expressed in frame count, a frame being composed of samples for all
+// channels at a given time. Frame size for unspecified format (AUDIO_FORMAT_OTHER) is 8 bit by
+// definition
+typedef struct audio_buffer_s {
+    size_t   frameCount;        // number of frames in buffer
+    union {
+        void*       raw;        // raw pointer to start of buffer
+        int32_t*    s32;        // pointer to signed 32 bit data at start of buffer
+        int16_t*    s16;        // pointer to signed 16 bit data at start of buffer
+        uint8_t*    u8;         // pointer to unsigned 8 bit data at start of buffer
+    };
+} audio_buffer_t;
+
+// The buffer_provider_s structure contains functions that can be used
+// by the effect engine process() function to query and release input
+// or output audio buffer.
+// The getBuffer() function is called to retrieve a buffer where data
+// should read from or written to by process() function.
+// The releaseBuffer() function MUST be called when the buffer retrieved
+// with getBuffer() is not needed anymore.
+// The process function should use the buffer provider mechanism to retrieve
+// input or output buffer if the inBuffer or outBuffer passed as argument is NULL
+// and the buffer configuration (buffer_config_t) given by the EFFECT_CMD_SET_CONFIG
+// command did not specify an audio buffer.
+
+typedef int32_t (* buffer_function_t)(void *cookie, audio_buffer_t *buffer);
+
+typedef struct buffer_provider_s {
+    buffer_function_t getBuffer;       // retrieve next buffer
+    buffer_function_t releaseBuffer;   // release used buffer
+    void       *cookie;                // for use by client of buffer provider functions
+} buffer_provider_t;
+
+// The buffer_config_s structure specifies the input or output audio format
+// to be used by the effect engine.
+typedef struct buffer_config_s {
+    audio_buffer_t  buffer;     // buffer for use by process() function if not passed explicitly
+    uint32_t   samplingRate;    // sampling rate
+    uint32_t   channels;        // channel mask (see audio_channel_mask_t in audio.h)
+    buffer_provider_t bufferProvider;   // buffer provider
+    uint8_t    format;          // Audio format (see audio_format_t in audio.h)
+    uint8_t    accessMode;      // read/write or accumulate in buffer (effect_buffer_access_e)
+    uint16_t   mask;            // indicates which of the above fields is valid
+} buffer_config_t;
+
+// EFFECT_FEATURE_AUX_CHANNELS feature configuration descriptor. Describe a combination
+// of main and auxiliary channels supported
+typedef struct channel_config_s {
+    audio_channel_mask_t main_channels; // channel mask for main channels
+    audio_channel_mask_t aux_channels;  // channel mask for auxiliary channels
+} channel_config_t;
+
+
+// effect_config_s structure is used to configure audio parameters and buffers for effect engine
+// input and output.
+typedef struct effect_config_s {
+    buffer_config_t   inputCfg;
+    buffer_config_t   outputCfg;
+} effect_config_t;
+
+
+// effect_param_s structure describes the format of the pCmdData argument of EFFECT_CMD_SET_PARAM
+// command and pCmdData and pReplyData of EFFECT_CMD_GET_PARAM command.
+// psize and vsize represent the actual size of parameter and value.
+//
+// NOTE: the start of value field inside the data field is always on a 32 bit boundary:
+//
+//  +-----------+
+//  | status    | sizeof(int)
+//  +-----------+
+//  | psize     | sizeof(int)
+//  +-----------+
+//  | vsize     | sizeof(int)
+//  +-----------+
+//  |           |   |           |
+//  ~ parameter ~   > psize     |
+//  |           |   |           >  ((psize - 1)/sizeof(int) + 1) * sizeof(int)
+//  +-----------+               |
+//  | padding   |               |
+//  +-----------+
+//  |           |   |
+//  ~ value     ~   > vsize
+//  |           |   |
+//  +-----------+
+
+typedef struct effect_param_s {
+    int32_t     status;     // Transaction status (unused for command, used for reply)
+    uint32_t    psize;      // Parameter size
+    uint32_t    vsize;      // Value size
+    char        data[];     // Start of Parameter + Value data
+} effect_param_t;
+
+// structure used by EFFECT_CMD_OFFLOAD command
+typedef struct effect_offload_param_s {
+    bool isOffload;         // true if the playback thread the effect is attached to is offloaded
+    int ioHandle;           // io handle of the playback thread the effect is attached to
+} effect_offload_param_t;
+
+
+__END_DECLS
+
+#endif  // ANDROID_AUDIO_EFFECT_CORE_H
diff --git a/audio/include/system/sound_trigger.h b/audio/include/system/sound_trigger.h
index 8f80080..c5156d9 100644
--- a/audio/include/system/sound_trigger.h
+++ b/audio/include/system/sound_trigger.h
@@ -50,13 +50,7 @@
     SOUND_MODEL_TYPE_GENERIC = 1      /* use for all models other than keyphrase */
 } sound_trigger_sound_model_type_t;
 
-typedef struct sound_trigger_uuid_s {
-    unsigned int   timeLow;
-    unsigned short timeMid;
-    unsigned short timeHiAndVersion;
-    unsigned short clockSeq;
-    unsigned char  node[6];
-} sound_trigger_uuid_t;
+typedef audio_uuid_t sound_trigger_uuid_t;
 
 /*
  * sound trigger implementation descriptor read by the framework via get_properties().
diff --git a/audio_route/audio_route.c b/audio_route/audio_route.c
index 90b114d..bd5c112 100644
--- a/audio_route/audio_route.c
+++ b/audio_route/audio_route.c
@@ -420,13 +420,24 @@
 static int mixer_enum_string_to_value(struct mixer_ctl *ctl, const char *string)
 {
     unsigned int i;
+    unsigned int num_values = mixer_ctl_get_num_enums(ctl);
+
+    if (string == NULL) {
+        ALOGE("NULL enum value string passed to mixer_enum_string_to_value() for ctl %s",
+              mixer_ctl_get_name(ctl));
+        return 0;
+    }
 
     /* Search the enum strings for a particular one */
-    for (i = 0; i < mixer_ctl_get_num_enums(ctl); i++) {
+    for (i = 0; i < num_values; i++) {
         if (strcmp(mixer_ctl_get_enum_string(ctl, i), string) == 0)
             break;
     }
-
+    if (i == num_values) {
+        ALOGE("unknown enum value string %s for ctl %s",
+              string, mixer_ctl_get_name(ctl));
+        return 0;
+    }
     return i;
 }
 
diff --git a/audio_utils/include/audio_utils/spdif/SPDIFEncoder.h b/audio_utils/include/audio_utils/spdif/SPDIFEncoder.h
index b356149..96421ac 100644
--- a/audio_utils/include/audio_utils/spdif/SPDIFEncoder.h
+++ b/audio_utils/include/audio_utils/spdif/SPDIFEncoder.h
@@ -18,7 +18,7 @@
 #define ANDROID_AUDIO_SPDIF_ENCODER_H
 
 #include <stdint.h>
-#include <hardware/audio.h>
+#include <system/audio.h>
 #include <audio_utils/spdif/FrameScanner.h>
 
 namespace android {
diff --git a/audio_utils/spdif/AC3FrameScanner.h b/audio_utils/spdif/AC3FrameScanner.h
index 9f3ea57..a73a860 100644
--- a/audio_utils/spdif/AC3FrameScanner.h
+++ b/audio_utils/spdif/AC3FrameScanner.h
@@ -18,7 +18,7 @@
 #define ANDROID_AUDIO_AC3_FRAME_SCANNER_H
 
 #include <stdint.h>
-#include <hardware/audio.h>
+#include <system/audio.h>
 #include <audio_utils/spdif/FrameScanner.h>
 
 namespace android {