| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2011 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
 | 17 |  | 
 | 18 | #ifndef ANDROID_AUDIO_CORE_H | 
 | 19 | #define ANDROID_AUDIO_CORE_H | 
 | 20 |  | 
 | 21 | #include <stdbool.h> | 
 | 22 | #include <stdint.h> | 
 | 23 | #include <sys/cdefs.h> | 
 | 24 | #include <sys/types.h> | 
 | 25 |  | 
 | 26 | #include <cutils/bitops.h> | 
 | 27 |  | 
 | 28 | __BEGIN_DECLS | 
 | 29 |  | 
 | 30 | /* The enums were moved here mostly from | 
 | 31 |  * frameworks/base/include/media/AudioSystem.h | 
 | 32 |  */ | 
 | 33 |  | 
 | 34 | typedef int audio_io_handle_t; | 
 | 35 |  | 
 | 36 | /* Audio stream types */ | 
 | 37 | typedef enum { | 
 | 38 |     AUDIO_STREAM_DEFAULT          = -1, | 
 | 39 |     AUDIO_STREAM_VOICE_CALL       = 0, | 
 | 40 |     AUDIO_STREAM_SYSTEM           = 1, | 
 | 41 |     AUDIO_STREAM_RING             = 2, | 
 | 42 |     AUDIO_STREAM_MUSIC            = 3, | 
 | 43 |     AUDIO_STREAM_ALARM            = 4, | 
 | 44 |     AUDIO_STREAM_NOTIFICATION     = 5, | 
 | 45 |     AUDIO_STREAM_BLUETOOTH_SCO    = 6, | 
 | 46 |     AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user and must be routed to speaker */ | 
 | 47 |     AUDIO_STREAM_DTMF             = 8, | 
 | 48 |     AUDIO_STREAM_TTS              = 9, | 
 | 49 |  | 
 | 50 |     AUDIO_STREAM_CNT, | 
 | 51 |     AUDIO_STREAM_MAX              = AUDIO_STREAM_CNT - 1, | 
 | 52 | } audio_stream_type_t; | 
 | 53 |  | 
 | 54 | /* Do not change these values without updating their counterparts | 
 | 55 |  * in media/java/android/media/MediaRecorder.java! | 
 | 56 |  */ | 
 | 57 | typedef enum { | 
 | 58 |     AUDIO_SOURCE_DEFAULT             = 0, | 
 | 59 |     AUDIO_SOURCE_MIC                 = 1, | 
 | 60 |     AUDIO_SOURCE_VOICE_UPLINK        = 2, | 
 | 61 |     AUDIO_SOURCE_VOICE_DOWNLINK      = 3, | 
 | 62 |     AUDIO_SOURCE_VOICE_CALL          = 4, | 
 | 63 |     AUDIO_SOURCE_CAMCORDER           = 5, | 
 | 64 |     AUDIO_SOURCE_VOICE_RECOGNITION   = 6, | 
 | 65 |     AUDIO_SOURCE_VOICE_COMMUNICATION = 7, | 
 | 66 |  | 
 | 67 |     AUDIO_SOURCE_CNT, | 
 | 68 |     AUDIO_SOURCE_MAX                 = AUDIO_SOURCE_CNT - 1, | 
 | 69 | } audio_source_t; | 
 | 70 |  | 
 | 71 | /* special audio session values | 
 | 72 |  * (XXX: should this be living in the audio effects land?) | 
 | 73 |  */ | 
 | 74 | typedef enum { | 
 | 75 |     /* session for effects attached to a particular output stream | 
 | 76 |      * (value must be less than 0) | 
 | 77 |      */ | 
 | 78 |     AUDIO_SESSION_OUTPUT_STAGE = -1, | 
 | 79 |  | 
 | 80 |     /* session for effects applied to output mix. These effects can | 
 | 81 |      * be moved by audio policy manager to another output stream | 
 | 82 |      * (value must be 0) | 
 | 83 |      */ | 
 | 84 |     AUDIO_SESSION_OUTPUT_MIX = 0, | 
 | 85 | } audio_session_t; | 
 | 86 |  | 
 | 87 | /* Audio sub formats (see enum audio_format). */ | 
 | 88 |  | 
 | 89 | /* PCM sub formats */ | 
 | 90 | typedef enum { | 
| Eric Laurent | 9714b27 | 2011-05-26 13:52:47 -0700 | [diff] [blame] | 91 |     AUDIO_FORMAT_PCM_SUB_16_BIT          = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ | 
 | 92 |     AUDIO_FORMAT_PCM_SUB_8_BIT           = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ | 
 | 93 |     AUDIO_FORMAT_PCM_SUB_32_BIT          = 0x3, /* PCM signed .31 fixed point */ | 
 | 94 |     AUDIO_FORMAT_PCM_SUB_8_24_BIT        = 0x4, /* PCM signed 7.24 fixed point */ | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 95 | } audio_format_pcm_sub_fmt_t; | 
 | 96 |  | 
 | 97 | /* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 | 
 | 98 |  * frame header to specify bit rate, stereo mode, version... | 
 | 99 |  */ | 
 | 100 | typedef enum { | 
 | 101 |     AUDIO_FORMAT_MP3_SUB_NONE            = 0x0, | 
 | 102 | } audio_format_mp3_sub_fmt_t; | 
 | 103 |  | 
 | 104 | /* AMR NB/WB sub format field definition: specify frame block interleaving, | 
 | 105 |  * bandwidth efficient or octet aligned, encoding mode for recording... | 
 | 106 |  */ | 
 | 107 | typedef enum { | 
 | 108 |     AUDIO_FORMAT_AMR_SUB_NONE            = 0x0, | 
 | 109 | } audio_format_amr_sub_fmt_t; | 
 | 110 |  | 
 | 111 | /* AAC sub format field definition: specify profile or bitrate for recording... */ | 
 | 112 | typedef enum { | 
 | 113 |     AUDIO_FORMAT_AAC_SUB_NONE            = 0x0, | 
 | 114 | } audio_format_aac_sub_fmt_t; | 
 | 115 |  | 
 | 116 | /* VORBIS sub format field definition: specify quality for recording... */ | 
 | 117 | typedef enum { | 
 | 118 |     AUDIO_FORMAT_VORBIS_SUB_NONE         = 0x0, | 
 | 119 | } audio_format_vorbis_sub_fmt_t; | 
 | 120 |  | 
 | 121 | /* Audio format consists in a main format field (upper 8 bits) and a sub format | 
 | 122 |  * field (lower 24 bits). | 
 | 123 |  * | 
 | 124 |  * The main format indicates the main codec type. The sub format field | 
 | 125 |  * indicates options and parameters for each format. The sub format is mainly | 
 | 126 |  * used for record to indicate for instance the requested bitrate or profile. | 
 | 127 |  * It can also be used for certain formats to give informations not present in | 
 | 128 |  * the encoded audio stream (e.g. octet alignement for AMR). | 
 | 129 |  */ | 
 | 130 | typedef enum { | 
 | 131 |     AUDIO_FORMAT_INVALID             = 0xFFFFFFFFUL, | 
 | 132 |     AUDIO_FORMAT_DEFAULT             = 0, | 
 | 133 |     AUDIO_FORMAT_PCM                 = 0x00000000UL, /* DO NOT CHANGE */ | 
 | 134 |     AUDIO_FORMAT_MP3                 = 0x01000000UL, | 
 | 135 |     AUDIO_FORMAT_AMR_NB              = 0x02000000UL, | 
 | 136 |     AUDIO_FORMAT_AMR_WB              = 0x03000000UL, | 
 | 137 |     AUDIO_FORMAT_AAC                 = 0x04000000UL, | 
 | 138 |     AUDIO_FORMAT_HE_AAC_V1           = 0x05000000UL, | 
 | 139 |     AUDIO_FORMAT_HE_AAC_V2           = 0x06000000UL, | 
 | 140 |     AUDIO_FORMAT_VORBIS              = 0x07000000UL, | 
 | 141 |     AUDIO_FORMAT_MAIN_MASK           = 0xFF000000UL, | 
 | 142 |     AUDIO_FORMAT_SUB_MASK            = 0x00FFFFFFUL, | 
 | 143 |  | 
 | 144 |     /* Aliases */ | 
 | 145 |     AUDIO_FORMAT_PCM_16_BIT          = (AUDIO_FORMAT_PCM | | 
 | 146 |                                         AUDIO_FORMAT_PCM_SUB_16_BIT), | 
 | 147 |     AUDIO_FORMAT_PCM_8_BIT           = (AUDIO_FORMAT_PCM | | 
 | 148 |                                         AUDIO_FORMAT_PCM_SUB_8_BIT), | 
| Eric Laurent | 9714b27 | 2011-05-26 13:52:47 -0700 | [diff] [blame] | 149 |     AUDIO_FORMAT_PCM_32_BIT          = (AUDIO_FORMAT_PCM | | 
 | 150 |                                         AUDIO_FORMAT_PCM_SUB_32_BIT), | 
 | 151 |     AUDIO_FORMAT_PCM_8_24_BIT        = (AUDIO_FORMAT_PCM | | 
 | 152 |                                         AUDIO_FORMAT_PCM_SUB_8_24_BIT), | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 153 | } audio_format_t; | 
 | 154 |  | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 155 | typedef enum { | 
 | 156 |     /* output channels */ | 
| Jean-Michel Trivi | 6d4f397 | 2011-07-25 16:19:07 -0700 | [diff] [blame] | 157 |     AUDIO_CHANNEL_OUT_FRONT_LEFT            = 0x1, | 
 | 158 |     AUDIO_CHANNEL_OUT_FRONT_RIGHT           = 0x2, | 
 | 159 |     AUDIO_CHANNEL_OUT_FRONT_CENTER          = 0x4, | 
 | 160 |     AUDIO_CHANNEL_OUT_LOW_FREQUENCY         = 0x8, | 
 | 161 |     AUDIO_CHANNEL_OUT_BACK_LEFT             = 0x10, | 
 | 162 |     AUDIO_CHANNEL_OUT_BACK_RIGHT            = 0x20, | 
 | 163 |     AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER  = 0x40, | 
 | 164 |     AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, | 
 | 165 |     AUDIO_CHANNEL_OUT_BACK_CENTER           = 0x100, | 
 | 166 |     AUDIO_CHANNEL_OUT_SIDE_LEFT             = 0x200, | 
 | 167 |     AUDIO_CHANNEL_OUT_SIDE_RIGHT            = 0x400, | 
 | 168 |     AUDIO_CHANNEL_OUT_TOP_CENTER            = 0x800, | 
 | 169 |     AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT        = 0x1000, | 
 | 170 |     AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER      = 0x2000, | 
 | 171 |     AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT       = 0x4000, | 
 | 172 |     AUDIO_CHANNEL_OUT_TOP_BACK_LEFT         = 0x8000, | 
 | 173 |     AUDIO_CHANNEL_OUT_TOP_BACK_CENTER       = 0x10000, | 
 | 174 |     AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT        = 0x20000, | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 175 |  | 
 | 176 |     AUDIO_CHANNEL_OUT_MONO     = AUDIO_CHANNEL_OUT_FRONT_LEFT, | 
 | 177 |     AUDIO_CHANNEL_OUT_STEREO   = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 178 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT), | 
 | 179 |     AUDIO_CHANNEL_OUT_QUAD     = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 180 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT | | 
 | 181 |                                   AUDIO_CHANNEL_OUT_BACK_LEFT | | 
 | 182 |                                   AUDIO_CHANNEL_OUT_BACK_RIGHT), | 
 | 183 |     AUDIO_CHANNEL_OUT_SURROUND = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 184 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT | | 
 | 185 |                                   AUDIO_CHANNEL_OUT_FRONT_CENTER | | 
 | 186 |                                   AUDIO_CHANNEL_OUT_BACK_CENTER), | 
 | 187 |     AUDIO_CHANNEL_OUT_5POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 188 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT | | 
 | 189 |                                   AUDIO_CHANNEL_OUT_FRONT_CENTER | | 
 | 190 |                                   AUDIO_CHANNEL_OUT_LOW_FREQUENCY | | 
 | 191 |                                   AUDIO_CHANNEL_OUT_BACK_LEFT | | 
 | 192 |                                   AUDIO_CHANNEL_OUT_BACK_RIGHT), | 
