audio.h revision 6df66e0b5115b1834c8304ed3b5dfe0497e661ba
19bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* 29bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Copyright (C) 2011 The Android Open Source Project 39bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 49bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Licensed under the Apache License, Version 2.0 (the "License"); 59bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * you may not use this file except in compliance with the License. 69bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * You may obtain a copy of the License at 79bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 89bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * http://www.apache.org/licenses/LICENSE-2.0 99bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Unless required by applicable law or agreed to in writing, software 119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * distributed under the License is distributed on an "AS IS" BASIS, 129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * See the License for the specific language governing permissions and 149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * limitations under the License. 159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#ifndef ANDROID_AUDIO_CORE_H 199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define ANDROID_AUDIO_CORE_H 209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <stdbool.h> 229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <stdint.h> 239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <stdio.h> 249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <sys/cdefs.h> 259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <sys/types.h> 269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#include <cutils/bitops.h> 289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand__BEGIN_DECLS 309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 31d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten/* The macro FCC_2 highlights places where there are 2-channel assumptions. 32d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten * This is typically due to legacy implementation of stereo input or output. 33d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten * Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc. 34d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten * Do not change this value. 35d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten */ 36d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten#define FCC_2 2 // FCC_2 = Fixed Channel Count 2 37d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten 38d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten/* The macro FCC_8 highlights places where there are 8-channel assumptions. 39d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten * This is typically due to audio mixer and resampler limitations. 40d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten * Do not change this value without verifying all locations that use it. 41d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten */ 42d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten#define FCC_8 8 // FCC_8 = Fixed Channel Count 8 43d190da511b137d315e8e60b1e1a772444b26bedbGlenn Kasten 449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The enums were moved here mostly from 459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/base/include/media/AudioSystem.h 469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* device address used to refer to the standard remote submix */ 499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS "0" 509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AudioFlinger and AudioPolicy services use I/O handles to identify audio sources and sinks */ 529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_io_handle_t; 539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_IO_HANDLE_NONE 0 549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio stream types */ 569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* These values must kept in sync with 589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/base/media/java/android/media/AudioSystem.java 599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_DEFAULT = -1, 619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_MIN = 0, 629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_VOICE_CALL = 0, 639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_SYSTEM = 1, 649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_RING = 2, 659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_MUSIC = 3, 669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ALARM = 4, 679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_NOTIFICATION = 5, 689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_BLUETOOTH_SCO = 6, 699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user 709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and must be routed to speaker 719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_DTMF = 8, 739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_TTS = 9, /* Transmitted Through Speaker. 749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Plays over speaker only, silent on other devices. 759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ACCESSIBILITY = 10, /* For accessibility talk back prompts */ 779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_REROUTING = 11, /* For dynamic policy output mixes */ 789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_PATCH = 12, /* For internal audio flinger tracks. Fixed volume */ 799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_PUBLIC_CNT = AUDIO_STREAM_TTS + 1, 809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_CNT = AUDIO_STREAM_PATCH + 1, 819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_stream_type_t; 829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_UNKNOWN = 0, 889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_SPEECH = 1, 899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MUSIC = 2, 909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MOVIE = 3, 919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_SONIFICATION = 4, 929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_CNT, 949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MAX = AUDIO_CONTENT_TYPE_CNT - 1, 959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_content_type_t; 969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_UNKNOWN = 0, 1029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_MEDIA = 1, 1039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VOICE_COMMUNICATION = 2, 1049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3, 1059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ALARM = 4, 1069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION = 5, 1079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6, 1089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7, 1099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8, 1109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9, 1119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_EVENT = 10, 1129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11, 1139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12, 1149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_SONIFICATION = 13, 1159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_GAME = 14, 1169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VIRTUAL_SOURCE = 15, 1179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_CNT, 1199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_MAX = AUDIO_USAGE_CNT - 1, 1209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_usage_t; 1219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_flags_mask_t; 1239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 1259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 1269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 128b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_AUDIBILITY_ENFORCED = 0x1, 129b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_SECURE = 0x2, 130b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_SCO = 0x4, 131b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BEACON = 0x8, 132b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_HW_AV_SYNC = 0x10, 133b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_HW_HOTWORD = 0x20, 134b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY = 0x40, 135b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BYPASS_MUTE = 0x80, 13644070ca5ddc92d1fee8f96db12e63b64f6ef96c4Phil Burk AUDIO_FLAG_LOW_LATENCY = 0x100, 1379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 1389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 1409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/MediaRecorder.java, 1419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/av/services/audiopolicy/AudioPolicyService.cpp, 1429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and system/media/audio_effects/include/audio_effects/audio_effects_conf.h! 1439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_DEFAULT = 0, 1469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_MIC = 1, 1479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_UPLINK = 2, 1489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_DOWNLINK = 3, 1499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_CALL = 4, 1509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_CAMCORDER = 5, 1519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_RECOGNITION = 6, 1529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_COMMUNICATION = 7, 1539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_REMOTE_SUBMIX = 8, /* Source for the mix to be presented remotely. */ 1549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* An example of remote presentation is Wifi Display */ 1559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* where a dongle attached to a TV can be used to */ 1569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* play the mix captured by this audio source. */ 157ff9834731ae20dceeaa23b883648b254886f347arago AUDIO_SOURCE_UNPROCESSED = 9, /* Source for unprocessed sound. 158ff9834731ae20dceeaa23b883648b254886f347arago Usage examples include level measurement and raw 159ff9834731ae20dceeaa23b883648b254886f347arago signal analysis. */ 1609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_CNT, 1619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_MAX = AUDIO_SOURCE_CNT - 1, 1629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_FM_TUNER = 1998, 1639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_HOTWORD = 1999, /* A low-priority, preemptible audio source for 1649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand for background software hotword detection. 1659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand Same tuning as AUDIO_SOURCE_VOICE_RECOGNITION. 1669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand Used only internally to the framework. Not exposed 1679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand at the audio HAL. */ 1689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_source_t; 1699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio attributes */ 1719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_ATTRIBUTES_TAGS_MAX_SIZE 256 1729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct { 1739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_content_type_t content_type; 1749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_usage_t usage; 1759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_source_t source; 1769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_flags_mask_t flags; 1779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE]; /* UTF8 */ 1789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_attributes_t; 1799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* special audio session values 1819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (XXX: should this be living in the audio effects land?) 1829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* session for effects attached to a particular output stream 1859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (value must be less than 0) 1869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_OUTPUT_STAGE = -1, 1889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* session for effects applied to output mix. These effects can 1909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * be moved by audio policy manager to another output stream 1919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (value must be 0) 1929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_OUTPUT_MIX = 0, 1949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* application does not specify an explicit session ID to be used, 1969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and requests a new session ID to be allocated 1979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * TODO use unique values for AUDIO_SESSION_OUTPUT_MIX and AUDIO_SESSION_ALLOCATE, 1989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * after all uses have been updated from 0 to the appropriate symbol, and have been tested. 1999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_ALLOCATE = 0, 2019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_session_t; 2029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2036df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten/* a unique ID allocated by AudioFlinger for use as an audio_io_handle_t, audio_session_t, 2046df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten * effect ID (int), audio_module_handle_t, and audio_patch_handle_t. 2056df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten * Audio port IDs (audio_port_handle_t) are allocated by AudioPolicy 2066df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten * in a different namespace than AudioFlinger unique IDs. 2076df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten */ 2089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_unique_id_t; 2099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2106df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten/* Possible uses for an audio_unique_id_t */ 2116df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kastentypedef enum { 2126df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_UNSPECIFIED = 0, 2136df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_SESSION = 1, 2146df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_MODULE = 2, 2156df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_EFFECT = 3, 2166df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_PATCH = 4, 2176df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_OUTPUT = 5, 2186df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_INPUT = 6, 2196df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten // 7 is available 2206df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_MAX = 8, // must be a power-of-two 2216df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten AUDIO_UNIQUE_ID_USE_MASK = AUDIO_UNIQUE_ID_USE_MAX - 1 2226df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten} audio_unique_id_use_t; 2236df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten 2246df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten/* Return the use of an audio_unique_id_t */ 2256df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kastenstatic inline audio_unique_id_use_t audio_unique_id_get_use(audio_unique_id_t id) 2266df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten{ 2276df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten return (audio_unique_id_use_t) (id & AUDIO_UNIQUE_ID_USE_MASK); 2286df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten} 2296df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten 2306df66e0b5115b1834c8304ed3b5dfe0497e661baGlenn Kasten/* Reserved audio_unique_id_t values. FIXME: not a complete list. */ 2319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_UNIQUE_ID_ALLOCATE AUDIO_SESSION_ALLOCATE 2329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio sub formats (see enum audio_format). */ 2349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* PCM sub formats */ 2369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* All of these are in native byte order */ 2389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 2399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 2409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 2419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 8.23 fixed point */ 2429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 2439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6, /* PCM signed .23 fixed point packed in 3 bytes */ 2449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_pcm_sub_fmt_t; 2459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio_format_*_sub_fmt_t declarations are not currently used */ 2479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 2499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frame header to specify bit rate, stereo mode, version... 2509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 2539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_mp3_sub_fmt_t; 2549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AMR NB/WB sub format field definition: specify frame block interleaving, 2569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * bandwidth efficient or octet aligned, encoding mode for recording... 2579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 2609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_amr_sub_fmt_t; 2619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AAC sub format field definition: specify profile or bitrate for recording... */ 2639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN = 0x1, 2659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC = 0x2, 2669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR = 0x4, 2679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP = 0x8, 2689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1 = 0x10, 2699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE = 0x20, 2709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC = 0x40, 2719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD = 0x80, 2729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2 = 0x100, 2739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD = 0x200, 2749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_aac_sub_fmt_t; 2759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* VORBIS sub format field definition: specify quality for recording... */ 2779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 2799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_vorbis_sub_fmt_t; 2809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 28297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/* Audio format is a 32-bit word that consists of: 28397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * main format field (upper 8 bits) 28497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * sub format field (lower 24 bits). 2859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 2869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The main format indicates the main codec type. The sub format field 2879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * indicates options and parameters for each format. The sub format is mainly 2889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used for record to indicate for instance the requested bitrate or profile. 2899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It can also be used for certain formats to give informations not present in 2909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the encoded audio stream (e.g. octet alignement for AMR). 2919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 2949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DEFAULT = 0, 2959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 2969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3 = 0x01000000UL, 2979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_NB = 0x02000000UL, 2989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_WB = 0x03000000UL, 2999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC = 0x04000000UL, 3009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V1*/ 3019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V2*/ 3029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS = 0x07000000UL, 3039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_OPUS = 0x08000000UL, 3049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AC3 = 0x09000000UL, 3059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_E_AC3 = 0x0A000000UL, 3069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS = 0x0B000000UL, 3079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS_HD = 0x0C000000UL, 30897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk // IEC61937 is encoded audio wrapped in 16-bit PCM. 30997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk AUDIO_FORMAT_IEC61937 = 0x0D000000UL, 31097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, /* Deprecated. Use audio_get_main_format() */ 3119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 3129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Aliases */ 3149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_16BIT */ 3159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 3169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT), 3179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_8BIT */ 3189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 3199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT), 3209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 3219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT), 3229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 3239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT), 3249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 3259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT), 3269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_24_BIT_PACKED = (AUDIO_FORMAT_PCM | 3279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED), 3289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_MAIN = (AUDIO_FORMAT_AAC | 3299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN), 3309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LC = (AUDIO_FORMAT_AAC | 3319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC), 3329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SSR = (AUDIO_FORMAT_AAC | 3339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR), 3349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LTP = (AUDIO_FORMAT_AAC | 3359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP), 3369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V1 = (AUDIO_FORMAT_AAC | 3379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1), 3389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SCALABLE = (AUDIO_FORMAT_AAC | 3399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE), 3409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ERLC = (AUDIO_FORMAT_AAC | 3419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC), 3429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LD = (AUDIO_FORMAT_AAC | 3439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD), 3449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V2 = (AUDIO_FORMAT_AAC | 3459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2), 3469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ELD = (AUDIO_FORMAT_AAC | 3479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD), 3489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_t; 3499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* For the channel mask for position assignment representation */ 3519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 3529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be a complete audio_channel_mask_t. */ 3549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_NONE = 0x0, 3569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_INVALID = 0xC0000000, 3579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be the bits portion of an audio_channel_mask_t 3599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * with representation AUDIO_CHANNEL_REPRESENTATION_POSITION. 3609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Using these bits as a complete audio_channel_mask_t is deprecated. 3619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 3629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output channels */ 3649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 3659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 3669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 3679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 3689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 3699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 3709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 3719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 3729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 3739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 3749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 3759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 3769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 3779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 3789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 3799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 3809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 3819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 3829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits? */ 3849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 3869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT), 3889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 3929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD, 3939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */ 3949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 4009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 4019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 4029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 4039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 4049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1, 4059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */ 4069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 4079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 4089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 4099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 4109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 4119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 4129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 4139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 4149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 4159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 4169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 4179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 4189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 4199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 4209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 4219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 4229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 4239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 4249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 4259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 4269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 4279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 4289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 4299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER| 4309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT| 4319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT| 4329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER| 4339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 4349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 4359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 4369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 4379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 4389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 4399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These are bits only, not complete values */ 4419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input channels */ 4439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT = 0x4, 4449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT = 0x8, 4459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT = 0x10, 4469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK = 0x20, 4479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 4489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 4499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 4509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 4519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE = 0x400, 4529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS = 0x800, 4539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 4549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 4559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 4569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 4579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits, or deprecated? */ 4599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 4619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 4629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 4639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 4649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT | 4659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT | 4669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK| 4679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED | 4689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 4699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED | 4709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED| 4719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE | 4729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS | 4739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS | 4749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS | 4759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK | 4769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK), 4779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 4789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* A channel mask per se only defines the presence or absence of a channel, not the order. 4809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But see AUDIO_INTERLEAVE_* below for the platform convention of order. 4819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio_channel_mask_t is an opaque type and its internal layout should not 4839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * be assumed as it may change in the future. 4849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Instead, always use the functions declared in this header to examine. 4859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * These are the current representations: 4879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_POSITION 4899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for position assignment. 4909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to the spatial position of a transducer (output), 4919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or interpretation of channel (input). 4929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The user of a channel mask needs to know the context of whether it is for output or input. 4939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The constants AUDIO_CHANNEL_OUT_* or AUDIO_CHANNEL_IN_* apply to the bits portion. 4949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 4959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_INDEX 4979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for index assignment. 4989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to a selected channel. 4999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no platform interpretation of the various bits. 5009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no concept of output or input. 5019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 5029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 5039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other representations are reserved for future use. 5049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 5059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Warning: current representation distinguishes between input and output, but this will not the be 5069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * case in future revisions of the platform. Wherever there is an ambiguity between input and output 5079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * that is currently resolved by checking the channel mask, the implementer should look for ways to 5089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * fix it with additional information outside of the mask. 5099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_channel_mask_t; 5119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Maximum number of channels for all representations */ 5139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_COUNT_MAX 30 5149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* log(2) of maximum number of representations, not part of public API */ 5169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_REPRESENTATION_LOG2 2 5179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Representations */ 5199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 5209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION = 0, // must be zero for compatibility 5219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 1 is reserved for future use 5229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_INDEX = 2, 5239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 3 is reserved for future use 5249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_channel_representation_t; 5259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5261f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung/* The channel index masks defined here are the canonical masks for 1 to 8 channel 5271f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung * endpoints and apply to both source and sink. 5281f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung */ 5291f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hungenum { 5301f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_HDR = AUDIO_CHANNEL_REPRESENTATION_INDEX << AUDIO_CHANNEL_COUNT_MAX, 5312bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_1 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 1) - 1), 5322bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_2 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 2) - 1), 5332bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_3 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 3) - 1), 5342bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_4 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 4) - 1), 5352bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_5 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 5) - 1), 5362bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_6 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 6) - 1), 5372bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_7 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 7) - 1), 5382bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_8 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 8) - 1), 5392c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // FIXME FCC_8 5401f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung}; 5411f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung 5429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 5439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_mask_get_bits(audio_channel_mask_t channel) 5449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return channel & ((1 << AUDIO_CHANNEL_COUNT_MAX) - 1); 5469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 5499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_representation_t audio_channel_mask_get_representation( 5509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel) 5519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // The right shift should be sufficient, but also "and" for safety in case mask is not 32 bits 5539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_representation_t) 5549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((channel >> AUDIO_CHANNEL_COUNT_MAX) & ((1 << AUDIO_CHANNEL_REPRESENTATION_LOG2) - 1)); 5559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if the channel mask is valid, 5589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or returns false for AUDIO_CHANNEL_NONE, AUDIO_CHANNEL_INVALID, and other invalid values. 5599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This function is unable to determine whether a channel mask for position assignment 5609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is invalid because an output mask has an invalid output bit set, 5619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or because an input mask has an invalid input bit set. 5629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other APIs that take a channel mask assume that it is valid. 5639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_channel_mask_is_valid(audio_channel_mask_t channel) 5659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 5679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation = audio_channel_mask_get_representation(channel); 5689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (representation) { 5699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 5709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 5719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 5739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 5749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 5769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 5779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Not part of public API */ 5809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_mask_from_representation_and_bits( 5819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation, uint32_t bits) 5829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_mask_t) ((representation << AUDIO_CHANNEL_COUNT_MAX) | bits); 5849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Expresses the convention when stereo audio samples are stored interleaved 5879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in an array. This should improve readability by allowing code to use 5889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * symbolic indices instead of hard-coded [0] and [1]. 5899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 5909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * For multi-channel beyond stereo, the platform convention is that channels 5919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * are interleaved in order from least significant channel mask bit 5929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to most significant channel mask bit, with unused bits skipped. 5939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Any exceptions to this convention will be noted at the appropriate API. 5949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 5969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_LEFT = 0, 5979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_RIGHT = 1, 5989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 5999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 6019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_INVALID = -2, 6029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CURRENT = -1, 6039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_NORMAL = 0, 6049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_RINGTONE = 1, 6059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_CALL = 2, 6069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_COMMUNICATION = 3, 6079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CNT, 6099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 6109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mode_t; 6119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* This enum is deprecated */ 6139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 6149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NONE = 0, 6159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 6169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 6179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 6189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 6199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 6209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 6219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_in_acoustics_t; 6229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 6249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_NONE = 0x0, 6259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* reserved bits */ 6269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_IN = 0x80000000, 6279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 6289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output devices */ 6299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_EARPIECE = 0x1, 6309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER = 0x2, 6319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 6329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 6339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 6349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 6359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 6369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 6379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 6389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 6399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 6409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT_AUX_DIGITAL, 6419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 6429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 6439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 6449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 6459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 6469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB host mode: your Android device is a USB host and the dock is a USB device */ 6479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 6489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 6499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice TX path */ 6509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000, 6519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 6529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE = 0x20000, 6539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* HDMI Audio Return Channel */ 6549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000, 6559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF out */ 6569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF = 0x80000, 6579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM transmitter out */ 6589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM = 0x100000, 6599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Line out for av devices */ 6609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE = 0x200000, 6619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* limited-output speaker device for acoustic safety */ 6629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE = 0x400000, 6634d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_IP = 0x800000, 6647f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent /* audio bus implemented by the audio system (e.g an MOST stereo channel) */ 6657f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_OUT_BUS = 0x1000000, 6669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 6679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 6689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER | 6699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET | 6709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 6719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 6749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 6779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI | 6789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 6799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 6809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY | 6819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE | 6829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 6839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX | 6849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE | 6859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC | 6869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF | 6879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM | 6889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE | 6899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE | 6904d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_IP | 6917f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_OUT_BUS | 6929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT), 6939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 6969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 6999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 7009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE), 7019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input devices */ 7029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 7039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 7049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 7059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 7069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 7079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 7089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL, 7099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice RX path */ 7109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 7119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX = AUDIO_DEVICE_IN_VOICE_CALL, 7129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 7139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 7149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 7159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 7169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 7179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 7189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM tuner input */ 7199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER = AUDIO_DEVICE_BIT_IN | 0x2000, 7209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* TV tuner input */ 7219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER = AUDIO_DEVICE_BIT_IN | 0x4000, 7229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 7239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE = AUDIO_DEVICE_BIT_IN | 0x8000, 7249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF in */ 7259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF = AUDIO_DEVICE_BIT_IN | 0x10000, 7269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP = AUDIO_DEVICE_BIT_IN | 0x20000, 7279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK = AUDIO_DEVICE_BIT_IN | 0x40000, 7284d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_IP = AUDIO_DEVICE_BIT_IN | 0x80000, 7297f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent /* audio bus implemented by the audio system (e.g an MOST stereo channel) */ 7307f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_IN_BUS = AUDIO_DEVICE_BIT_IN | 0x100000, 7319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 7329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 7349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT | 7359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC | 7369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 7379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET | 7389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI | 7399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX | 7409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC | 7419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX | 7429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 7439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 7449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY | 7459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE | 7469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER | 7479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER | 7489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE | 7499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF | 7509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 7519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK | 7524d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_IP | 7537f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_IN_BUS | 7549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT), 7559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 7569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_USB = (AUDIO_DEVICE_IN_USB_ACCESSORY | 7579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE), 7589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 7599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_devices_t; 7619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the audio output flags serve two purposes: 7639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when an AudioTrack is created they indicate a "wish" to be connected to an 7649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * output stream with attributes corresponding to the specified flags 7659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when present in an output profile descriptor listed for a particular audio 7669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware module, they indicate that an output stream can be opened that 7679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * supports the attributes indicated by the flags. 7689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the audio policy manager will try to match the flags in the request 7699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (when getOuput() is called) to an available output stream. 7709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 7729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 7739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 7749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // to one output stream: no software mixer 7759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 7769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // the device. It is unique and must be 7779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // present. It is opened by default and 7789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // receives routing, audio mode and volume 7799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // controls related to voice calls. 7809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 7819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // defined elsewhere 7829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 7839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 7849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // streams to hardware codec 7859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, // use non-blocking write 78655093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40, // output uses a hardware A/V synchronization source 78755093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_TTS = 0x80, // output for streams transmitted through speaker 78855093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten // at a sample rate high enough to accommodate 78955093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten // lower-range ultrasonic playback 79055093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_RAW = 0x100, // minimize signal processing 79155093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_SYNC = 0x200, // synchronize I/O streams 79280b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda 793cf6443f4e67079e2b3c3f7849f49681e856f7f38Phil Burk AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 0x400, // Audio stream contains compressed audio in 794cf6443f4e67079e2b3c3f7849f49681e856f7f38Phil Burk // SPDIF data bursts, not PCM. 7959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_output_flags_t; 7969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio input flags are analogous to audio output flags. 7989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Currently they are used only when an AudioRecord is created, 7999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to indicate a preference to be connected to an input stream with 8009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * attributes corresponding to the specified flags. 8019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 8029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 8039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 8049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 8059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_HW_HOTWORD = 0x2, // prefer an input that captures from hw hotword source 80655093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_INPUT_FLAG_RAW = 0x4, // minimize signal processing 80755093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_INPUT_FLAG_SYNC = 0x8, // synchronize I/O streams 80855093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten 8099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_input_flags_t; 8109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Additional information about compressed streams offloaded to 8129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware playback 8139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The version and size fields must be initialized by the caller by using 8149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one of the constants defined here. 8159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 8169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct { 8179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t version; // version of the info structure 8189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t size; // total size of the structure including version and size 8199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; // sample rate in Hz 8209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; // channel mask 8219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; // audio format 8229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream_type; // stream type 8239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bit_rate; // bit rate in bits per second 8249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int64_t duration_us; // duration in microseconds, -1 if unknown 8259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool has_video; // true if stream is tied to a video stream 8269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool is_streaming; // true if streaming, false if local playback 8279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_offload_info_t; 8289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 8309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((((maj) & 0xff) << 8) | ((min) & 0xff)) 8319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 8339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 8349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 8369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 8379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 8389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 8409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 8429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 8439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 8449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 8459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 8469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* common audio stream configuration parameters 8499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * You should memset() the entire structure to zero before use to 8509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * ensure forward compatibility 8519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 8529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_config { 8539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; 8549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; 8559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; 8569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_offload_info_t offload_info; 8579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t frame_count; 8589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct audio_config audio_config_t; 8609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_config_t AUDIO_CONFIG_INITIALIZER = { 8629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: AUDIO_CHANNEL_NONE, 8649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand offload_info: { 8669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 8679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 8689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 8709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 8729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 8739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 8749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 8759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 8769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand }, 8779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand frame_count: 0, 8789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8805413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivistruct audio_config_base { 8815413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi uint32_t sample_rate; 8825413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi audio_channel_mask_t channel_mask; 8835413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi audio_format_t format; 8845413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi}; 8855413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi 8865413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivitypedef struct audio_config_base audio_config_base_t; 8875413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi 8885413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivistatic const audio_config_base_t AUDIO_CONFIG_BASE_INITIALIZER = { 8895413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi sample_rate: 0, 8905413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi channel_mask: AUDIO_CHANNEL_NONE, 8915413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi format: AUDIO_FORMAT_DEFAULT 8925413dc382ba613605086f4dcae9423df82d6a932Jean-Michel Trivi}; 8939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio hw module handle functions or structures referencing a module */ 8959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_module_handle_t; 8969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 8989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Volume control 8999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 9009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* If the audio hardware supports gain control on some audio paths, 9029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the platform can expose them in the audio_policy.conf file. The audio HAL 9039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * will then implement gain control functions that will use the following data 9049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * structures. */ 9059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Type of gain control exposed by an audio port */ 9079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_JOINT 0x1 /* supports joint channel gain control */ 9089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_CHANNELS 0x2 /* supports separate channel gain control */ 9099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_RAMP 0x4 /* supports gain ramps */ 9109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_gain_mode_t; 9129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio_gain struct is a representation of a gain stage. 9159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * A gain stage is always attached to an audio port. */ 9169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain { 9179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* e.g. AUDIO_GAIN_MODE_JOINT */ 9189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain an be controlled. 9199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A if AUDIO_GAIN_MODE_CHANNELS is not supported */ 9209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int min_value; /* minimum gain value in millibels */ 9219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int max_value; /* maximum gain value in millibels */ 9229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int default_value; /* default gain value in millibels */ 9239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int step_value; /* gain step in millibels */ 9249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int min_ramp_ms; /* minimum ramp duration in ms */ 9259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int max_ramp_ms; /* maximum ramp duration in ms */ 9269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The gain configuration structure is used to get or set the gain values of a 9299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * given port */ 9309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain_config { 9319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int index; /* index of the corresponding audio_gain in the 9329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port gains[] table */ 9339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* mode requested for this command */ 9349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain value follows. 9359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A in joint mode */ 9362c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten 9372c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // note this "8" is not FCC_8, so it won't need to be changed for > 8 channels 9389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int values[sizeof(audio_channel_mask_t) * 8]; /* gain values in millibels 9399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand for each channel ordered from LSb to MSb in 9409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel mask. The number of values is 1 in joint 9419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand mode or popcount(channel_mask) */ 9429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int ramp_duration_ms; /* ramp duration in ms */ 9439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 9469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Routing control 9479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 9489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Types defined here are used to describe an audio source or sink at internal 9509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * framework interfaces (audio policy, patch panel) or at the audio HAL. 9519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Sink and sources are grouped in a concept of “audio port” representing an 9529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio end point at the edge of the system managed by the module exposing 9539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the interface. */ 9549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port role: either source or sink */ 9569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 9579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_NONE, 9589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SOURCE, 9599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SINK, 9609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_role_t; 9619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port type indicates if it is a session (e.g AudioTrack), 9639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * a mix (e.g PlaybackThread output) or a physical device 9649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 9669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_NONE, 9679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_DEVICE, 9689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_MIX, 9699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_SESSION, 9709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_type_t; 9719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Each port has a unique ID or handle allocated by policy manager */ 9739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_port_handle_t; 9749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_HANDLE_NONE 0 9759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the maximum length for the human-readable device name */ 9779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_NAME_LEN 128 9789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* maximum audio device address length */ 9809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_DEVICE_MAX_ADDRESS_LEN 32 9819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware device */ 9849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_device_ext { 9859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 9869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; /* device address. "" if N/A */ 9889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * sub mix */ 9929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_mix_ext { 9939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 9949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input/output stream */ 9959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 9969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand //TODO: change use case for output streams: use strategy and mixer attributes 9979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream; 9989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_source_t source; 9999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } usecase; 10009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is an 10039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio session */ 10049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_session_ext { 10059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 10069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Flags indicating which fields are to be considered in struct audio_port_config */ 10099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_SAMPLE_RATE 0x1 10109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_CHANNEL_MASK 0x2 10119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_FORMAT 0x4 10129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_GAIN 0x8 10139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_ALL (AUDIO_PORT_CONFIG_SAMPLE_RATE | \ 10149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_CHANNEL_MASK | \ 10159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_FORMAT | \ 10169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_GAIN) 10179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio port configuration structure used to specify a particular configuration of 10199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * an audio port */ 10209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config { 10219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 10229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 10239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 10249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int config_mask; /* e.g AUDIO_PORT_CONFIG_ALL */ 10259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rate; /* sampling rate in Hz */ 10269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channel mask if applicable */ 10279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; /* format if applicable */ 10289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain_config gain; /* gain to apply if applicable */ 10299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 10309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_device_ext device; /* device specific info */ 10319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_mix_ext mix; /* mix specific info */ 10329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_session_ext session; /* session specific info */ 10339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 10349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of sampling rates in audio port */ 10389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_SAMPLING_RATES 16 10399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of channel masks in audio port */ 10409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_CHANNEL_MASKS 16 10419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of audio formats in audio port */ 10429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_FORMATS 16 10439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of gain controls in audio port */ 10449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_GAINS 16 10459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a hardware device */ 10479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_device_ext { 10489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 10499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 10509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 10519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Latency class of the audio mix */ 10549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 10559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_LOW, 10569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_NORMAL, 10579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mix_latency_class_t; 10589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a sub mix */ 10609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_mix_ext { 10619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 10629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input.output stream */ 10639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_mix_latency_class_t latency_class; /* latency class */ 10649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // other attributes: routing strategies 10659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is an audio session */ 10689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_session_ext { 10699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 10709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port { 10739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 10749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 10759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 10769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char name[AUDIO_PORT_MAX_NAME_LEN]; 10779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sample_rates; /* number of sampling rates in following array */ 10789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rates[AUDIO_PORT_MAX_SAMPLING_RATES]; 10799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_channel_masks; /* number of channel masks in following array */ 10809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_masks[AUDIO_PORT_MAX_CHANNEL_MASKS]; 10819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_formats; /* number of formats in following array */ 10829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t formats[AUDIO_PORT_MAX_FORMATS]; 10839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_gains; /* number of gains in following array */ 10849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain gains[AUDIO_PORT_MAX_GAINS]; 10859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config active_config; /* current audio port configuration */ 10869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 10879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_device_ext device; 10889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_mix_ext mix; 10899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_session_ext session; 10909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 10919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio patch represents a connection between one or more source ports and 10949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one or more sink ports. Patches are connected and disconnected by audio policy manager or by 10959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * applications via framework APIs. 10969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each patch is identified by a handle at the interface used to create that patch. For instance, 10979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * when a patch is created by the audio HAL, the HAL allocates and returns a handle. 10989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This handle is unique to a given audio HAL hardware module. 10999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But the same patch receives another system wide unique handle allocated by the framework. 11009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This unique handle is used for all transactions inside the framework. 11019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 11029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_patch_handle_t; 11039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_HANDLE_NONE 0 11049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_PORTS_MAX 16 11069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_patch { 11089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_patch_handle_t id; /* patch unique ID */ 11099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sources; /* number of sources in following array */ 11109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX]; 11119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sinks; /* number of sinks in following array */ 11129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX]; 11139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 11149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* a HW synchronization source returned by the audio HAL */ 11189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_hw_sync_t; 11199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* an invalid HW synchronization source indicating an error */ 11219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_HW_SYNC_INVALID 0 11229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_device(audio_devices_t device) 11249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 11269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 11279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 11299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_device(audio_devices_t device) 11339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 11379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_devices(audio_devices_t device) 11439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (device & AUDIO_DEVICE_BIT_IN) == 0; 11459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_in_device(audio_devices_t device) 11489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_IN_BLUETOOTH_A2DP)) 11529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_out_device(audio_devices_t device) 11589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 11609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 11629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand// Deprecated - use audio_is_a2dp_out_device() instead 11669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_device(audio_devices_t device) 11679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_a2dp_out_device(device); 11699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 11729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) == 0) { 11749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL_SCO) == 0)) 11759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } else { 11779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) == 0)) 11799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_out_device(audio_devices_t device) 11869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)); 11889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_in_device(audio_devices_t device) 11919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (popcount(device) == 1 && (device & AUDIO_DEVICE_IN_ALL_USB) != 0) 11959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* OBSOLETE - use audio_is_usb_out_device() instead. */ 12019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_device(audio_devices_t device) 12029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_usb_out_device(device); 12049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_remote_submix_device(audio_devices_t device) 12079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 1208794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz if ((audio_is_output_devices(device) && 1209794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 1210794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz || (!audio_is_output_devices(device) && 1211794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX)) 12129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 12139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 12149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 12159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 12189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 12199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an input channel, and 12209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an input channel. 12219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 12229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_channel(audio_channel_mask_t channel) 12249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_IN_ALL) { 12299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 12309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 12349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 12369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 12409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 12419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an output channel, and 12429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an output channel. 12439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 12449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_channel(audio_channel_mask_t channel) 12469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_OUT_ALL) { 12519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 12529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 12569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 12589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an input channel mask, 12629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio input or recording. 12639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an input channel, 12649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 12659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 12669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_in_mask(audio_channel_mask_t channel) 12689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // TODO: We can now merge with from_out_mask and remove anding 12739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_IN_ALL; 12749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 12799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an output channel mask, 12839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio output or playback. 12849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an output channel, 12859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 12869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 12879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_out_mask(audio_channel_mask_t channel) 12899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // TODO: We can now merge with from_in_mask and remove anding 12949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_OUT_ALL; 12959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 13009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 130321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten/* Derive a channel mask for index assignment from a channel count. 130421aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * Returns the matching channel mask, 130521aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 130621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds AUDIO_CHANNEL_COUNT_MAX. 130721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten */ 130821aa43a5ea032080aee301abc60780887f94665fGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_for_index_assignment_from_count( 130921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t channel_count) 131021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten{ 131121aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count == 0) { 131221aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_NONE; 131321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 131421aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count > AUDIO_CHANNEL_COUNT_MAX) { 131521aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_INVALID; 131621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 131721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t bits = (1 << channel_count) - 1; 131821aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return audio_channel_mask_from_representation_and_bits( 131921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX, bits); 132021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten} 132121aa43a5ea032080aee301abc60780887f94665fGlenn Kasten 13229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Derive an output channel mask for position assignment from a channel count. 13239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 13249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 13259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 13269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * for continuity with stereo. 13279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 13289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 13299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 13309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default output channel mask is defined. 13319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 13329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 13339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 13359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 13369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 13379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 13389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 13399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_MONO; 13409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 13429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO; 13439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 3: 13459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER; 13469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 4: // 4.0 13489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD; 13499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 5: // 5.0 13519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER; 13529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 6: // 5.1 13549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1; 13559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 7: // 6.1 13579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER; 13589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 8: 13609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_7POINT1; 13619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13622c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // FIXME FCC_8 13639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_INVALID; 13659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_channel_mask_from_representation_and_bits( 13679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 13689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13707cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten/* Derive a default input channel mask from a channel count. 13717cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten * Assumes a position mask for mono and stereo, or an index mask for channel counts > 2. 13729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 13739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 13749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 13759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default input channel mask is defined. 13769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 13779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 13789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 13809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 13819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 13829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 13839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 13849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_MONO; 13859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 13879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_STEREO; 13889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13897cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 3: 13907cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 4: 13917cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 5: 13927cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 6: 13937cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 7: 13947cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 8: 13957cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten // FIXME FCC_8 13967cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten return audio_channel_mask_for_index_assignment_from_count(channel_count); 13979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_INVALID; 13999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 14009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_channel_mask_from_representation_and_bits( 14019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 14029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_valid_format(audio_format_t format) 14059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 14069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format & AUDIO_FORMAT_MAIN_MASK) { 14079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM: 14089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 14099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 14109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 14119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 14129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 14139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 14149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 14159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 14169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 14179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 14189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 14199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* not reached */ 14209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_MP3: 14219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_NB: 14229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_WB: 14239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AAC: 14249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V1: 14259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V2: 14269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_VORBIS: 14279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_OPUS: 14289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AC3: 14299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_E_AC3: 14309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS: 14319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS_HD: 143297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk case AUDIO_FORMAT_IEC61937: 14339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 14349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 14359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 14369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 14379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 143997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 144097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * Extract the primary format, eg. PCM, AC3, etc. 144197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 144297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burkstatic inline audio_format_t audio_get_main_format(audio_format_t format) 144397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk{ 144497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (audio_format_t)(format & AUDIO_FORMAT_MAIN_MASK); 144597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk} 144697763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk 144797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 144897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * Is the data plain PCM samples that can be scaled and mixed? 144997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 14509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_linear_pcm(audio_format_t format) 14519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 145297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (audio_get_main_format(format) == AUDIO_FORMAT_PCM); 145397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk} 145497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk 145597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 145697763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * For this format, is the number of PCM audio frames directly proportional 145797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * to the number of data bytes? 145897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * 145997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * In other words, is the format transported as PCM audio samples, 146097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * but not necessarily scalable or mixable. 146197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * This returns true for real PCM, but also for AUDIO_FORMAT_IEC61937, 146297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * which is transported as 16 bit PCM audio, but where the encoded data 146397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * cannot be mixed or scaled. 146497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 146597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burkstatic inline bool audio_has_proportional_frames(audio_format_t format) 146697763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk{ 146797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk audio_format_t mainFormat = audio_get_main_format(format); 146897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (mainFormat == AUDIO_FORMAT_PCM 146997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk || mainFormat == AUDIO_FORMAT_IEC61937); 14709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline size_t audio_bytes_per_sample(audio_format_t format) 14739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 14749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t size = 0; 14759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 14779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 14789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 14799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int32_t); 14809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 14829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t) * 3; 14839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 148597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk case AUDIO_FORMAT_IEC61937: 14869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int16_t); 14879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 14899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t); 14909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 14929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(float); 14939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 14959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 14979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return size; 14989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* converts device address to string sent to audio HAL via set_parameters */ 1501ed5246d4a581cdc5aa16a27e8dd70d52fe8cd2bbArman Uguraystatic inline char *audio_device_address_to_parameter(audio_devices_t device, const char *address) 15029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 15039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand const size_t kSize = AUDIO_DEVICE_MAX_ADDRESS_LEN + sizeof("a2dp_sink_address="); 15049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char param[kSize]; 15059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (device & AUDIO_DEVICE_OUT_ALL_A2DP) 15079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "a2dp_sink_address", address); 15089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else if (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 15099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "mix", address); 15109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 15119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s", address); 15129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return strdup(param); 15149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 15159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15169598786860a469193a65c23bf424093d9ae5867cPaul McLeanstatic inline bool audio_device_is_digital(audio_devices_t device) { 15179598786860a469193a65c23bf424093d9ae5867cPaul McLean if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 15189598786860a469193a65c23bf424093d9ae5867cPaul McLean // input 15190b1a35902f6a9033ac11f245624aab198ff236b1Eric Laurent return (~AUDIO_DEVICE_BIT_IN & device & (AUDIO_DEVICE_IN_ALL_USB | 15209598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_IN_HDMI | 15214d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_SPDIF | 15227f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_IN_IP | 15237f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_IN_BUS)) != 0; 15249598786860a469193a65c23bf424093d9ae5867cPaul McLean } else { 15259598786860a469193a65c23bf424093d9ae5867cPaul McLean // output 15269598786860a469193a65c23bf424093d9ae5867cPaul McLean return (device & (AUDIO_DEVICE_OUT_ALL_USB | 15279598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_OUT_HDMI | 15289598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_OUT_HDMI_ARC | 15294d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_SPDIF | 15307f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_OUT_IP | 15317f695e4d92da0de59fa4087b5f21e2cdbe82da2aEric Laurent AUDIO_DEVICE_OUT_BUS)) != 0; 15329598786860a469193a65c23bf424093d9ae5867cPaul McLean } 15339598786860a469193a65c23bf424093d9ae5867cPaul McLean} 15349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand__END_DECLS 15369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 15379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#endif // ANDROID_AUDIO_CORE_H 1538