Merge "Add const value for manually set surround formats." into pi-dev
diff --git a/audio/include/system/audio-base.h b/audio/include/system/audio-base.h
index 6d8e08b..3d0638d 100644
--- a/audio/include/system/audio-base.h
+++ b/audio/include/system/audio-base.h
@@ -69,102 +69,112 @@
 } audio_session_t;
 
 typedef enum {
-    AUDIO_FORMAT_INVALID = 4294967295u,
-    AUDIO_FORMAT_DEFAULT = 0u,
-    AUDIO_FORMAT_PCM = 0u,
-    AUDIO_FORMAT_MP3 = 16777216u,
-    AUDIO_FORMAT_AMR_NB = 33554432u,
-    AUDIO_FORMAT_AMR_WB = 50331648u,
-    AUDIO_FORMAT_AAC = 67108864u,
-    AUDIO_FORMAT_HE_AAC_V1 = 83886080u,
-    AUDIO_FORMAT_HE_AAC_V2 = 100663296u,
-    AUDIO_FORMAT_VORBIS = 117440512u,
-    AUDIO_FORMAT_OPUS = 134217728u,
-    AUDIO_FORMAT_AC3 = 150994944u,
-    AUDIO_FORMAT_E_AC3 = 167772160u,
-    AUDIO_FORMAT_DTS = 184549376u,
-    AUDIO_FORMAT_DTS_HD = 201326592u,
-    AUDIO_FORMAT_IEC61937 = 218103808u,
-    AUDIO_FORMAT_DOLBY_TRUEHD = 234881024u,
-    AUDIO_FORMAT_EVRC = 268435456u,
-    AUDIO_FORMAT_EVRCB = 285212672u,
-    AUDIO_FORMAT_EVRCWB = 301989888u,
-    AUDIO_FORMAT_EVRCNW = 318767104u,
-    AUDIO_FORMAT_AAC_ADIF = 335544320u,
-    AUDIO_FORMAT_WMA = 352321536u,
-    AUDIO_FORMAT_WMA_PRO = 369098752u,
-    AUDIO_FORMAT_AMR_WB_PLUS = 385875968u,
-    AUDIO_FORMAT_MP2 = 402653184u,
-    AUDIO_FORMAT_QCELP = 419430400u,
-    AUDIO_FORMAT_DSD = 436207616u,
-    AUDIO_FORMAT_FLAC = 452984832u,
-    AUDIO_FORMAT_ALAC = 469762048u,
-    AUDIO_FORMAT_APE = 486539264u,
-    AUDIO_FORMAT_AAC_ADTS = 503316480u,
-    AUDIO_FORMAT_SBC = 520093696u,
-    AUDIO_FORMAT_APTX = 536870912u,
-    AUDIO_FORMAT_APTX_HD = 553648128u,
-    AUDIO_FORMAT_AC4 = 570425344u,
-    AUDIO_FORMAT_LDAC = 587202560u,
-    AUDIO_FORMAT_MAT = 603979776u,
-    AUDIO_FORMAT_MAIN_MASK = 4278190080u,
-    AUDIO_FORMAT_SUB_MASK = 16777215u,
-    AUDIO_FORMAT_PCM_SUB_16_BIT = 1u,
-    AUDIO_FORMAT_PCM_SUB_8_BIT = 2u,
-    AUDIO_FORMAT_PCM_SUB_32_BIT = 3u,
-    AUDIO_FORMAT_PCM_SUB_8_24_BIT = 4u,
-    AUDIO_FORMAT_PCM_SUB_FLOAT = 5u,
-    AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 6u,
-    AUDIO_FORMAT_MP3_SUB_NONE = 0u,
-    AUDIO_FORMAT_AMR_SUB_NONE = 0u,
-    AUDIO_FORMAT_AAC_SUB_MAIN = 1u,
-    AUDIO_FORMAT_AAC_SUB_LC = 2u,
-    AUDIO_FORMAT_AAC_SUB_SSR = 4u,
-    AUDIO_FORMAT_AAC_SUB_LTP = 8u,
-    AUDIO_FORMAT_AAC_SUB_HE_V1 = 16u,
-    AUDIO_FORMAT_AAC_SUB_SCALABLE = 32u,
-    AUDIO_FORMAT_AAC_SUB_ERLC = 64u,
-    AUDIO_FORMAT_AAC_SUB_LD = 128u,
-    AUDIO_FORMAT_AAC_SUB_HE_V2 = 256u,
-    AUDIO_FORMAT_AAC_SUB_ELD = 512u,
-    AUDIO_FORMAT_AAC_SUB_XHE = 768u,
-    AUDIO_FORMAT_VORBIS_SUB_NONE = 0u,
-    AUDIO_FORMAT_E_AC3_SUB_JOC = 1u,
-    AUDIO_FORMAT_MAT_SUB_1_0 = 1u,
-    AUDIO_FORMAT_MAT_SUB_2_0 = 2u,
-    AUDIO_FORMAT_MAT_SUB_2_1 = 3u,
-    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_AAC_XHE = 67109632u, // (AAC | AAC_SUB_XHE)
-    AUDIO_FORMAT_AAC_ADTS_MAIN = 503316481u, // (AAC_ADTS | AAC_SUB_MAIN)
-    AUDIO_FORMAT_AAC_ADTS_LC = 503316482u, // (AAC_ADTS | AAC_SUB_LC)
-    AUDIO_FORMAT_AAC_ADTS_SSR = 503316484u, // (AAC_ADTS | AAC_SUB_SSR)
-    AUDIO_FORMAT_AAC_ADTS_LTP = 503316488u, // (AAC_ADTS | AAC_SUB_LTP)
-    AUDIO_FORMAT_AAC_ADTS_HE_V1 = 503316496u, // (AAC_ADTS | AAC_SUB_HE_V1)
-    AUDIO_FORMAT_AAC_ADTS_SCALABLE = 503316512u, // (AAC_ADTS | AAC_SUB_SCALABLE)
-    AUDIO_FORMAT_AAC_ADTS_ERLC = 503316544u, // (AAC_ADTS | AAC_SUB_ERLC)
-    AUDIO_FORMAT_AAC_ADTS_LD = 503316608u, // (AAC_ADTS | AAC_SUB_LD)
-    AUDIO_FORMAT_AAC_ADTS_HE_V2 = 503316736u, // (AAC_ADTS | AAC_SUB_HE_V2)
-    AUDIO_FORMAT_AAC_ADTS_ELD = 503316992u, // (AAC_ADTS | AAC_SUB_ELD)
-    AUDIO_FORMAT_AAC_ADTS_XHE = 503317248u, // (AAC_ADTS | AAC_SUB_XHE)
-    AUDIO_FORMAT_E_AC3_JOC = 167772161u, // (E_AC3 | E_AC3_SUB_JOC)
-    AUDIO_FORMAT_MAT_1_0 = 603979777u, // (MAT | MAT_SUB_1_0)
-    AUDIO_FORMAT_MAT_2_0 = 603979778u, // (MAT | MAT_SUB_2_0)
-    AUDIO_FORMAT_MAT_2_1 = 603979779u, // (MAT | MAT_SUB_2_1)
+    AUDIO_FORMAT_INVALID             = 0xFFFFFFFFu,
+    AUDIO_FORMAT_DEFAULT             = 0,
+    AUDIO_FORMAT_PCM                 = 0x00000000u,
+    AUDIO_FORMAT_MP3                 = 0x01000000u,
+    AUDIO_FORMAT_AMR_NB              = 0x02000000u,
+    AUDIO_FORMAT_AMR_WB              = 0x03000000u,
+    AUDIO_FORMAT_AAC                 = 0x04000000u,
+    AUDIO_FORMAT_HE_AAC_V1           = 0x05000000u,
+    AUDIO_FORMAT_HE_AAC_V2           = 0x06000000u,
+    AUDIO_FORMAT_VORBIS              = 0x07000000u,
+    AUDIO_FORMAT_OPUS                = 0x08000000u,
+    AUDIO_FORMAT_AC3                 = 0x09000000u,
+    AUDIO_FORMAT_E_AC3               = 0x0A000000u,
+    AUDIO_FORMAT_DTS                 = 0x0B000000u,
+    AUDIO_FORMAT_DTS_HD              = 0x0C000000u,
+    AUDIO_FORMAT_IEC61937            = 0x0D000000u,
+    AUDIO_FORMAT_DOLBY_TRUEHD        = 0x0E000000u,
+    AUDIO_FORMAT_EVRC                = 0x10000000u,
+    AUDIO_FORMAT_EVRCB               = 0x11000000u,
+    AUDIO_FORMAT_EVRCWB              = 0x12000000u,
+    AUDIO_FORMAT_EVRCNW              = 0x13000000u,
+    AUDIO_FORMAT_AAC_ADIF            = 0x14000000u,
+    AUDIO_FORMAT_WMA                 = 0x15000000u,
+    AUDIO_FORMAT_WMA_PRO             = 0x16000000u,
+    AUDIO_FORMAT_AMR_WB_PLUS         = 0x17000000u,
+    AUDIO_FORMAT_MP2                 = 0x18000000u,
+    AUDIO_FORMAT_QCELP               = 0x19000000u,
+    AUDIO_FORMAT_DSD                 = 0x1A000000u,
+    AUDIO_FORMAT_FLAC                = 0x1B000000u,
+    AUDIO_FORMAT_ALAC                = 0x1C000000u,
+    AUDIO_FORMAT_APE                 = 0x1D000000u,
+    AUDIO_FORMAT_AAC_ADTS            = 0x1E000000u,
+    AUDIO_FORMAT_SBC                 = 0x1F000000u,
+    AUDIO_FORMAT_APTX                = 0x20000000u,
+    AUDIO_FORMAT_APTX_HD             = 0x21000000u,
+    AUDIO_FORMAT_AC4                 = 0x22000000u,
+    AUDIO_FORMAT_LDAC                = 0x23000000u,
+    AUDIO_FORMAT_MAT                 = 0x24000000u,
+    AUDIO_FORMAT_MAIN_MASK           = 0xFF000000u,
+    AUDIO_FORMAT_SUB_MASK            = 0x00FFFFFFu,
+
+    /* Subformats */
+    AUDIO_FORMAT_PCM_SUB_16_BIT        = 0x1u,
+    AUDIO_FORMAT_PCM_SUB_8_BIT         = 0x2u,
+    AUDIO_FORMAT_PCM_SUB_32_BIT        = 0x3u,
+    AUDIO_FORMAT_PCM_SUB_8_24_BIT      = 0x4u,
+    AUDIO_FORMAT_PCM_SUB_FLOAT         = 0x5u,
+    AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6u,
+
+    AUDIO_FORMAT_MP3_SUB_NONE          = 0x0u,
+
+    AUDIO_FORMAT_AMR_SUB_NONE          = 0x0u,
+
+    AUDIO_FORMAT_AAC_SUB_MAIN          = 0x1u,
+    AUDIO_FORMAT_AAC_SUB_LC            = 0x2u,
+    AUDIO_FORMAT_AAC_SUB_SSR           = 0x4u,
+    AUDIO_FORMAT_AAC_SUB_LTP           = 0x8u,
+    AUDIO_FORMAT_AAC_SUB_HE_V1         = 0x10u,
+    AUDIO_FORMAT_AAC_SUB_SCALABLE      = 0x20u,
+    AUDIO_FORMAT_AAC_SUB_ERLC          = 0x40u,
+    AUDIO_FORMAT_AAC_SUB_LD            = 0x80u,
+    AUDIO_FORMAT_AAC_SUB_HE_V2         = 0x100u,
+    AUDIO_FORMAT_AAC_SUB_ELD           = 0x200u,
+    AUDIO_FORMAT_AAC_SUB_XHE           = 0x300u,
+
+    AUDIO_FORMAT_VORBIS_SUB_NONE       = 0x0u,
+
+    AUDIO_FORMAT_E_AC3_SUB_JOC         = 0x1u,
+
+    AUDIO_FORMAT_MAT_SUB_1_0           = 0x1u,
+    AUDIO_FORMAT_MAT_SUB_2_0           = 0x2u,
+    AUDIO_FORMAT_MAT_SUB_2_1           = 0x3u,
+
+    /* Aliases */
+    AUDIO_FORMAT_PCM_16_BIT            = 0x1u,        // (PCM | PCM_SUB_16_BIT)
+    AUDIO_FORMAT_PCM_8_BIT             = 0x2u,        // (PCM | PCM_SUB_8_BIT)
+    AUDIO_FORMAT_PCM_32_BIT            = 0x3u,        // (PCM | PCM_SUB_32_BIT)
+    AUDIO_FORMAT_PCM_8_24_BIT          = 0x4u,        // (PCM | PCM_SUB_8_24_BIT)
+    AUDIO_FORMAT_PCM_FLOAT             = 0x5u,        // (PCM | PCM_SUB_FLOAT)
+    AUDIO_FORMAT_PCM_24_BIT_PACKED     = 0x6u,        // (PCM | PCM_SUB_24_BIT_PACKED)
+    AUDIO_FORMAT_AAC_MAIN              = 0x4000001u,  // (AAC | AAC_SUB_MAIN)
+    AUDIO_FORMAT_AAC_LC                = 0x4000002u,  // (AAC | AAC_SUB_LC)
+    AUDIO_FORMAT_AAC_SSR               = 0x4000004u,  // (AAC | AAC_SUB_SSR)
+    AUDIO_FORMAT_AAC_LTP               = 0x4000008u,  // (AAC | AAC_SUB_LTP)
+    AUDIO_FORMAT_AAC_HE_V1             = 0x4000010u,  // (AAC | AAC_SUB_HE_V1)
+    AUDIO_FORMAT_AAC_SCALABLE          = 0x4000020u,  // (AAC | AAC_SUB_SCALABLE)
+    AUDIO_FORMAT_AAC_ERLC              = 0x4000040u,  // (AAC | AAC_SUB_ERLC)
+    AUDIO_FORMAT_AAC_LD                = 0x4000080u,  // (AAC | AAC_SUB_LD)
+    AUDIO_FORMAT_AAC_HE_V2             = 0x4000100u,  // (AAC | AAC_SUB_HE_V2)
+    AUDIO_FORMAT_AAC_ELD               = 0x4000200u,  // (AAC | AAC_SUB_ELD)
+    AUDIO_FORMAT_AAC_XHE               = 0x4000300u,  // (AAC | AAC_SUB_XHE)
+    AUDIO_FORMAT_AAC_ADTS_MAIN         = 0x1e000001u, // (AAC_ADTS | AAC_SUB_MAIN)
+    AUDIO_FORMAT_AAC_ADTS_LC           = 0x1e000002u, // (AAC_ADTS | AAC_SUB_LC)
+    AUDIO_FORMAT_AAC_ADTS_SSR          = 0x1e000004u, // (AAC_ADTS | AAC_SUB_SSR)
+    AUDIO_FORMAT_AAC_ADTS_LTP          = 0x1e000008u, // (AAC_ADTS | AAC_SUB_LTP)
+    AUDIO_FORMAT_AAC_ADTS_HE_V1        = 0x1e000010u, // (AAC_ADTS | AAC_SUB_HE_V1)
+    AUDIO_FORMAT_AAC_ADTS_SCALABLE     = 0x1e000020u, // (AAC_ADTS | AAC_SUB_SCALABLE)
+    AUDIO_FORMAT_AAC_ADTS_ERLC         = 0x1e000040u, // (AAC_ADTS | AAC_SUB_ERLC)
+    AUDIO_FORMAT_AAC_ADTS_LD           = 0x1e000080u, // (AAC_ADTS | AAC_SUB_LD)
+    AUDIO_FORMAT_AAC_ADTS_HE_V2        = 0x1e000100u, // (AAC_ADTS | AAC_SUB_HE_V2)
+    AUDIO_FORMAT_AAC_ADTS_ELD          = 0x1e000200u, // (AAC_ADTS | AAC_SUB_ELD)
+    AUDIO_FORMAT_AAC_ADTS_XHE          = 0x1e000300u, // (AAC_ADTS | AAC_SUB_XHE)
+    AUDIO_FORMAT_E_AC3_JOC             = 0xA000001u,  // (E_AC3 | E_AC3_SUB_JOC)
+    AUDIO_FORMAT_MAT_1_0               = 0x24000001u, // (MAT | MAT_SUB_1_0)
+    AUDIO_FORMAT_MAT_2_0               = 0x24000002u, // (MAT | MAT_SUB_2_0)
+    AUDIO_FORMAT_MAT_2_1               = 0x24000003u, // (MAT | MAT_SUB_2_1)
 } audio_format_t;
 
 enum {
@@ -173,93 +183,96 @@
 };
 
 enum {
-    AUDIO_CHANNEL_REPRESENTATION_POSITION = 0u,
-    AUDIO_CHANNEL_REPRESENTATION_INDEX = 2u,
-    AUDIO_CHANNEL_NONE = 0u,
-    AUDIO_CHANNEL_INVALID = 3221225472u,
-    AUDIO_CHANNEL_OUT_FRONT_LEFT = 1u,
-    AUDIO_CHANNEL_OUT_FRONT_RIGHT = 2u,
-    AUDIO_CHANNEL_OUT_FRONT_CENTER = 4u,
-    AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 8u,
-    AUDIO_CHANNEL_OUT_BACK_LEFT = 16u,
-    AUDIO_CHANNEL_OUT_BACK_RIGHT = 32u,
-    AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 64u,
-    AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 128u,
-    AUDIO_CHANNEL_OUT_BACK_CENTER = 256u,
-    AUDIO_CHANNEL_OUT_SIDE_LEFT = 512u,
-    AUDIO_CHANNEL_OUT_SIDE_RIGHT = 1024u,
-    AUDIO_CHANNEL_OUT_TOP_CENTER = 2048u,
-    AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 4096u,
-    AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 8192u,
-    AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 16384u,
-    AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 32768u,
-    AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 65536u,
-    AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 131072u,
-    AUDIO_CHANNEL_OUT_TOP_SIDE_LEFT = 262144u,
-    AUDIO_CHANNEL_OUT_TOP_SIDE_RIGHT = 524288u,
-    AUDIO_CHANNEL_OUT_MONO = 1u, // OUT_FRONT_LEFT
-    AUDIO_CHANNEL_OUT_STEREO = 3u, // (OUT_FRONT_LEFT | OUT_FRONT_RIGHT)
-    AUDIO_CHANNEL_OUT_2POINT1 = 11u, // ((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_LOW_FREQUENCY)
-    AUDIO_CHANNEL_OUT_2POINT0POINT2 = 786435u, // (((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_2POINT1POINT2 = 786443u, // ((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT) | OUT_LOW_FREQUENCY)
-    AUDIO_CHANNEL_OUT_3POINT0POINT2 = 786439u, // ((((OUT_FRONT_LEFT | OUT_FRONT_CENTER) | OUT_FRONT_RIGHT) | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_3POINT1POINT2 = 786447u, // (((((OUT_FRONT_LEFT | OUT_FRONT_CENTER) | OUT_FRONT_RIGHT) | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT) | OUT_LOW_FREQUENCY)
-    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_SURROUND = 263u, // (((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_BACK_CENTER)
-    AUDIO_CHANNEL_OUT_PENTA = 55u, // (OUT_QUAD | OUT_FRONT_CENTER)
-    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_5POINT1POINT2 = 786495u, // ((OUT_5POINT1 | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_5POINT1POINT4 = 184383u, // ((((OUT_5POINT1 | OUT_TOP_FRONT_LEFT) | OUT_TOP_FRONT_RIGHT) | OUT_TOP_BACK_LEFT) | OUT_TOP_BACK_RIGHT)
-    AUDIO_CHANNEL_OUT_6POINT1 = 319u, // ((((((OUT_FRONT_LEFT | OUT_FRONT_RIGHT) | OUT_FRONT_CENTER) | OUT_LOW_FREQUENCY) | OUT_BACK_LEFT) | OUT_BACK_RIGHT) | OUT_BACK_CENTER)
-    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_7POINT1POINT2 = 788031u, // ((OUT_7POINT1 | OUT_TOP_SIDE_LEFT) | OUT_TOP_SIDE_RIGHT)
-    AUDIO_CHANNEL_OUT_7POINT1POINT4 = 185919u, // ((((OUT_7POINT1 | OUT_TOP_FRONT_LEFT) | OUT_TOP_FRONT_RIGHT) | OUT_TOP_BACK_LEFT) | OUT_TOP_BACK_RIGHT)
-    AUDIO_CHANNEL_IN_LEFT = 4u,
-    AUDIO_CHANNEL_IN_RIGHT = 8u,
-    AUDIO_CHANNEL_IN_FRONT = 16u,
-    AUDIO_CHANNEL_IN_BACK = 32u,
-    AUDIO_CHANNEL_IN_LEFT_PROCESSED = 64u,
-    AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 128u,
-    AUDIO_CHANNEL_IN_FRONT_PROCESSED = 256u,
-    AUDIO_CHANNEL_IN_BACK_PROCESSED = 512u,
-    AUDIO_CHANNEL_IN_PRESSURE = 1024u,
-    AUDIO_CHANNEL_IN_X_AXIS = 2048u,
-    AUDIO_CHANNEL_IN_Y_AXIS = 4096u,
-    AUDIO_CHANNEL_IN_Z_AXIS = 8192u,
-    AUDIO_CHANNEL_IN_BACK_LEFT = 65536u,
-    AUDIO_CHANNEL_IN_BACK_RIGHT = 131072u,
-    AUDIO_CHANNEL_IN_CENTER = 262144u,
-    AUDIO_CHANNEL_IN_LOW_FREQUENCY = 1048576u,
-    AUDIO_CHANNEL_IN_TOP_LEFT = 2097152u,
-    AUDIO_CHANNEL_IN_TOP_RIGHT = 4194304u,
-    AUDIO_CHANNEL_IN_VOICE_UPLINK = 16384u,
-    AUDIO_CHANNEL_IN_VOICE_DNLINK = 32768u,
-    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_6 = 252u, // (((((IN_LEFT | IN_RIGHT) | IN_FRONT) | IN_BACK) | IN_LEFT_PROCESSED) | IN_RIGHT_PROCESSED)
-    AUDIO_CHANNEL_IN_2POINT0POINT2 = 6291468u, // (((IN_LEFT | IN_RIGHT) | IN_TOP_LEFT) | IN_TOP_RIGHT)
-    AUDIO_CHANNEL_IN_2POINT1POINT2 = 7340044u, // ((((IN_LEFT | IN_RIGHT) | IN_TOP_LEFT) | IN_TOP_RIGHT) | IN_LOW_FREQUENCY)
-    AUDIO_CHANNEL_IN_3POINT0POINT2 = 6553612u, // ((((IN_LEFT | IN_CENTER) | IN_RIGHT) | IN_TOP_LEFT) | IN_TOP_RIGHT)
-    AUDIO_CHANNEL_IN_3POINT1POINT2 = 7602188u, // (((((IN_LEFT | IN_CENTER) | IN_RIGHT) | IN_TOP_LEFT) | IN_TOP_RIGHT) | IN_LOW_FREQUENCY)
-    AUDIO_CHANNEL_IN_5POINT1 = 1507340u, // (((((IN_LEFT | IN_CENTER) | IN_RIGHT) | IN_BACK_LEFT) | IN_BACK_RIGHT) | IN_LOW_FREQUENCY)
-    AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO = 16400u, // (IN_VOICE_UPLINK | IN_MONO)
-    AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO = 32784u, // (IN_VOICE_DNLINK | IN_MONO)
-    AUDIO_CHANNEL_IN_VOICE_CALL_MONO = 49168u, // (IN_VOICE_UPLINK_MONO | IN_VOICE_DNLINK_MONO)
-    AUDIO_CHANNEL_COUNT_MAX = 30u,
-    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))
+    AUDIO_CHANNEL_REPRESENTATION_POSITION   = 0x0u,
+    AUDIO_CHANNEL_REPRESENTATION_INDEX      = 0x2u,
+    AUDIO_CHANNEL_NONE                      = 0x0u,
+    AUDIO_CHANNEL_INVALID                   = 0xC0000000u,
+
+    AUDIO_CHANNEL_OUT_FRONT_LEFT            = 0x1u,
+    AUDIO_CHANNEL_OUT_FRONT_RIGHT           = 0x2u,
+    AUDIO_CHANNEL_OUT_FRONT_CENTER          = 0x4u,
+    AUDIO_CHANNEL_OUT_LOW_FREQUENCY         = 0x8u,
+    AUDIO_CHANNEL_OUT_BACK_LEFT             = 0x10u,
+    AUDIO_CHANNEL_OUT_BACK_RIGHT            = 0x20u,
+    AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER  = 0x40u,
+    AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80u,
+    AUDIO_CHANNEL_OUT_BACK_CENTER           = 0x100u,
+    AUDIO_CHANNEL_OUT_SIDE_LEFT             = 0x200u,
+    AUDIO_CHANNEL_OUT_SIDE_RIGHT            = 0x400u,
+    AUDIO_CHANNEL_OUT_TOP_CENTER            = 0x800u,
+    AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT        = 0x1000u,
+    AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER      = 0x2000u,
+    AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT       = 0x4000u,
+    AUDIO_CHANNEL_OUT_TOP_BACK_LEFT         = 0x8000u,
+    AUDIO_CHANNEL_OUT_TOP_BACK_CENTER       = 0x10000u,
+    AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT        = 0x20000u,
+    AUDIO_CHANNEL_OUT_TOP_SIDE_LEFT         = 0x40000u,
+    AUDIO_CHANNEL_OUT_TOP_SIDE_RIGHT        = 0x80000u,
+    AUDIO_CHANNEL_OUT_MONO                  = 0x1u,     // OUT_FRONT_LEFT
+    AUDIO_CHANNEL_OUT_STEREO                = 0x3u,     // OUT_FRONT_LEFT | OUT_FRONT_RIGHT
+    AUDIO_CHANNEL_OUT_2POINT1               = 0xBu,     // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_LOW_FREQUENCY
+    AUDIO_CHANNEL_OUT_2POINT0POINT2         = 0xC0003u, // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_2POINT1POINT2         = 0xC000Bu, // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT | OUT_LOW_FREQUENCY
+    AUDIO_CHANNEL_OUT_3POINT0POINT2         = 0xC0007u, // OUT_FRONT_LEFT | OUT_FRONT_CENTER | OUT_FRONT_RIGHT | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_3POINT1POINT2         = 0xC000Fu, // OUT_FRONT_LEFT | OUT_FRONT_CENTER | OUT_FRONT_RIGHT | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT | OUT_LOW_FREQUENCY
+    AUDIO_CHANNEL_OUT_QUAD                  = 0x33u,    // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_BACK_LEFT | OUT_BACK_RIGHT
+    AUDIO_CHANNEL_OUT_QUAD_BACK             = 0x33u,    // OUT_QUAD
+    AUDIO_CHANNEL_OUT_QUAD_SIDE             = 0x603u,   // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_SIDE_LEFT | OUT_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_SURROUND              = 0x107u,   // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_FRONT_CENTER | OUT_BACK_CENTER
+    AUDIO_CHANNEL_OUT_PENTA                 = 0x37u,    // OUT_QUAD | OUT_FRONT_CENTER
+    AUDIO_CHANNEL_OUT_5POINT1               = 0x3Fu,    // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_FRONT_CENTER | OUT_LOW_FREQUENCY | OUT_BACK_LEFT | OUT_BACK_RIGHT
+    AUDIO_CHANNEL_OUT_5POINT1_BACK          = 0x3Fu,    // OUT_5POINT1
+    AUDIO_CHANNEL_OUT_5POINT1_SIDE          = 0x60Fu,   // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_FRONT_CENTER | OUT_LOW_FREQUENCY | OUT_SIDE_LEFT | OUT_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_5POINT1POINT2         = 0xC003Fu, // OUT_5POINT1 | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_5POINT1POINT4         = 0x2D03Fu, // OUT_5POINT1 | OUT_TOP_FRONT_LEFT | OUT_TOP_FRONT_RIGHT | OUT_TOP_BACK_LEFT | OUT_TOP_BACK_RIGHT
+    AUDIO_CHANNEL_OUT_6POINT1               = 0x13Fu,   // OUT_FRONT_LEFT | OUT_FRONT_RIGHT | OUT_FRONT_CENTER | OUT_LOW_FREQUENCY | OUT_BACK_LEFT | OUT_BACK_RIGHT | OUT_BACK_CENTER
+    AUDIO_CHANNEL_OUT_7POINT1               = 0x63Fu,   // 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_7POINT1POINT2         = 0xC063Fu, // OUT_7POINT1 | OUT_TOP_SIDE_LEFT | OUT_TOP_SIDE_RIGHT
+    AUDIO_CHANNEL_OUT_7POINT1POINT4         = 0x2D63Fu, // OUT_7POINT1 | OUT_TOP_FRONT_LEFT | OUT_TOP_FRONT_RIGHT | OUT_TOP_BACK_LEFT | OUT_TOP_BACK_RIGHT
+
+    AUDIO_CHANNEL_IN_LEFT                   = 0x4u,
+    AUDIO_CHANNEL_IN_RIGHT                  = 0x8u,
+    AUDIO_CHANNEL_IN_FRONT                  = 0x10u,
+    AUDIO_CHANNEL_IN_BACK                   = 0x20u,
+    AUDIO_CHANNEL_IN_LEFT_PROCESSED         = 0x40u,
+    AUDIO_CHANNEL_IN_RIGHT_PROCESSED        = 0x80u,
+    AUDIO_CHANNEL_IN_FRONT_PROCESSED        = 0x100u,
+    AUDIO_CHANNEL_IN_BACK_PROCESSED         = 0x200u,
+    AUDIO_CHANNEL_IN_PRESSURE               = 0x400u,
+    AUDIO_CHANNEL_IN_X_AXIS                 = 0x800u,
+    AUDIO_CHANNEL_IN_Y_AXIS                 = 0x1000u,
+    AUDIO_CHANNEL_IN_Z_AXIS                 = 0x2000u,
+    AUDIO_CHANNEL_IN_BACK_LEFT              = 0x10000u,
+    AUDIO_CHANNEL_IN_BACK_RIGHT             = 0x20000u,
+    AUDIO_CHANNEL_IN_CENTER                 = 0x40000u,
+    AUDIO_CHANNEL_IN_LOW_FREQUENCY          = 0x100000u,
+    AUDIO_CHANNEL_IN_TOP_LEFT               = 0x200000u,
+    AUDIO_CHANNEL_IN_TOP_RIGHT              = 0x400000u,
+    AUDIO_CHANNEL_IN_VOICE_UPLINK           = 0x4000u,
+    AUDIO_CHANNEL_IN_VOICE_DNLINK           = 0x8000u,
+    AUDIO_CHANNEL_IN_MONO                   = 0x10u,     // IN_FRONT
+    AUDIO_CHANNEL_IN_STEREO                 = 0xCu,      // IN_LEFT | IN_RIGHT
+    AUDIO_CHANNEL_IN_FRONT_BACK             = 0x30u,     // IN_FRONT | IN_BACK
+    AUDIO_CHANNEL_IN_6                      = 0xFCu,     // IN_LEFT | IN_RIGHT | IN_FRONT | IN_BACK | IN_LEFT_PROCESSED | IN_RIGHT_PROCESSED
+    AUDIO_CHANNEL_IN_2POINT0POINT2          = 0x60000Cu, // IN_LEFT | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT
+    AUDIO_CHANNEL_IN_2POINT1POINT2          = 0x70000Cu, // IN_LEFT | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT | IN_LOW_FREQUENCY
+    AUDIO_CHANNEL_IN_3POINT0POINT2          = 0x64000Cu, // IN_LEFT | IN_CENTER | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT
+    AUDIO_CHANNEL_IN_3POINT1POINT2          = 0x74000Cu, // IN_LEFT | IN_CENTER | IN_RIGHT | IN_TOP_LEFT | IN_TOP_RIGHT | IN_LOW_FREQUENCY
+    AUDIO_CHANNEL_IN_5POINT1                = 0x17000Cu, // IN_LEFT | IN_CENTER | IN_RIGHT | IN_BACK_LEFT | IN_BACK_RIGHT | IN_LOW_FREQUENCY
+    AUDIO_CHANNEL_IN_VOICE_UPLINK_MONO      = 0x4010u,   // IN_VOICE_UPLINK | IN_MONO
+    AUDIO_CHANNEL_IN_VOICE_DNLINK_MONO      = 0x8010u,   // IN_VOICE_DNLINK | IN_MONO
+    AUDIO_CHANNEL_IN_VOICE_CALL_MONO        = 0xC010u,   // IN_VOICE_UPLINK_MONO | IN_VOICE_DNLINK_MONO
+
+    AUDIO_CHANNEL_COUNT_MAX                 = 30u,
+    AUDIO_CHANNEL_INDEX_HDR                 = 0x80000000u, // REPRESENTATION_INDEX << COUNT_MAX
+    AUDIO_CHANNEL_INDEX_MASK_1              = 0x80000001u, // INDEX_HDR | (1 << 1) - 1
+    AUDIO_CHANNEL_INDEX_MASK_2              = 0x80000003u, // INDEX_HDR | (1 << 2) - 1
+    AUDIO_CHANNEL_INDEX_MASK_3              = 0x80000007u, // INDEX_HDR | (1 << 3) - 1
+    AUDIO_CHANNEL_INDEX_MASK_4              = 0x8000000Fu, // INDEX_HDR | (1 << 4) - 1
+    AUDIO_CHANNEL_INDEX_MASK_5              = 0x8000001Fu, // INDEX_HDR | (1 << 5) - 1
+    AUDIO_CHANNEL_INDEX_MASK_6              = 0x8000003Fu, // INDEX_HDR | (1 << 6) - 1
+    AUDIO_CHANNEL_INDEX_MASK_7              = 0x8000007Fu, // INDEX_HDR | (1 << 7) - 1
+    AUDIO_CHANNEL_INDEX_MASK_8              = 0x800000FFu, // INDEX_HDR | (1 << 8) - 1
 };
 
 typedef enum {
@@ -274,97 +287,99 @@
 } audio_mode_t;
 
 enum {
-    AUDIO_DEVICE_NONE = 0u,
-    AUDIO_DEVICE_BIT_IN = 2147483648u,
-    AUDIO_DEVICE_BIT_DEFAULT = 1073741824u,
-    AUDIO_DEVICE_OUT_EARPIECE = 1u,
-    AUDIO_DEVICE_OUT_SPEAKER = 2u,
-    AUDIO_DEVICE_OUT_WIRED_HEADSET = 4u,
-    AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 8u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 16u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 32u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 64u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 128u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 256u,
-    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 512u,
-    AUDIO_DEVICE_OUT_AUX_DIGITAL = 1024u,
-    AUDIO_DEVICE_OUT_HDMI = 1024u, // OUT_AUX_DIGITAL
-    AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 2048u,
-    AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 4096u,
-    AUDIO_DEVICE_OUT_USB_ACCESSORY = 8192u,
-    AUDIO_DEVICE_OUT_USB_DEVICE = 16384u,
-    AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 32768u,
-    AUDIO_DEVICE_OUT_TELEPHONY_TX = 65536u,
-    AUDIO_DEVICE_OUT_LINE = 131072u,
-    AUDIO_DEVICE_OUT_HDMI_ARC = 262144u,
-    AUDIO_DEVICE_OUT_SPDIF = 524288u,
-    AUDIO_DEVICE_OUT_FM = 1048576u,
-    AUDIO_DEVICE_OUT_AUX_LINE = 2097152u,
-    AUDIO_DEVICE_OUT_SPEAKER_SAFE = 4194304u,
-    AUDIO_DEVICE_OUT_IP = 8388608u,
-    AUDIO_DEVICE_OUT_BUS = 16777216u,
-    AUDIO_DEVICE_OUT_PROXY = 33554432u,
-    AUDIO_DEVICE_OUT_USB_HEADSET = 67108864u,
-    AUDIO_DEVICE_OUT_HEARING_AID = 134217728u,
-    AUDIO_DEVICE_OUT_ECHO_CANCELLER = 268435456u,
-    AUDIO_DEVICE_OUT_DEFAULT = 1073741824u, // BIT_DEFAULT
-    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_PROXY = 2164260864u, // (BIT_IN | 0x1000000)
-    AUDIO_DEVICE_IN_USB_HEADSET = 2181038080u, // (BIT_IN | 0x2000000)
-    AUDIO_DEVICE_IN_BLUETOOTH_BLE = 2214592512u, // (BIT_IN | 0x4000000)
-    AUDIO_DEVICE_IN_DEFAULT = 3221225472u, // (BIT_IN | BIT_DEFAULT)
+    AUDIO_DEVICE_NONE                          = 0x0u,
+    AUDIO_DEVICE_BIT_IN                        = 0x80000000u,
+    AUDIO_DEVICE_BIT_DEFAULT                   = 0x40000000u,
+
+    AUDIO_DEVICE_OUT_EARPIECE                  = 0x1u,
+    AUDIO_DEVICE_OUT_SPEAKER                   = 0x2u,
+    AUDIO_DEVICE_OUT_WIRED_HEADSET             = 0x4u,
+    AUDIO_DEVICE_OUT_WIRED_HEADPHONE           = 0x8u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_SCO             = 0x10u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET     = 0x20u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT      = 0x40u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP            = 0x80u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100u,
+    AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER    = 0x200u,
+    AUDIO_DEVICE_OUT_AUX_DIGITAL               = 0x400u,
+    AUDIO_DEVICE_OUT_HDMI                      = 0x400u,      // OUT_AUX_DIGITAL
+    AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET         = 0x800u,
+    AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET         = 0x1000u,
+    AUDIO_DEVICE_OUT_USB_ACCESSORY             = 0x2000u,
+    AUDIO_DEVICE_OUT_USB_DEVICE                = 0x4000u,
+    AUDIO_DEVICE_OUT_REMOTE_SUBMIX             = 0x8000u,
+    AUDIO_DEVICE_OUT_TELEPHONY_TX              = 0x10000u,
+    AUDIO_DEVICE_OUT_LINE                      = 0x20000u,
+    AUDIO_DEVICE_OUT_HDMI_ARC                  = 0x40000u,
+    AUDIO_DEVICE_OUT_SPDIF                     = 0x80000u,
+    AUDIO_DEVICE_OUT_FM                        = 0x100000u,
+    AUDIO_DEVICE_OUT_AUX_LINE                  = 0x200000u,
+    AUDIO_DEVICE_OUT_SPEAKER_SAFE              = 0x400000u,
+    AUDIO_DEVICE_OUT_IP                        = 0x800000u,
+    AUDIO_DEVICE_OUT_BUS                       = 0x1000000u,
+    AUDIO_DEVICE_OUT_PROXY                     = 0x2000000u,
+    AUDIO_DEVICE_OUT_USB_HEADSET               = 0x4000000u,
+    AUDIO_DEVICE_OUT_HEARING_AID               = 0x8000000u,
+    AUDIO_DEVICE_OUT_ECHO_CANCELLER            = 0x10000000u,
+    AUDIO_DEVICE_OUT_DEFAULT                   = 0x40000000u, // BIT_DEFAULT
+
+    AUDIO_DEVICE_IN_COMMUNICATION              = 0x80000001u, // BIT_IN | 0x1
+    AUDIO_DEVICE_IN_AMBIENT                    = 0x80000002u, // BIT_IN | 0x2
+    AUDIO_DEVICE_IN_BUILTIN_MIC                = 0x80000004u, // BIT_IN | 0x4
+    AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET      = 0x80000008u, // BIT_IN | 0x8
+    AUDIO_DEVICE_IN_WIRED_HEADSET              = 0x80000010u, // BIT_IN | 0x10
+    AUDIO_DEVICE_IN_AUX_DIGITAL                = 0x80000020u, // BIT_IN | 0x20
+    AUDIO_DEVICE_IN_HDMI                       = 0x80000020u, // IN_AUX_DIGITAL
+    AUDIO_DEVICE_IN_VOICE_CALL                 = 0x80000040u, // BIT_IN | 0x40
+    AUDIO_DEVICE_IN_TELEPHONY_RX               = 0x80000040u, // IN_VOICE_CALL
+    AUDIO_DEVICE_IN_BACK_MIC                   = 0x80000080u, // BIT_IN | 0x80
+    AUDIO_DEVICE_IN_REMOTE_SUBMIX              = 0x80000100u, // BIT_IN | 0x100
+    AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET          = 0x80000200u, // BIT_IN | 0x200
+    AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET          = 0x80000400u, // BIT_IN | 0x400
+    AUDIO_DEVICE_IN_USB_ACCESSORY              = 0x80000800u, // BIT_IN | 0x800
+    AUDIO_DEVICE_IN_USB_DEVICE                 = 0x80001000u, // BIT_IN | 0x1000
+    AUDIO_DEVICE_IN_FM_TUNER                   = 0x80002000u, // BIT_IN | 0x2000
+    AUDIO_DEVICE_IN_TV_TUNER                   = 0x80004000u, // BIT_IN | 0x4000
+    AUDIO_DEVICE_IN_LINE                       = 0x80008000u, // BIT_IN | 0x8000
+    AUDIO_DEVICE_IN_SPDIF                      = 0x80010000u, // BIT_IN | 0x10000
+    AUDIO_DEVICE_IN_BLUETOOTH_A2DP             = 0x80020000u, // BIT_IN | 0x20000
+    AUDIO_DEVICE_IN_LOOPBACK                   = 0x80040000u, // BIT_IN | 0x40000
+    AUDIO_DEVICE_IN_IP                         = 0x80080000u, // BIT_IN | 0x80000
+    AUDIO_DEVICE_IN_BUS                        = 0x80100000u, // BIT_IN | 0x100000
+    AUDIO_DEVICE_IN_PROXY                      = 0x81000000u, // BIT_IN | 0x1000000
+    AUDIO_DEVICE_IN_USB_HEADSET                = 0x82000000u, // BIT_IN | 0x2000000
+    AUDIO_DEVICE_IN_BLUETOOTH_BLE              = 0x84000000u, // BIT_IN | 0x4000000
+    AUDIO_DEVICE_IN_DEFAULT                    = 0xC0000000u, // BIT_IN | BIT_DEFAULT
 };
 
 typedef enum {
-    AUDIO_OUTPUT_FLAG_NONE = 0,
-    AUDIO_OUTPUT_FLAG_DIRECT = 1,
-    AUDIO_OUTPUT_FLAG_PRIMARY = 2,
-    AUDIO_OUTPUT_FLAG_FAST = 4,
-    AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 8,
-    AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 16,
-    AUDIO_OUTPUT_FLAG_NON_BLOCKING = 32,
-    AUDIO_OUTPUT_FLAG_HW_AV_SYNC = 64,
-    AUDIO_OUTPUT_FLAG_TTS = 128,
-    AUDIO_OUTPUT_FLAG_RAW = 256,
-    AUDIO_OUTPUT_FLAG_SYNC = 512,
-    AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 1024,
-    AUDIO_OUTPUT_FLAG_DIRECT_PCM = 8192,
-    AUDIO_OUTPUT_FLAG_MMAP_NOIRQ = 16384,
-    AUDIO_OUTPUT_FLAG_VOIP_RX = 32768,
-    AUDIO_OUTPUT_FLAG_INCALL_MUSIC = 65536,
+    AUDIO_OUTPUT_FLAG_NONE             = 0x0,
+    AUDIO_OUTPUT_FLAG_DIRECT           = 0x1,
+    AUDIO_OUTPUT_FLAG_PRIMARY          = 0x2,
+    AUDIO_OUTPUT_FLAG_FAST             = 0x4,
+    AUDIO_OUTPUT_FLAG_DEEP_BUFFER      = 0x8,
+    AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10,
+    AUDIO_OUTPUT_FLAG_NON_BLOCKING     = 0x20,
+    AUDIO_OUTPUT_FLAG_HW_AV_SYNC       = 0x40,
+    AUDIO_OUTPUT_FLAG_TTS              = 0x80,
+    AUDIO_OUTPUT_FLAG_RAW              = 0x100,
+    AUDIO_OUTPUT_FLAG_SYNC             = 0x200,
+    AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO  = 0x400,
+    AUDIO_OUTPUT_FLAG_DIRECT_PCM       = 0x2000,
+    AUDIO_OUTPUT_FLAG_MMAP_NOIRQ       = 0x4000,
+    AUDIO_OUTPUT_FLAG_VOIP_RX          = 0x8000,
+    AUDIO_OUTPUT_FLAG_INCALL_MUSIC     = 0x10000,
 } audio_output_flags_t;
 
 typedef enum {
-    AUDIO_INPUT_FLAG_NONE = 0,
-    AUDIO_INPUT_FLAG_FAST = 1,
-    AUDIO_INPUT_FLAG_HW_HOTWORD = 2,
-    AUDIO_INPUT_FLAG_RAW = 4,
-    AUDIO_INPUT_FLAG_SYNC = 8,
-    AUDIO_INPUT_FLAG_MMAP_NOIRQ = 16,
-    AUDIO_INPUT_FLAG_VOIP_TX = 32,
-    AUDIO_INPUT_FLAG_HW_AV_SYNC = 64,
+    AUDIO_INPUT_FLAG_NONE       = 0x0,
+    AUDIO_INPUT_FLAG_FAST       = 0x1,
+    AUDIO_INPUT_FLAG_HW_HOTWORD = 0x2,
+    AUDIO_INPUT_FLAG_RAW        = 0x4,
+    AUDIO_INPUT_FLAG_SYNC       = 0x8,
+    AUDIO_INPUT_FLAG_MMAP_NOIRQ = 0x10,
+    AUDIO_INPUT_FLAG_VOIP_TX    = 0x20,
+    AUDIO_INPUT_FLAG_HW_AV_SYNC = 0x40,
 } audio_input_flags_t;
 
 typedef enum {
@@ -398,9 +413,9 @@
 } audio_content_type_t;
 
 enum {
-    AUDIO_GAIN_MODE_JOINT = 1u,
-    AUDIO_GAIN_MODE_CHANNELS = 2u,
-    AUDIO_GAIN_MODE_RAMP = 4u,
+    AUDIO_GAIN_MODE_JOINT    = 0x1u,
+    AUDIO_GAIN_MODE_CHANNELS = 0x2u,
+    AUDIO_GAIN_MODE_RAMP     = 0x4u,
 };
 
 typedef enum {
@@ -417,10 +432,10 @@
 } audio_port_type_t;
 
 enum {
-    AUDIO_PORT_CONFIG_SAMPLE_RATE = 1u,
-    AUDIO_PORT_CONFIG_CHANNEL_MASK = 2u,
-    AUDIO_PORT_CONFIG_FORMAT = 4u,
-    AUDIO_PORT_CONFIG_GAIN = 8u,
+    AUDIO_PORT_CONFIG_SAMPLE_RATE  = 0x1u,
+    AUDIO_PORT_CONFIG_CHANNEL_MASK = 0x2u,
+    AUDIO_PORT_CONFIG_FORMAT       = 0x4u,
+    AUDIO_PORT_CONFIG_GAIN         = 0x8u,
 };
 
 typedef enum {
diff --git a/audio/include/system/audio.h b/audio/include/system/audio.h
index 724df6e..8e15410 100644
--- a/audio/include/system/audio.h
+++ b/audio/include/system/audio.h
@@ -1070,23 +1070,13 @@
     AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED = 0,
     AUDIO_MICROPHONE_CHANNEL_MAPPING_DIRECT = 1,
     AUDIO_MICROPHONE_CHANNEL_MAPPING_PROCESSED = 2,
+    AUDIO_MICROPHONE_CHANNEL_MAPPING_CNT = 3,
 } audio_microphone_channel_mapping_t;
 