| Jean-Michel Trivi | 33fad99 | 2011-07-24 16:31:03 -0700 | [diff] [blame] | 193 |     // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 194 |     AUDIO_CHANNEL_OUT_7POINT1  = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 195 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT | | 
 | 196 |                                   AUDIO_CHANNEL_OUT_FRONT_CENTER | | 
 | 197 |                                   AUDIO_CHANNEL_OUT_LOW_FREQUENCY | | 
 | 198 |                                   AUDIO_CHANNEL_OUT_BACK_LEFT | | 
 | 199 |                                   AUDIO_CHANNEL_OUT_BACK_RIGHT | | 
| Jean-Michel Trivi | 33fad99 | 2011-07-24 16:31:03 -0700 | [diff] [blame] | 200 |                                   AUDIO_CHANNEL_OUT_SIDE_LEFT | | 
 | 201 |                                   AUDIO_CHANNEL_OUT_SIDE_RIGHT), | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 202 |     AUDIO_CHANNEL_OUT_ALL      = (AUDIO_CHANNEL_OUT_FRONT_LEFT | | 
 | 203 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT | | 
 | 204 |                                   AUDIO_CHANNEL_OUT_FRONT_CENTER | | 
 | 205 |                                   AUDIO_CHANNEL_OUT_LOW_FREQUENCY | | 
 | 206 |                                   AUDIO_CHANNEL_OUT_BACK_LEFT | | 
 | 207 |                                   AUDIO_CHANNEL_OUT_BACK_RIGHT | | 
 | 208 |                                   AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | | 
 | 209 |                                   AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | | 
| Jean-Michel Trivi | 33fad99 | 2011-07-24 16:31:03 -0700 | [diff] [blame] | 210 |                                   AUDIO_CHANNEL_OUT_BACK_CENTER| | 
 | 211 |                                   AUDIO_CHANNEL_OUT_SIDE_LEFT| | 
 | 212 |                                   AUDIO_CHANNEL_OUT_SIDE_RIGHT| | 
 | 213 |                                   AUDIO_CHANNEL_OUT_TOP_CENTER| | 
 | 214 |                                   AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| | 
 | 215 |                                   AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| | 
 | 216 |                                   AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| | 
 | 217 |                                   AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| | 
 | 218 |                                   AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| | 
 | 219 |                                   AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 220 |  | 
 | 221 |     /* input channels */ | 
 | 222 |     AUDIO_CHANNEL_IN_LEFT            = 0x4, | 
 | 223 |     AUDIO_CHANNEL_IN_RIGHT           = 0x8, | 
 | 224 |     AUDIO_CHANNEL_IN_FRONT           = 0x10, | 
 | 225 |     AUDIO_CHANNEL_IN_BACK            = 0x20, | 
 | 226 |     AUDIO_CHANNEL_IN_LEFT_PROCESSED  = 0x40, | 
 | 227 |     AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, | 
 | 228 |     AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, | 
 | 229 |     AUDIO_CHANNEL_IN_BACK_PROCESSED  = 0x200, | 
 | 230 |     AUDIO_CHANNEL_IN_PRESSURE        = 0x400, | 
 | 231 |     AUDIO_CHANNEL_IN_X_AXIS          = 0x800, | 
 | 232 |     AUDIO_CHANNEL_IN_Y_AXIS          = 0x1000, | 
 | 233 |     AUDIO_CHANNEL_IN_Z_AXIS          = 0x2000, | 
 | 234 |     AUDIO_CHANNEL_IN_VOICE_UPLINK    = 0x4000, | 
 | 235 |     AUDIO_CHANNEL_IN_VOICE_DNLINK    = 0x8000, | 
 | 236 |  | 
 | 237 |     AUDIO_CHANNEL_IN_MONO   = AUDIO_CHANNEL_IN_FRONT, | 
 | 238 |     AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), | 
 | 239 |     AUDIO_CHANNEL_IN_ALL    = (AUDIO_CHANNEL_IN_LEFT | | 
 | 240 |                                AUDIO_CHANNEL_IN_RIGHT | | 
 | 241 |                                AUDIO_CHANNEL_IN_FRONT | | 
 | 242 |                                AUDIO_CHANNEL_IN_BACK| | 
 | 243 |                                AUDIO_CHANNEL_IN_LEFT_PROCESSED | | 
 | 244 |                                AUDIO_CHANNEL_IN_RIGHT_PROCESSED | | 
 | 245 |                                AUDIO_CHANNEL_IN_FRONT_PROCESSED | | 
 | 246 |                                AUDIO_CHANNEL_IN_BACK_PROCESSED| | 
 | 247 |                                AUDIO_CHANNEL_IN_PRESSURE | | 
 | 248 |                                AUDIO_CHANNEL_IN_X_AXIS | | 
 | 249 |                                AUDIO_CHANNEL_IN_Y_AXIS | | 
 | 250 |                                AUDIO_CHANNEL_IN_Z_AXIS | | 
 | 251 |                                AUDIO_CHANNEL_IN_VOICE_UPLINK | | 
 | 252 |                                AUDIO_CHANNEL_IN_VOICE_DNLINK), | 
