OSDN Git Service

Audio HAL: extensions for new SoC features
authorMikhail Naganov <mnaganov@google.com>
Tue, 22 Nov 2016 02:38:12 +0000 (18:38 -0800)
committerMikhail Naganov <mnaganov@google.com>
Tue, 6 Dec 2016 18:00:32 +0000 (10:00 -0800)
Extended audio offload structure: added support to add bit_width,
offload buffer size and usage info.

Add support for direct PCM audio stream. Direct PCM stream
is used when pcm data required post processing in DSP. Direct PCM
stream is used for both track offload and PCM offload.

Add audio proxy source device.

Add support for additional audio formats: EVRC, QCELP, WMA, WMA,
AAC_ADIF, AMR, MP2, FLAC, ALAC, APE, DSD, LDAC.

Extend audio channel mask.

Test: make
Change-Id: If01c351a810015b1ff97fc9f2e62c49eba8ea069

audio/include/system/audio-base.h
audio/include/system/audio.h

index a50a484..08cb1ff 100644 (file)
@@ -77,6 +77,25 @@ typedef enum {
     AUDIO_FORMAT_DTS_HD = 201326592u, // 0x0C000000UL
     AUDIO_FORMAT_IEC61937 = 218103808u, // 0x0D000000UL
     AUDIO_FORMAT_DOLBY_TRUEHD = 234881024u, // 0x0E000000UL
+    AUDIO_FORMAT_EVRC = 268435456u, // 0x10000000UL
+    AUDIO_FORMAT_EVRCB = 285212672u, // 0x11000000UL
+    AUDIO_FORMAT_EVRCWB = 301989888u, // 0x12000000UL
+    AUDIO_FORMAT_EVRCNW = 318767104u, // 0x13000000UL
+    AUDIO_FORMAT_AAC_ADIF = 335544320u, // 0x14000000UL
+    AUDIO_FORMAT_WMA = 352321536u, // 0x15000000UL
+    AUDIO_FORMAT_WMA_PRO = 369098752u, // 0x16000000UL
+    AUDIO_FORMAT_AMR_WB_PLUS = 385875968u, // 0x17000000UL
+    AUDIO_FORMAT_MP2 = 402653184u, // 0x18000000UL
+    AUDIO_FORMAT_QCELP = 419430400u, // 0x19000000UL
+    AUDIO_FORMAT_DSD = 436207616u, // 0x1A000000UL
+    AUDIO_FORMAT_FLAC = 452984832u, // 0x1B000000UL
+    AUDIO_FORMAT_ALAC = 469762048u, // 0x1C000000UL
+    AUDIO_FORMAT_APE = 486539264u, // 0x1D000000UL
+    AUDIO_FORMAT_AAC_ADTS = 503316480u, // 0x1E000000UL
+    AUDIO_FORMAT_SBC = 520093696u, // 0x1F000000UL
+    AUDIO_FORMAT_APTX = 536870912u, // 0x20000000UL
+    AUDIO_FORMAT_APTX_HD = 553648128u, // 0x21000000UL
+    AUDIO_FORMAT_LDAC = 570425344u, // 0x22000000UL
     AUDIO_FORMAT_MAIN_MASK = 4278190080u, // 0xFF000000UL
     AUDIO_FORMAT_SUB_MASK = 16777215u, // 0x00FFFFFFUL
     AUDIO_FORMAT_PCM_SUB_16_BIT = 1u, // 0x1
@@ -114,6 +133,16 @@ typedef enum {
     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_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_t;
 
 enum {
@@ -146,12 +175,16 @@ enum {
     AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 131072u, // 0x20000
     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_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_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_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
@@ -171,6 +204,9 @@ enum {
     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_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_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, // (REPRESENTATION_INDEX << COUNT_MAX)
@@ -230,8 +266,9 @@ enum {
     AUDIO_DEVICE_OUT_SPEAKER_SAFE = 4194304u, // 0x400000
     AUDIO_DEVICE_OUT_IP = 8388608u, // 0x800000
     AUDIO_DEVICE_OUT_BUS = 16777216u, // 0x1000000
+    AUDIO_DEVICE_OUT_PROXY = 33554432u, // 0x2000000
     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 = 1140850687u, // ((((((((((((((((((((((((((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_PROXY) | 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)
@@ -258,8 +295,9 @@ enum {
     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_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 = 3240099839u, // ((((((((((((((((((((((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_PROXY) | IN_DEFAULT)
     AUDIO_DEVICE_IN_ALL_SCO = 2147483656u, // IN_BLUETOOTH_SCO_HEADSET
     AUDIO_DEVICE_IN_ALL_USB = 2147489792u, // (IN_USB_ACCESSORY | IN_USB_DEVICE)
 };
@@ -277,6 +315,7 @@ typedef enum {
     AUDIO_OUTPUT_FLAG_RAW = 256, // 0x100
     AUDIO_OUTPUT_FLAG_SYNC = 512, // 0x200
     AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 1024, // 0x400
+    AUDIO_OUTPUT_FLAG_DIRECT_PCM = 8192, // 0x2000
 } audio_output_flags_t;
 
 typedef enum {
@@ -287,6 +326,27 @@ typedef enum {
     AUDIO_INPUT_FLAG_SYNC = 8, // 0x8
 } audio_input_flags_t;
 
+typedef enum {
+    AUDIO_USAGE_UNKNOWN = 0,
+    AUDIO_USAGE_MEDIA = 1,
+    AUDIO_USAGE_VOICE_COMMUNICATION = 2,
+    AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3,
+    AUDIO_USAGE_ALARM = 4,
+    AUDIO_USAGE_NOTIFICATION = 5,
+    AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6,
+    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7,
+    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8,
+    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9,
+    AUDIO_USAGE_NOTIFICATION_EVENT = 10,
+    AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11,
+    AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12,
+    AUDIO_USAGE_ASSISTANCE_SONIFICATION = 13,
+    AUDIO_USAGE_GAME = 14,
+    AUDIO_USAGE_VIRTUAL_SOURCE = 15,
+    AUDIO_USAGE_CNT = 16,
+    AUDIO_USAGE_MAX = 15, // (CNT - 1)
+} audio_usage_t;
+
 enum {
     AUDIO_GAIN_MODE_JOINT = 1u, // 0x1
     AUDIO_GAIN_MODE_CHANNELS = 2u, // 0x2
index f71972d..e1ec705 100644 (file)
@@ -57,31 +57,6 @@ typedef enum {
     AUDIO_CONTENT_TYPE_MAX          = AUDIO_CONTENT_TYPE_CNT - 1,
 } audio_content_type_t;
 
-/* Do not change these values without updating their counterparts
- * in frameworks/base/media/java/android/media/AudioAttributes.java
- */
-typedef enum {
-    AUDIO_USAGE_UNKNOWN                            = 0,
-    AUDIO_USAGE_MEDIA                              = 1,
-    AUDIO_USAGE_VOICE_COMMUNICATION                = 2,
-    AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING     = 3,
-    AUDIO_USAGE_ALARM                              = 4,
-    AUDIO_USAGE_NOTIFICATION                       = 5,
-    AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE    = 6,
-    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7,
-    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8,
-    AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9,
-    AUDIO_USAGE_NOTIFICATION_EVENT                 = 10,
-    AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY           = 11,
-    AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE     = 12,
-    AUDIO_USAGE_ASSISTANCE_SONIFICATION            = 13,
-    AUDIO_USAGE_GAME                               = 14,
-    AUDIO_USAGE_VIRTUAL_SOURCE                     = 15,
-
-    AUDIO_USAGE_CNT,
-    AUDIO_USAGE_MAX                                = AUDIO_USAGE_CNT - 1,
-} audio_usage_t;
-
 typedef uint32_t audio_flags_mask_t;
 
 /* Do not change these values without updating their counterparts
@@ -260,6 +235,9 @@ typedef struct {
     int64_t duration_us;                // duration in microseconds, -1 if unknown
     bool has_video;                     // true if stream is tied to a video stream
     bool is_streaming;                  // true if streaming, false if local playback
+    uint32_t bit_width;
+    uint32_t offload_buffer_size;       // offload fragment size
+    audio_usage_t usage;
 } audio_offload_info_t;
 
 #define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \
@@ -278,7 +256,10 @@ static const audio_offload_info_t AUDIO_INFO_INITIALIZER = {
     /* .bit_rate = */ 0,
     /* .duration_us = */ 0,
     /* .has_video = */ false,
-    /* .is_streaming = */ false
+    /* .is_streaming = */ false,
+    /* .bit_width = */ 16,
+    /* .offload_buffer_size = */ 0,
+    /* .usage = */ AUDIO_USAGE_UNKNOWN
 };
 
 /* common audio stream configuration parameters
@@ -308,7 +289,10 @@ static const audio_config_t AUDIO_CONFIG_INITIALIZER = {
         /* .bit_rate = */ 0,
         /* .duration_us = */ 0,
         /* .has_video = */ false,
-        /* .is_streaming = */ false
+        /* .is_streaming = */ false,
+        /* .bit_width = */ 16,
+        /* .offload_buffer_size = */ 0,
+        /* .usage = */ AUDIO_USAGE_UNKNOWN
     },
     /* .frame_count = */ 0,
 };
@@ -817,6 +801,7 @@ static inline bool audio_is_valid_format(audio_format_t format)
     case AUDIO_FORMAT_AMR_NB:
     case AUDIO_FORMAT_AMR_WB:
     case AUDIO_FORMAT_AAC:
+    case AUDIO_FORMAT_AAC_ADTS:
     case AUDIO_FORMAT_HE_AAC_V1:
     case AUDIO_FORMAT_HE_AAC_V2:
     case AUDIO_FORMAT_VORBIS:
@@ -827,6 +812,21 @@ static inline bool audio_is_valid_format(audio_format_t format)
     case AUDIO_FORMAT_DTS_HD:
     case AUDIO_FORMAT_IEC61937:
     case AUDIO_FORMAT_DOLBY_TRUEHD:
+    case AUDIO_FORMAT_QCELP:
+    case AUDIO_FORMAT_EVRC:
+    case AUDIO_FORMAT_EVRCB:
+    case AUDIO_FORMAT_EVRCWB:
+    case AUDIO_FORMAT_AAC_ADIF:
+    case AUDIO_FORMAT_AMR_WB_PLUS:
+    case AUDIO_FORMAT_MP2:
+    case AUDIO_FORMAT_EVRCNW:
+    case AUDIO_FORMAT_FLAC:
+    case AUDIO_FORMAT_ALAC:
+    case AUDIO_FORMAT_APE:
+    case AUDIO_FORMAT_WMA:
+    case AUDIO_FORMAT_WMA_PRO:
+    case AUDIO_FORMAT_DSD:
+    case AUDIO_FORMAT_LDAC:
         return true;
     default:
         return false;