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> 23a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent#include <stdio.h> 24e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <sys/cdefs.h> 25e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <sys/types.h> 26e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 27e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#include <cutils/bitops.h> 28e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 29e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin__BEGIN_DECLS 30e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 31e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* The enums were moved here mostly from 32e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * frameworks/base/include/media/AudioSystem.h 33e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 34e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 358ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown/* device address used to refer to the standard remote submix */ 368ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown#define AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS "0" 378ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown 381c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* AudioFlinger and AudioPolicy services use I/O handles to identify audio sources and sinks */ 39e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef int audio_io_handle_t; 401c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten#define AUDIO_IO_HANDLE_NONE 0 41e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 42e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Audio stream types */ 43e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 441c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* These values must kept in sync with 451c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * frameworks/base/media/java/android/media/AudioSystem.java 461c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten */ 47e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_DEFAULT = -1, 481c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_STREAM_MIN = 0, 49e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_VOICE_CALL = 0, 50e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_SYSTEM = 1, 51e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_RING = 2, 52e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_MUSIC = 3, 53e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_ALARM = 4, 54e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_NOTIFICATION = 5, 55e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_BLUETOOTH_SCO = 6, 56432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user 57432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * and must be routed to speaker 58432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 59e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_STREAM_DTMF = 8, 6047f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_TTS = 9, /* Transmitted Through Speaker. 6147f52f247d6d895878b831de448f19b98225515dEric Laurent * Plays over speaker only, silent on other devices. 6247f52f247d6d895878b831de448f19b98225515dEric Laurent */ 6347f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_ACCESSIBILITY = 10, /* For accessibility talk back prompts */ 6447f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_REROUTING = 11, /* For dynamic policy output mixes */ 6547f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_PATCH = 12, /* For internal audio flinger tracks. Fixed volume */ 6647f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_PUBLIC_CNT = AUDIO_STREAM_TTS + 1, 6747f52f247d6d895878b831de448f19b98225515dEric Laurent AUDIO_STREAM_CNT = AUDIO_STREAM_PATCH + 1, 68e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_stream_type_t; 69e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 70e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Do not change these values without updating their counterparts 710d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 720d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 730d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef enum { 740d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_UNKNOWN = 0, 750d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_SPEECH = 1, 760d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MUSIC = 2, 770d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MOVIE = 3, 780d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_SONIFICATION = 4, 790d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 800d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_CNT, 810d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_CONTENT_TYPE_MAX = AUDIO_CONTENT_TYPE_CNT - 1, 820d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_content_type_t; 830d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 840d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 850d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 860d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 870d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef enum { 880d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_UNKNOWN = 0, 890d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_MEDIA = 1, 900d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_VOICE_COMMUNICATION = 2, 910d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3, 920d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ALARM = 4, 930d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION = 5, 940d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6, 950d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7, 960d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8, 970d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9, 980d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_NOTIFICATION_EVENT = 10, 990d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11, 1000d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12, 1010d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_ASSISTANCE_SONIFICATION = 13, 1020d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_GAME = 14, 1034fca59181c838b91572d1b57cb74b26d0a70528fEric Laurent AUDIO_USAGE_VIRTUAL_SOURCE = 15, 1040d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1050d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_CNT, 1060d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_USAGE_MAX = AUDIO_USAGE_CNT - 1, 1070d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_usage_t; 1080d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1090d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef uint32_t audio_flags_mask_t; 1100d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1110d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 1120d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi * in frameworks/base/media/java/android/media/AudioAttributes.java 1130d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi */ 1140d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivienum { 1150d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_AUDIBILITY_ENFORCED = 0x1, 1160d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_SECURE = 0x2, 1170d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi AUDIO_FLAG_SCO = 0x4, 118d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent AUDIO_FLAG_BEACON = 0x8, 119f6cce347a73e3b3da9ff6698ead25b5a543ce47bEric Laurent AUDIO_FLAG_HW_AV_SYNC = 0x10, 120f6cce347a73e3b3da9ff6698ead25b5a543ce47bEric Laurent AUDIO_FLAG_HW_HOTWORD = 0x20, 1210d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi}; 1220d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 1230d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Do not change these values without updating their counterparts 1241c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * in frameworks/base/media/java/android/media/MediaRecorder.java, 125c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood * frameworks/av/services/audiopolicy/AudioPolicyService.cpp, 1261c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * and system/media/audio_effects/include/audio_effects/audio_effects_conf.h! 127e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 128e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 129e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_DEFAULT = 0, 130e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_MIC = 1, 131e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_UPLINK = 2, 132e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_DOWNLINK = 3, 133e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_CALL = 4, 134e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_CAMCORDER = 5, 135e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_RECOGNITION = 6, 136e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_VOICE_COMMUNICATION = 7, 137e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi AUDIO_SOURCE_REMOTE_SUBMIX = 8, /* Source for the mix to be presented remotely. */ 138e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* An example of remote presentation is Wifi Display */ 139e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* where a dongle attached to a TV can be used to */ 140e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi /* play the mix captured by this audio source. */ 141e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_CNT, 142e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SOURCE_MAX = AUDIO_SOURCE_CNT - 1, 1434c4cf467f5857e9ec4a0688d75854cc9cdaa1d4dCarson Liao AUDIO_SOURCE_FM_TUNER = 1998, 14404c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent AUDIO_SOURCE_HOTWORD = 1999, /* A low-priority, preemptible audio source for 14504c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent for background software hotword detection. 14604c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent Same tuning as AUDIO_SOURCE_VOICE_RECOGNITION. 14704c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent Used only internally to the framework. Not exposed 14804c12ca061cd4ffe79a8eb5d570c4830a0950c85Eric Laurent at the audio HAL. */ 149e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_source_t; 150e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1510d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi/* Audio attributes */ 1520d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi#define AUDIO_ATTRIBUTES_TAGS_MAX_SIZE 256 1530d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivitypedef struct { 1540d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_content_type_t content_type; 1550d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_usage_t usage; 1560d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_source_t source; 1570d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi audio_flags_mask_t flags; 1580d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi char tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE]; /* UTF8 */ 1590d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi} audio_attributes_t; 1600d580e83dd97b7f36869041cdc8f1af12dff8675Jean-Michel Trivi 161e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* special audio session values 162e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (XXX: should this be living in the audio effects land?) 163e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 164e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 165e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* session for effects attached to a particular output stream 166e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (value must be less than 0) 167e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 168e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SESSION_OUTPUT_STAGE = -1, 169e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 170e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* session for effects applied to output mix. These effects can 171e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * be moved by audio policy manager to another output stream 172e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * (value must be 0) 173e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 174e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_SESSION_OUTPUT_MIX = 0, 175b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten 176b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten /* application does not specify an explicit session ID to be used, 177b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * and requests a new session ID to be allocated 178b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * TODO use unique values for AUDIO_SESSION_OUTPUT_MIX and AUDIO_SESSION_ALLOCATE, 179b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten * after all uses have been updated from 0 to the appropriate symbol, and have been tested. 180b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten */ 181b4f2b4eac4b9ae3d8c7804c5902343c4235f81adGlenn Kasten AUDIO_SESSION_ALLOCATE = 0, 182e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_session_t; 183e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1841e92ed5e83474c157237de18af5b2201095f37e3Eric Laurent/* a unique ID allocated by AudioFlinger for use as a audio_io_handle_t or audio_session_t */ 1851e92ed5e83474c157237de18af5b2201095f37e3Eric Laurenttypedef int audio_unique_id_t; 1861e92ed5e83474c157237de18af5b2201095f37e3Eric Laurent 1871e92ed5e83474c157237de18af5b2201095f37e3Eric Laurent#define AUDIO_UNIQUE_ID_ALLOCATE AUDIO_SESSION_ALLOCATE 1881e92ed5e83474c157237de18af5b2201095f37e3Eric Laurent 189e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* Audio sub formats (see enum audio_format). */ 190e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 191e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* PCM sub formats */ 192e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 193c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten /* All of these are in native byte order */ 1949714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 1959714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 1969714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 1979714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 7.24 fixed point */ 1981c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 199c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6, /* PCM signed .23 fixed point packed in 3 bytes */ 200e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_pcm_sub_fmt_t; 201e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 2021c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* The audio_format_*_sub_fmt_t declarations are not currently used */ 2031c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten 204e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 205e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * frame header to specify bit rate, stereo mode, version... 206e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 207e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 208e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 209e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_mp3_sub_fmt_t; 210e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 211e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* AMR NB/WB sub format field definition: specify frame block interleaving, 212e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * bandwidth efficient or octet aligned, encoding mode for recording... 213e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 214e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 215e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 216e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_amr_sub_fmt_t; 217e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 218e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* AAC sub format field definition: specify profile or bitrate for recording... */ 219e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 220923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_MAIN = 0x1, 221923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LC = 0x2, 222923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SSR = 0x4, 223923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LTP = 0x8, 224923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V1 = 0x10, 225923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SCALABLE = 0x20, 226923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ERLC = 0x40, 227923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LD = 0x80, 228923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V2 = 0x100, 229923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ELD = 0x200, 230e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_aac_sub_fmt_t; 231e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 232e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin/* VORBIS sub format field definition: specify quality for recording... */ 233e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 234e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 235e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_vorbis_sub_fmt_t; 236e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 2371c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* Audio format consists of a main format field (upper 8 bits) and a sub format 238e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * field (lower 24 bits). 239e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * 240e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * The main format indicates the main codec type. The sub format field 241e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * indicates options and parameters for each format. The sub format is mainly 242e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * used for record to indicate for instance the requested bitrate or profile. 243e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * It can also be used for certain formats to give informations not present in 244e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin * the encoded audio stream (e.g. octet alignement for AMR). 245e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin */ 246e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 247e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 248e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_DEFAULT = 0, 249e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 250e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MP3 = 0x01000000UL, 251e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_NB = 0x02000000UL, 252e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AMR_WB = 0x03000000UL, 253e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_AAC = 0x04000000UL, 254923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V1*/ 255923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V2*/ 256e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_VORBIS = 0x07000000UL, 25776edb1c0e644fe9f0b9f93939647a34123a60063Vignesh Venkatasubramanian AUDIO_FORMAT_OPUS = 0x08000000UL, 258ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent AUDIO_FORMAT_AC3 = 0x09000000UL, 259ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent AUDIO_FORMAT_E_AC3 = 0x0A000000UL, 260e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, 261e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 262e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 263e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* Aliases */ 2641c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* note != AudioFormat.ENCODING_PCM_16BIT */ 265e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 266e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_SUB_16_BIT), 2671c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* note != AudioFormat.ENCODING_PCM_8BIT */ 268e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 269e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_FORMAT_PCM_SUB_8_BIT), 2709714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 2719714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_32_BIT), 2729714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 2739714b27bb41d999cb61b22833d3f253552b3c82bEric Laurent AUDIO_FORMAT_PCM_SUB_8_24_BIT), 2741c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 2751c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_FORMAT_PCM_SUB_FLOAT), 276c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_24_BIT_PACKED = (AUDIO_FORMAT_PCM | 277c0a51093a2604b27f7d78f88eecaea15ac744f2eGlenn Kasten AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED), 278923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_MAIN = (AUDIO_FORMAT_AAC | 279923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_MAIN), 280923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LC = (AUDIO_FORMAT_AAC | 281923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LC), 282923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SSR = (AUDIO_FORMAT_AAC | 283923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SSR), 284923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LTP = (AUDIO_FORMAT_AAC | 285923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LTP), 286923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_HE_V1 = (AUDIO_FORMAT_AAC | 287923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V1), 288923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SCALABLE = (AUDIO_FORMAT_AAC | 289923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_SCALABLE), 290923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_ERLC = (AUDIO_FORMAT_AAC | 291923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ERLC), 292923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_LD = (AUDIO_FORMAT_AAC | 293923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_LD), 294923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_HE_V2 = (AUDIO_FORMAT_AAC | 295923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_HE_V2), 296923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_ELD = (AUDIO_FORMAT_AAC | 297923e740879c871e0c3806f7c6df77093e715bb38aarti jadhav-gaikwad AUDIO_FORMAT_AAC_SUB_ELD), 298e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_format_t; 299e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 300432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* For the channel mask for position assignment representation */ 30116a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastenenum { 302432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 303432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These can be a complete audio_channel_mask_t. */ 304432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 3054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_CHANNEL_NONE = 0x0, 306432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_INVALID = 0xC0000000, 307432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 308432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These can be the bits portion of an audio_channel_mask_t 309432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * with representation AUDIO_CHANNEL_REPRESENTATION_POSITION. 310432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Using these bits as a complete audio_channel_mask_t is deprecated. 311432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 312432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 313e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* output channels */ 3146d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 3156d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 3166d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 3176d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 3186d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 3196d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 3206d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 3216d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 3226d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 3236d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 3246d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 3256d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 3266d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 3276d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 3286d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 3296d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 3306d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 3316d4f39754bff9c1dcb8023839ea583b6d0723b14Jean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 332e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 333432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* TODO: should these be considered complete channel masks, or only bits? */ 334432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 335e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 336e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 337e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT), 338e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 339e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 340e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 341e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT), 342b8d59396dfb3b9135bb6dc869aa723ca618bd95dGlenn Kasten AUDIO_CHANNEL_OUT_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD, 343ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten /* like AUDIO_CHANNEL_OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */ 344ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_QUAD_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 345ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_RIGHT | 346ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_LEFT | 347ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_RIGHT), 348e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_5POINT1 = (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), 354b8d59396dfb3b9135bb6dc869aa723ca618bd95dGlenn Kasten AUDIO_CHANNEL_OUT_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1, 355ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten /* like AUDIO_CHANNEL_OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */ 356ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_5POINT1_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 357ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_RIGHT | 358ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_FRONT_CENTER | 359ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 360ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_LEFT | 361ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten AUDIO_CHANNEL_OUT_SIDE_RIGHT), 36233fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 363e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 364e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 365e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_CENTER | 366e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 367e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 368e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT | 36933fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT | 37033fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT), 371e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 372e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT | 373e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_CENTER | 374e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 375e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_LEFT | 376e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_BACK_RIGHT | 377e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 378e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 37933fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_BACK_CENTER| 38033fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_LEFT| 38133fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_SIDE_RIGHT| 38233fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_CENTER| 38333fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 38433fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 38533fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 38633fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 38733fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 38833fad99acfaffb775ce0792b06ba97bb6cacce1aJean-Michel Trivi AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 389e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 390432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* These are bits only, not complete values */ 391432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 392e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* input channels */ 393e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT = 0x4, 394e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT = 0x8, 395e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT = 0x10, 396e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK = 0x20, 397e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 398e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 399e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 400e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 401e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_PRESSURE = 0x400, 402e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_X_AXIS = 0x800, 403e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 404e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 405e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 406e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 407e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 408432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* TODO: should these be considered complete channel masks, or only bits, or deprecated? */ 409432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 410e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 411e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 4126c70ceeefe4cd2838b5788f6db8eb35751a5ce21Eric Laurent AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 413e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 414e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT | 415e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT | 416e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK| 417e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_LEFT_PROCESSED | 418e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 419e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_FRONT_PROCESSED | 420e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_BACK_PROCESSED| 421e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_PRESSURE | 422e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_X_AXIS | 423e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Y_AXIS | 424e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_Z_AXIS | 425e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_UPLINK | 426e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_CHANNEL_IN_VOICE_DNLINK), 4274ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi}; 4284ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi 429ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten/* A channel mask per se only defines the presence or absence of a channel, not the order. 430ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * But see AUDIO_INTERLEAVE_* below for the platform convention of order. 431432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 432432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * audio_channel_mask_t is an opaque type and its internal layout should not 433432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * be assumed as it may change in the future. 434432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Instead, always use the functions declared in this header to examine. 435432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 436432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * These are the current representations: 437432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 438432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * AUDIO_CHANNEL_REPRESENTATION_POSITION 439432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is a channel mask representation for position assignment. 440432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Each low-order bit corresponds to the spatial position of a transducer (output), 441432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or interpretation of channel (input). 442432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * The user of a channel mask needs to know the context of whether it is for output or input. 443432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * The constants AUDIO_CHANNEL_OUT_* or AUDIO_CHANNEL_IN_* apply to the bits portion. 444432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * It is not permitted for no bits to be set. 445432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 446432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * AUDIO_CHANNEL_REPRESENTATION_INDEX 447432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is a channel mask representation for index assignment. 448432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Each low-order bit corresponds to a selected channel. 449432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * There is no platform interpretation of the various bits. 450432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * There is no concept of output or input. 451432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * It is not permitted for no bits to be set. 452432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 453432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * All other representations are reserved for future use. 454432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * 455432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Warning: current representation distinguishes between input and output, but this will not the be 456432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * case in future revisions of the platform. Wherever there is an ambiguity between input and output 457432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * that is currently resolved by checking the channel mask, the implementer should look for ways to 458432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * fix it with additional information outside of the mask. 459ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten */ 4604ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivitypedef uint32_t audio_channel_mask_t; 461e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 462432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Maximum number of channels for all representations */ 463432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten#define AUDIO_CHANNEL_COUNT_MAX 30 464432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 465432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* log(2) of maximum number of representations, not part of public API */ 466432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten#define AUDIO_CHANNEL_REPRESENTATION_LOG2 2 467432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 468432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Representations */ 469432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastentypedef enum { 470432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION = 0, // must be zero for compatibility 471432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // 1 is reserved for future use 472432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX = 2, 473432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // 3 is reserved for future use 474432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} audio_channel_representation_t; 475432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 476432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* The return value is undefined if the channel mask is invalid. */ 477432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline uint32_t audio_channel_mask_get_bits(audio_channel_mask_t channel) 478432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 479432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return channel & ((1 << AUDIO_CHANNEL_COUNT_MAX) - 1); 480432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 481432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 482432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* The return value is undefined if the channel mask is invalid. */ 483432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_representation_t audio_channel_mask_get_representation( 484432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_mask_t channel) 485432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 486432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // The right shift should be sufficient, but also "and" for safety in case mask is not 32 bits 487432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return (audio_channel_representation_t) 488432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten ((channel >> AUDIO_CHANNEL_COUNT_MAX) & ((1 << AUDIO_CHANNEL_REPRESENTATION_LOG2) - 1)); 489432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 490432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 491432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if the channel mask is valid, 492432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or returns false for AUDIO_CHANNEL_NONE, AUDIO_CHANNEL_INVALID, and other invalid values. 493432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * This function is unable to determine whether a channel mask for position assignment 494432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * is invalid because an output mask has an invalid output bit set, 495432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or because an input mask has an invalid input bit set. 496432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * All other APIs that take a channel mask assume that it is valid. 497432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 498432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline bool audio_channel_mask_is_valid(audio_channel_mask_t channel) 499432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 500432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 501432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_representation_t representation = audio_channel_mask_get_representation(channel); 502432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (representation) { 503432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 504432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 505432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 506432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 507432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 508432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 509432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 510432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 511432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 512432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 513432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Not part of public API */ 514432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_from_representation_and_bits( 515432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten audio_channel_representation_t representation, uint32_t bits) 516432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 517432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return (audio_channel_mask_t) ((representation << AUDIO_CHANNEL_COUNT_MAX) | bits); 518432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 519432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 5201c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* Expresses the convention when stereo audio samples are stored interleaved 5211c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * in an array. This should improve readability by allowing code to use 5221c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten * symbolic indices instead of hard-coded [0] and [1]. 523ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * 524ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * For multi-channel beyond stereo, the platform convention is that channels 525ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * are interleaved in order from least significant channel mask bit 526ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * to most significant channel mask bit, with unused bits skipped. 527ee7c17b7fc816393afcc7e8dbe751c55a512495bGlenn Kasten * Any exceptions to this convention will be noted at the appropriate API. 5281c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten */ 5291c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kastenenum { 5301c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_INTERLEAVE_LEFT = 0, 5311c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_INTERLEAVE_RIGHT = 1, 5321c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten}; 5331c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten 534e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 535e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_INVALID = -2, 536e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_CURRENT = -1, 537e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_NORMAL = 0, 538e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_RINGTONE = 1, 539e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_IN_CALL = 2, 540e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_IN_COMMUNICATION = 3, 541e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 542e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_CNT, 543e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 544e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_mode_t; 545e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 5461c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten/* This enum is deprecated */ 547e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavintypedef enum { 5481c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten AUDIO_IN_ACOUSTICS_NONE = 0, 549e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 550e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 551e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 552e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 553e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 554e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 555e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} audio_in_acoustics_t; 556e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 55716a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastenenum { 558eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_NONE = 0x0, 559eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent /* reserved bits */ 560eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_BIT_IN = 0x80000000, 561eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 562e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* output devices */ 563e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_EARPIECE = 0x1, 564e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_SPEAKER = 0x2, 565e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 566e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 567e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 568e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 569e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 570e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 571e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 572e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 573e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 574abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT_AUX_DIGITAL, 5751c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 576e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 577e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 5781c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 57979f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 5801c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten /* USB host mode: your Android device is a USB host and the dock is a USB device */ 58179f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 582eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 583abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Telephony voice TX path */ 584abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000, 585abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Analog jack with line impedance detected */ 586abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_LINE = 0x20000, 587abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* HDMI Audio Return Channel */ 588abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000, 589abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* S/PDIF out */ 590abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_SPDIF = 0x80000, 591abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* FM transmitter out */ 592abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_FM = 0x100000, 593cadd5bb70eae200d744f115fd63c3ebe17069db8Jungshik Jang /* Line out for av devices */ 594cadd5bb70eae200d744f115fd63c3ebe17069db8Jungshik Jang AUDIO_DEVICE_OUT_AUX_LINE = 0x200000, 595fcfa86403e206e2caa519299939480cb45deb8baJon Eklund /* limited-output speaker device for acoustic safety */ 596fcfa86403e206e2caa519299939480cb45deb8baJon Eklund AUDIO_DEVICE_OUT_SPEAKER_SAFE = 0x400000, 597eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 598e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 599e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_SPEAKER | 600e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADSET | 601e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 602e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 603e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 604e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 605e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 606e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 607e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 608abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI | 609e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 610e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 61179f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_ACCESSORY | 61279f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE | 613eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 614abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_TELEPHONY_TX | 615abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_LINE | 616abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_HDMI_ARC | 617abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_SPDIF | 618abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_OUT_FM | 619cadd5bb70eae200d744f115fd63c3ebe17069db8Jungshik Jang AUDIO_DEVICE_OUT_AUX_LINE | 620fcfa86403e206e2caa519299939480cb45deb8baJon Eklund AUDIO_DEVICE_OUT_SPEAKER_SAFE | 621e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_DEFAULT), 622e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 623e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 624e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 625e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 626e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 627e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 62879f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 62979f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent AUDIO_DEVICE_OUT_USB_DEVICE), 630e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 631e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin /* input devices */ 632eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 633eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 634eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 635eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 636eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 637eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 638abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL, 639abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Telephony voice RX path */ 640eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 641abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TELEPHONY_RX = AUDIO_DEVICE_IN_VOICE_CALL, 642eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 643eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 644eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 645eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 646eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 647eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 648abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* FM tuner input */ 649abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_FM_TUNER = AUDIO_DEVICE_BIT_IN | 0x2000, 650abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* TV tuner input */ 651abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TV_TUNER = AUDIO_DEVICE_BIT_IN | 0x4000, 652abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* Analog jack with line impedance detected */ 653abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_LINE = AUDIO_DEVICE_BIT_IN | 0x8000, 654abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent /* S/PDIF in */ 655abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_SPDIF = AUDIO_DEVICE_BIT_IN | 0x10000, 656c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood AUDIO_DEVICE_IN_BLUETOOTH_A2DP = AUDIO_DEVICE_BIT_IN | 0x20000, 657b63dd8a005ad3133915a949e6b31e81d51007688Terry Heo AUDIO_DEVICE_IN_LOOPBACK = AUDIO_DEVICE_BIT_IN | 0x40000, 658eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 659e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 660e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 661e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_AMBIENT | 662e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BUILTIN_MIC | 663e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 664e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_WIRED_HEADSET | 665abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_HDMI | 666abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TELEPHONY_RX | 667e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_BACK_MIC | 668eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_REMOTE_SUBMIX | 669eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 670eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 671eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_ACCESSORY | 672eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent AUDIO_DEVICE_IN_USB_DEVICE | 673abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_FM_TUNER | 674abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_TV_TUNER | 675abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_LINE | 676abcb99927d9ad3f66288a5ce16d7c86c14b49249Eric Laurent AUDIO_DEVICE_IN_SPDIF | 677c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 678b63dd8a005ad3133915a949e6b31e81d51007688Terry Heo AUDIO_DEVICE_IN_LOOPBACK | 679e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_DEFAULT), 680e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 68100b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean AUDIO_DEVICE_IN_ALL_USB = (AUDIO_DEVICE_IN_USB_ACCESSORY | 68200b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean AUDIO_DEVICE_IN_USB_DEVICE), 68316a7a0443a59c636ab20a3161ec630d037766eccGlenn Kasten}; 68416a7a0443a59c636ab20a3161ec630d037766eccGlenn Kasten 68516a7a0443a59c636ab20a3161ec630d037766eccGlenn Kastentypedef uint32_t audio_devices_t; 686e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 687545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent/* the audio output flags serve two purposes: 688545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * - when an AudioTrack is created they indicate a "wish" to be connected to an 689545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * output stream with attributes corresponding to the specified flags 690545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * - when present in an output profile descriptor listed for a particular audio 691545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * hardware module, they indicate that an output stream can be opened that 692545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * supports the attributes indicated by the flags. 693545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * the audio policy manager will try to match the flags in the request 694545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent * (when getOuput() is called) to an available output stream. 695545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent */ 696545ab46063f083239b29e59b8b491656d93f2a38Eric Laurenttypedef enum { 6979aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 6989aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 6999aec362e76a60725df1a444214f222297caf46a2Eric Laurent // to one output stream: no software mixer 7009aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 7019aec362e76a60725df1a444214f222297caf46a2Eric Laurent // the device. It is unique and must be 7029aec362e76a60725df1a444214f222297caf46a2Eric Laurent // present. It is opened by default and 7039aec362e76a60725df1a444214f222297caf46a2Eric Laurent // receives routing, audio mode and volume 7049aec362e76a60725df1a444214f222297caf46a2Eric Laurent // controls related to voice calls. 7059aec362e76a60725df1a444214f222297caf46a2Eric Laurent AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 7069aec362e76a60725df1a444214f222297caf46a2Eric Laurent // defined elsewhere 70705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 70805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 70905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald // streams to hardware codec 710d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, // use non-blocking write 711d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent AUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40 // output uses a hardware A/V synchronization source 712545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent} audio_output_flags_t; 713545ab46063f083239b29e59b8b491656d93f2a38Eric Laurent 714c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten/* The audio input flags are analogous to audio output flags. 715c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * Currently they are used only when an AudioRecord is created, 716c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * to indicate a preference to be connected to an input stream with 717c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten * attributes corresponding to the specified flags. 718c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten */ 719c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kastentypedef enum { 720f6cce347a73e3b3da9ff6698ead25b5a543ce47bEric Laurent AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 721f6cce347a73e3b3da9ff6698ead25b5a543ce47bEric Laurent AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 722f6cce347a73e3b3da9ff6698ead25b5a543ce47bEric Laurent AUDIO_INPUT_FLAG_HW_HOTWORD = 0x2, // prefer an input that captures from hw hotword source 723c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten} audio_input_flags_t; 724c051ffd7c24bbe989c9e39c793c6bbbac3ee3effGlenn Kasten 72505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald/* Additional information about compressed streams offloaded to 72605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * hardware playback 72705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * The version and size fields must be initialized by the caller by using 72805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald * one of the constants defined here. 72905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald */ 73005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgeraldtypedef struct { 73105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint16_t version; // version of the info structure 73205529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint16_t size; // total size of the structure including version and size 73305529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint32_t sample_rate; // sample rate in Hz 73405529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_channel_mask_t channel_mask; // channel mask 73505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_format_t format; // audio format 73605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald audio_stream_type_t stream_type; // stream type 73705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald uint32_t bit_rate; // bit rate in bits per second 73805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald int64_t duration_us; // duration in microseconds, -1 if unknown 73905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald bool has_video; // true if stream is tied to a video stream 74005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald bool is_streaming; // true if streaming, false if local playback 74105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald} audio_offload_info_t; 74205529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 74305529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 74405529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald ((((maj) & 0xff) << 8) | ((min) & 0xff)) 74505529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 74605529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 74705529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 74805529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 74905529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgeraldstatic const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 75005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 75105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald size: sizeof(audio_offload_info_t), 7524887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn sample_rate: 0, 7534887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn channel_mask: 0, 7544887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn format: AUDIO_FORMAT_DEFAULT, 7554887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn stream_type: AUDIO_STREAM_VOICE_CALL, 7564887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn bit_rate: 0, 7574887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn duration_us: 0, 7584887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn has_video: false, 7594887842c925f304dc862bdd5810f27cdd2eaedcbMark Salyzyn is_streaming: false 76005529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald}; 76105529a1a10711d93745a9fcf07520f65a3eb4f3dRichard Fitzgerald 7620a381a379d00f708a0dfe4da758697128177749aEric Laurent/* common audio stream configuration parameters 7630a381a379d00f708a0dfe4da758697128177749aEric Laurent * You should memset() the entire structure to zero before use to 7640a381a379d00f708a0dfe4da758697128177749aEric Laurent * ensure forward compatibility 7650a381a379d00f708a0dfe4da758697128177749aEric Laurent */ 7660a381a379d00f708a0dfe4da758697128177749aEric Laurentstruct audio_config { 7670a381a379d00f708a0dfe4da758697128177749aEric Laurent uint32_t sample_rate; 7680a381a379d00f708a0dfe4da758697128177749aEric Laurent audio_channel_mask_t channel_mask; 7690a381a379d00f708a0dfe4da758697128177749aEric Laurent audio_format_t format; 7700a381a379d00f708a0dfe4da758697128177749aEric Laurent audio_offload_info_t offload_info; 7710a381a379d00f708a0dfe4da758697128177749aEric Laurent size_t frame_count; 7720a381a379d00f708a0dfe4da758697128177749aEric Laurent}; 7730a381a379d00f708a0dfe4da758697128177749aEric Laurenttypedef struct audio_config audio_config_t; 7740a381a379d00f708a0dfe4da758697128177749aEric Laurent 7750a381a379d00f708a0dfe4da758697128177749aEric Laurentstatic const audio_config_t AUDIO_CONFIG_INITIALIZER = { 7760a381a379d00f708a0dfe4da758697128177749aEric Laurent sample_rate: 0, 7770a381a379d00f708a0dfe4da758697128177749aEric Laurent channel_mask: AUDIO_CHANNEL_NONE, 7780a381a379d00f708a0dfe4da758697128177749aEric Laurent format: AUDIO_FORMAT_DEFAULT, 7790a381a379d00f708a0dfe4da758697128177749aEric Laurent offload_info: { 7800a381a379d00f708a0dfe4da758697128177749aEric Laurent version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 7810a381a379d00f708a0dfe4da758697128177749aEric Laurent size: sizeof(audio_offload_info_t), 7820a381a379d00f708a0dfe4da758697128177749aEric Laurent sample_rate: 0, 7830a381a379d00f708a0dfe4da758697128177749aEric Laurent channel_mask: 0, 7840a381a379d00f708a0dfe4da758697128177749aEric Laurent format: AUDIO_FORMAT_DEFAULT, 7850a381a379d00f708a0dfe4da758697128177749aEric Laurent stream_type: AUDIO_STREAM_VOICE_CALL, 7860a381a379d00f708a0dfe4da758697128177749aEric Laurent bit_rate: 0, 7870a381a379d00f708a0dfe4da758697128177749aEric Laurent duration_us: 0, 7880a381a379d00f708a0dfe4da758697128177749aEric Laurent has_video: false, 7890a381a379d00f708a0dfe4da758697128177749aEric Laurent is_streaming: false 7900a381a379d00f708a0dfe4da758697128177749aEric Laurent }, 7910a381a379d00f708a0dfe4da758697128177749aEric Laurent frame_count: 0, 7920a381a379d00f708a0dfe4da758697128177749aEric Laurent}; 7930a381a379d00f708a0dfe4da758697128177749aEric Laurent 7944cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7954cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* audio hw module handle functions or structures referencing a module */ 7964cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_module_handle_t; 7974cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 7984cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/****************************** 7994cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Volume control 8004cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent *****************************/ 8014cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8024cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* If the audio hardware supports gain control on some audio paths, 8034cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * the platform can expose them in the audio_policy.conf file. The audio HAL 8044cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * will then implement gain control functions that will use the following data 8054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * structures. */ 8064cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8074cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Type of gain control exposed by an audio port */ 8084cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_JOINT 0x1 /* supports joint channel gain control */ 8094cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_CHANNELS 0x2 /* supports separate channel gain control */ 8104cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_GAIN_MODE_RAMP 0x4 /* supports gain ramps */ 8114cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8124cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef uint32_t audio_gain_mode_t; 8134cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8144cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8154cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* An audio_gain struct is a representation of a gain stage. 8164cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * A gain stage is always attached to an audio port. */ 8174cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_gain { 8184cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_gain_mode_t mode; /* e.g. AUDIO_GAIN_MODE_JOINT */ 8194cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channels which gain an be controlled. 8204cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent N/A if AUDIO_GAIN_MODE_CHANNELS is not supported */ 8214cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int min_value; /* minimum gain value in millibels */ 8224cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int max_value; /* maximum gain value in millibels */ 8234cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int default_value; /* default gain value in millibels */ 8244cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int step_value; /* gain step in millibels */ 8254cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int min_ramp_ms; /* minimum ramp duration in ms */ 8264cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int max_ramp_ms; /* maximum ramp duration in ms */ 8274cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8284cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8294cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* The gain configuration structure is used to get or set the gain values of a 8304cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * given port */ 8314cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_gain_config { 8324cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent int index; /* index of the corresponding audio_gain in the 8334cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port gains[] table */ 8344cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_gain_mode_t mode; /* mode requested for this command */ 8354cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channels which gain value follows. 8364cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent N/A in joint mode */ 837f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang int values[sizeof(audio_channel_mask_t) * 8]; /* gain values in millibels 838f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang for each channel ordered from LSb to MSb in 839f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang channel mask. The number of values is 1 in joint 840f7e5aeadb71cf786bea6a9ee8c86069e939e8267Jungshik Jang mode or popcount(channel_mask) */ 8414cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int ramp_duration_ms; /* ramp duration in ms */ 8424cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8434cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8444cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/****************************** 8454cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Routing control 8464cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent *****************************/ 8474cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8484cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Types defined here are used to describe an audio source or sink at internal 8494cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * framework interfaces (audio policy, patch panel) or at the audio HAL. 8504cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Sink and sources are grouped in a concept of “audio port” representing an 8514cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * audio end point at the edge of the system managed by the module exposing 8524cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * the interface. */ 8534cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8544cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Audio port role: either source or sink */ 8554cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 8564cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_NONE, 8574cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_SOURCE, 8584cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_ROLE_SINK, 8594cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_port_role_t; 8604cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8614cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Audio port type indicates if it is a session (e.g AudioTrack), 8624cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * a mix (e.g PlaybackThread output) or a physical device 8634cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8644cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 8654cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_NONE, 8664cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_DEVICE, 8674cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_MIX, 8684cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_TYPE_SESSION, 8694cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_port_type_t; 8704cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8714cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Each port has a unique ID or handle allocated by policy manager */ 8724cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_port_handle_t; 8734cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_HANDLE_NONE 0 8744cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8754cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8764cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* maximum audio device address length */ 8774cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_DEVICE_MAX_ADDRESS_LEN 32 8784cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8794cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is a 8804cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * hardware device */ 8814cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_device_ext { 8824cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the device is attached to */ 8834cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8844cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; /* device address. "" if N/A */ 8854cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8864cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8874cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is a 8884cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * sub mix */ 8894cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_mix_ext { 8904cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the stream is attached to */ 8914cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_io_handle_t handle; /* I/O handle of the input/output stream */ 8924cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 8934cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent //TODO: change use case for output streams: use strategy and mixer attributes 8944cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_stream_type_t stream; 8954cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_source_t source; 8964cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } usecase; 8974cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 8984cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 8994cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port configuration structure when the audio port is an 9004cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * audio session */ 9014cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config_session_ext { 9024cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_session_t session; /* audio session */ 9034cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9044cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Flags indicating which fields are to be considered in struct audio_port_config */ 9064cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_SAMPLE_RATE 0x1 9074cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_CHANNEL_MASK 0x2 9084cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_FORMAT 0x4 9094cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_GAIN 0x8 9104cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_CONFIG_ALL (AUDIO_PORT_CONFIG_SAMPLE_RATE | \ 9114cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_CHANNEL_MASK | \ 9124cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_FORMAT | \ 9134cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_PORT_CONFIG_GAIN) 9144cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9154cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* audio port configuration structure used to specify a particular configuration of 9164cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * an audio port */ 9174cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_config { 9184cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_handle_t id; /* port unique ID */ 9194cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_role_t role; /* sink or source */ 9204cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_type_t type; /* device, mix ... */ 9214cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int config_mask; /* e.g AUDIO_PORT_CONFIG_ALL */ 9224cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int sample_rate; /* sampling rate in Hz */ 9234cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_mask; /* channel mask if applicable */ 9244cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_format_t format; /* format if applicable */ 9254cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_gain_config gain; /* gain to apply if applicable */ 9264cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 9274cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_device_ext device; /* device specific info */ 9284cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_mix_ext mix; /* mix specific info */ 9294cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config_session_ext session; /* session specific info */ 9304cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } ext; 9314cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9324cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9334cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9344cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of sampling rates in audio port */ 9354cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_SAMPLING_RATES 16 9364cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of channel masks in audio port */ 9374cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_CHANNEL_MASKS 16 9384cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of audio formats in audio port */ 9394cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_FORMATS 16 9404cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* max number of gain controls in audio port */ 9414cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PORT_MAX_GAINS 16 9424cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9434cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is a hardware device */ 9444cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_device_ext { 9454cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the device is attached to */ 9464cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9474cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 9484cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9494cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9504cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* Latency class of the audio mix */ 9514cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef enum { 9524cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_LATENCY_LOW, 9534cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent AUDIO_LATENCY_NORMAL, 9544cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent} audio_mix_latency_class_t; 9554cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9564cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is a sub mix */ 9574cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_mix_ext { 9584cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_module_handle_t hw_module; /* module the stream is attached to */ 9594cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_io_handle_t handle; /* I/O handle of the input.output stream */ 9604cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_mix_latency_class_t latency_class; /* latency class */ 9614cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent // other attributes: routing strategies 9624cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9634cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9644cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* extension for audio port structure when the audio port is an audio session */ 9654cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port_session_ext { 9664cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_session_t session; /* audio session */ 9674cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9684cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9694cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9704cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_port { 9714cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_handle_t id; /* port unique ID */ 9724cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_role_t role; /* sink or source */ 9734cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_port_type_t type; /* device, mix ... */ 9744cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sample_rates; /* number of sampling rates in following array */ 9754cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int sample_rates[AUDIO_PORT_MAX_SAMPLING_RATES]; 9764cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_channel_masks; /* number of channel masks in following array */ 9774cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_channel_mask_t channel_masks[AUDIO_PORT_MAX_CHANNEL_MASKS]; 9784cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_formats; /* number of formats in following array */ 9794cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_format_t formats[AUDIO_PORT_MAX_FORMATS]; 9804cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_gains; /* number of gains in following array */ 9814cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_gain gains[AUDIO_PORT_MAX_GAINS]; 9824cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config active_config; /* current audio port configuration */ 9834cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent union { 9844cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_device_ext device; 9854cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_mix_ext mix; 9864cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_session_ext session; 9874cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent } ext; 9884cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 9894cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 9904cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent/* An audio patch represents a connection between one or more source ports and 9914cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * one or more sink ports. Patches are connected and disconnected by audio policy manager or by 9924cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * applications via framework APIs. 9934cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * Each patch is identified by a handle at the interface used to create that patch. For instance, 9944cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * when a patch is created by the audio HAL, the HAL allocates and returns a handle. 9954cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * This handle is unique to a given audio HAL hardware module. 9964cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * But the same patch receives another system wide unique handle allocated by the framework. 9974cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent * This unique handle is used for all transactions inside the framework. 9984cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent */ 9994cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurenttypedef int audio_patch_handle_t; 10004cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PATCH_HANDLE_NONE 0 10014cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 10024cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent#define AUDIO_PATCH_PORTS_MAX 16 10034cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 10044cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurentstruct audio_patch { 10054cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent audio_patch_handle_t id; /* patch unique ID */ 10064cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sources; /* number of sources in following array */ 10074cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX]; 10084cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent unsigned int num_sinks; /* number of sinks in following array */ 10094cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX]; 10104cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent}; 10114cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 10124cd050121fd22c0f7277a988d548d0e8f327a760Eric Laurent 1013d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent 1014d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent/* a HW synchronization source returned by the audio HAL */ 1015d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurenttypedef uint32_t audio_hw_sync_t; 1016d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent 1017d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent/* an invalid HW synchronization source indicating an error */ 1018d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent#define AUDIO_HW_SYNC_INVALID 0 1019d91e6df901eeebadb92a0361796a387c5b0ceec0Eric Laurent 1020e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_output_device(audio_devices_t device) 1021e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1022eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 1023eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 1024e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 1025e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin else 1026e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1027e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1028e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1029e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_input_device(audio_devices_t device) 1030e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1031eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 1032eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent device &= ~AUDIO_DEVICE_BIT_IN; 1033eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 1034eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return true; 1035eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent } 1036eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return false; 1037e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1038e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1039eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurentstatic inline bool audio_is_output_devices(audio_devices_t device) 1040eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent{ 1041eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent return (device & AUDIO_DEVICE_BIT_IN) == 0; 1042eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent} 1043eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent 1044c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_in_device(audio_devices_t device) 1045c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood{ 1046c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 1047c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood device &= ~AUDIO_DEVICE_BIT_IN; 1048c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood if ((popcount(device) == 1) && (device & AUDIO_DEVICE_IN_BLUETOOTH_A2DP)) 1049c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return true; 1050c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood } 1051c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return false; 1052c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood} 1053eeeee802e9837c592b0f0f9fd183bcaa9e77732eEric Laurent 1054c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_out_device(audio_devices_t device) 1055e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1056e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 1057e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 1058e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin else 1059e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1060e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1061e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1062c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood// Deprecated - use audio_is_a2dp_out_device() instead 1063c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwoodstatic inline bool audio_is_a2dp_device(audio_devices_t device) 1064c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood{ 1065c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood return audio_is_a2dp_out_device(device); 1066c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood} 1067c8183af4b3a3515f8f0cff27b2808a7139f18230Mike Lockwood 1068e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavinstatic inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 1069e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1070b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((device & AUDIO_DEVICE_BIT_IN) == 0) { 1071b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL_SCO) == 0)) 1072b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return true; 1073b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent } else { 1074b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent device &= ~AUDIO_DEVICE_BIT_IN; 1075b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) == 0)) 1076b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return true; 1077b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent } 1078b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent 1079b526630ab843f9a405be23618d5808d8e65755f3Eric Laurent return false; 1080e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1081e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 108200b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLeanstatic inline bool audio_is_usb_out_device(audio_devices_t device) 108300b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean{ 108400b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)); 108500b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean} 108600b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean 108700b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLeanstatic inline bool audio_is_usb_in_device(audio_devices_t device) 108800b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean{ 108900b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 109000b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean device &= ~AUDIO_DEVICE_BIT_IN; 109100b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean if (popcount(device) == 1 && (device & AUDIO_DEVICE_IN_ALL_USB) != 0) 109200b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return true; 109300b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean } 109400b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return false; 109500b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean} 109600b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean 109700b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean/* OBSOLETE - use audio_is_usb_out_device() instead. */ 109879f90bdc7de561aa31888948c0661568ccc33da1Eric Laurentstatic inline bool audio_is_usb_device(audio_devices_t device) 109979f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent{ 110000b8972062fb32dd02bcac7821a6612ce27ebd86Paul McLean return audio_is_usb_out_device(device); 110179f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent} 110279f90bdc7de561aa31888948c0661568ccc33da1Eric Laurent 1103e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivistatic inline bool audio_is_remote_submix_device(audio_devices_t device) 1104e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi{ 11058ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown if ((device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX 11068ecc7afca42d0bb27aad25733790309f71f307d6Jeff Brown || (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX) 1107e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi return true; 1108e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi else 1109e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi return false; 1110e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi} 1111e11866a8799a2357b82c9217c8d6b726726f23feJean-Michel Trivi 1112432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if: 1113432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * representation is valid, and 1114432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there is at least one channel bit set which _could_ correspond to an input channel, and 1115432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there are no channel bits set which could _not_ correspond to an input channel. 1116432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Otherwise returns false. 1117432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1118f7326dc0aa2da2df6bf1fa1ae7ef259a0ebdbd7bGlenn Kastenstatic inline bool audio_is_input_channel(audio_channel_mask_t channel) 1119e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1120432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1121432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1122432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1123432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (bits & ~AUDIO_CHANNEL_IN_ALL) { 1124432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 1125432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1126432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1127432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1128432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 1129432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1130e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1131432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1132e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1133e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1134432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Returns true if: 1135432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * representation is valid, and 1136432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there is at least one channel bit set which _could_ correspond to an output channel, and 1137432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * there are no channel bits set which could _not_ correspond to an output channel. 1138432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Otherwise returns false. 1139432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1140f7326dc0aa2da2df6bf1fa1ae7ef259a0ebdbd7bGlenn Kastenstatic inline bool audio_is_output_channel(audio_channel_mask_t channel) 1141e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1142432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1143432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1144432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1145432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (bits & ~AUDIO_CHANNEL_OUT_ALL) { 1146432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = 0; 1147432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1148432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1149432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1150432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return bits != 0; 1151432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1152e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1153432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1154e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1155e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1156a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung/* Returns the number of channels from an input channel mask, 1157a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung * used in the context of audio input or recording. 1158432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * If a channel bit is set which could _not_ correspond to an input channel, 1159432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * it is excluded from the count. 1160432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns zero if the representation is invalid. 1161a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung */ 1162a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hungstatic inline uint32_t audio_channel_count_from_in_mask(audio_channel_mask_t channel) 1163a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung{ 1164432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1165432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1166432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1167432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // TODO: We can now merge with from_out_mask and remove anding 1168432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits &= AUDIO_CHANNEL_IN_ALL; 1169432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1170432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1171432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return popcount(bits); 1172432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1173432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return 0; 1174432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1175a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung} 1176a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung 1177a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung/* Returns the number of channels from an output channel mask, 1178a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung * used in the context of audio output or playback. 1179432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * If a channel bit is set which could _not_ correspond to an output channel, 1180432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * it is excluded from the count. 1181432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns zero if the representation is invalid. 1182a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung */ 1183a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hungstatic inline uint32_t audio_channel_count_from_out_mask(audio_channel_mask_t channel) 1184a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung{ 1185432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = audio_channel_mask_get_bits(channel); 1186432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten switch (audio_channel_mask_get_representation(channel)) { 1187432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_POSITION: 1188432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // TODO: We can now merge with from_in_mask and remove anding 1189432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits &= AUDIO_CHANNEL_OUT_ALL; 1190432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten // fall through 1191432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case AUDIO_CHANNEL_REPRESENTATION_INDEX: 1192432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return popcount(bits); 1193432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten default: 1194432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return 0; 1195432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1196a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung} 1197a7e8f8615d357357712660d1ed3863c274c2c7bbAndy Hung 1198432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive an output channel mask for position assignment from a channel count. 11994ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 12004ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 12014ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 12024ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi * for continuity with stereo. 1203432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1204432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1205432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 1206432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * configurations for which a default output channel mask is defined. 12074ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi */ 120889f7ba3df8fc359023b494c2e625beed900bc706Glenn Kastenstatic inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 12094ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi{ 1210432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits; 12111c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten switch (channel_count) { 1212432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case 0: 1213432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 12144ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 1: 1215432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_MONO; 1216432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12174ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 2: 1218432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_STEREO; 1219432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12204ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 3: 1221432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER; 1222432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12234ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 4: // 4.0 1224432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_QUAD; 1225432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12264ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 5: // 5.0 1227432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER; 1228432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12294ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 6: // 5.1 1230432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_5POINT1; 1231432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12324ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 7: // 6.1 1233432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER; 1234432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12354ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi case 8: 1236432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_OUT_7POINT1; 1237432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 12384ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi default: 1239432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 12404ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi } 1241432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1242432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 12434ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi} 12444ab051ab4613f2622dc3f3f0f57bb34d8a40a6a9Jean-Michel Trivi 1245432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive an input channel mask for position assignment from a channel count. 1246432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Currently handles only mono and stereo. 1247432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1248432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1249432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 1250432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * configurations for which a default input channel mask is defined. 1251432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 125289f7ba3df8fc359023b494c2e625beed900bc706Glenn Kastenstatic inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 125389f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten{ 1254432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits; 125589f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten switch (channel_count) { 1256432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten case 0: 1257432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 125889f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten case 1: 1259432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_IN_MONO; 1260432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 126189f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten case 2: 1262432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten bits = AUDIO_CHANNEL_IN_STEREO; 1263432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten break; 126489f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten default: 1265432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 1266432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1267432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1268432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 1269432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten} 1270432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten 1271432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten/* Derive a channel mask for index assignment from a channel count. 1272432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * Returns the matching channel mask, 1273432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 1274432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds AUDIO_CHANNEL_COUNT_MAX. 1275432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten */ 1276432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_for_index_assignment_from_count( 1277432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t channel_count) 1278432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten{ 1279432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (channel_count == 0) { 1280432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_NONE; 1281432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten } 1282432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten if (channel_count > AUDIO_CHANNEL_COUNT_MAX) { 1283432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return AUDIO_CHANNEL_INVALID; 128489f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten } 1285432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten uint32_t bits = (1 << channel_count) - 1; 1286432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten return audio_channel_mask_from_representation_and_bits( 1287432b7c6da2bd47c0db9db190b05733a45f744d6cGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX, bits); 128889f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten} 128989f7ba3df8fc359023b494c2e625beed900bc706Glenn Kasten 1290828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline bool audio_is_valid_format(audio_format_t format) 1291e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1292e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin switch (format & AUDIO_FORMAT_MAIN_MASK) { 1293e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_PCM: 129445b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten switch (format) { 129545b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_16_BIT: 129645b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_8_BIT: 129745b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_32_BIT: 129845b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_8_24_BIT: 129945b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_FLOAT: 130045b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten case AUDIO_FORMAT_PCM_24_BIT_PACKED: 130145b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten return true; 130245b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten default: 1303da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return false; 1304da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent } 130545b9581fc9884da4bf60203ece1563e29aac8c96Glenn Kasten /* not reached */ 1306e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_MP3: 1307e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AMR_NB: 1308e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AMR_WB: 1309e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_AAC: 1310e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_HE_AAC_V1: 1311e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_HE_AAC_V2: 1312e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin case AUDIO_FORMAT_VORBIS: 1313ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_OPUS: 1314ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_AC3: 1315ce30de3553ecaaa0a85eec8a788e808630d766b4Eric Laurent case AUDIO_FORMAT_E_AC3: 1316e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return true; 1317e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin default: 1318e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin return false; 1319e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin } 1320e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1321e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1322828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline bool audio_is_linear_pcm(audio_format_t format) 1323e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin{ 1324da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM); 1325da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent} 1326da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent 1327828bf0cdf4e869fa7bb007331670328c834f8277Glenn Kastenstatic inline size_t audio_bytes_per_sample(audio_format_t format) 1328da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent{ 1329da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent size_t size = 0; 1330da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent 1331e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin switch (format) { 1332427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_32_BIT: 1333427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_8_24_BIT: 1334427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(int32_t); 1335427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1336173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung case AUDIO_FORMAT_PCM_24_BIT_PACKED: 1337173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung size = sizeof(uint8_t) * 3; 1338173f4995b075e67abdb1874da9f6e83fd7324a5eAndy Hung break; 1339427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_16_BIT: 1340427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(int16_t); 1341427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1342427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi case AUDIO_FORMAT_PCM_8_BIT: 1343427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi size = sizeof(uint8_t); 1344427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 13451c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten case AUDIO_FORMAT_PCM_FLOAT: 13461c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten size = sizeof(float); 13471c3e16fb40780c010f35119cdf782e6fcb7ce017Glenn Kasten break; 1348427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi default: 1349427d2b43c23c48aedadca008482f495145411e2bJean-Michel Trivi break; 1350e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin } 1351da382248758eacd9f91d6f0a50dff3f021791c24Eric Laurent return size; 1352e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin} 1353e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1354a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent/* converts device address to string sent to audio HAL via set_parameters */ 1355a768c306b2391b8b573f047de3416c693fa50e62Eric Laurentstatic char *audio_device_address_to_parameter(audio_devices_t device, const char *address) 1356a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent{ 1357a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent const size_t kSize = AUDIO_DEVICE_MAX_ADDRESS_LEN + sizeof("a2dp_sink_address="); 1358a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent char param[kSize]; 1359a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent 1360a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent if (device & AUDIO_DEVICE_OUT_ALL_A2DP) 1361a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent snprintf(param, kSize, "%s=%s", "a2dp_sink_address", address); 1362a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent else if (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 1363a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent snprintf(param, kSize, "%s=%s", "mix", address); 1364a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent else 1365a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent snprintf(param, kSize, "%s", address); 1366a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent 1367a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent return strdup(param); 1368a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent} 1369a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent 1370a768c306b2391b8b573f047de3416c693fa50e62Eric Laurent 1371e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin__END_DECLS 1372e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin 1373e8e4be57aa45f621d231a40801a4dea877be09d5Dima Zavin#endif // ANDROID_AUDIO_CORE_H 1374