| Jean-Michel Trivi | 4ab051a | 2012-03-02 16:41:35 -0800 | [diff] [blame] | 253 | }; | 
 | 254 |  | 
 | 255 | typedef uint32_t audio_channel_mask_t; | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 256 |  | 
 | 257 | typedef enum { | 
 | 258 |     AUDIO_MODE_INVALID          = -2, | 
 | 259 |     AUDIO_MODE_CURRENT          = -1, | 
 | 260 |     AUDIO_MODE_NORMAL           = 0, | 
 | 261 |     AUDIO_MODE_RINGTONE         = 1, | 
 | 262 |     AUDIO_MODE_IN_CALL          = 2, | 
 | 263 |     AUDIO_MODE_IN_COMMUNICATION = 3, | 
 | 264 |  | 
 | 265 |     AUDIO_MODE_CNT, | 
 | 266 |     AUDIO_MODE_MAX              = AUDIO_MODE_CNT - 1, | 
 | 267 | } audio_mode_t; | 
 | 268 |  | 
 | 269 | typedef enum { | 
 | 270 |     AUDIO_IN_ACOUSTICS_AGC_ENABLE    = 0x0001, | 
 | 271 |     AUDIO_IN_ACOUSTICS_AGC_DISABLE   = 0, | 
 | 272 |     AUDIO_IN_ACOUSTICS_NS_ENABLE     = 0x0002, | 
 | 273 |     AUDIO_IN_ACOUSTICS_NS_DISABLE    = 0, | 
 | 274 |     AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, | 
 | 275 |     AUDIO_IN_ACOUSTICS_TX_DISABLE    = 0, | 
 | 276 | } audio_in_acoustics_t; | 
 | 277 |  | 
 | 278 | typedef enum { | 
 | 279 |     /* output devices */ | 
 | 280 |     AUDIO_DEVICE_OUT_EARPIECE                  = 0x1, | 
 | 281 |     AUDIO_DEVICE_OUT_SPEAKER                   = 0x2, | 
 | 282 |     AUDIO_DEVICE_OUT_WIRED_HEADSET             = 0x4, | 
 | 283 |     AUDIO_DEVICE_OUT_WIRED_HEADPHONE           = 0x8, | 
 | 284 |     AUDIO_DEVICE_OUT_BLUETOOTH_SCO             = 0x10, | 
 | 285 |     AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET     = 0x20, | 
 | 286 |     AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT      = 0x40, | 
 | 287 |     AUDIO_DEVICE_OUT_BLUETOOTH_A2DP            = 0x80, | 
 | 288 |     AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, | 
 | 289 |     AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER    = 0x200, | 
 | 290 |     AUDIO_DEVICE_OUT_AUX_DIGITAL               = 0x400, | 
 | 291 |     AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET         = 0x800, | 
 | 292 |     AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET         = 0x1000, | 
| Eric Laurent | 79f90bd | 2012-04-06 08:57:48 -0700 | [diff] [blame] | 293 |     AUDIO_DEVICE_OUT_USB_ACCESSORY             = 0x2000, | 
 | 294 |     AUDIO_DEVICE_OUT_USB_DEVICE                = 0x4000, | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 295 |     AUDIO_DEVICE_OUT_DEFAULT                   = 0x8000, | 
 | 296 |     AUDIO_DEVICE_OUT_ALL      = (AUDIO_DEVICE_OUT_EARPIECE | | 
 | 297 |                                  AUDIO_DEVICE_OUT_SPEAKER | | 
 | 298 |                                  AUDIO_DEVICE_OUT_WIRED_HEADSET | | 
 | 299 |                                  AUDIO_DEVICE_OUT_WIRED_HEADPHONE | | 
 | 300 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_SCO | | 
 | 301 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | | 
 | 302 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | | 
 | 303 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | | 
 | 304 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | | 
 | 305 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | | 
 | 306 |                                  AUDIO_DEVICE_OUT_AUX_DIGITAL | | 
 | 307 |                                  AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | | 
 | 308 |                                  AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | | 
| Eric Laurent | 79f90bd | 2012-04-06 08:57:48 -0700 | [diff] [blame] | 309 |                                  AUDIO_DEVICE_OUT_USB_ACCESSORY | | 
 | 310 |                                  AUDIO_DEVICE_OUT_USB_DEVICE | | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 311 |                                  AUDIO_DEVICE_OUT_DEFAULT), | 
 | 312 |     AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | | 
 | 313 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | | 
 | 314 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), | 
 | 315 |     AUDIO_DEVICE_OUT_ALL_SCO  = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | | 
 | 316 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | | 
 | 317 |                                  AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), | 
