audio.h revision 432b7c6da2bd47c0db9db190b05733a45f744d6c
1e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* 2e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * Copyright (C) 2011 The Android Open Source Project 3e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * 4e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 5e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * you may not use this file except in compliance with the License. 6e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * You may obtain a copy of the License at 7e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * 8e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * http://www.apache.org/licenses/LICENSE-2.0 9e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * 10e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * Unless required by applicable law or agreed to in writing, software 11e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * distributed under the License is distributed on an "AS IS" BASIS, 12e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * See the License for the specific language governing permissions and 14e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * limitations under the License. 15e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 16e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 17e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 18e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#ifndef ANDROID_AUDIO_CORE_H 19e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#define ANDROID_AUDIO_CORE_H 20e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 21e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <stdbool.h> 22e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <stdint.h> 23e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <sys/cdefs.h> 24e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <sys/types.h> 25e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 26e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <cutils/bitops.h> 27e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 28e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin__BEGIN_DECLS 29e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 30e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* The enums were moved here mostly from 31e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * frameworks/base/include/media/AudioSystem.h 32e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 33e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 348ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown/* device address used to refer to the standard remote submix */ 358ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown#define AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS "0" 368ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown 371c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* AudioFlinger and AudioPolicy services use I/O handles to identify audio sources and sinks */ 38e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef int audio_io_handle_t; 391c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten#define AUDIO_IO_HANDLE_NONE 0 40e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 41e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Audio stream types */ 42e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 431c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* These values must kept in sync with 441c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * frameworks/base/media/java/android/media/AudioSystem.java 451c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten */ 46e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_DEFAULT = -1, 471c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_STREAM_MIN = 0, 48e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_VOICE_CALL = 0, 49e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_SYSTEM = 1, 50e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_RING = 2, 51e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_MUSIC = 3, 52e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_ALARM = 4, 53e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_NOTIFICATION = 5, 54e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_BLUETOOTH_SCO = 6, 55432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user 56432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * and must be routed to speaker 57432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 58e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_DTMF = 8, 59e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_TTS = 9, 60e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 61e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_CNT, 62e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_MAX = AUDIO_STREAM_CNT - 1, 63e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_stream_type_t; 64e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 65e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Do not change these values without updating their counterparts 660d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 670d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 680d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef enum { 690d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_UNKNOWN = 0, 700d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_SPEECH = 1, 710d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MUSIC = 2, 720d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MOVIE = 3, 730d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_SONIFICATION = 4, 740d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 750d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_CNT, 760d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MAX = AUDIO_CONTENT_TYPE_CNT - 1, 770d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_content_type_t; 780d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 790d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 800d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 810d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 820d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef enum { 830d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_UNKNOWN = 0, 840d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_MEDIA = 1, 850d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_VOICE_COMMUNICATION = 2, 860d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3, 870d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ALARM = 4, 880d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION = 5, 890d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6, 900d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7, 910d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8, 920d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9, 930d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_EVENT = 10, 940d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11, 950d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12, 960d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_SONIFICATION = 13, 970d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_GAME = 14, 980d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 990d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_CNT, 1000d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_MAX = AUDIO_USAGE_CNT - 1, 1010d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_usage_t; 1020d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1030d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef uint32_t audio_flags_mask_t; 1040d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1050d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 1060d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 1070d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 1080d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivienum { 1090d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_AUDIBILITY_ENFORCED = 0x1, 1100d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_SECURE = 0x2, 1110d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_SCO = 0x4, 1120d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi}; 1130d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1140d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 1151c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * in frameworks/base/media/java/android/media/MediaRecorder.java, 116c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood * frameworks/av/services/audiopolicy/AudioPolicyService.cpp, 1171c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * and system/media/audio_effects/include/audio_effects/audio_effects_conf.h! 118e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 119e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 120e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_DEFAULT = 0, 121e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_MIC = 1, 122e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_UPLINK = 2, 123e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_DOWNLINK = 3, 124e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_CALL = 4, 125e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_CAMCORDER = 5, 126e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_RECOGNITION = 6, 127e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_COMMUNICATION = 7, 128e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi AUDIO_SOURCE_REMOTE_SUBMIX = 8, /* Source for the mix to be presented remotely. */ 129e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* An example of remote presentation is Wifi Display */ 130e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* where a dongle attached to a TV can be used to */ 131e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* play the mix captured by this audio source. */ 132e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_CNT, 133e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_MAX = AUDIO_SOURCE_CNT - 1, 13404c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent AUDIO_SOURCE_HOTWORD = 1999, /* A low-priority, preemptible audio source for 13504c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent for background software hotword detection. 13604c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent Same tuning as AUDIO_SOURCE_VOICE_RECOGNITION. 13704c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent Used only internally to the framework. Not exposed 13804c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent at the audio HAL. */ 139e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_source_t; 140e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1410d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Audio attributes */ 1420d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi#define AUDIO_ATTRIBUTES_TAGS_MAX_SIZE 256 1430d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef struct { 1440d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_content_type_t content_type; 1450d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_usage_t usage; 1460d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_source_t source; 1470d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_flags_mask_t flags; 1480d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi char tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE]; /* UTF8 */ 1490d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_attributes_t; 1500d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 151e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* special audio session values 152e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (XXX: should this be living in the audio effects land?) 153e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 154e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 155e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* session for effects attached to a particular output stream 156e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (value must be less than 0) 157e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 158e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SESSION_OUTPUT_STAGE = -1, 159e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 160e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* session for effects applied to output mix. These effects can 161e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * be moved by audio policy manager to another output stream 162e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (value must be 0) 163e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 164e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SESSION_OUTPUT_MIX = 0, 165b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten 166b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten /* application does not specify an explicit session ID to be used, 167b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * and requests a new session ID to be allocated 168b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * TODO use unique values for AUDIO_SESSION_OUTPUT_MIX and AUDIO_SESSION_ALLOCATE, 169b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * after all uses have been updated from 0 to the appropriate symbol, and have been tested. 170b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten */ 171b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten AUDIO_SESSION_ALLOCATE = 0, 172e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_session_t; 173e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 174e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Audio sub formats (see enum audio_format). */ 175e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 176e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* PCM sub formats */ 177e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 178c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten /* All of these are in native byte order */ 1799714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 1809714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 1819714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 1829714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 7.24 fixed point */ 1831c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 184c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6, /* PCM signed .23 fixed point packed in 3 bytes */ 185e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_pcm_sub_fmt_t; 186e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1871c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* The audio_format_*_sub_fmt_t declarations are not currently used */ 1881c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten 189e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 190e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * frame header to specify bit rate, stereo mode, version... 191e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 192e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 193e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 194e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_mp3_sub_fmt_t; 195e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 196e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* AMR NB/WB sub format field definition: specify frame block interleaving, 197e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * bandwidth efficient or octet aligned, encoding mode for recording... 198e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 199e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 200e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 201e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_amr_sub_fmt_t; 202e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 203e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* AAC sub format field definition: specify profile or bitrate for recording... */ 204e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 205923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_MAIN = 0x1, 206923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LC = 0x2, 207923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SSR = 0x4, 208923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LTP = 0x8, 209923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V1 = 0x10, 210923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SCALABLE = 0x20, 211923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ERLC = 0x40, 212923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LD = 0x80, 213923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V2 = 0x100, 214923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ELD = 0x200, 215e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_aac_sub_fmt_t; 216e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 217e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* VORBIS sub format field definition: specify quality for recording... */ 218e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 219e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 220e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_vorbis_sub_fmt_t; 221e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 2221c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* Audio format consists of a main format field (upper 8 bits) and a sub format 223e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * field (lower 24 bits). 224e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * 225e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * The main format indicates the main codec type. The sub format field 226e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * indicates options and parameters for each format. The sub format is mainly 227e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * used for record to indicate for instance the requested bitrate or profile. 228e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * It can also be used for certain formats to give informations not present in 229e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * the encoded audio stream (e.g. octet alignement for AMR). 230e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 231e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 232e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 233e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_DEFAULT = 0, 234e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 235e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MP3 = 0x01000000UL, 236e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_NB = 0x02000000UL, 237e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_WB = 0x03000000UL, 238e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AAC = 0x04000000UL, 239923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V1*/ 240923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V2*/ 241e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_VORBIS = 0x07000000UL, 24276edb1c0e644fe9f0b9f93939647a34123a60063Vignesh Venkatasubramanian AUDIO_FORMAT_OPUS = 0x08000000UL, 243ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent AUDIO_FORMAT_AC3 = 0x09000000UL, 244ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent AUDIO_FORMAT_E_AC3 = 0x0A000000UL, 245e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, 246e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 247e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 248e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* Aliases */ 2491c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* note != AudioFormat.ENCODING_PCM_16BIT */ 250e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 251e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_SUB_16_BIT), 2521c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* note != AudioFormat.ENCODING_PCM_8BIT */ 253e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 254e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_SUB_8_BIT), 2559714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 2569714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_32_BIT), 2579714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 2589714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_24_BIT), 2591c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 2601c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_SUB_FLOAT), 261c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_24_BIT_PACKED = (AUDIO_FORMAT_PCM | 262c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED), 263923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_MAIN = (AUDIO_FORMAT_AAC | 264923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_MAIN), 265923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LC = (AUDIO_FORMAT_AAC | 266923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LC), 267923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SSR = (AUDIO_FORMAT_AAC | 268923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SSR), 269923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LTP = (AUDIO_FORMAT_AAC | 270923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LTP), 271923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_HE_V1 = (AUDIO_FORMAT_AAC | 272923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V1), 273923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SCALABLE = (AUDIO_FORMAT_AAC | 274923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SCALABLE), 275923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_ERLC = (AUDIO_FORMAT_AAC | 276923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ERLC), 277923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LD = (AUDIO_FORMAT_AAC | 278923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LD), 279923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_HE_V2 = (AUDIO_FORMAT_AAC | 280923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V2), 281923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_ELD = (AUDIO_FORMAT_AAC | 282923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ELD), 283e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_t; 284e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 285432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* For the channel mask for position assignment representation */ 28616a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastenenum { 287432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 288432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These can be a complete audio_channel_mask_t. */ 289432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 2904cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_CHANNEL_NONE = 0x0, 291432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_INVALID = 0xC0000000, 292432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 293432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These can be the bits portion of an audio_channel_mask_t 294432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * with representation AUDIO_CHANNEL_REPRESENTATION_POSITION. 295432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Using these bits as a complete audio_channel_mask_t is deprecated. 296432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 297432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 298e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* output channels */ 2996d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 3006d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 3016d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 3026d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 3036d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 3046d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 3056d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 3066d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 3076d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 3086d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 3096d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 3106d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 3116d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 3126d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 3136d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 3146d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 3156d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 3166d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 317e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 318432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* TODO: should these be considered complete channel masks, or only bits? */ 319432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 320e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 321e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 322e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT), 323e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 324e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 325e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 326e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT), 327b8d59396dfb3b9135bb6dc869aa723ca618bd95dGlenn Kasten AUDIO_CHANNEL_OUT_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD, 328ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten /* like AUDIO_CHANNEL_OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */ 329ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_QUAD_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 330ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_RIGHT | 331ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_LEFT | 332ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_RIGHT), 333e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_5POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 334e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 335e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_CENTER | 336e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 337e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 338e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT), 339b8d59396dfb3b9135bb6dc869aa723ca618bd95dGlenn Kasten AUDIO_CHANNEL_OUT_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1, 340ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten /* like AUDIO_CHANNEL_OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */ 341ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_5POINT1_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 342ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_RIGHT | 343ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_CENTER | 344ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 345ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_LEFT | 346ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_RIGHT), 34733fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 348e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 349e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 350e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_CENTER | 351e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 352e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 353e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT | 35433fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT | 35533fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT), 356e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 357e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 358e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_CENTER | 359e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 360e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 361e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT | 362e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 363e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 36433fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_CENTER| 36533fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT| 36633fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT| 36733fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_CENTER| 36833fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 36933fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 37033fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 37133fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 37233fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 37333fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 374e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 375432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These are bits only, not complete values */ 376432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 377e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* input channels */ 378e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT = 0x4, 379e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT = 0x8, 380e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT = 0x10, 381e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK = 0x20, 382e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 383e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 384e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 385e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 386e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_PRESSURE = 0x400, 387e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_X_AXIS = 0x800, 388e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 389e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 390e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 391e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 392e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 393432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* TODO: should these be considered complete channel masks, or only bits, or deprecated? */ 394432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 395e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 396e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 3976c70ceeefe4cd2838b5788f6db8eb35751a5ce21Eric Laurent AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 398e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 399e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT | 400e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT | 401e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK| 402e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT_PROCESSED | 403e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 404e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT_PROCESSED | 405e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK_PROCESSED| 406e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_PRESSURE | 407e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_X_AXIS | 408e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Y_AXIS | 409e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Z_AXIS | 410e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_UPLINK | 411e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_DNLINK), 4124ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi}; 4134ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi 414ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten/* A channel mask per se only defines the presence or absence of a channel, not the order. 415ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * But see AUDIO_INTERLEAVE_* below for the platform convention of order. 416432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 417432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * audio_channel_mask_t is an opaque type and its internal layout should not 418432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * be assumed as it may change in the future. 419432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Instead, always use the functions declared in this header to examine. 420432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 421432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * These are the current representations: 422432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 423432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * AUDIO_CHANNEL_REPRESENTATION_POSITION 424432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is a channel mask representation for position assignment. 425432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Each low-order bit corresponds to the spatial position of a transducer (output), 426432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or interpretation of channel (input). 427432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * The user of a channel mask needs to know the context of whether it is for output or input. 428432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * The constants AUDIO_CHANNEL_OUT_* or AUDIO_CHANNEL_IN_* apply to the bits portion. 429432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * It is not permitted for no bits to be set. 430432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 431432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * AUDIO_CHANNEL_REPRESENTATION_INDEX 432432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is a channel mask representation for index assignment. 433432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Each low-order bit corresponds to a selected channel. 434432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * There is no platform interpretation of the various bits. 435432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * There is no concept of output or input. 436432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * It is not permitted for no bits to be set. 437432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 438432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * All other representations are reserved for future use. 439432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 440432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Warning: current representation distinguishes between input and output, but this will not the be 441432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * case in future revisions of the platform. Wherever there is an ambiguity between input and output 442432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * that is currently resolved by checking the channel mask, the implementer should look for ways to 443432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * fix it with additional information outside of the mask. 444ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten */ 4454ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivitypedef uint32_t audio_channel_mask_t; 446e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 447432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Maximum number of channels for all representations */ 448432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten#define AUDIO_CHANNEL_COUNT_MAX 30 449432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 450432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* log(2) of maximum number of representations, not part of public API */ 451432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten#define AUDIO_CHANNEL_REPRESENTATION_LOG2 2 452432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 453432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Representations */ 454432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastentypedef enum { 455432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION = 0, // must be zero for compatibility 456432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // 1 is reserved for future use 457432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX = 2, 458432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // 3 is reserved for future use 459432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} audio_channel_representation_t; 460432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 461432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* The return value is undefined if the channel mask is invalid. */ 462432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline uint32_t audio_channel_mask_get_bits(audio_channel_mask_t channel) 463432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 464432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return channel & ((1 << AUDIO_CHANNEL_COUNT_MAX) - 1); 465432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 466432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 467432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* The return value is undefined if the channel mask is invalid. */ 468432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_representation_t audio_channel_mask_get_representation( 469432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_mask_t channel) 470432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 471432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // The right shift should be sufficient, but also "and" for safety in case mask is not 32 bits 472432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return (audio_channel_representation_t) 473432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten ((channel >> AUDIO_CHANNEL_COUNT_MAX) & ((1 << AUDIO_CHANNEL_REPRESENTATION_LOG2) - 1)); 474432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 475432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 476432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if the channel mask is valid, 477432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or returns false for AUDIO_CHANNEL_NONE, AUDIO_CHANNEL_INVALID, and other invalid values. 478432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * This function is unable to determine whether a channel mask for position assignment 479432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is invalid because an output mask has an invalid output bit set, 480432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or because an input mask has an invalid input bit set. 481432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * All other APIs that take a channel mask assume that it is valid. 482432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 483432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline bool audio_channel_mask_is_valid(audio_channel_mask_t channel) 484432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 485432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 486432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_representation_t representation = audio_channel_mask_get_representation(channel); 487432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (representation) { 488432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 489432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 490432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 491432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 492432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 493432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 494432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 495432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 496432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 497432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 498432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Not part of public API */ 499432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_from_representation_and_bits( 500432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_representation_t representation, uint32_t bits) 501432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 502432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return (audio_channel_mask_t) ((representation << AUDIO_CHANNEL_COUNT_MAX) | bits); 503432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 504432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 5051c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* Expresses the convention when stereo audio samples are stored interleaved 5061c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * in an array. This should improve readability by allowing code to use 5071c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * symbolic indices instead of hard-coded [0] and [1]. 508ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * 509ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * For multi-channel beyond stereo, the platform convention is that channels 510ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * are interleaved in order from least significant channel mask bit 511ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * to most significant channel mask bit, with unused bits skipped. 512ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * Any exceptions to this convention will be noted at the appropriate API. 5131c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten */ 5141c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kastenenum { 5151c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_INTERLEAVE_LEFT = 0, 5161c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_INTERLEAVE_RIGHT = 1, 5171c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten}; 5181c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten 519e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 520e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_INVALID = -2, 521e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_CURRENT = -1, 522e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_NORMAL = 0, 523e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_RINGTONE = 1, 524e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_IN_CALL = 2, 525e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_IN_COMMUNICATION = 3, 526e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 527e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_CNT, 528e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 529e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_mode_t; 530e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 5311c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* This enum is deprecated */ 532e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 5331c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_IN_ACOUSTICS_NONE = 0, 534e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 535e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 536e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 537e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 538e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 539e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 540e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_in_acoustics_t; 541e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 54216a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastenenum { 543eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_NONE = 0x0, 544eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent /* reserved bits */ 545eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_BIT_IN = 0x80000000, 546eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 547e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* output devices */ 548e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_EARPIECE = 0x1, 549e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_SPEAKER = 0x2, 550e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 551e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 552e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 553e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 554e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 555e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 556e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 557e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 558e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 559abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT_AUX_DIGITAL, 5601c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 561e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 562e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 5631c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 56479f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 5651c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* USB host mode: your Android device is a USB host and the dock is a USB device */ 56679f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 567eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 568abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Telephony voice TX path */ 569abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000, 570abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Analog jack with line impedance detected */ 571abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_LINE = 0x20000, 572abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* HDMI Audio Return Channel */ 573abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000, 574abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* S/PDIF out */ 575abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_SPDIF = 0x80000, 576abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* FM transmitter out */ 577abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_FM = 0x100000, 578eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 579e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 580e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_SPEAKER | 581e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADSET | 582e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 583e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 584e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 585e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 586e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 587e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 588e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 589abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI | 590e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 591e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 59279f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_ACCESSORY | 59379f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE | 594eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 595abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_TELEPHONY_TX | 596abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_LINE | 597abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI_ARC | 598abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_SPDIF | 599abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_FM | 600e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DEFAULT), 601e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 602e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 603e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 604e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 605e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 606e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 60779f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 60879f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE), 609e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 610e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* input devices */ 611eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 612eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 613eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 614eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 615eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 616eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 617abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL, 618abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Telephony voice RX path */ 619eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 620abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TELEPHONY_RX = AUDIO_DEVICE_IN_VOICE_CALL, 621eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 622eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 623eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 624eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 625eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 626eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 627abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* FM tuner input */ 628abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_FM_TUNER = AUDIO_DEVICE_BIT_IN | 0x2000, 629abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* TV tuner input */ 630abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TV_TUNER = AUDIO_DEVICE_BIT_IN | 0x4000, 631abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Analog jack with line impedance detected */ 632abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_LINE = AUDIO_DEVICE_BIT_IN | 0x8000, 633abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* S/PDIF in */ 634abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_SPDIF = AUDIO_DEVICE_BIT_IN | 0x10000, 635c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood AUDIO_DEVICE_IN_BLUETOOTH_A2DP = AUDIO_DEVICE_BIT_IN | 0x20000, 636b63dd8a005ad3133915a949e6b31e81d51007688Terry Heo AUDIO_DEVICE_IN_LOOPBACK = AUDIO_DEVICE_BIT_IN | 0x40000, 637eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 638e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 639e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 640e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_AMBIENT | 641e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BUILTIN_MIC | 642e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 643e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_WIRED_HEADSET | 644abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_HDMI | 645abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TELEPHONY_RX | 646e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BACK_MIC | 647eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_REMOTE_SUBMIX | 648eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 649eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 650eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_ACCESSORY | 651eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_DEVICE | 652abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_FM_TUNER | 653abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TV_TUNER | 654abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_LINE | 655abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_SPDIF | 656c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 657b63dd8a005ad3133915a949e6b31e81d51007688Terry Heo AUDIO_DEVICE_IN_LOOPBACK | 658e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_DEFAULT), 659e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 66000b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean AUDIO_DEVICE_IN_ALL_USB = (AUDIO_DEVICE_IN_USB_ACCESSORY | 66100b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean AUDIO_DEVICE_IN_USB_DEVICE), 66216a7a0443a59c636ab20a3161ec630d037766eccGlenn Kasten}; 66316a7a0443a59c636ab20a3161ec630d037766eccGlenn Kasten 66416a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastentypedef uint32_t audio_devices_t; 665e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 666545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent/* the audio output flags serve two purposes: 667545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * - when an AudioTrack is created they indicate a "wish" to be connected to an 668545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * output stream with attributes corresponding to the specified flags 669545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * - when present in an output profile descriptor listed for a particular audio 670545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * hardware module, they indicate that an output stream can be opened that 671545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * supports the attributes indicated by the flags. 672545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * the audio policy manager will try to match the flags in the request 673545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * (when getOuput() is called) to an available output stream. 674545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent */ 675545ab46063f083239b29e59b8b491656d93f2a38Eric Laurenttypedef enum { 6769aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 6779aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 6789aec362e76a60725df1a444214f222297caf46a2Eric Laurent // to one output stream: no software mixer 6799aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 6809aec362e76a60725df1a444214f222297caf46a2Eric Laurent // the device. It is unique and must be 6819aec362e76a60725df1a444214f222297caf46a2Eric Laurent // present. It is opened by default and 6829aec362e76a60725df1a444214f222297caf46a2Eric Laurent // receives routing, audio mode and volume 6839aec362e76a60725df1a444214f222297caf46a2Eric Laurent // controls related to voice calls. 6849aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 6859aec362e76a60725df1a444214f222297caf46a2Eric Laurent // defined elsewhere 68605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 68705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 68805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald // streams to hardware codec 68905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20 // use non-blocking write 690545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent} audio_output_flags_t; 691545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent 692c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten/* The audio input flags are analogous to audio output flags. 693c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * Currently they are used only when an AudioRecord is created, 694c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * to indicate a preference to be connected to an input stream with 695c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * attributes corresponding to the specified flags. 696c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten */ 697c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kastentypedef enum { 698c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 699c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 700c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten} audio_input_flags_t; 701c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten 70205529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald/* Additional information about compressed streams offloaded to 70305529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * hardware playback 70405529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * The version and size fields must be initialized by the caller by using 70505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * one of the constants defined here. 70605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald */ 70705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgeraldtypedef struct { 70805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint16_t version; // version of the info structure 70905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint16_t size; // total size of the structure including version and size 71005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint32_t sample_rate; // sample rate in Hz 71105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_channel_mask_t channel_mask; // channel mask 71205529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_format_t format; // audio format 71305529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_stream_type_t stream_type; // stream type 71405529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint32_t bit_rate; // bit rate in bits per second 71505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald int64_t duration_us; // duration in microseconds, -1 if unknown 71605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald bool has_video; // true if stream is tied to a video stream 71705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald bool is_streaming; // true if streaming, false if local playback 71805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald} audio_offload_info_t; 71905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 72005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 72105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald ((((maj) & 0xff) << 8) | ((min) & 0xff)) 72205529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 72305529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 72405529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 72505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 72605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgeraldstatic const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 72705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 72805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald size: sizeof(audio_offload_info_t), 7294887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn sample_rate: 0, 7304887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn channel_mask: 0, 7314887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn format: AUDIO_FORMAT_DEFAULT, 7324887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn stream_type: AUDIO_STREAM_VOICE_CALL, 7334887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn bit_rate: 0, 7344887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn duration_us: 0, 7354887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn has_video: false, 7364887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn is_streaming: false 73705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald}; 73805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 7394cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7404cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* audio hw module handle functions or structures referencing a module */ 7414cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_module_handle_t; 7424cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7434cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/****************************** 7444cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Volume control 7454cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent *****************************/ 7464cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7474cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* If the audio hardware supports gain control on some audio paths, 7484cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * the platform can expose them in the audio_policy.conf file. The audio HAL 7494cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * will then implement gain control functions that will use the following data 7504cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * structures. */ 7514cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7524cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Type of gain control exposed by an audio port */ 7534cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_JOINT 0x1 /* supports joint channel gain control */ 7544cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_CHANNELS 0x2 /* supports separate channel gain control */ 7554cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_RAMP 0x4 /* supports gain ramps */ 7564cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7574cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef uint32_t audio_gain_mode_t; 7584cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7594cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7604cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* An audio_gain struct is a representation of a gain stage. 7614cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * A gain stage is always attached to an audio port. */ 7624cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_gain { 7634cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_gain_mode_t mode; /* e.g. AUDIO_GAIN_MODE_JOINT */ 7644cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channels which gain an be controlled. 7654cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent N/A if AUDIO_GAIN_MODE_CHANNELS is not supported */ 7664cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int min_value; /* minimum gain value in millibels */ 7674cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int max_value; /* maximum gain value in millibels */ 7684cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int default_value; /* default gain value in millibels */ 7694cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int step_value; /* gain step in millibels */ 7704cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int min_ramp_ms; /* minimum ramp duration in ms */ 7714cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int max_ramp_ms; /* maximum ramp duration in ms */ 7724cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 7734cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7744cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* The gain configuration structure is used to get or set the gain values of a 7754cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * given port */ 7764cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_gain_config { 7774cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int index; /* index of the corresponding audio_gain in the 7784cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port gains[] table */ 7794cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_gain_mode_t mode; /* mode requested for this command */ 7804cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channels which gain value follows. 7814cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent N/A in joint mode */ 782f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang int values[sizeof(audio_channel_mask_t) * 8]; /* gain values in millibels 783f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang for each channel ordered from LSb to MSb in 784f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang channel mask. The number of values is 1 in joint 785f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang mode or popcount(channel_mask) */ 7864cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int ramp_duration_ms; /* ramp duration in ms */ 7874cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 7884cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7894cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/****************************** 7904cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Routing control 7914cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent *****************************/ 7924cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7934cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Types defined here are used to describe an audio source or sink at internal 7944cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * framework interfaces (audio policy, patch panel) or at the audio HAL. 7954cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Sink and sources are grouped in a concept of “audio port” representing an 7964cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * audio end point at the edge of the system managed by the module exposing 7974cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * the interface. */ 7984cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7994cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Audio port role: either source or sink */ 8004cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 8014cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_NONE, 8024cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_SOURCE, 8034cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_SINK, 8044cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_port_role_t; 8054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8064cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Audio port type indicates if it is a session (e.g AudioTrack), 8074cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * a mix (e.g PlaybackThread output) or a physical device 8084cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8094cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 8104cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_NONE, 8114cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_DEVICE, 8124cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_MIX, 8134cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_SESSION, 8144cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_port_type_t; 8154cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8164cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Each port has a unique ID or handle allocated by policy manager */ 8174cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_port_handle_t; 8184cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_HANDLE_NONE 0 8194cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8204cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8214cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* maximum audio device address length */ 8224cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_DEVICE_MAX_ADDRESS_LEN 32 8234cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8244cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is a 8254cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * hardware device */ 8264cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_device_ext { 8274cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the device is attached to */ 8284cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8294cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; /* device address. "" if N/A */ 8304cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8314cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8324cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is a 8334cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * sub mix */ 8344cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_mix_ext { 8354cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the stream is attached to */ 8364cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_io_handle_t handle; /* I/O handle of the input/output stream */ 8374cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 8384cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent //TODO: change use case for output streams: use strategy and mixer attributes 8394cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_stream_type_t stream; 8404cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_source_t source; 8414cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } usecase; 8424cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8434cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8444cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is an 8454cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * audio session */ 8464cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_session_ext { 8474cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_session_t session; /* audio session */ 8484cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8494cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8504cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Flags indicating which fields are to be considered in struct audio_port_config */ 8514cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_SAMPLE_RATE 0x1 8524cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_CHANNEL_MASK 0x2 8534cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_FORMAT 0x4 8544cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_GAIN 0x8 8554cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_ALL (AUDIO_PORT_CONFIG_SAMPLE_RATE | \ 8564cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_CHANNEL_MASK | \ 8574cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_FORMAT | \ 8584cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_GAIN) 8594cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8604cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* audio port configuration structure used to specify a particular configuration of 8614cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * an audio port */ 8624cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config { 8634cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_handle_t id; /* port unique ID */ 8644cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_role_t role; /* sink or source */ 8654cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_type_t type; /* device, mix ... */ 8664cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int config_mask; /* e.g AUDIO_PORT_CONFIG_ALL */ 8674cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int sample_rate; /* sampling rate in Hz */ 8684cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channel mask if applicable */ 8694cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_format_t format; /* format if applicable */ 8704cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_gain_config gain; /* gain to apply if applicable */ 8714cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 8724cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_device_ext device; /* device specific info */ 8734cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_mix_ext mix; /* mix specific info */ 8744cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_session_ext session; /* session specific info */ 8754cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } ext; 8764cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8774cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8784cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8794cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of sampling rates in audio port */ 8804cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_SAMPLING_RATES 16 8814cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of channel masks in audio port */ 8824cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_CHANNEL_MASKS 16 8834cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of audio formats in audio port */ 8844cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_FORMATS 16 8854cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of gain controls in audio port */ 8864cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_GAINS 16 8874cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8884cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is a hardware device */ 8894cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_device_ext { 8904cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the device is attached to */ 8914cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8924cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 8934cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8944cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8954cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Latency class of the audio mix */ 8964cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 8974cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_LATENCY_LOW, 8984cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_LATENCY_NORMAL, 8994cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_mix_latency_class_t; 9004cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9014cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is a sub mix */ 9024cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_mix_ext { 9034cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the stream is attached to */ 9044cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_io_handle_t handle; /* I/O handle of the input.output stream */ 9054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_mix_latency_class_t latency_class; /* latency class */ 9064cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent // other attributes: routing strategies 9074cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9084cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9094cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is an audio session */ 9104cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_session_ext { 9114cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_session_t session; /* audio session */ 9124cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9134cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9144cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9154cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port { 9164cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_handle_t id; /* port unique ID */ 9174cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_role_t role; /* sink or source */ 9184cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_type_t type; /* device, mix ... */ 9194cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sample_rates; /* number of sampling rates in following array */ 9204cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int sample_rates[AUDIO_PORT_MAX_SAMPLING_RATES]; 9214cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_channel_masks; /* number of channel masks in following array */ 9224cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_masks[AUDIO_PORT_MAX_CHANNEL_MASKS]; 9234cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_formats; /* number of formats in following array */ 9244cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_format_t formats[AUDIO_PORT_MAX_FORMATS]; 9254cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_gains; /* number of gains in following array */ 9264cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_gain gains[AUDIO_PORT_MAX_GAINS]; 9274cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config active_config; /* current audio port configuration */ 9284cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 9294cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_device_ext device; 9304cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_mix_ext mix; 9314cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_session_ext session; 9324cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } ext; 9334cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9344cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9354cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* An audio patch represents a connection between one or more source ports and 9364cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * one or more sink ports. Patches are connected and disconnected by audio policy manager or by 9374cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * applications via framework APIs. 9384cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Each patch is identified by a handle at the interface used to create that patch. For instance, 9394cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * when a patch is created by the audio HAL, the HAL allocates and returns a handle. 9404cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * This handle is unique to a given audio HAL hardware module. 9414cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * But the same patch receives another system wide unique handle allocated by the framework. 9424cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * This unique handle is used for all transactions inside the framework. 9434cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent */ 9444cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_patch_handle_t; 9454cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PATCH_HANDLE_NONE 0 9464cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9474cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PATCH_PORTS_MAX 16 9484cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9494cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_patch { 9504cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_patch_handle_t id; /* patch unique ID */ 9514cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sources; /* number of sources in following array */ 9524cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX]; 9534cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sinks; /* number of sinks in following array */ 9544cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX]; 9554cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9564cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9574cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 958e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_output_device(audio_devices_t device) 959e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 960eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 961eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 962e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 963e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin else 964e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 965e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 966e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 967e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_input_device(audio_devices_t device) 968e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 969eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 970eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent device &= ~AUDIO_DEVICE_BIT_IN; 971eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 972eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return true; 973eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent } 974eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return false; 975e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 976e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 977eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurentstatic inline bool audio_is_output_devices(audio_devices_t device) 978eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent{ 979eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return (device & AUDIO_DEVICE_BIT_IN) == 0; 980eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent} 981eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent 982c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_in_device(audio_devices_t device) 983c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood{ 984c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 985c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood device &= ~AUDIO_DEVICE_BIT_IN; 986c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood if ((popcount(device) == 1) && (device & AUDIO_DEVICE_IN_BLUETOOTH_A2DP)) 987c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return true; 988c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood } 989c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return false; 990c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood} 991eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent 992c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_out_device(audio_devices_t device) 993e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 994e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 995e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 996e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin else 997e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 998e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 999e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1000c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood// Deprecated - use audio_is_a2dp_out_device() instead 1001c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_device(audio_devices_t device) 1002c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood{ 1003c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return audio_is_a2dp_out_device(device); 1004c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood} 1005c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood 1006e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 1007e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1008b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((device & AUDIO_DEVICE_BIT_IN) == 0) { 1009b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL_SCO) == 0)) 1010b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return true; 1011b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent } else { 1012b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent device &= ~AUDIO_DEVICE_BIT_IN; 1013b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) == 0)) 1014b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return true; 1015b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent } 1016b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent 1017b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return false; 1018e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1019e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 102000b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLeanstatic inline bool audio_is_usb_out_device(audio_devices_t device) 102100b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean{ 102200b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)); 102300b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean} 102400b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean 102500b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLeanstatic inline bool audio_is_usb_in_device(audio_devices_t device) 102600b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean{ 102700b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 102800b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean device &= ~AUDIO_DEVICE_BIT_IN; 102900b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean if (popcount(device) == 1 && (device & AUDIO_DEVICE_IN_ALL_USB) != 0) 103000b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return true; 103100b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean } 103200b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return false; 103300b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean} 103400b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean 103500b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean/* OBSOLETE - use audio_is_usb_out_device() instead. */ 103679f90bdc7de561aa31888948c0661568ccc33da1Eric Laurentstatic inline bool audio_is_usb_device(audio_devices_t device) 103779f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent{ 103800b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return audio_is_usb_out_device(device); 103979f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent} 104079f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent 1041e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivistatic inline bool audio_is_remote_submix_device(audio_devices_t device) 1042e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi{ 10438ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown if ((device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX 10448ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown || (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX) 1045e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi return true; 1046e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi else 1047e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi return false; 1048e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi} 1049e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi 1050432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if: 1051432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * representation is valid, and 1052432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there is at least one channel bit set which _could_ correspond to an input channel, and 1053432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there are no channel bits set which could _not_ correspond to an input channel. 1054432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Otherwise returns false. 1055432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1056f7326dc0aa2da2df6bf1fa1ae7ef259a0ebdbd7bGlenn Kastenstatic inline bool audio_is_input_channel(audio_channel_mask_t channel) 1057e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1058432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1059432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1060432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1061432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (bits & ~AUDIO_CHANNEL_IN_ALL) { 1062432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 1063432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1064432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1065432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1066432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 1067432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1068e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1069432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1070e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1071e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1072432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if: 1073432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * representation is valid, and 1074432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there is at least one channel bit set which _could_ correspond to an output channel, and 1075432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there are no channel bits set which could _not_ correspond to an output channel. 1076432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Otherwise returns false. 1077432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1078f7326dc0aa2da2df6bf1fa1ae7ef259a0ebdbd7bGlenn Kastenstatic inline bool audio_is_output_channel(audio_channel_mask_t channel) 1079e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1080432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1081432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1082432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1083432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (bits & ~AUDIO_CHANNEL_OUT_ALL) { 1084432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 1085432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1086432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1087432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1088432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 1089432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1090e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1091432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1092e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1093e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1094a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung/* Returns the number of channels from an input channel mask, 1095a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung * used in the context of audio input or recording. 1096432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * If a channel bit is set which could _not_ correspond to an input channel, 1097432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * it is excluded from the count. 1098432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns zero if the representation is invalid. 1099a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung */ 1100a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hungstatic inline uint32_t audio_channel_count_from_in_mask(audio_channel_mask_t channel) 1101a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung{ 1102432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1103432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1104432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1105432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // TODO: We can now merge with from_out_mask and remove anding 1106432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits &= AUDIO_CHANNEL_IN_ALL; 1107432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1108432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1109432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return popcount(bits); 1110432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1111432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return 0; 1112432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1113a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung} 1114a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung 1115a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung/* Returns the number of channels from an output channel mask, 1116a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung * used in the context of audio output or playback. 1117432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * If a channel bit is set which could _not_ correspond to an output channel, 1118432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * it is excluded from the count. 1119432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns zero if the representation is invalid. 1120a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung */ 1121a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hungstatic inline uint32_t audio_channel_count_from_out_mask(audio_channel_mask_t channel) 1122a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung{ 1123432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1124432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1125432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1126432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // TODO: We can now merge with from_in_mask and remove anding 1127432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits &= AUDIO_CHANNEL_OUT_ALL; 1128432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1129432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1130432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return popcount(bits); 1131432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1132432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return 0; 1133432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1134a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung} 1135a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung 1136432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive an output channel mask for position assignment from a channel count. 11374ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 11384ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 11394ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 11404ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * for continuity with stereo. 1141432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1142432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1143432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 1144432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * configurations for which a default output channel mask is defined. 11454ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi */ 114689f7ba3df8fc359023b494c2e625beed900bc706Glenn Kastenstatic inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 11474ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi{ 1148432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits; 11491c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten switch (channel_count) { 1150432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case 0: 1151432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 11524ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 1: 1153432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_MONO; 1154432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11554ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 2: 1156432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_STEREO; 1157432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11584ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 3: 1159432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER; 1160432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11614ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 4: // 4.0 1162432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_QUAD; 1163432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11644ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 5: // 5.0 1165432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER; 1166432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11674ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 6: // 5.1 1168432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_5POINT1; 1169432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11704ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 7: // 6.1 1171432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER; 1172432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11734ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 8: 1174432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_7POINT1; 1175432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 11764ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi default: 1177432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 11784ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi } 1179432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1180432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 11814ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi} 11824ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi 1183432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive an input channel mask for position assignment from a channel count. 1184432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Currently handles only mono and stereo. 1185432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1186432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1187432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 1188432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * configurations for which a default input channel mask is defined. 1189432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 119089f7ba3df8fc359023b494c2e625beed900bc706Glenn Kastenstatic inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 119189f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten{ 1192432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits; 119389f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten switch (channel_count) { 1194432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case 0: 1195432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 119689f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten case 1: 1197432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_IN_MONO; 1198432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 119989f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten case 2: 1200432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_IN_STEREO; 1201432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 120289f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten default: 1203432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 1204432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1205432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1206432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 1207432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 1208432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 1209432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive a channel mask for index assignment from a channel count. 1210432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1211432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1212432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds AUDIO_CHANNEL_COUNT_MAX. 1213432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1214432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_for_index_assignment_from_count( 1215432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t channel_count) 1216432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 1217432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (channel_count == 0) { 1218432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 1219432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1220432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (channel_count > AUDIO_CHANNEL_COUNT_MAX) { 1221432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 122289f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten } 1223432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = (1 << channel_count) - 1; 1224432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1225432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX, bits); 122689f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten} 122789f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten 1228828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline bool audio_is_valid_format(audio_format_t format) 1229e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1230e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin switch (format & AUDIO_FORMAT_MAIN_MASK) { 1231e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_PCM: 123245b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten switch (format) { 123345b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_16_BIT: 123445b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_8_BIT: 123545b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_32_BIT: 123645b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_8_24_BIT: 123745b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_FLOAT: 123845b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_24_BIT_PACKED: 123945b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten return true; 124045b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten default: 1241da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return false; 1242da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent } 124345b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten /* not reached */ 1244e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_MP3: 1245e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AMR_NB: 1246e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AMR_WB: 1247e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AAC: 1248e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_HE_AAC_V1: 1249e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_HE_AAC_V2: 1250e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_VORBIS: 1251ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_OPUS: 1252ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_AC3: 1253ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_E_AC3: 1254e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 1255e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin default: 1256e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1257e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin } 1258e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1259e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1260828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline bool audio_is_linear_pcm(audio_format_t format) 1261e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1262da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM); 1263da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent} 1264da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent 1265828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline size_t audio_bytes_per_sample(audio_format_t format) 1266da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent{ 1267da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent size_t size = 0; 1268da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent 1269e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin switch (format) { 1270427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_32_BIT: 1271427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_8_24_BIT: 1272427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(int32_t); 1273427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1274173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung case AUDIO_FORMAT_PCM_24_BIT_PACKED: 1275173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung size = sizeof(uint8_t) * 3; 1276173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung break; 1277427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_16_BIT: 1278427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(int16_t); 1279427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1280427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_8_BIT: 1281427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(uint8_t); 1282427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 12831c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten case AUDIO_FORMAT_PCM_FLOAT: 12841c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten size = sizeof(float); 12851c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten break; 1286427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi default: 1287427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1288e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin } 1289da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return size; 1290e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1291e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1292e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin__END_DECLS 1293e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1294e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#endif // ANDROID_AUDIO_CORE_H 1295