-typedef enum {
-    AUDIO_MICROPHONE_CHARACTERISTIC_NONE = 0u, // 0x0
-    AUDIO_MICROPHONE_CHARACTERISTIC_SENSITIVITY = 1u, // 0x1
-    AUDIO_MICROPHONE_CHARACTERISTIC_MAX_SPL = 2u, // 0x2
-    AUDIO_MICROPHONE_CHARACTERISTIC_MIN_SPL = 4u, // 0x4
-    AUDIO_MICROPHONE_CHARACTERISTIC_ORIENTATION = 8u, // 0x8
-    AUDIO_MICROPHONE_CHARACTERISTIC_GEOMETRIC_LOCATION = 16u, // 0x10
-    AUDIO_MICROPHONE_CHARACTERISTIC_ALL = 31u, /* ((((SENSITIVITY | MAX_SPL) | MIN_SPL)
-                                                  | ORIENTATION) | GEOMETRIC_LOCATION) */
-} audio_microphone_characteristic_fields_t;
-
 /* the maximum length for the microphone id */
 #define AUDIO_MICROPHONE_ID_MAX_LEN 32
 /* max number of frequency responses in a frequency response table */
-#define AUDIO_MICROPHONE_MAX_FREQUENCY_RESPONSES 32
+#define AUDIO_MICROPHONE_MAX_FREQUENCY_RESPONSES 256
 /* max number of microphone */
 #define AUDIO_MICROPHONE_MAX_COUNT 32
 /* the value of unknown spl */