| Eric Laurent | 79f90bd | 2012-04-06 08:57:48 -0700 | [diff] [blame] | 318 |     AUDIO_DEVICE_OUT_ALL_USB  = (AUDIO_DEVICE_OUT_USB_ACCESSORY | | 
 | 319 |                                  AUDIO_DEVICE_OUT_USB_DEVICE), | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 320 |  | 
 | 321 |     /* input devices */ | 
 | 322 |     AUDIO_DEVICE_IN_COMMUNICATION         = 0x10000, | 
 | 323 |     AUDIO_DEVICE_IN_AMBIENT               = 0x20000, | 
 | 324 |     AUDIO_DEVICE_IN_BUILTIN_MIC           = 0x40000, | 
 | 325 |     AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000, | 
 | 326 |     AUDIO_DEVICE_IN_WIRED_HEADSET         = 0x100000, | 
 | 327 |     AUDIO_DEVICE_IN_AUX_DIGITAL           = 0x200000, | 
 | 328 |     AUDIO_DEVICE_IN_VOICE_CALL            = 0x400000, | 
 | 329 |     AUDIO_DEVICE_IN_BACK_MIC              = 0x800000, | 
 | 330 |     AUDIO_DEVICE_IN_DEFAULT               = 0x80000000, | 
 | 331 |  | 
 | 332 |     AUDIO_DEVICE_IN_ALL     = (AUDIO_DEVICE_IN_COMMUNICATION | | 
 | 333 |                                AUDIO_DEVICE_IN_AMBIENT | | 
 | 334 |                                AUDIO_DEVICE_IN_BUILTIN_MIC | | 
 | 335 |                                AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | | 
 | 336 |                                AUDIO_DEVICE_IN_WIRED_HEADSET | | 
 | 337 |                                AUDIO_DEVICE_IN_AUX_DIGITAL | | 
 | 338 |                                AUDIO_DEVICE_IN_VOICE_CALL | | 
 | 339 |                                AUDIO_DEVICE_IN_BACK_MIC | | 
 | 340 |                                AUDIO_DEVICE_IN_DEFAULT), | 
 | 341 |     AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, | 
 | 342 | } audio_devices_t; | 
 | 343 |  | 
