audio.h revision 76edb1c0e644fe9f0b9f93939647a34123a60063
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/* device address used to refer to the standard remote submix */ 35#define AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS "0" 36 37/* AudioFlinger and AudioPolicy services use I/O handles to identify audio sources and sinks */ 38typedef int audio_io_handle_t; 39#define AUDIO_IO_HANDLE_NONE 0 40 41/* Audio stream types */ 42typedef enum { 43 /* These values must kept in sync with 44 * frameworks/base/media/java/android/media/AudioSystem.java 45 */ 46 AUDIO_STREAM_DEFAULT = -1, 47 AUDIO_STREAM_MIN = 0, 48 AUDIO_STREAM_VOICE_CALL = 0, 49 AUDIO_STREAM_SYSTEM = 1, 50 AUDIO_STREAM_RING = 2, 51 AUDIO_STREAM_MUSIC = 3, 52 AUDIO_STREAM_ALARM = 4, 53 AUDIO_STREAM_NOTIFICATION = 5, 54 AUDIO_STREAM_BLUETOOTH_SCO = 6, 55 AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user and must be routed to speaker */ 56 AUDIO_STREAM_DTMF = 8, 57 AUDIO_STREAM_TTS = 9, 58 59 AUDIO_STREAM_CNT, 60 AUDIO_STREAM_MAX = AUDIO_STREAM_CNT - 1, 61} audio_stream_type_t; 62 63/* Do not change these values without updating their counterparts 64 * in frameworks/base/media/java/android/media/MediaRecorder.java, 65 * frameworks/av/services/audioflinger/AudioPolicyService.cpp, 66 * and system/media/audio_effects/include/audio_effects/audio_effects_conf.h! 67 */ 68typedef enum { 69 AUDIO_SOURCE_DEFAULT = 0, 70 AUDIO_SOURCE_MIC = 1, 71 AUDIO_SOURCE_VOICE_UPLINK = 2, 72 AUDIO_SOURCE_VOICE_DOWNLINK = 3, 73 AUDIO_SOURCE_VOICE_CALL = 4, 74 AUDIO_SOURCE_CAMCORDER = 5, 75 AUDIO_SOURCE_VOICE_RECOGNITION = 6, 76 AUDIO_SOURCE_VOICE_COMMUNICATION = 7, 77 AUDIO_SOURCE_REMOTE_SUBMIX = 8, /* Source for the mix to be presented remotely. */ 78 /* An example of remote presentation is Wifi Display */ 79 /* where a dongle attached to a TV can be used to */ 80 /* play the mix captured by this audio source. */ 81 AUDIO_SOURCE_CNT, 82 AUDIO_SOURCE_MAX = AUDIO_SOURCE_CNT - 1, 83 AUDIO_SOURCE_HOTWORD = 1999, /* A low-priority, preemptible audio source for 84 for background software hotword detection. 85 Same tuning as AUDIO_SOURCE_VOICE_RECOGNITION. 86 Used only internally to the framework. Not exposed 87 at the audio HAL. */ 88} audio_source_t; 89 90/* special audio session values 91 * (XXX: should this be living in the audio effects land?) 92 */ 93typedef enum { 94 /* session for effects attached to a particular output stream 95 * (value must be less than 0) 96 */ 97 AUDIO_SESSION_OUTPUT_STAGE = -1, 98 99 /* session for effects applied to output mix. These effects can 100 * be moved by audio policy manager to another output stream 101 * (value must be 0) 102 */ 103 AUDIO_SESSION_OUTPUT_MIX = 0, 104 105 /* application does not specify an explicit session ID to be used, 106 * and requests a new session ID to be allocated 107 * TODO use unique values for AUDIO_SESSION_OUTPUT_MIX and AUDIO_SESSION_ALLOCATE, 108 * after all uses have been updated from 0 to the appropriate symbol, and have been tested. 109 */ 110 AUDIO_SESSION_ALLOCATE = 0, 111} audio_session_t; 112 113/* Audio sub formats (see enum audio_format). */ 114 115/* PCM sub formats */ 116typedef enum { 117 AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 118 AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 119 AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 120 AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 7.24 fixed point */ 121 AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 122} audio_format_pcm_sub_fmt_t; 123 124/* The audio_format_*_sub_fmt_t declarations are not currently used */ 125 126/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 127 * frame header to specify bit rate, stereo mode, version... 128 */ 129typedef enum { 130 AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 131} audio_format_mp3_sub_fmt_t; 132 133/* AMR NB/WB sub format field definition: specify frame block interleaving, 134 * bandwidth efficient or octet aligned, encoding mode for recording... 135 */ 136typedef enum { 137 AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 138} audio_format_amr_sub_fmt_t; 139 140/* AAC sub format field definition: specify profile or bitrate for recording... */ 141typedef enum { 142 AUDIO_FORMAT_AAC_SUB_NONE = 0x0, 143} audio_format_aac_sub_fmt_t; 144 145/* VORBIS sub format field definition: specify quality for recording... */ 146typedef enum { 147 AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 148} audio_format_vorbis_sub_fmt_t; 149 150/* Audio format consists of a main format field (upper 8 bits) and a sub format 151 * field (lower 24 bits). 152 * 153 * The main format indicates the main codec type. The sub format field 154 * indicates options and parameters for each format. The sub format is mainly 155 * used for record to indicate for instance the requested bitrate or profile. 156 * It can also be used for certain formats to give informations not present in 157 * the encoded audio stream (e.g. octet alignement for AMR). 158 */ 159typedef enum { 160 AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 161 AUDIO_FORMAT_DEFAULT = 0, 162 AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 163 AUDIO_FORMAT_MP3 = 0x01000000UL, 164 AUDIO_FORMAT_AMR_NB = 0x02000000UL, 165 AUDIO_FORMAT_AMR_WB = 0x03000000UL, 166 AUDIO_FORMAT_AAC = 0x04000000UL, 167 AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, 168 AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, 169 AUDIO_FORMAT_VORBIS = 0x07000000UL, 170 AUDIO_FORMAT_OPUS = 0x08000000UL, 171 AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, 172 AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 173 174 /* Aliases */ 175 /* note != AudioFormat.ENCODING_PCM_16BIT */ 176 AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 177 AUDIO_FORMAT_PCM_SUB_16_BIT), 178 /* note != AudioFormat.ENCODING_PCM_8BIT */ 179 AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 180 AUDIO_FORMAT_PCM_SUB_8_BIT), 181 AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 182 AUDIO_FORMAT_PCM_SUB_32_BIT), 183 AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 184 AUDIO_FORMAT_PCM_SUB_8_24_BIT), 185 AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 186 AUDIO_FORMAT_PCM_SUB_FLOAT), 187} audio_format_t; 188 189enum { 190 /* output channels */ 191 AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 192 AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 193 AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 194 AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 195 AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 196 AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 197 AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 198 AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 199 AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 200 AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 201 AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 202 AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 203 AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 204 AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 205 AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 206 AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 207 AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 208 AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 209 210 AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 211 AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 212 AUDIO_CHANNEL_OUT_FRONT_RIGHT), 213 AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 214 AUDIO_CHANNEL_OUT_FRONT_RIGHT | 215 AUDIO_CHANNEL_OUT_BACK_LEFT | 216 AUDIO_CHANNEL_OUT_BACK_RIGHT), 217 AUDIO_CHANNEL_OUT_SURROUND = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 218 AUDIO_CHANNEL_OUT_FRONT_RIGHT | 219 AUDIO_CHANNEL_OUT_FRONT_CENTER | 220 AUDIO_CHANNEL_OUT_BACK_CENTER), 221 AUDIO_CHANNEL_OUT_5POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 222 AUDIO_CHANNEL_OUT_FRONT_RIGHT | 223 AUDIO_CHANNEL_OUT_FRONT_CENTER | 224 AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 225 AUDIO_CHANNEL_OUT_BACK_LEFT | 226 AUDIO_CHANNEL_OUT_BACK_RIGHT), 227 // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 228 AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 229 AUDIO_CHANNEL_OUT_FRONT_RIGHT | 230 AUDIO_CHANNEL_OUT_FRONT_CENTER | 231 AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 232 AUDIO_CHANNEL_OUT_BACK_LEFT | 233 AUDIO_CHANNEL_OUT_BACK_RIGHT | 234 AUDIO_CHANNEL_OUT_SIDE_LEFT | 235 AUDIO_CHANNEL_OUT_SIDE_RIGHT), 236 AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 237 AUDIO_CHANNEL_OUT_FRONT_RIGHT | 238 AUDIO_CHANNEL_OUT_FRONT_CENTER | 239 AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 240 AUDIO_CHANNEL_OUT_BACK_LEFT | 241 AUDIO_CHANNEL_OUT_BACK_RIGHT | 242 AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 243 AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 244 AUDIO_CHANNEL_OUT_BACK_CENTER| 245 AUDIO_CHANNEL_OUT_SIDE_LEFT| 246 AUDIO_CHANNEL_OUT_SIDE_RIGHT| 247 AUDIO_CHANNEL_OUT_TOP_CENTER| 248 AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 249 AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 250 AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 251 AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 252 AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 253 AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 254 255 /* input channels */ 256 AUDIO_CHANNEL_IN_LEFT = 0x4, 257 AUDIO_CHANNEL_IN_RIGHT = 0x8, 258 AUDIO_CHANNEL_IN_FRONT = 0x10, 259 AUDIO_CHANNEL_IN_BACK = 0x20, 260 AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 261 AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 262 AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 263 AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 264 AUDIO_CHANNEL_IN_PRESSURE = 0x400, 265 AUDIO_CHANNEL_IN_X_AXIS = 0x800, 266 AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 267 AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 268 AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 269 AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 270 271 AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 272 AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 273 AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 274 AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 275 AUDIO_CHANNEL_IN_RIGHT | 276 AUDIO_CHANNEL_IN_FRONT | 277 AUDIO_CHANNEL_IN_BACK| 278 AUDIO_CHANNEL_IN_LEFT_PROCESSED | 279 AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 280 AUDIO_CHANNEL_IN_FRONT_PROCESSED | 281 AUDIO_CHANNEL_IN_BACK_PROCESSED| 282 AUDIO_CHANNEL_IN_PRESSURE | 283 AUDIO_CHANNEL_IN_X_AXIS | 284 AUDIO_CHANNEL_IN_Y_AXIS | 285 AUDIO_CHANNEL_IN_Z_AXIS | 286 AUDIO_CHANNEL_IN_VOICE_UPLINK | 287 AUDIO_CHANNEL_IN_VOICE_DNLINK), 288}; 289 290typedef uint32_t audio_channel_mask_t; 291 292/* Expresses the convention when stereo audio samples are stored interleaved 293 * in an array. This should improve readability by allowing code to use 294 * symbolic indices instead of hard-coded [0] and [1]. 295 */ 296enum { 297 AUDIO_INTERLEAVE_LEFT = 0, 298 AUDIO_INTERLEAVE_RIGHT = 1, 299}; 300 301typedef enum { 302 AUDIO_MODE_INVALID = -2, 303 AUDIO_MODE_CURRENT = -1, 304 AUDIO_MODE_NORMAL = 0, 305 AUDIO_MODE_RINGTONE = 1, 306 AUDIO_MODE_IN_CALL = 2, 307 AUDIO_MODE_IN_COMMUNICATION = 3, 308 309 AUDIO_MODE_CNT, 310 AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 311} audio_mode_t; 312 313/* This enum is deprecated */ 314typedef enum { 315 AUDIO_IN_ACOUSTICS_NONE = 0, 316 AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 317 AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 318 AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 319 AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 320 AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 321 AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 322} audio_in_acoustics_t; 323 324enum { 325 AUDIO_DEVICE_NONE = 0x0, 326 /* reserved bits */ 327 AUDIO_DEVICE_BIT_IN = 0x80000000, 328 AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 329 /* output devices */ 330 AUDIO_DEVICE_OUT_EARPIECE = 0x1, 331 AUDIO_DEVICE_OUT_SPEAKER = 0x2, 332 AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 333 AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 334 AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 335 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 336 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 337 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 338 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 339 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 340 AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 341 /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 342 AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 343 AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 344 /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 345 AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 346 /* USB host mode: your Android device is a USB host and the dock is a USB device */ 347 AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 348 AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 349 AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 350 AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 351 AUDIO_DEVICE_OUT_SPEAKER | 352 AUDIO_DEVICE_OUT_WIRED_HEADSET | 353 AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 354 AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 355 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 356 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 357 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 358 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 359 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 360 AUDIO_DEVICE_OUT_AUX_DIGITAL | 361 AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 362 AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 363 AUDIO_DEVICE_OUT_USB_ACCESSORY | 364 AUDIO_DEVICE_OUT_USB_DEVICE | 365 AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 366 AUDIO_DEVICE_OUT_DEFAULT), 367 AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 368 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 369 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 370 AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 371 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 372 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 373 AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 374 AUDIO_DEVICE_OUT_USB_DEVICE), 375 376 /* input devices */ 377 AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 378 AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 379 AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 380 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 381 AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 382 AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 383 AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 384 AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 385 AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 386 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 387 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 388 AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 389 AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 390 AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 391 392 AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 393 AUDIO_DEVICE_IN_AMBIENT | 394 AUDIO_DEVICE_IN_BUILTIN_MIC | 395 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 396 AUDIO_DEVICE_IN_WIRED_HEADSET | 397 AUDIO_DEVICE_IN_AUX_DIGITAL | 398 AUDIO_DEVICE_IN_VOICE_CALL | 399 AUDIO_DEVICE_IN_BACK_MIC | 400 AUDIO_DEVICE_IN_REMOTE_SUBMIX | 401 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 402 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 403 AUDIO_DEVICE_IN_USB_ACCESSORY | 404 AUDIO_DEVICE_IN_USB_DEVICE | 405 AUDIO_DEVICE_IN_DEFAULT), 406 AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 407}; 408 409typedef uint32_t audio_devices_t; 410 411/* the audio output flags serve two purposes: 412 * - when an AudioTrack is created they indicate a "wish" to be connected to an 413 * output stream with attributes corresponding to the specified flags 414 * - when present in an output profile descriptor listed for a particular audio 415 * hardware module, they indicate that an output stream can be opened that 416 * supports the attributes indicated by the flags. 417 * the audio policy manager will try to match the flags in the request 418 * (when getOuput() is called) to an available output stream. 419 */ 420typedef enum { 421 AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 422 AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 423 // to one output stream: no software mixer 424 AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 425 // the device. It is unique and must be 426 // present. It is opened by default and 427 // receives routing, audio mode and volume 428 // controls related to voice calls. 429 AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 430 // defined elsewhere 431 AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 432 AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 433 // streams to hardware codec 434 AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20 // use non-blocking write 435} audio_output_flags_t; 436 437/* The audio input flags are analogous to audio output flags. 438 * Currently they are used only when an AudioRecord is created, 439 * to indicate a preference to be connected to an input stream with 440 * attributes corresponding to the specified flags. 441 */ 442typedef enum { 443 AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 444 AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 445} audio_input_flags_t; 446 447/* Additional information about compressed streams offloaded to 448 * hardware playback 449 * The version and size fields must be initialized by the caller by using 450 * one of the constants defined here. 451 */ 452typedef struct { 453 uint16_t version; // version of the info structure 454 uint16_t size; // total size of the structure including version and size 455 uint32_t sample_rate; // sample rate in Hz 456 audio_channel_mask_t channel_mask; // channel mask 457 audio_format_t format; // audio format 458 audio_stream_type_t stream_type; // stream type 459 uint32_t bit_rate; // bit rate in bits per second 460 int64_t duration_us; // duration in microseconds, -1 if unknown 461 bool has_video; // true if stream is tied to a video stream 462 bool is_streaming; // true if streaming, false if local playback 463} audio_offload_info_t; 464 465#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 466 ((((maj) & 0xff) << 8) | ((min) & 0xff)) 467 468#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 469#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 470 471static const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 472 version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 473 size: sizeof(audio_offload_info_t), 474}; 475 476static inline bool audio_is_output_device(audio_devices_t device) 477{ 478 if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 479 (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 480 return true; 481 else 482 return false; 483} 484 485static inline bool audio_is_input_device(audio_devices_t device) 486{ 487 if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 488 device &= ~AUDIO_DEVICE_BIT_IN; 489 if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 490 return true; 491 } 492 return false; 493} 494 495static inline bool audio_is_output_devices(audio_devices_t device) 496{ 497 return (device & AUDIO_DEVICE_BIT_IN) == 0; 498} 499 500 501static inline bool audio_is_a2dp_device(audio_devices_t device) 502{ 503 if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 504 return true; 505 else 506 return false; 507} 508 509static inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 510{ 511 device &= ~AUDIO_DEVICE_BIT_IN; 512 if ((popcount(device) == 1) && (device & (AUDIO_DEVICE_OUT_ALL_SCO | 513 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET))) 514 return true; 515 else 516 return false; 517} 518 519static inline bool audio_is_usb_device(audio_devices_t device) 520{ 521 if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)) 522 return true; 523 else 524 return false; 525} 526 527static inline bool audio_is_remote_submix_device(audio_devices_t device) 528{ 529 if ((device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX 530 || (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX) 531 return true; 532 else 533 return false; 534} 535 536static inline bool audio_is_input_channel(audio_channel_mask_t channel) 537{ 538 if ((channel & ~AUDIO_CHANNEL_IN_ALL) == 0) 539 return channel != 0; 540 else 541 return false; 542} 543 544static inline bool audio_is_output_channel(audio_channel_mask_t channel) 545{ 546 if ((channel & ~AUDIO_CHANNEL_OUT_ALL) == 0) 547 return channel != 0; 548 else 549 return false; 550} 551 552/* Derive an output channel mask from a channel count. 553 * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 554 * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 555 * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 556 * for continuity with stereo. 557 * Returns the matching channel mask, or 0 if the number of channels exceeds that of the 558 * configurations for which a default channel mask is defined. 559 */ 560static inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 561{ 562 switch (channel_count) { 563 case 1: 564 return AUDIO_CHANNEL_OUT_MONO; 565 case 2: 566 return AUDIO_CHANNEL_OUT_STEREO; 567 case 3: 568 return (AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER); 569 case 4: // 4.0 570 return AUDIO_CHANNEL_OUT_QUAD; 571 case 5: // 5.0 572 return (AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER); 573 case 6: // 5.1 574 return AUDIO_CHANNEL_OUT_5POINT1; 575 case 7: // 6.1 576 return (AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER); 577 case 8: 578 return AUDIO_CHANNEL_OUT_7POINT1; 579 default: 580 return 0; 581 } 582} 583 584/* Similar to above, but for input. Currently handles only mono and stereo. */ 585static inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 586{ 587 switch (channel_count) { 588 case 1: 589 return AUDIO_CHANNEL_IN_MONO; 590 case 2: 591 return AUDIO_CHANNEL_IN_STEREO; 592 default: 593 return 0; 594 } 595} 596 597static inline bool audio_is_valid_format(audio_format_t format) 598{ 599 switch (format & AUDIO_FORMAT_MAIN_MASK) { 600 case AUDIO_FORMAT_PCM: 601 if (format != AUDIO_FORMAT_PCM_16_BIT && 602 format != AUDIO_FORMAT_PCM_8_BIT && format != AUDIO_FORMAT_PCM_FLOAT) { 603 return false; 604 } 605 case AUDIO_FORMAT_MP3: 606 case AUDIO_FORMAT_AMR_NB: 607 case AUDIO_FORMAT_AMR_WB: 608 case AUDIO_FORMAT_AAC: 609 case AUDIO_FORMAT_HE_AAC_V1: 610 case AUDIO_FORMAT_HE_AAC_V2: 611 case AUDIO_FORMAT_VORBIS: 612 return true; 613 default: 614 return false; 615 } 616} 617 618static inline bool audio_is_linear_pcm(audio_format_t format) 619{ 620 return ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM); 621} 622 623static inline size_t audio_bytes_per_sample(audio_format_t format) 624{ 625 size_t size = 0; 626 627 switch (format) { 628 case AUDIO_FORMAT_PCM_32_BIT: 629 case AUDIO_FORMAT_PCM_8_24_BIT: 630 size = sizeof(int32_t); 631 break; 632 case AUDIO_FORMAT_PCM_16_BIT: 633 size = sizeof(int16_t); 634 break; 635 case AUDIO_FORMAT_PCM_8_BIT: 636 size = sizeof(uint8_t); 637 break; 638 case AUDIO_FORMAT_PCM_FLOAT: 639 size = sizeof(float); 640 break; 641 default: 642 break; 643 } 644 return size; 645} 646 647__END_DECLS 648 649#endif // ANDROID_AUDIO_CORE_H 650