@@ -1117,7 +1107,6 @@
     float frequency_responses[2][AUDIO_MICROPHONE_MAX_FREQUENCY_RESPONSES];
     struct audio_microphone_coordinate geometric_location;
     struct audio_microphone_coordinate orientation;
-    audio_microphone_characteristic_fields_t valid_mask;
 };
 
 __END_DECLS
diff --git a/audio_utils/format.c b/audio_utils/format.c
index 1803e3c..50872fc 100644
--- a/audio_utils/format.c
+++ b/audio_utils/format.c
@@ -34,7 +34,10 @@
         case AUDIO_FORMAT_PCM_24_BIT_PACKED:
         case AUDIO_FORMAT_PCM_32_BIT:
         case AUDIO_FORMAT_PCM_8_24_BIT:
-            memcpy(dst, src, count * audio_bytes_per_sample(dst_format));
+            if (dst != src) {
+                // TODO: should assert if memory regions overlap.
+                memcpy(dst, src, count * audio_bytes_per_sample(dst_format));
+            }
             return;
         default:
             break;
diff --git a/audio_utils/include/audio_utils/format.h b/audio_utils/include/audio_utils/format.h
index dfcfecd..842bbf0 100644
--- a/audio_utils/include/audio_utils/format.h
+++ b/audio_utils/include/audio_utils/format.h
@@ -54,8 +54,8 @@
  * 2) Both dst_format and src_format are identical and of the list given
  * in (1). This is a straight copy.
  *