| Eric Laurent | 545ab46 | 2012-04-16 18:05:39 -0700 | [diff] [blame] | 344 | /* the audio output flags serve two purposes: | 
 | 345 |  * - when an AudioTrack is created they indicate a "wish" to be connected to an | 
 | 346 |  * output stream with attributes corresponding to the specified flags | 
 | 347 |  * - when present in an output profile descriptor listed for a particular audio | 
 | 348 |  * hardware module, they indicate that an output stream can be opened that | 
 | 349 |  * supports the attributes indicated by the flags. | 
 | 350 |  * the audio policy manager will try to match the flags in the request | 
 | 351 |  * (when getOuput() is called) to an available output stream. | 
 | 352 |  */ | 
 | 353 | typedef enum { | 
| Eric Laurent | 9aec362 | 2012-04-13 16:52:58 -0700 | [diff] [blame] | 354 |     AUDIO_OUTPUT_FLAG_NONE = 0x0,       // no attributes | 
 | 355 |     AUDIO_OUTPUT_FLAG_DIRECT = 0x1,     // this output directly connects a track | 
 | 356 |                                         // to one output stream: no software mixer | 
 | 357 |     AUDIO_OUTPUT_FLAG_PRIMARY = 0x2,    // this output is the primary output of | 
 | 358 |                                         // the device. It is unique and must be | 
 | 359 |                                         // present. It is opened by default and | 
 | 360 |                                         // receives routing, audio mode and volume | 
 | 361 |                                         // controls related to voice calls. | 
 | 362 |     AUDIO_OUTPUT_FLAG_FAST = 0x4,       // output supports "fast tracks", | 
 | 363 |                                         // defined elsewhere | 
 | 364 |     AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8 // use deep audio buffers | 
| Eric Laurent | 545ab46 | 2012-04-16 18:05:39 -0700 | [diff] [blame] | 365 | } audio_output_flags_t; | 
 | 366 |  | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 367 | static inline bool audio_is_output_device(audio_devices_t device) | 
 | 368 | { | 
 | 369 |     if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) | 
 | 370 |         return true; | 
 | 371 |     else | 
 | 372 |         return false; | 
 | 373 | } | 
 | 374 |  | 
 | 375 | static inline bool audio_is_input_device(audio_devices_t device) | 
 | 376 | { | 
 | 377 |     if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) | 
 | 378 |         return true; | 
 | 379 |     else | 
 | 380 |         return false; | 
 | 381 | } | 
 | 382 |  | 
 | 383 | static inline bool audio_is_a2dp_device(audio_devices_t device) | 
 | 384 | { | 
 | 385 |     if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) | 
 | 386 |         return true; | 
 | 387 |     else | 
 | 388 |         return false; | 
 | 389 | } | 
 | 390 |  | 
 | 391 | static inline bool audio_is_bluetooth_sco_device(audio_devices_t device) | 
 | 392 | { | 
 | 393 |     if ((popcount(device) == 1) && (device & (AUDIO_DEVICE_OUT_ALL_SCO | | 
 | 394 |                    AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET))) | 
 | 395 |         return true; | 
 | 396 |     else | 
 | 397 |         return false; | 
 | 398 | } | 
 | 399 |  | 
