audio.h revision 2bd237dd9da7fa3d7278ec8ae8091d95be3eadc0
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 2039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* a unique ID allocated by AudioFlinger for use as a audio_io_handle_t or audio_session_t */ 2049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_unique_id_t; 2059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_UNIQUE_ID_ALLOCATE AUDIO_SESSION_ALLOCATE 2079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio sub formats (see enum audio_format). */ 2099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* PCM sub formats */ 2119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* All of these are in native byte order */ 2139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 2149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 2159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 2169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 8.23 fixed point */ 2179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 2189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6, /* PCM signed .23 fixed point packed in 3 bytes */ 2199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_pcm_sub_fmt_t; 2209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio_format_*_sub_fmt_t declarations are not currently used */ 2229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 2249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frame header to specify bit rate, stereo mode, version... 2259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 2289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_mp3_sub_fmt_t; 2299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AMR NB/WB sub format field definition: specify frame block interleaving, 2319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * bandwidth efficient or octet aligned, encoding mode for recording... 2329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 2359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_amr_sub_fmt_t; 2369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AAC sub format field definition: specify profile or bitrate for recording... */ 2389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN = 0x1, 2409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC = 0x2, 2419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR = 0x4, 2429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP = 0x8, 2439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1 = 0x10, 2449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE = 0x20, 2459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC = 0x40, 2469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD = 0x80, 2479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2 = 0x100, 2489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD = 0x200, 2499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_aac_sub_fmt_t; 2509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* VORBIS sub format field definition: specify quality for recording... */ 2529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 2549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_vorbis_sub_fmt_t; 2559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 25797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/* Audio format is a 32-bit word that consists of: 25897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * main format field (upper 8 bits) 25997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * sub format field (lower 24 bits). 2609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 2619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The main format indicates the main codec type. The sub format field 2629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * indicates options and parameters for each format. The sub format is mainly 2639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used for record to indicate for instance the requested bitrate or profile. 2649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It can also be used for certain formats to give informations not present in 2659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the encoded audio stream (e.g. octet alignement for AMR). 2669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 2699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DEFAULT = 0, 2709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 2719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3 = 0x01000000UL, 2729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_NB = 0x02000000UL, 2739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_WB = 0x03000000UL, 2749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC = 0x04000000UL, 2759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V1*/ 2769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V2*/ 2779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS = 0x07000000UL, 2789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_OPUS = 0x08000000UL, 2799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AC3 = 0x09000000UL, 2809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_E_AC3 = 0x0A000000UL, 2819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS = 0x0B000000UL, 2829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS_HD = 0x0C000000UL, 28397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk // IEC61937 is encoded audio wrapped in 16-bit PCM. 28497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk AUDIO_FORMAT_IEC61937 = 0x0D000000UL, 28597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, /* Deprecated. Use audio_get_main_format() */ 2869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 2879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Aliases */ 2899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_16BIT */ 2909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 2919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT), 2929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_8BIT */ 2939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 2949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT), 2959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 2969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT), 2979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 2989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT), 2999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 3009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT), 3019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_24_BIT_PACKED = (AUDIO_FORMAT_PCM | 3029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED), 3039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_MAIN = (AUDIO_FORMAT_AAC | 3049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN), 3059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LC = (AUDIO_FORMAT_AAC | 3069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC), 3079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SSR = (AUDIO_FORMAT_AAC | 3089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR), 3099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LTP = (AUDIO_FORMAT_AAC | 3109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP), 3119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V1 = (AUDIO_FORMAT_AAC | 3129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1), 3139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SCALABLE = (AUDIO_FORMAT_AAC | 3149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE), 3159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ERLC = (AUDIO_FORMAT_AAC | 3169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC), 3179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LD = (AUDIO_FORMAT_AAC | 3189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD), 3199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V2 = (AUDIO_FORMAT_AAC | 3209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2), 3219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ELD = (AUDIO_FORMAT_AAC | 3229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD), 3239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_t; 3249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* For the channel mask for position assignment representation */ 3269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 3279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be a complete audio_channel_mask_t. */ 3299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_NONE = 0x0, 3319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_INVALID = 0xC0000000, 3329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be the bits portion of an audio_channel_mask_t 3349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * with representation AUDIO_CHANNEL_REPRESENTATION_POSITION. 3359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Using these bits as a complete audio_channel_mask_t is deprecated. 3369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 3379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output channels */ 3399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 3409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 3419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 3429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 3439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 3449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 3459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 3469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 3479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 3489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 3499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 3509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 3519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 3529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 3539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 3549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 3559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 3569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 3579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits? */ 3599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 3619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT), 3639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 3679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD, 3689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */ 3699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 3799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1, 3809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */ 3819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 3889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 3949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 4009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 4019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 4029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 4039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 4049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER| 4059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT| 4069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT| 4079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER| 4089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 4099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 4109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 4119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 4129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 4139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 4149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These are bits only, not complete values */ 4169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input channels */ 4189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT = 0x4, 4199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT = 0x8, 4209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT = 0x10, 4219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK = 0x20, 4229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 4239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 4249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 4259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 4269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE = 0x400, 4279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS = 0x800, 4289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 4299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 4309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 4319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 4329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits, or deprecated? */ 4349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 4369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 4379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 4389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 4399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT | 4409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT | 4419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK| 4429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED | 4439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 4449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED | 4459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED| 4469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE | 4479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS | 4489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS | 4499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS | 4509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK | 4519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK), 4529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 4539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* A channel mask per se only defines the presence or absence of a channel, not the order. 4559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But see AUDIO_INTERLEAVE_* below for the platform convention of order. 4569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio_channel_mask_t is an opaque type and its internal layout should not 4589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * be assumed as it may change in the future. 4599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Instead, always use the functions declared in this header to examine. 4609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * These are the current representations: 4629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_POSITION 4649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for position assignment. 4659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to the spatial position of a transducer (output), 4669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or interpretation of channel (input). 4679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The user of a channel mask needs to know the context of whether it is for output or input. 4689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The constants AUDIO_CHANNEL_OUT_* or AUDIO_CHANNEL_IN_* apply to the bits portion. 4699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 4709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_INDEX 4729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for index assignment. 4739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to a selected channel. 4749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no platform interpretation of the various bits. 4759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no concept of output or input. 4769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 4779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other representations are reserved for future use. 4799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Warning: current representation distinguishes between input and output, but this will not the be 4819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * case in future revisions of the platform. Wherever there is an ambiguity between input and output 4829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * that is currently resolved by checking the channel mask, the implementer should look for ways to 4839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * fix it with additional information outside of the mask. 4849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 4859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_channel_mask_t; 4869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Maximum number of channels for all representations */ 4889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_COUNT_MAX 30 4899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* log(2) of maximum number of representations, not part of public API */ 4919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_REPRESENTATION_LOG2 2 4929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Representations */ 4949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 4959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION = 0, // must be zero for compatibility 4969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 1 is reserved for future use 4979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_INDEX = 2, 4989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 3 is reserved for future use 4999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_channel_representation_t; 5009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5011f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung/* The channel index masks defined here are the canonical masks for 1 to 8 channel 5021f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung * endpoints and apply to both source and sink. 5031f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung */ 5041f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hungenum { 5051f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_HDR = AUDIO_CHANNEL_REPRESENTATION_INDEX << AUDIO_CHANNEL_COUNT_MAX, 5062bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_1 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 1) - 1), 5072bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_2 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 2) - 1), 5082bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_3 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 3) - 1), 5092bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_4 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 4) - 1), 5102bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_5 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 5) - 1), 5112bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_6 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 6) - 1), 5122bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_7 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 7) - 1), 5132bd237dd9da7fa3d7278ec8ae8091d95be3eadc0Ryan Haining AUDIO_CHANNEL_INDEX_MASK_8 = AUDIO_CHANNEL_INDEX_HDR | ((1 << 8) - 1), 5142c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // FIXME FCC_8 5151f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung}; 5161f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung 5179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 5189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_mask_get_bits(audio_channel_mask_t channel) 5199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return channel & ((1 << AUDIO_CHANNEL_COUNT_MAX) - 1); 5219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 5249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_representation_t audio_channel_mask_get_representation( 5259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel) 5269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // The right shift should be sufficient, but also "and" for safety in case mask is not 32 bits 5289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_representation_t) 5299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((channel >> AUDIO_CHANNEL_COUNT_MAX) & ((1 << AUDIO_CHANNEL_REPRESENTATION_LOG2) - 1)); 5309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if the channel mask is valid, 5339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or returns false for AUDIO_CHANNEL_NONE, AUDIO_CHANNEL_INVALID, and other invalid values. 5349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This function is unable to determine whether a channel mask for position assignment 5359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is invalid because an output mask has an invalid output bit set, 5369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or because an input mask has an invalid input bit set. 5379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other APIs that take a channel mask assume that it is valid. 5389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_channel_mask_is_valid(audio_channel_mask_t channel) 5409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 5429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation = audio_channel_mask_get_representation(channel); 5439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (representation) { 5449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 5459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 5469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 5489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 5499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 5519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 5529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Not part of public API */ 5559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_mask_from_representation_and_bits( 5569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation, uint32_t bits) 5579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_mask_t) ((representation << AUDIO_CHANNEL_COUNT_MAX) | bits); 5599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Expresses the convention when stereo audio samples are stored interleaved 5629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in an array. This should improve readability by allowing code to use 5639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * symbolic indices instead of hard-coded [0] and [1]. 5649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 5659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * For multi-channel beyond stereo, the platform convention is that channels 5669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * are interleaved in order from least significant channel mask bit 5679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to most significant channel mask bit, with unused bits skipped. 5689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Any exceptions to this convention will be noted at the appropriate API. 5699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 5719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_LEFT = 0, 5729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_RIGHT = 1, 5739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 5749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 5769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_INVALID = -2, 5779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CURRENT = -1, 5789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_NORMAL = 0, 5799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_RINGTONE = 1, 5809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_CALL = 2, 5819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_COMMUNICATION = 3, 5829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CNT, 5849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 5859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mode_t; 5869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* This enum is deprecated */ 5889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 5899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NONE = 0, 5909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 5919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 5929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 5939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 5949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 5959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 5969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_in_acoustics_t; 5979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 5999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_NONE = 0x0, 6009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* reserved bits */ 6019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_IN = 0x80000000, 6029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 6039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output devices */ 6049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_EARPIECE = 0x1, 6059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER = 0x2, 6069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 6079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 6089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 6099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 6109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 6119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 6129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 6139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 6149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 6159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT_AUX_DIGITAL, 6169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 6179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 6189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 6199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 6209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 6219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB host mode: your Android device is a USB host and the dock is a USB device */ 6229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 6239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 6249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice TX path */ 6259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000, 6269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 6279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE = 0x20000, 6289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* HDMI Audio Return Channel */ 6299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000, 6309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF out */ 6319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF = 0x80000, 6329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM transmitter out */ 6339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM = 0x100000, 6349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Line out for av devices */ 6359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE = 0x200000, 6369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* limited-output speaker device for acoustic safety */ 6379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE = 0x400000, 6384d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_IP = 0x800000, 6399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 6409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 6419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER | 6429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET | 6439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 6449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 6479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 6509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI | 6519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 6529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 6539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY | 6549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE | 6559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 6569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX | 6579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE | 6589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC | 6599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF | 6609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM | 6619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE | 6629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE | 6634d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_IP | 6649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT), 6659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 6689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 6719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 6729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE), 6739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input devices */ 6749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 6759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 6769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 6779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 6789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 6799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 6809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL, 6819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice RX path */ 6829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 6839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX = AUDIO_DEVICE_IN_VOICE_CALL, 6849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 6859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 6869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 6879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 6889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 6899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 6909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM tuner input */ 6919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER = AUDIO_DEVICE_BIT_IN | 0x2000, 6929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* TV tuner input */ 6939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER = AUDIO_DEVICE_BIT_IN | 0x4000, 6949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 6959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE = AUDIO_DEVICE_BIT_IN | 0x8000, 6969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF in */ 6979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF = AUDIO_DEVICE_BIT_IN | 0x10000, 6989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP = AUDIO_DEVICE_BIT_IN | 0x20000, 6999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK = AUDIO_DEVICE_BIT_IN | 0x40000, 7004d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_IP = AUDIO_DEVICE_BIT_IN | 0x80000, 7019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 7029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 7049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT | 7059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC | 7069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 7079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET | 7089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI | 7099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX | 7109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC | 7119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX | 7129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 7139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 7149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY | 7159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE | 7169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER | 7179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER | 7189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE | 7199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF | 7209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 7219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK | 7224d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_IP | 7239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT), 7249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 7259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_USB = (AUDIO_DEVICE_IN_USB_ACCESSORY | 7269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE), 7279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 7289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_devices_t; 7309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the audio output flags serve two purposes: 7329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when an AudioTrack is created they indicate a "wish" to be connected to an 7339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * output stream with attributes corresponding to the specified flags 7349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when present in an output profile descriptor listed for a particular audio 7359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware module, they indicate that an output stream can be opened that 7369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * supports the attributes indicated by the flags. 7379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the audio policy manager will try to match the flags in the request 7389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (when getOuput() is called) to an available output stream. 7399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 7419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 7429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 7439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // to one output stream: no software mixer 7449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 7459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // the device. It is unique and must be 7469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // present. It is opened by default and 7479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // receives routing, audio mode and volume 7489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // controls related to voice calls. 7499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 7509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // defined elsewhere 7519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 7529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 7539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // streams to hardware codec 7549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, // use non-blocking write 75555093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40, // output uses a hardware A/V synchronization source 75655093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_TTS = 0x80, // output for streams transmitted through speaker 75755093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten // at a sample rate high enough to accommodate 75855093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten // lower-range ultrasonic playback 75955093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_RAW = 0x100, // minimize signal processing 76055093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_OUTPUT_FLAG_SYNC = 0x200, // synchronize I/O streams 76180b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda 762cf6443f4e67079e2b3c3f7849f49681e856f7f38Phil Burk AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO = 0x400, // Audio stream contains compressed audio in 763cf6443f4e67079e2b3c3f7849f49681e856f7f38Phil Burk // SPDIF data bursts, not PCM. 7649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_output_flags_t; 7659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio input flags are analogous to audio output flags. 7679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Currently they are used only when an AudioRecord is created, 7689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to indicate a preference to be connected to an input stream with 7699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * attributes corresponding to the specified flags. 7709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 7729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 7739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 7749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_HW_HOTWORD = 0x2, // prefer an input that captures from hw hotword source 77555093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_INPUT_FLAG_RAW = 0x4, // minimize signal processing 77655093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten AUDIO_INPUT_FLAG_SYNC = 0x8, // synchronize I/O streams 77755093a1d870e97a2c4ae88a406601568feebda5dGlenn Kasten 7789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_input_flags_t; 7799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Additional information about compressed streams offloaded to 7819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware playback 7829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The version and size fields must be initialized by the caller by using 7839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one of the constants defined here. 7849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct { 7869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t version; // version of the info structure 7879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t size; // total size of the structure including version and size 7889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; // sample rate in Hz 7899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; // channel mask 7909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; // audio format 7919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream_type; // stream type 7929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bit_rate; // bit rate in bits per second 7939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int64_t duration_us; // duration in microseconds, -1 if unknown 7949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool has_video; // true if stream is tied to a video stream 7959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool is_streaming; // true if streaming, false if local playback 7969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_offload_info_t; 7979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 7999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((((maj) & 0xff) << 8) | ((min) & 0xff)) 8009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 8029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 8039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 8059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 8069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 8079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 8099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 8119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 8129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 8139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 8149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 8159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* common audio stream configuration parameters 8189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * You should memset() the entire structure to zero before use to 8199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * ensure forward compatibility 8209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 8219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_config { 8229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; 8239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; 8249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; 8259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_offload_info_t offload_info; 8269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t frame_count; 8279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct audio_config audio_config_t; 8299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_config_t AUDIO_CONFIG_INITIALIZER = { 8319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: AUDIO_CHANNEL_NONE, 8339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand offload_info: { 8359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 8369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 8379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 8399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 8419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 8429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 8439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 8449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 8459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand }, 8469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand frame_count: 0, 8479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio hw module handle functions or structures referencing a module */ 8519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_module_handle_t; 8529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 8549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Volume control 8559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 8569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* If the audio hardware supports gain control on some audio paths, 8589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the platform can expose them in the audio_policy.conf file. The audio HAL 8599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * will then implement gain control functions that will use the following data 8609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * structures. */ 8619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Type of gain control exposed by an audio port */ 8639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_JOINT 0x1 /* supports joint channel gain control */ 8649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_CHANNELS 0x2 /* supports separate channel gain control */ 8659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_RAMP 0x4 /* supports gain ramps */ 8669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_gain_mode_t; 8689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio_gain struct is a representation of a gain stage. 8719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * A gain stage is always attached to an audio port. */ 8729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain { 8739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* e.g. AUDIO_GAIN_MODE_JOINT */ 8749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain an be controlled. 8759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A if AUDIO_GAIN_MODE_CHANNELS is not supported */ 8769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int min_value; /* minimum gain value in millibels */ 8779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int max_value; /* maximum gain value in millibels */ 8789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int default_value; /* default gain value in millibels */ 8799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int step_value; /* gain step in millibels */ 8809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int min_ramp_ms; /* minimum ramp duration in ms */ 8819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int max_ramp_ms; /* maximum ramp duration in ms */ 8829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The gain configuration structure is used to get or set the gain values of a 8859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * given port */ 8869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain_config { 8879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int index; /* index of the corresponding audio_gain in the 8889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port gains[] table */ 8899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* mode requested for this command */ 8909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain value follows. 8919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A in joint mode */ 8922c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten 8932c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // note this "8" is not FCC_8, so it won't need to be changed for > 8 channels 8949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int values[sizeof(audio_channel_mask_t) * 8]; /* gain values in millibels 8959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand for each channel ordered from LSb to MSb in 8969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel mask. The number of values is 1 in joint 8979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand mode or popcount(channel_mask) */ 8989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int ramp_duration_ms; /* ramp duration in ms */ 8999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 9029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Routing control 9039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 9049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Types defined here are used to describe an audio source or sink at internal 9069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * framework interfaces (audio policy, patch panel) or at the audio HAL. 9079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Sink and sources are grouped in a concept of “audio port” representing an 9089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio end point at the edge of the system managed by the module exposing 9099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the interface. */ 9109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port role: either source or sink */ 9129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 9139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_NONE, 9149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SOURCE, 9159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SINK, 9169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_role_t; 9179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port type indicates if it is a session (e.g AudioTrack), 9199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * a mix (e.g PlaybackThread output) or a physical device 9209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 9229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_NONE, 9239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_DEVICE, 9249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_MIX, 9259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_SESSION, 9269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_type_t; 9279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Each port has a unique ID or handle allocated by policy manager */ 9299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_port_handle_t; 9309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_HANDLE_NONE 0 9319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the maximum length for the human-readable device name */ 9339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_NAME_LEN 128 9349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* maximum audio device address length */ 9369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_DEVICE_MAX_ADDRESS_LEN 32 9379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware device */ 9409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_device_ext { 9419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 9429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; /* device address. "" if N/A */ 9449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * sub mix */ 9489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_mix_ext { 9499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 9509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input/output stream */ 9519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 9529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand //TODO: change use case for output streams: use strategy and mixer attributes 9539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream; 9549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_source_t source; 9559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } usecase; 9569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is an 9599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio session */ 9609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_session_ext { 9619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 9629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Flags indicating which fields are to be considered in struct audio_port_config */ 9659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_SAMPLE_RATE 0x1 9669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_CHANNEL_MASK 0x2 9679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_FORMAT 0x4 9689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_GAIN 0x8 9699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_ALL (AUDIO_PORT_CONFIG_SAMPLE_RATE | \ 9709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_CHANNEL_MASK | \ 9719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_FORMAT | \ 9729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_GAIN) 9739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio port configuration structure used to specify a particular configuration of 9759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * an audio port */ 9769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config { 9779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 9789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 9799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 9809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int config_mask; /* e.g AUDIO_PORT_CONFIG_ALL */ 9819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rate; /* sampling rate in Hz */ 9829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channel mask if applicable */ 9839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; /* format if applicable */ 9849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain_config gain; /* gain to apply if applicable */ 9859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 9869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_device_ext device; /* device specific info */ 9879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_mix_ext mix; /* mix specific info */ 9889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_session_ext session; /* session specific info */ 9899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 9909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of sampling rates in audio port */ 9949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_SAMPLING_RATES 16 9959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of channel masks in audio port */ 9969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_CHANNEL_MASKS 16 9979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of audio formats in audio port */ 9989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_FORMATS 16 9999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of gain controls in audio port */ 10009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_GAINS 16 10019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a hardware device */ 10039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_device_ext { 10049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 10059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 10069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 10079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Latency class of the audio mix */ 10109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 10119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_LOW, 10129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_NORMAL, 10139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mix_latency_class_t; 10149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a sub mix */ 10169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_mix_ext { 10179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 10189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input.output stream */ 10199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_mix_latency_class_t latency_class; /* latency class */ 10209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // other attributes: routing strategies 10219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is an audio session */ 10249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_session_ext { 10259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 10269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port { 10299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 10309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 10319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 10329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char name[AUDIO_PORT_MAX_NAME_LEN]; 10339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sample_rates; /* number of sampling rates in following array */ 10349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rates[AUDIO_PORT_MAX_SAMPLING_RATES]; 10359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_channel_masks; /* number of channel masks in following array */ 10369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_masks[AUDIO_PORT_MAX_CHANNEL_MASKS]; 10379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_formats; /* number of formats in following array */ 10389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t formats[AUDIO_PORT_MAX_FORMATS]; 10399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_gains; /* number of gains in following array */ 10409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain gains[AUDIO_PORT_MAX_GAINS]; 10419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config active_config; /* current audio port configuration */ 10429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 10439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_device_ext device; 10449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_mix_ext mix; 10459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_session_ext session; 10469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 10479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio patch represents a connection between one or more source ports and 10509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one or more sink ports. Patches are connected and disconnected by audio policy manager or by 10519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * applications via framework APIs. 10529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each patch is identified by a handle at the interface used to create that patch. For instance, 10539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * when a patch is created by the audio HAL, the HAL allocates and returns a handle. 10549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This handle is unique to a given audio HAL hardware module. 10559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But the same patch receives another system wide unique handle allocated by the framework. 10569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This unique handle is used for all transactions inside the framework. 10579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 10589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_patch_handle_t; 10599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_HANDLE_NONE 0 10609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_PORTS_MAX 16 10629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_patch { 10649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_patch_handle_t id; /* patch unique ID */ 10659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sources; /* number of sources in following array */ 10669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX]; 10679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sinks; /* number of sinks in following array */ 10689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX]; 10699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* a HW synchronization source returned by the audio HAL */ 10749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_hw_sync_t; 10759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* an invalid HW synchronization source indicating an error */ 10779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_HW_SYNC_INVALID 0 10789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_device(audio_devices_t device) 10809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 10829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 10839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 10859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_device(audio_devices_t device) 10899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 10919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 10929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 10939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 10959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_devices(audio_devices_t device) 10999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (device & AUDIO_DEVICE_BIT_IN) == 0; 11019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_in_device(audio_devices_t device) 11049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_IN_BLUETOOTH_A2DP)) 11089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_out_device(audio_devices_t device) 11149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 11169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 11189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand// Deprecated - use audio_is_a2dp_out_device() instead 11229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_device(audio_devices_t device) 11239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_a2dp_out_device(device); 11259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 11289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) == 0) { 11309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL_SCO) == 0)) 11319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } else { 11339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) == 0)) 11359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_out_device(audio_devices_t device) 11429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)); 11449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_in_device(audio_devices_t device) 11479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (popcount(device) == 1 && (device & AUDIO_DEVICE_IN_ALL_USB) != 0) 11519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* OBSOLETE - use audio_is_usb_out_device() instead. */ 11579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_device(audio_devices_t device) 11589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_usb_out_device(device); 11609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_remote_submix_device(audio_devices_t device) 11639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 1164794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz if ((audio_is_output_devices(device) && 1165794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 1166794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz || (!audio_is_output_devices(device) && 1167794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX)) 11689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 11709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 11749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 11759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an input channel, and 11769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an input channel. 11779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 11789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 11799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_channel(audio_channel_mask_t channel) 11809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 11829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 11839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 11849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_IN_ALL) { 11859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 11869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 11889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 11899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 11909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 11919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 11969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 11979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an output channel, and 11989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an output channel. 11999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 12009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_channel(audio_channel_mask_t channel) 12029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_OUT_ALL) { 12079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 12089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 12129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 12149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an input channel mask, 12189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio input or recording. 12199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an input channel, 12209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 12219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 12229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_in_mask(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 // TODO: We can now merge with from_out_mask and remove anding 12299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_IN_ALL; 12309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 12359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an output channel mask, 12399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio output or playback. 12409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an output channel, 12419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 12429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 12439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_out_mask(audio_channel_mask_t channel) 12459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // TODO: We can now merge with from_in_mask and remove anding 12509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_OUT_ALL; 12519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 12569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 125921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten/* Derive a channel mask for index assignment from a channel count. 126021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * Returns the matching channel mask, 126121aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 126221aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds AUDIO_CHANNEL_COUNT_MAX. 126321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten */ 126421aa43a5ea032080aee301abc60780887f94665fGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_for_index_assignment_from_count( 126521aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t channel_count) 126621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten{ 126721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count == 0) { 126821aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_NONE; 126921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 127021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count > AUDIO_CHANNEL_COUNT_MAX) { 127121aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_INVALID; 127221aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 127321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t bits = (1 << channel_count) - 1; 127421aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return audio_channel_mask_from_representation_and_bits( 127521aa43a5ea032080aee301abc60780887f94665fGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX, bits); 127621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten} 127721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten 12789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Derive an output channel mask for position assignment from a channel count. 12799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 12809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 12819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 12829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * for continuity with stereo. 12839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 12849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 12859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 12869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default output channel mask is defined. 12879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 12899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 12919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 12929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 12939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 12949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 12959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_MONO; 12969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 12989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO; 12999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 3: 13019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER; 13029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 4: // 4.0 13049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD; 13059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 5: // 5.0 13079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER; 13089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 6: // 5.1 13109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1; 13119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 7: // 6.1 13139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER; 13149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 8: 13169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_7POINT1; 13179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13182c29cee2e519db2decc91747b01f54597a856d1bGlenn Kasten // FIXME FCC_8 13199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_INVALID; 13219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_channel_mask_from_representation_and_bits( 13239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 13249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13267cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten/* Derive a default input channel mask from a channel count. 13277cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten * Assumes a position mask for mono and stereo, or an index mask for channel counts > 2. 13289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 13299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 13309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 13319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default input channel mask is defined. 13329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 13339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 13349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 13369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 13379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 13389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 13399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 13409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_MONO; 13419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 13439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_STEREO; 13449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13457cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 3: 13467cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 4: 13477cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 5: 13487cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 6: 13497cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 7: 13507cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 8: 13517cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten // FIXME FCC_8 13527cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten return audio_channel_mask_for_index_assignment_from_count(channel_count); 13539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_INVALID; 13559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_channel_mask_from_representation_and_bits( 13579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 13589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_valid_format(audio_format_t format) 13619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format & AUDIO_FORMAT_MAIN_MASK) { 13639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM: 13649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 13659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 13669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 13679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 13689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 13699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 13709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 13719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 13729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 13749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* not reached */ 13769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_MP3: 13779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_NB: 13789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_WB: 13799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AAC: 13809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V1: 13819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V2: 13829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_VORBIS: 13839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_OPUS: 13849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AC3: 13859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_E_AC3: 13869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS: 13879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS_HD: 138897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk case AUDIO_FORMAT_IEC61937: 13899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 13909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 13929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 139597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 139697763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * Extract the primary format, eg. PCM, AC3, etc. 139797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 139897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burkstatic inline audio_format_t audio_get_main_format(audio_format_t format) 139997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk{ 140097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (audio_format_t)(format & AUDIO_FORMAT_MAIN_MASK); 140197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk} 140297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk 140397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 140497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * Is the data plain PCM samples that can be scaled and mixed? 140597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 14069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_linear_pcm(audio_format_t format) 14079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 140897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (audio_get_main_format(format) == AUDIO_FORMAT_PCM); 140997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk} 141097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk 141197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk/** 141297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * For this format, is the number of PCM audio frames directly proportional 141397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * to the number of data bytes? 141497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * 141597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * In other words, is the format transported as PCM audio samples, 141697763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * but not necessarily scalable or mixable. 141797763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * This returns true for real PCM, but also for AUDIO_FORMAT_IEC61937, 141897763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * which is transported as 16 bit PCM audio, but where the encoded data 141997763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk * cannot be mixed or scaled. 142097763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk */ 142197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burkstatic inline bool audio_has_proportional_frames(audio_format_t format) 142297763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk{ 142397763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk audio_format_t mainFormat = audio_get_main_format(format); 142497763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk return (mainFormat == AUDIO_FORMAT_PCM 142597763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk || mainFormat == AUDIO_FORMAT_IEC61937); 14269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline size_t audio_bytes_per_sample(audio_format_t format) 14299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 14309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t size = 0; 14319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 14339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 14349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 14359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int32_t); 14369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 14389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t) * 3; 14399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 144197763f31a43caaf6b76e99e8d20abcc27141ec52Phil Burk case AUDIO_FORMAT_IEC61937: 14429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int16_t); 14439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 14459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t); 14469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 14489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(float); 14499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 14519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 14529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 14539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return size; 14549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* converts device address to string sent to audio HAL via set_parameters */ 1457ed5246d4a581cdc5aa16a27e8dd70d52fe8cd2bbArman Uguraystatic inline char *audio_device_address_to_parameter(audio_devices_t device, const char *address) 14589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 14599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand const size_t kSize = AUDIO_DEVICE_MAX_ADDRESS_LEN + sizeof("a2dp_sink_address="); 14609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char param[kSize]; 14619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (device & AUDIO_DEVICE_OUT_ALL_A2DP) 14639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "a2dp_sink_address", address); 14649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else if (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 14659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "mix", address); 14669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 14679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s", address); 14689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return strdup(param); 14709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14729598786860a469193a65c23bf424093d9ae5867cPaul McLeanstatic inline bool audio_device_is_digital(audio_devices_t device) { 14739598786860a469193a65c23bf424093d9ae5867cPaul McLean if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 14749598786860a469193a65c23bf424093d9ae5867cPaul McLean // input 14750b1a35902f6a9033ac11f245624aab198ff236b1Eric Laurent return (~AUDIO_DEVICE_BIT_IN & device & (AUDIO_DEVICE_IN_ALL_USB | 14769598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_IN_HDMI | 14774d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_SPDIF | 14784d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_IN_IP)) != 0; 14799598786860a469193a65c23bf424093d9ae5867cPaul McLean } else { 14809598786860a469193a65c23bf424093d9ae5867cPaul McLean // output 14819598786860a469193a65c23bf424093d9ae5867cPaul McLean return (device & (AUDIO_DEVICE_OUT_ALL_USB | 14829598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_OUT_HDMI | 14839598786860a469193a65c23bf424093d9ae5867cPaul McLean AUDIO_DEVICE_OUT_HDMI_ARC | 14844d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_SPDIF | 14854d5418183c209ecd5c4109f0ecb6c6f259360c0eEric Laurent AUDIO_DEVICE_OUT_IP)) != 0; 14869598786860a469193a65c23bf424093d9ae5867cPaul McLean } 14879598786860a469193a65c23bf424093d9ae5867cPaul McLean} 14889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand__END_DECLS 14909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#endif // ANDROID_AUDIO_CORE_H 1492