- * The destination and source buffers must be completely separate if the destination
- * format size is larger than the source format size. These routines call functions
+ * The destination and source buffers must be completely separate
+ * or point to the same starting buffer address. These routines call functions
  * in primitives.h, so descriptions of detailed behavior can be reviewed there.
  *
  * Logs a fatal error if dst or src format is not allowed by the conversion rules above.
diff --git a/audio_utils/primitives.c b/audio_utils/primitives.c
index d88d701..594f1c5 100644
--- a/audio_utils/primitives.c
+++ b/audio_utils/primitives.c
@@ -138,14 +138,15 @@
     src += count;
     for (; count > 0; --count) {
         dst -= 3;
+        const int16_t sample = *--src;
 #if HAVE_BIG_ENDIAN
-        dst[0] = *--src >> 8;
-        dst[1] = *src;
+        dst[0] = sample >> 8;
+        dst[1] = sample;
         dst[2] = 0;
 #else
         dst[0] = 0;
-        dst[1] = *--src;
-        dst[2] = *src >> 8;
+        dst[1] = sample;
+        dst[2] = sample >> 8;
 #endif
     }
 }
diff --git a/audio_utils/tests/Android.bp b/audio_utils/tests/Android.bp
index 8952046..e0403aa 100644
--- a/audio_utils/tests/Android.bp
+++ b/audio_utils/tests/Android.bp
@@ -225,3 +225,25 @@
         "-Werror",
     ],
 }