| Eric Laurent | 79f90bd | 2012-04-06 08:57:48 -0700 | [diff] [blame] | 400 | static inline bool audio_is_usb_device(audio_devices_t device) | 
 | 401 | { | 
 | 402 |     if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)) | 
 | 403 |         return true; | 
 | 404 |     else | 
 | 405 |         return false; | 
 | 406 | } | 
 | 407 |  | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 408 | static inline bool audio_is_input_channel(uint32_t channel) | 
 | 409 | { | 
 | 410 |     if ((channel & ~AUDIO_CHANNEL_IN_ALL) == 0) | 
 | 411 |         return true; | 
 | 412 |     else | 
 | 413 |         return false; | 
 | 414 | } | 
 | 415 |  | 
 | 416 | static inline bool audio_is_output_channel(uint32_t channel) | 
 | 417 | { | 
 | 418 |     if ((channel & ~AUDIO_CHANNEL_OUT_ALL) == 0) | 
 | 419 |         return true; | 
 | 420 |     else | 
 | 421 |         return false; | 
 | 422 | } | 
 | 423 |  | 
| Glenn Kasten | 89f7ba3 | 2012-03-14 13:45:31 -0700 | [diff] [blame] | 424 | /* Derive an output channel mask from a channel count. | 
| Jean-Michel Trivi | 4ab051a | 2012-03-02 16:41:35 -0800 | [diff] [blame] | 425 |  * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel | 
 | 426 |  * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, | 
 | 427 |  * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC | 
 | 428 |  * for continuity with stereo. | 
 | 429 |  * Returns the matching channel mask, or 0 if the number of channels exceeds that of the | 
 | 430 |  * configurations for which a default channel mask is defined. | 
 | 431 |  */ | 
| Glenn Kasten | 89f7ba3 | 2012-03-14 13:45:31 -0700 | [diff] [blame] | 432 | static inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) | 
| Jean-Michel Trivi | 4ab051a | 2012-03-02 16:41:35 -0800 | [diff] [blame] | 433 | { | 
 | 434 |     switch(channel_count) { | 
 | 435 |     case 1: | 
 | 436 |         return AUDIO_CHANNEL_OUT_MONO; | 
 | 437 |     case 2: | 
 | 438 |         return AUDIO_CHANNEL_OUT_STEREO; | 
 | 439 |     case 3: | 
 | 440 |         return (AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER); | 
 | 441 |     case 4: // 4.0 | 
 | 442 |         return AUDIO_CHANNEL_OUT_QUAD; | 
 | 443 |     case 5: // 5.0 | 
 | 444 |         return (AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER); | 
 | 445 |     case 6: // 5.1 | 
 | 446 |         return AUDIO_CHANNEL_OUT_5POINT1; | 
 | 447 |     case 7: // 6.1 | 
 | 448 |         return (AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER); | 
 | 449 |     case 8: | 
 | 450 |         return AUDIO_CHANNEL_OUT_7POINT1; | 
 | 451 |     default: | 
 | 452 |         return 0; | 
 | 453 |     } | 
 | 454 | } | 
 | 455 |  | 