+
+cc_test {
+    name: "format_tests",
+    host_supported: true,
+
+    shared_libs: [
+        "liblog",
+    ],
+    srcs: ["format_tests.cpp"],
+    cflags: [
+        "-Werror",
+        "-Wall",
+    ],
+    target: {
+        android: {
+            shared_libs: ["libaudioutils"],
+        },
+        host: {
+            static_libs: ["libaudioutils"],
+        },
+    }
+}
diff --git a/audio_utils/tests/build_and_run_all_unit_tests.sh b/audio_utils/tests/build_and_run_all_unit_tests.sh
index 2cfff84..78de692 100755
--- a/audio_utils/tests/build_and_run_all_unit_tests.sh
+++ b/audio_utils/tests/build_and_run_all_unit_tests.sh
@@ -35,6 +35,10 @@
 adb push $OUT/data/nativetest/string_tests/string_tests /system/bin
 adb shell /system/bin/string_tests
 
+echo "format tests"
+adb push $OUT/data/nativetest/format_tests/format_tests /system/bin
+adb shell /system/bin/format_tests
+
 echo "benchmarking primitives"
 adb push $OUT/system/bin/primitives_benchmark /system/bin
 adb shell /system/bin/primitives_benchmark
diff --git a/audio_utils/tests/format_tests.cpp b/audio_utils/tests/format_tests.cpp
new file mode 100644
index 0000000..0526b30
--- /dev/null
+++ b/audio_utils/tests/format_tests.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2018 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "audio_utils_format_tests"
+#include <log/log.h>
+
+#include <audio_utils/format.h>
+#include <gtest/gtest.h>
+
+/** returns true if the format is a common source or destination format.
+    memcpy_by_audio_format() allows interchange between any PCM format and the
+    "common" PCM 16 bit and PCM float formats. */
+static bool is_common_format(audio_format_t format) {
+    return format == AUDIO_FORMAT_PCM_16_BIT || format == AUDIO_FORMAT_PCM_FLOAT;
+}
+
+// Initialize PCM 16 bit ramp for basic data sanity check (generated from PCM 8 bit data).
+// TODO: consider creating fillPseudoRandomValue().
+template<size_t size>
+static void fillRamp(int16_t(&buffer)[size])
+{
+    // Create PCM 16 bit data based on PCM 8 bit format because PCM 8 bit is convertible
+    // to all other audio formats without loss; hence, round trip conversion preserves equality.
+    uint8_t bytes[size];
+    for (size_t i = 0; i < size; ++i) {
+        bytes[i] = i;
+    }
+    // convert to PCM 16 bit
+    memcpy_by_audio_format(
+            buffer, AUDIO_FORMAT_PCM_16_BIT,
+            bytes, AUDIO_FORMAT_PCM_8_BIT, size);
+
+    uint8_t check[size];
+    memcpy_by_audio_format(
+            check, AUDIO_FORMAT_PCM_8_BIT,
+            buffer, AUDIO_FORMAT_PCM_16_BIT, size);
+    EXPECT_EQ(0, memcmp(check, bytes, size));
+}
+
+class FormatTest : public testing::TestWithParam<std::tuple<audio_format_t, audio_format_t>>
+{
+};
+
+TEST_P(FormatTest, memcpy_by_audio_format)
+{
+    // fetch parameters
+    const auto param = GetParam();
+    const audio_format_t src_encoding = std::get<0>(param);
+    const audio_format_t dst_encoding = std::get<1>(param);
+
+    // either source or destination (or both) need to be a common format
+    if (!is_common_format(src_encoding) && !is_common_format(dst_encoding)) {
+        printf("skip conversion src:%#x  dst:%#x\n", src_encoding, dst_encoding);
+        return;
+    }
+
+    constexpr size_t SAMPLES = UINT8_MAX;
+    constexpr audio_format_t orig_encoding = AUDIO_FORMAT_PCM_16_BIT;
+    int16_t orig_data[SAMPLES];
+
+    fillRamp(orig_data);
+
+    // data buffer for in-place conversion (uint32_t is maximum sample size of 4 bytes)
+    uint32_t data[SAMPLES];
+    // check buffer is used to compare out-of-place vs in-place conversion.
+    uint32_t check[SAMPLES];
+
+    printf("trying conversion src:%#x  dst:%#x\n", src_encoding, dst_encoding);
+    fflush(stdout);
+    // Copy original data to data buffer at src_encoding.
+    memcpy_by_audio_format(
+            data, src_encoding,
+            orig_data, orig_encoding, SAMPLES);
+
+    // Convert from src encoding to dst encoding.
+    memcpy_by_audio_format(
+            check, dst_encoding,
+            data, src_encoding, SAMPLES);
+
+    // Check in-place is same as out-of-place conversion.
+    memcpy_by_audio_format(
+            data, dst_encoding,
+            data, src_encoding, SAMPLES);
+    EXPECT_EQ(0, memcmp(check, data, SAMPLES * audio_bytes_per_sample(dst_encoding)));
+
+    // Go back to the original data encoding for comparison.
+    memcpy_by_audio_format(
+            data, orig_encoding,
+            data, dst_encoding, SAMPLES);
+
+    // Raw byte compare at the original encoding must succeed - our conversions
+    // must be lossless for PCM 8 bit representation which orig_data was constructed from.
+    EXPECT_EQ(0,
+            memcmp(data, orig_data, SAMPLES * audio_bytes_per_sample(orig_encoding)));
+}
+
+INSTANTIATE_TEST_CASE_P(FormatVariations, FormatTest, ::testing::Combine(
+    ::testing::Values(
+        AUDIO_FORMAT_PCM_8_BIT,
+        AUDIO_FORMAT_PCM_16_BIT,
+        AUDIO_FORMAT_PCM_FLOAT,
+        AUDIO_FORMAT_PCM_24_BIT_PACKED,
+        AUDIO_FORMAT_PCM_32_BIT,
+        AUDIO_FORMAT_PCM_8_24_BIT
+    ),
+    ::testing::Values(
+        AUDIO_FORMAT_PCM_8_BIT,
+        AUDIO_FORMAT_PCM_16_BIT,
+        AUDIO_FORMAT_PCM_FLOAT,
+        AUDIO_FORMAT_PCM_24_BIT_PACKED,
+        AUDIO_FORMAT_PCM_32_BIT,
+        AUDIO_FORMAT_PCM_8_24_BIT
+    )));
diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c
index e99abc4..f33da8d 100644
--- a/camera/src/camera_metadata.c
+++ b/camera/src/camera_metadata.c
@@ -234,7 +234,7 @@
         return NULL;
     }
 
-    void *buffer = malloc(src_size);
+    void *buffer = calloc(1, src_size);
     memcpy(buffer, src, src_size);
 
     camera_metadata_t *metadata = (camera_metadata_t*) buffer;
@@ -251,7 +251,7 @@
 
     size_t memory_needed = calculate_camera_metadata_size(entry_capacity,
                                                           data_capacity);
-    void *buffer = malloc(memory_needed);
+    void *buffer = calloc(1, memory_needed);
     camera_metadata_t *metadata = place_camera_metadata(
         buffer, memory_needed, entry_capacity, data_capacity);
     if (!metadata) {