| Glenn Kasten | 89f7ba3 | 2012-03-14 13:45:31 -0700 | [diff] [blame] | 456 | /* Similar to above, but for input.  Currently handles only mono and stereo. */ | 
 | 457 | static inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) | 
 | 458 | { | 
 | 459 |     switch (channel_count) { | 
 | 460 |     case 1: | 
 | 461 |         return AUDIO_CHANNEL_IN_MONO; | 
 | 462 |     case 2: | 
 | 463 |         return AUDIO_CHANNEL_IN_STEREO; | 
 | 464 |     default: | 
 | 465 |         return 0; | 
 | 466 |     } | 
 | 467 | } | 
 | 468 |  | 
| Glenn Kasten | 828bf0c | 2012-01-12 12:34:42 -0800 | [diff] [blame] | 469 | static inline bool audio_is_valid_format(audio_format_t format) | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 470 | { | 
 | 471 |     switch (format & AUDIO_FORMAT_MAIN_MASK) { | 
 | 472 |     case AUDIO_FORMAT_PCM: | 
| Eric Laurent | da38224 | 2011-06-16 21:13:43 -0700 | [diff] [blame] | 473 |         if (format != AUDIO_FORMAT_PCM_16_BIT && | 
 | 474 |                 format != AUDIO_FORMAT_PCM_8_BIT) { | 
 | 475 |             return false; | 
 | 476 |         } | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 477 |     case AUDIO_FORMAT_MP3: | 
 | 478 |     case AUDIO_FORMAT_AMR_NB: | 
 | 479 |     case AUDIO_FORMAT_AMR_WB: | 
 | 480 |     case AUDIO_FORMAT_AAC: | 
 | 481 |     case AUDIO_FORMAT_HE_AAC_V1: | 
 | 482 |     case AUDIO_FORMAT_HE_AAC_V2: | 
 | 483 |     case AUDIO_FORMAT_VORBIS: | 
 | 484 |         return true; | 
 | 485 |     default: | 
 | 486 |         return false; | 
 | 487 |     } | 
 | 488 | } | 
 | 489 |  | 
| Glenn Kasten | 828bf0c | 2012-01-12 12:34:42 -0800 | [diff] [blame] | 490 | static inline bool audio_is_linear_pcm(audio_format_t format) | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 491 | { | 
| Eric Laurent | da38224 | 2011-06-16 21:13:43 -0700 | [diff] [blame] | 492 |     return ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM); | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 493 | } | 
 | 494 |  | 
| Glenn Kasten | 828bf0c | 2012-01-12 12:34:42 -0800 | [diff] [blame] | 495 | static inline size_t audio_bytes_per_sample(audio_format_t format) | 
| Eric Laurent | da38224 | 2011-06-16 21:13:43 -0700 | [diff] [blame] | 496 | { | 
 | 497 |     size_t size = 0; | 
 | 498 |  | 
 | 499 |     switch (format) { | 
| Jean-Michel Trivi | 427d2b4 | 2012-03-05 15:38:15 -0800 | [diff] [blame] | 500 |     case AUDIO_FORMAT_PCM_32_BIT: | 
 | 501 |     case AUDIO_FORMAT_PCM_8_24_BIT: | 
 | 502 |         size = sizeof(int32_t); | 
 | 503 |         break; | 
 | 504 |     case AUDIO_FORMAT_PCM_16_BIT: | 
 | 505 |         size = sizeof(int16_t); | 
 | 506 |         break; | 
 | 507 |     case AUDIO_FORMAT_PCM_8_BIT: | 
 | 508 |         size = sizeof(uint8_t); | 
 | 509 |         break; | 
 | 510 |     default: | 
 | 511 |         break; | 
| Eric Laurent | da38224 | 2011-06-16 21:13:43 -0700 | [diff] [blame] | 512 |     } | 
 | 513 |     return size; | 
 | 514 | } | 
| Dima Zavin | e8e4be5 | 2011-05-12 10:25:33 -0700 | [diff] [blame] | 515 |  | 
 | 516 | __END_DECLS | 
 | 517 |  | 
 | 518 | #endif  // ANDROID_AUDIO_CORE_H |