audio.h revision 7cb33cef3d5031ed0c14d114aec1ef7c972df476
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 319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The enums were moved here mostly from 329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/base/include/media/AudioSystem.h 339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* device address used to refer to the standard remote submix */ 369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS "0" 379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AudioFlinger and AudioPolicy services use I/O handles to identify audio sources and sinks */ 399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_io_handle_t; 409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_IO_HANDLE_NONE 0 419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio stream types */ 439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* These values must kept in sync with 459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/base/media/java/android/media/AudioSystem.java 469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_DEFAULT = -1, 489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_MIN = 0, 499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_VOICE_CALL = 0, 509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_SYSTEM = 1, 519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_RING = 2, 529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_MUSIC = 3, 539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ALARM = 4, 549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_NOTIFICATION = 5, 559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_BLUETOOTH_SCO = 6, 569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user 579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and must be routed to speaker 589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_DTMF = 8, 609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_TTS = 9, /* Transmitted Through Speaker. 619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Plays over speaker only, silent on other devices. 629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_ACCESSIBILITY = 10, /* For accessibility talk back prompts */ 649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_REROUTING = 11, /* For dynamic policy output mixes */ 659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_PATCH = 12, /* For internal audio flinger tracks. Fixed volume */ 669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_PUBLIC_CNT = AUDIO_STREAM_TTS + 1, 679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_STREAM_CNT = AUDIO_STREAM_PATCH + 1, 689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_stream_type_t; 699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_UNKNOWN = 0, 759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_SPEECH = 1, 769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MUSIC = 2, 779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MOVIE = 3, 789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_SONIFICATION = 4, 799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_CNT, 819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CONTENT_TYPE_MAX = AUDIO_CONTENT_TYPE_CNT - 1, 829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_content_type_t; 839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_UNKNOWN = 0, 899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_MEDIA = 1, 909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VOICE_COMMUNICATION = 2, 919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING = 3, 929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ALARM = 4, 939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION = 5, 949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE = 6, 959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST = 7, 969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT = 8, 979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED = 9, 989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_NOTIFICATION_EVENT = 10, 999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY = 11, 1009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE = 12, 1019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_ASSISTANCE_SONIFICATION = 13, 1029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_GAME = 14, 1039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_VIRTUAL_SOURCE = 15, 1049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_CNT, 1069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_USAGE_MAX = AUDIO_USAGE_CNT - 1, 1079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_usage_t; 1089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_flags_mask_t; 1109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 1129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/AudioAttributes.java 1139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 115b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_AUDIBILITY_ENFORCED = 0x1, 116b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_SECURE = 0x2, 117b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_SCO = 0x4, 118b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BEACON = 0x8, 119b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_HW_AV_SYNC = 0x10, 120b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_HW_HOTWORD = 0x20, 121b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY = 0x40, 122b5307ff75f42faa8333e7042e6fd95751a3755f0Jean-Michel Trivi AUDIO_FLAG_BYPASS_MUTE = 0x80, 1239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 1249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Do not change these values without updating their counterparts 1269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in frameworks/base/media/java/android/media/MediaRecorder.java, 1279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frameworks/av/services/audiopolicy/AudioPolicyService.cpp, 1289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and system/media/audio_effects/include/audio_effects/audio_effects_conf.h! 1299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_DEFAULT = 0, 1329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_MIC = 1, 1339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_UPLINK = 2, 1349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_DOWNLINK = 3, 1359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_CALL = 4, 1369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_CAMCORDER = 5, 1379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_RECOGNITION = 6, 1389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_VOICE_COMMUNICATION = 7, 1399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_REMOTE_SUBMIX = 8, /* Source for the mix to be presented remotely. */ 1409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* An example of remote presentation is Wifi Display */ 1419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* where a dongle attached to a TV can be used to */ 1429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* play the mix captured by this audio source. */ 1439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_CNT, 1449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_MAX = AUDIO_SOURCE_CNT - 1, 1459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_FM_TUNER = 1998, 1469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SOURCE_HOTWORD = 1999, /* A low-priority, preemptible audio source for 1479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand for background software hotword detection. 1489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand Same tuning as AUDIO_SOURCE_VOICE_RECOGNITION. 1499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand Used only internally to the framework. Not exposed 1509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand at the audio HAL. */ 1519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_source_t; 1529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio attributes */ 1549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_ATTRIBUTES_TAGS_MAX_SIZE 256 1559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct { 1569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_content_type_t content_type; 1579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_usage_t usage; 1589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_source_t source; 1599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_flags_mask_t flags; 1609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE]; /* UTF8 */ 1619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_attributes_t; 1629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* special audio session values 1649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (XXX: should this be living in the audio effects land?) 1659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* session for effects attached to a particular output stream 1689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (value must be less than 0) 1699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_OUTPUT_STAGE = -1, 1719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* session for effects applied to output mix. These effects can 1739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * be moved by audio policy manager to another output stream 1749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (value must be 0) 1759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_OUTPUT_MIX = 0, 1779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* application does not specify an explicit session ID to be used, 1799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and requests a new session ID to be allocated 1809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * TODO use unique values for AUDIO_SESSION_OUTPUT_MIX and AUDIO_SESSION_ALLOCATE, 1819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * after all uses have been updated from 0 to the appropriate symbol, and have been tested. 1829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 1839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_SESSION_ALLOCATE = 0, 1849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_session_t; 1859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* a unique ID allocated by AudioFlinger for use as a audio_io_handle_t or audio_session_t */ 1879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_unique_id_t; 1889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_UNIQUE_ID_ALLOCATE AUDIO_SESSION_ALLOCATE 1909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio sub formats (see enum audio_format). */ 1929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 1939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* PCM sub formats */ 1949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 1959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* All of these are in native byte order */ 1969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT = 0x1, /* DO NOT CHANGE - PCM signed 16 bits */ 1979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT = 0x2, /* DO NOT CHANGE - PCM unsigned 8 bits */ 1989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT = 0x3, /* PCM signed .31 fixed point */ 1999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT = 0x4, /* PCM signed 8.23 fixed point */ 2009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT = 0x5, /* PCM single-precision floating point */ 2019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED = 0x6, /* PCM signed .23 fixed point packed in 3 bytes */ 2029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_pcm_sub_fmt_t; 2039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio_format_*_sub_fmt_t declarations are not currently used */ 2059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* MP3 sub format field definition : can use 11 LSBs in the same way as MP3 2079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * frame header to specify bit rate, stereo mode, version... 2089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3_SUB_NONE = 0x0, 2119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_mp3_sub_fmt_t; 2129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AMR NB/WB sub format field definition: specify frame block interleaving, 2149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * bandwidth efficient or octet aligned, encoding mode for recording... 2159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_SUB_NONE = 0x0, 2189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_amr_sub_fmt_t; 2199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* AAC sub format field definition: specify profile or bitrate for recording... */ 2219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN = 0x1, 2239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC = 0x2, 2249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR = 0x4, 2259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP = 0x8, 2269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1 = 0x10, 2279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE = 0x20, 2289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC = 0x40, 2299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD = 0x80, 2309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2 = 0x100, 2319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD = 0x200, 2329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_aac_sub_fmt_t; 2339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* VORBIS sub format field definition: specify quality for recording... */ 2359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS_SUB_NONE = 0x0, 2379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_vorbis_sub_fmt_t; 2389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio format consists of a main format field (upper 8 bits) and a sub format 2419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * field (lower 24 bits). 2429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 2439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The main format indicates the main codec type. The sub format field 2449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * indicates options and parameters for each format. The sub format is mainly 2459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used for record to indicate for instance the requested bitrate or profile. 2469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It can also be used for certain formats to give informations not present in 2479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the encoded audio stream (e.g. octet alignement for AMR). 2489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 2499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 2509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_INVALID = 0xFFFFFFFFUL, 2519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DEFAULT = 0, 2529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM = 0x00000000UL, /* DO NOT CHANGE */ 2539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MP3 = 0x01000000UL, 2549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_NB = 0x02000000UL, 2559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AMR_WB = 0x03000000UL, 2569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC = 0x04000000UL, 2579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V1 = 0x05000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V1*/ 2589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_HE_AAC_V2 = 0x06000000UL, /* Deprecated, Use AUDIO_FORMAT_AAC_HE_V2*/ 2599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_VORBIS = 0x07000000UL, 2609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_OPUS = 0x08000000UL, 2619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AC3 = 0x09000000UL, 2629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_E_AC3 = 0x0A000000UL, 2639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS = 0x0B000000UL, 2649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_DTS_HD = 0x0C000000UL, 2659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_MAIN_MASK = 0xFF000000UL, 2669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_SUB_MASK = 0x00FFFFFFUL, 2679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 2689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Aliases */ 2699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_16BIT */ 2709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_16_BIT = (AUDIO_FORMAT_PCM | 2719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_16_BIT), 2729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* note != AudioFormat.ENCODING_PCM_8BIT */ 2739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_BIT = (AUDIO_FORMAT_PCM | 2749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_BIT), 2759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_32_BIT = (AUDIO_FORMAT_PCM | 2769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_32_BIT), 2779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_8_24_BIT = (AUDIO_FORMAT_PCM | 2789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_8_24_BIT), 2799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_FLOAT = (AUDIO_FORMAT_PCM | 2809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_FLOAT), 2819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_24_BIT_PACKED = (AUDIO_FORMAT_PCM | 2829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_PCM_SUB_24_BIT_PACKED), 2839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_MAIN = (AUDIO_FORMAT_AAC | 2849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_MAIN), 2859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LC = (AUDIO_FORMAT_AAC | 2869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LC), 2879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SSR = (AUDIO_FORMAT_AAC | 2889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SSR), 2899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LTP = (AUDIO_FORMAT_AAC | 2909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LTP), 2919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V1 = (AUDIO_FORMAT_AAC | 2929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V1), 2939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SCALABLE = (AUDIO_FORMAT_AAC | 2949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_SCALABLE), 2959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ERLC = (AUDIO_FORMAT_AAC | 2969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ERLC), 2979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_LD = (AUDIO_FORMAT_AAC | 2989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_LD), 2999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_HE_V2 = (AUDIO_FORMAT_AAC | 3009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_HE_V2), 3019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_ELD = (AUDIO_FORMAT_AAC | 3029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_FORMAT_AAC_SUB_ELD), 3039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_format_t; 3049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* For the channel mask for position assignment representation */ 3069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 3079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be a complete audio_channel_mask_t. */ 3099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_NONE = 0x0, 3119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_INVALID = 0xC0000000, 3129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These can be the bits portion of an audio_channel_mask_t 3149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * with representation AUDIO_CHANNEL_REPRESENTATION_POSITION. 3159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Using these bits as a complete audio_channel_mask_t is deprecated. 3169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 3179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output channels */ 3199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT = 0x1, 3209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT = 0x2, 3219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER = 0x4, 3229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY = 0x8, 3239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT = 0x10, 3249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT = 0x20, 3259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER = 0x40, 3269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER = 0x80, 3279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER = 0x100, 3289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT = 0x200, 3299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT = 0x400, 3309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER = 0x800, 3319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT = 0x1000, 3329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER = 0x2000, 3339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT = 0x4000, 3349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT = 0x8000, 3359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER = 0x10000, 3369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT = 0x20000, 3379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits? */ 3399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_MONO = AUDIO_CHANNEL_OUT_FRONT_LEFT, 3419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_STEREO = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT), 3439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 3479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_BACK = AUDIO_CHANNEL_OUT_QUAD, 3489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_QUAD_BACK with *_SIDE_* instead of *_BACK_* */ 3499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_QUAD_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT), 3599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_BACK = AUDIO_CHANNEL_OUT_5POINT1, 3609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* like AUDIO_CHANNEL_OUT_5POINT1_BACK with *_SIDE_* instead of *_BACK_* */ 3619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_5POINT1_SIDE = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // matches the correct AudioFormat.CHANNEL_OUT_7POINT1_SURROUND definition for 7.1 3689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_7POINT1 = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 3749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT | 3759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT), 3769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_ALL = (AUDIO_CHANNEL_OUT_FRONT_LEFT | 3779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT | 3789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_CENTER | 3799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_LOW_FREQUENCY | 3809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_LEFT | 3819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_RIGHT | 3829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | 3839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER | 3849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_BACK_CENTER| 3859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_LEFT| 3869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_SIDE_RIGHT| 3879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_CENTER| 3889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT| 3899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER| 3909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT| 3919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_LEFT| 3929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_CENTER| 3939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT), 3949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* These are bits only, not complete values */ 3969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 3979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input channels */ 3989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT = 0x4, 3999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT = 0x8, 4009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT = 0x10, 4019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK = 0x20, 4029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED = 0x40, 4039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED = 0x80, 4049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED = 0x100, 4059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED = 0x200, 4069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE = 0x400, 4079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS = 0x800, 4089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS = 0x1000, 4099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS = 0x2000, 4109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK = 0x4000, 4119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK = 0x8000, 4129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* TODO: should these be considered complete channel masks, or only bits, or deprecated? */ 4149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_MONO = AUDIO_CHANNEL_IN_FRONT, 4169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_STEREO = (AUDIO_CHANNEL_IN_LEFT | AUDIO_CHANNEL_IN_RIGHT), 4179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_BACK = (AUDIO_CHANNEL_IN_FRONT | AUDIO_CHANNEL_IN_BACK), 4189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_ALL = (AUDIO_CHANNEL_IN_LEFT | 4199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT | 4209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT | 4219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK| 4229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_LEFT_PROCESSED | 4239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_RIGHT_PROCESSED | 4249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_FRONT_PROCESSED | 4259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_BACK_PROCESSED| 4269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_PRESSURE | 4279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_X_AXIS | 4289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Y_AXIS | 4299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_Z_AXIS | 4309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_UPLINK | 4319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_IN_VOICE_DNLINK), 4329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 4339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* A channel mask per se only defines the presence or absence of a channel, not the order. 4359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But see AUDIO_INTERLEAVE_* below for the platform convention of order. 4369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio_channel_mask_t is an opaque type and its internal layout should not 4389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * be assumed as it may change in the future. 4399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Instead, always use the functions declared in this header to examine. 4409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * These are the current representations: 4429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_POSITION 4449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for position assignment. 4459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to the spatial position of a transducer (output), 4469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or interpretation of channel (input). 4479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The user of a channel mask needs to know the context of whether it is for output or input. 4489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The constants AUDIO_CHANNEL_OUT_* or AUDIO_CHANNEL_IN_* apply to the bits portion. 4499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 4509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * AUDIO_CHANNEL_REPRESENTATION_INDEX 4529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is a channel mask representation for index assignment. 4539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each low-order bit corresponds to a selected channel. 4549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no platform interpretation of the various bits. 4559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * There is no concept of output or input. 4569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * It is not permitted for no bits to be set. 4579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other representations are reserved for future use. 4599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 4609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Warning: current representation distinguishes between input and output, but this will not the be 4619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * case in future revisions of the platform. Wherever there is an ambiguity between input and output 4629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * that is currently resolved by checking the channel mask, the implementer should look for ways to 4639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * fix it with additional information outside of the mask. 4649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 4659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_channel_mask_t; 4669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Maximum number of channels for all representations */ 4689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_COUNT_MAX 30 4699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* log(2) of maximum number of representations, not part of public API */ 4719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_CHANNEL_REPRESENTATION_LOG2 2 4729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Representations */ 4749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 4759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION = 0, // must be zero for compatibility 4769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 1 is reserved for future use 4779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_INDEX = 2, 4789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // 3 is reserved for future use 4799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_channel_representation_t; 4809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 4811f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung/* The channel index masks defined here are the canonical masks for 1 to 8 channel 4821f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung * endpoints and apply to both source and sink. 4831f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung */ 4841f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hungenum { 4851f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_HDR = AUDIO_CHANNEL_REPRESENTATION_INDEX << AUDIO_CHANNEL_COUNT_MAX, 4861f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_1 = AUDIO_CHANNEL_INDEX_HDR | (1 << 1) - 1, 4871f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_2 = AUDIO_CHANNEL_INDEX_HDR | (1 << 2) - 1, 4881f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_3 = AUDIO_CHANNEL_INDEX_HDR | (1 << 3) - 1, 4891f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_4 = AUDIO_CHANNEL_INDEX_HDR | (1 << 4) - 1, 4901f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_5 = AUDIO_CHANNEL_INDEX_HDR | (1 << 5) - 1, 4911f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_6 = AUDIO_CHANNEL_INDEX_HDR | (1 << 6) - 1, 4921f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_7 = AUDIO_CHANNEL_INDEX_HDR | (1 << 7) - 1, 4931f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung AUDIO_CHANNEL_INDEX_MASK_8 = AUDIO_CHANNEL_INDEX_HDR | (1 << 8) - 1, 4941f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung}; 4951f6902ea391a84a33b0dca376285a5440ba5f55fAndy Hung 4969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 4979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_mask_get_bits(audio_channel_mask_t channel) 4989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 4999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return channel & ((1 << AUDIO_CHANNEL_COUNT_MAX) - 1); 5009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The return value is undefined if the channel mask is invalid. */ 5039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_representation_t audio_channel_mask_get_representation( 5049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel) 5059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // The right shift should be sufficient, but also "and" for safety in case mask is not 32 bits 5079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_representation_t) 5089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((channel >> AUDIO_CHANNEL_COUNT_MAX) & ((1 << AUDIO_CHANNEL_REPRESENTATION_LOG2) - 1)); 5099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if the channel mask is valid, 5129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or returns false for AUDIO_CHANNEL_NONE, AUDIO_CHANNEL_INVALID, and other invalid values. 5139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This function is unable to determine whether a channel mask for position assignment 5149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * is invalid because an output mask has an invalid output bit set, 5159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or because an input mask has an invalid input bit set. 5169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * All other APIs that take a channel mask assume that it is valid. 5179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_channel_mask_is_valid(audio_channel_mask_t channel) 5199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 5219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation = audio_channel_mask_get_representation(channel); 5229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (representation) { 5239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 5249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 5259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 5279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 5289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 5299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 5309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 5319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Not part of public API */ 5349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_mask_from_representation_and_bits( 5359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_representation_t representation, uint32_t bits) 5369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 5379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (audio_channel_mask_t) ((representation << AUDIO_CHANNEL_COUNT_MAX) | bits); 5389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 5399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Expresses the convention when stereo audio samples are stored interleaved 5419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * in an array. This should improve readability by allowing code to use 5429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * symbolic indices instead of hard-coded [0] and [1]. 5439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * 5449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * For multi-channel beyond stereo, the platform convention is that channels 5459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * are interleaved in order from least significant channel mask bit 5469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to most significant channel mask bit, with unused bits skipped. 5479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Any exceptions to this convention will be noted at the appropriate API. 5489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 5499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 5509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_LEFT = 0, 5519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INTERLEAVE_RIGHT = 1, 5529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 5539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 5559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_INVALID = -2, 5569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CURRENT = -1, 5579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_NORMAL = 0, 5589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_RINGTONE = 1, 5599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_CALL = 2, 5609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_IN_COMMUNICATION = 3, 5619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_CNT, 5639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_MODE_MAX = AUDIO_MODE_CNT - 1, 5649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mode_t; 5659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* This enum is deprecated */ 5679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 5689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NONE = 0, 5699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_ENABLE = 0x0001, 5709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_AGC_DISABLE = 0, 5719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_ENABLE = 0x0002, 5729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_NS_DISABLE = 0, 5739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_IIR_ENABLE = 0x0004, 5749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_IN_ACOUSTICS_TX_DISABLE = 0, 5759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_in_acoustics_t; 5769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 5779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandenum { 5789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_NONE = 0x0, 5799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* reserved bits */ 5809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_IN = 0x80000000, 5819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_BIT_DEFAULT = 0x40000000, 5829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* output devices */ 5839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_EARPIECE = 0x1, 5849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER = 0x2, 5859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4, 5869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8, 5879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO = 0x10, 5889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20, 5899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40, 5909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP = 0x80, 5919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100, 5929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200, 5939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_DIGITAL = 0x400, 5949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI = AUDIO_DEVICE_OUT_AUX_DIGITAL, 5959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* uses an analog connection (multiplexed over the USB connector pins for instance) */ 5969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET = 0x800, 5979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET = 0x1000, 5989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB accessory mode: your Android device is a USB device and the dock is a USB host */ 5999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000, 6009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* USB host mode: your Android device is a USB host and the dock is a USB device */ 6019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE = 0x4000, 6029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX = 0x8000, 6039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice TX path */ 6049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX = 0x10000, 6059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 6069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE = 0x20000, 6079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* HDMI Audio Return Channel */ 6089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC = 0x40000, 6099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF out */ 6109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF = 0x80000, 6119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM transmitter out */ 6129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM = 0x100000, 6139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Line out for av devices */ 6149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE = 0x200000, 6159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* limited-output speaker device for acoustic safety */ 6169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE = 0x400000, 6179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT = AUDIO_DEVICE_BIT_DEFAULT, 6189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_EARPIECE | 6199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER | 6209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADSET | 6219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 6229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT | 6259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | 6289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI | 6299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET | 6309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET | 6319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_ACCESSORY | 6329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE | 6339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_REMOTE_SUBMIX | 6349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_TELEPHONY_TX | 6359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_LINE | 6369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_HDMI_ARC | 6379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPDIF | 6389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_FM | 6399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_AUX_LINE | 6409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_SPEAKER_SAFE | 6419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_DEFAULT), 6429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_A2DP = (AUDIO_DEVICE_OUT_BLUETOOTH_A2DP | 6439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | 6449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 6459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_SCO = (AUDIO_DEVICE_OUT_BLUETOOTH_SCO | 6469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET | 6479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 6489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_ALL_USB = (AUDIO_DEVICE_OUT_USB_ACCESSORY | 6499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_OUT_USB_DEVICE), 6509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* input devices */ 6529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_COMMUNICATION = AUDIO_DEVICE_BIT_IN | 0x1, 6539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT = AUDIO_DEVICE_BIT_IN | 0x2, 6549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC = AUDIO_DEVICE_BIT_IN | 0x4, 6559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET = AUDIO_DEVICE_BIT_IN | 0x8, 6569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x10, 6579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AUX_DIGITAL = AUDIO_DEVICE_BIT_IN | 0x20, 6589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI = AUDIO_DEVICE_IN_AUX_DIGITAL, 6599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Telephony voice RX path */ 6609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_VOICE_CALL = AUDIO_DEVICE_BIT_IN | 0x40, 6619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX = AUDIO_DEVICE_IN_VOICE_CALL, 6629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC = AUDIO_DEVICE_BIT_IN | 0x80, 6639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX = AUDIO_DEVICE_BIT_IN | 0x100, 6649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x200, 6659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET = AUDIO_DEVICE_BIT_IN | 0x400, 6669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY = AUDIO_DEVICE_BIT_IN | 0x800, 6679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE = AUDIO_DEVICE_BIT_IN | 0x1000, 6689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* FM tuner input */ 6699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER = AUDIO_DEVICE_BIT_IN | 0x2000, 6709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* TV tuner input */ 6719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER = AUDIO_DEVICE_BIT_IN | 0x4000, 6729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* Analog jack with line impedance detected */ 6739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE = AUDIO_DEVICE_BIT_IN | 0x8000, 6749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* S/PDIF in */ 6759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF = AUDIO_DEVICE_BIT_IN | 0x10000, 6769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP = AUDIO_DEVICE_BIT_IN | 0x20000, 6779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK = AUDIO_DEVICE_BIT_IN | 0x40000, 6789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT = AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT, 6799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 6809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_COMMUNICATION | 6819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_AMBIENT | 6829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BUILTIN_MIC | 6839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET | 6849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_WIRED_HEADSET | 6859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_HDMI | 6869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TELEPHONY_RX | 6879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BACK_MIC | 6889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_REMOTE_SUBMIX | 6899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET | 6909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET | 6919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_ACCESSORY | 6929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE | 6939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_FM_TUNER | 6949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_TV_TUNER | 6959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LINE | 6969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_SPDIF | 6979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_BLUETOOTH_A2DP | 6989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_LOOPBACK | 6999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_DEFAULT), 7009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_SCO = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 7019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_ALL_USB = (AUDIO_DEVICE_IN_USB_ACCESSORY | 7029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_DEVICE_IN_USB_DEVICE), 7039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 7049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_devices_t; 7069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the audio output flags serve two purposes: 7089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when an AudioTrack is created they indicate a "wish" to be connected to an 7099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * output stream with attributes corresponding to the specified flags 7109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * - when present in an output profile descriptor listed for a particular audio 7119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware module, they indicate that an output stream can be opened that 7129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * supports the attributes indicated by the flags. 7139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the audio policy manager will try to match the flags in the request 7149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (when getOuput() is called) to an available output stream. 7159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 7179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NONE = 0x0, // no attributes 7189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DIRECT = 0x1, // this output directly connects a track 7199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // to one output stream: no software mixer 7209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_PRIMARY = 0x2, // this output is the primary output of 7219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // the device. It is unique and must be 7229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // present. It is opened by default and 7239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // receives routing, audio mode and volume 7249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // controls related to voice calls. 7259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_FAST = 0x4, // output supports "fast tracks", 7269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // defined elsewhere 7279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_DEEP_BUFFER = 0x8, // use deep audio buffers 7289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD = 0x10, // offload playback of compressed 7299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // streams to hardware codec 7309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_OUTPUT_FLAG_NON_BLOCKING = 0x20, // use non-blocking write 73180b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda AUDIO_OUTPUT_FLAG_HW_AV_SYNC = 0x40, // output uses a hardware A/V synchronization source 73280b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda AUDIO_OUTPUT_FLAG_TTS = 0x80 // output for streams transmitted through speaker 73380b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda // at a sample rate high enough to accommodate 73480b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda // lower-range ultrasonic playback 73580b8823a7fd689283093ddaf074f9d67ec152aa8Ravi Kumar Alamanda 7369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_output_flags_t; 7379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The audio input flags are analogous to audio output flags. 7399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Currently they are used only when an AudioRecord is created, 7409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * to indicate a preference to be connected to an input stream with 7419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * attributes corresponding to the specified flags. 7429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 7449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_NONE = 0x0, // no attributes 7459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_FAST = 0x1, // prefer an input that supports "fast tracks" 7469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_INPUT_FLAG_HW_HOTWORD = 0x2, // prefer an input that captures from hw hotword source 7479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_input_flags_t; 7489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Additional information about compressed streams offloaded to 7509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware playback 7519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * The version and size fields must be initialized by the caller by using 7529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one of the constants defined here. 7539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct { 7559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t version; // version of the info structure 7569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint16_t size; // total size of the structure including version and size 7579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; // sample rate in Hz 7589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; // channel mask 7599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; // audio format 7609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream_type; // stream type 7619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bit_rate; // bit rate in bits per second 7629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int64_t duration_us; // duration in microseconds, -1 if unknown 7639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool has_video; // true if stream is tied to a video stream 7649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bool is_streaming; // true if streaming, false if local playback 7659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_offload_info_t; 7669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_MAKE_OFFLOAD_INFO_VERSION(maj,min) \ 7689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand ((((maj) & 0xff) << 8) | ((min) & 0xff)) 7699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_0_1 AUDIO_MAKE_OFFLOAD_INFO_VERSION(0, 1) 7719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_OFFLOAD_INFO_VERSION_CURRENT AUDIO_OFFLOAD_INFO_VERSION_0_1 7729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_offload_info_t AUDIO_INFO_INITIALIZER = { 7749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 7759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 7769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 7779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 7789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 7799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 7809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 7819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 7829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 7839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 7849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 7859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* common audio stream configuration parameters 7879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * You should memset() the entire structure to zero before use to 7889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * ensure forward compatibility 7899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 7909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_config { 7919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t sample_rate; 7929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; 7939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; 7949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_offload_info_t offload_info; 7959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t frame_count; 7969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 7979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef struct audio_config audio_config_t; 7989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 7999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic const audio_config_t AUDIO_CONFIG_INITIALIZER = { 8009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: AUDIO_CHANNEL_NONE, 8029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand offload_info: { 8049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand version: AUDIO_OFFLOAD_INFO_VERSION_CURRENT, 8059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size: sizeof(audio_offload_info_t), 8069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand sample_rate: 0, 8079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel_mask: 0, 8089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand format: AUDIO_FORMAT_DEFAULT, 8099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand stream_type: AUDIO_STREAM_VOICE_CALL, 8109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bit_rate: 0, 8119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand duration_us: 0, 8129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand has_video: false, 8139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand is_streaming: false 8149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand }, 8159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand frame_count: 0, 8169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio hw module handle functions or structures referencing a module */ 8209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_module_handle_t; 8219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 8239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Volume control 8249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 8259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* If the audio hardware supports gain control on some audio paths, 8279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the platform can expose them in the audio_policy.conf file. The audio HAL 8289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * will then implement gain control functions that will use the following data 8299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * structures. */ 8309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Type of gain control exposed by an audio port */ 8329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_JOINT 0x1 /* supports joint channel gain control */ 8339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_CHANNELS 0x2 /* supports separate channel gain control */ 8349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_GAIN_MODE_RAMP 0x4 /* supports gain ramps */ 8359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_gain_mode_t; 8379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio_gain struct is a representation of a gain stage. 8409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * A gain stage is always attached to an audio port. */ 8419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain { 8429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* e.g. AUDIO_GAIN_MODE_JOINT */ 8439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain an be controlled. 8449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A if AUDIO_GAIN_MODE_CHANNELS is not supported */ 8459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int min_value; /* minimum gain value in millibels */ 8469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int max_value; /* maximum gain value in millibels */ 8479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int default_value; /* default gain value in millibels */ 8489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int step_value; /* gain step in millibels */ 8499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int min_ramp_ms; /* minimum ramp duration in ms */ 8509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int max_ramp_ms; /* maximum ramp duration in ms */ 8519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* The gain configuration structure is used to get or set the gain values of a 8549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * given port */ 8559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_gain_config { 8569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int index; /* index of the corresponding audio_gain in the 8579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port gains[] table */ 8589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_gain_mode_t mode; /* mode requested for this command */ 8599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channels which gain value follows. 8609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand N/A in joint mode */ 8619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand int values[sizeof(audio_channel_mask_t) * 8]; /* gain values in millibels 8629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand for each channel ordered from LSb to MSb in 8639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand channel mask. The number of values is 1 in joint 8649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand mode or popcount(channel_mask) */ 8659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int ramp_duration_ms; /* ramp duration in ms */ 8669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 8679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/****************************** 8699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Routing control 8709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand *****************************/ 8719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Types defined here are used to describe an audio source or sink at internal 8739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * framework interfaces (audio policy, patch panel) or at the audio HAL. 8749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Sink and sources are grouped in a concept of “audio port” representing an 8759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio end point at the edge of the system managed by the module exposing 8769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * the interface. */ 8779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port role: either source or sink */ 8799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 8809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_NONE, 8819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SOURCE, 8829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_ROLE_SINK, 8839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_role_t; 8849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Audio port type indicates if it is a session (e.g AudioTrack), 8869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * a mix (e.g PlaybackThread output) or a physical device 8879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 8889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 8899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_NONE, 8909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_DEVICE, 8919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_MIX, 8929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_TYPE_SESSION, 8939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_port_type_t; 8949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Each port has a unique ID or handle allocated by policy manager */ 8969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_port_handle_t; 8979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_HANDLE_NONE 0 8989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 8999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* the maximum length for the human-readable device name */ 9009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_NAME_LEN 128 9019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* maximum audio device address length */ 9039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_DEVICE_MAX_ADDRESS_LEN 32 9049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * hardware device */ 9079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_device_ext { 9089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 9099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; /* device address. "" if N/A */ 9119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is a 9149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * sub mix */ 9159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_mix_ext { 9169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 9179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input/output stream */ 9189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 9199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand //TODO: change use case for output streams: use strategy and mixer attributes 9209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_stream_type_t stream; 9219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_source_t source; 9229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } usecase; 9239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port configuration structure when the audio port is an 9269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * audio session */ 9279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config_session_ext { 9289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 9299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Flags indicating which fields are to be considered in struct audio_port_config */ 9329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_SAMPLE_RATE 0x1 9339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_CHANNEL_MASK 0x2 9349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_FORMAT 0x4 9359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_GAIN 0x8 9369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_CONFIG_ALL (AUDIO_PORT_CONFIG_SAMPLE_RATE | \ 9379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_CHANNEL_MASK | \ 9389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_FORMAT | \ 9399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_PORT_CONFIG_GAIN) 9409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* audio port configuration structure used to specify a particular configuration of 9429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * an audio port */ 9439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_config { 9449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 9459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 9469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 9479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int config_mask; /* e.g AUDIO_PORT_CONFIG_ALL */ 9489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rate; /* sampling rate in Hz */ 9499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_mask; /* channel mask if applicable */ 9509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t format; /* format if applicable */ 9519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain_config gain; /* gain to apply if applicable */ 9529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 9539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_device_ext device; /* device specific info */ 9549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_mix_ext mix; /* mix specific info */ 9559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config_session_ext session; /* session specific info */ 9569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 9579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of sampling rates in audio port */ 9619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_SAMPLING_RATES 16 9629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of channel masks in audio port */ 9639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_CHANNEL_MASKS 16 9649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of audio formats in audio port */ 9659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_FORMATS 16 9669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* max number of gain controls in audio port */ 9679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PORT_MAX_GAINS 16 9689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a hardware device */ 9709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_device_ext { 9719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the device is attached to */ 9729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_devices_t type; /* device type (e.g AUDIO_DEVICE_OUT_SPEAKER) */ 9739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char address[AUDIO_DEVICE_MAX_ADDRESS_LEN]; 9749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Latency class of the audio mix */ 9779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef enum { 9789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_LOW, 9799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_LATENCY_NORMAL, 9809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} audio_mix_latency_class_t; 9819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is a sub mix */ 9839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_mix_ext { 9849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_module_handle_t hw_module; /* module the stream is attached to */ 9859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_io_handle_t handle; /* I/O handle of the input.output stream */ 9869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_mix_latency_class_t latency_class; /* latency class */ 9879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // other attributes: routing strategies 9889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* extension for audio port structure when the audio port is an audio session */ 9919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port_session_ext { 9929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_session_t session; /* audio session */ 9939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 9949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 9959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_port { 9969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_handle_t id; /* port unique ID */ 9979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_role_t role; /* sink or source */ 9989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_port_type_t type; /* device, mix ... */ 9999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char name[AUDIO_PORT_MAX_NAME_LEN]; 10009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sample_rates; /* number of sampling rates in following array */ 10019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int sample_rates[AUDIO_PORT_MAX_SAMPLING_RATES]; 10029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_channel_masks; /* number of channel masks in following array */ 10039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_channel_mask_t channel_masks[AUDIO_PORT_MAX_CHANNEL_MASKS]; 10049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_formats; /* number of formats in following array */ 10059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_format_t formats[AUDIO_PORT_MAX_FORMATS]; 10069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_gains; /* number of gains in following array */ 10079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_gain gains[AUDIO_PORT_MAX_GAINS]; 10089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config active_config; /* current audio port configuration */ 10099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand union { 10109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_device_ext device; 10119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_mix_ext mix; 10129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_session_ext session; 10139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } ext; 10149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* An audio patch represents a connection between one or more source ports and 10179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * one or more sink ports. Patches are connected and disconnected by audio policy manager or by 10189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * applications via framework APIs. 10199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Each patch is identified by a handle at the interface used to create that patch. For instance, 10209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * when a patch is created by the audio HAL, the HAL allocates and returns a handle. 10219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This handle is unique to a given audio HAL hardware module. 10229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * But the same patch receives another system wide unique handle allocated by the framework. 10239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This unique handle is used for all transactions inside the framework. 10249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 10259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef int audio_patch_handle_t; 10269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_HANDLE_NONE 0 10279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_PATCH_PORTS_MAX 16 10299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstruct audio_patch { 10319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand audio_patch_handle_t id; /* patch unique ID */ 10329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sources; /* number of sources in following array */ 10339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sources[AUDIO_PATCH_PORTS_MAX]; 10349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand unsigned int num_sinks; /* number of sinks in following array */ 10359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand struct audio_port_config sinks[AUDIO_PATCH_PORTS_MAX]; 10369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand}; 10379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* a HW synchronization source returned by the audio HAL */ 10419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandtypedef uint32_t audio_hw_sync_t; 10429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* an invalid HW synchronization source indicating an error */ 10449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#define AUDIO_HW_SYNC_INVALID 0 10459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_device(audio_devices_t device) 10479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (((device & AUDIO_DEVICE_BIT_IN) == 0) && 10499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand (popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL) == 0)) 10509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 10529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_device(audio_devices_t device) 10569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 10589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 10599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_ALL) == 0)) 10609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 10629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_devices(audio_devices_t device) 10669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return (device & AUDIO_DEVICE_BIT_IN) == 0; 10689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_in_device(audio_devices_t device) 10719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 10739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 10749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_IN_BLUETOOTH_A2DP)) 10759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 10779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_out_device(audio_devices_t device) 10819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_A2DP)) 10839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 10859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 10869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand// Deprecated - use audio_is_a2dp_out_device() instead 10899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_a2dp_device(audio_devices_t device) 10909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_a2dp_out_device(device); 10929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 10939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 10949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_bluetooth_sco_device(audio_devices_t device) 10959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 10969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) == 0) { 10979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_OUT_ALL_SCO) == 0)) 10989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 10999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } else { 11009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((popcount(device) == 1) && ((device & ~AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) == 0)) 11029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_out_device(audio_devices_t device) 11099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_ALL_USB)); 11119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_in_device(audio_devices_t device) 11149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if ((device & AUDIO_DEVICE_BIT_IN) != 0) { 11169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand device &= ~AUDIO_DEVICE_BIT_IN; 11179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (popcount(device) == 1 && (device & AUDIO_DEVICE_IN_ALL_USB) != 0) 11189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* OBSOLETE - use audio_is_usb_out_device() instead. */ 11249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_usb_device(audio_devices_t device) 11259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_is_usb_out_device(device); 11279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_remote_submix_device(audio_devices_t device) 11309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 1131794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz if ((audio_is_output_devices(device) && 1132794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) == AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 1133794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz || (!audio_is_output_devices(device) && 1134794857a8a1800e515d61970363c405db5359c2aaMisael Lopez Cruz (device & AUDIO_DEVICE_IN_REMOTE_SUBMIX) == AUDIO_DEVICE_IN_REMOTE_SUBMIX)) 11359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 11369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 11379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 11419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 11429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an input channel, and 11439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an input channel. 11449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 11459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 11469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_input_channel(audio_channel_mask_t channel) 11479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 11499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 11509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 11519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_IN_ALL) { 11529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 11539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 11559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 11569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 11579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 11589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns true if: 11639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * representation is valid, and 11649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there is at least one channel bit set which _could_ correspond to an output channel, and 11659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * there are no channel bits set which could _not_ correspond to an output channel. 11669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Otherwise returns false. 11679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 11689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_output_channel(audio_channel_mask_t channel) 11699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 11719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 11729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 11739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (bits & ~AUDIO_CHANNEL_OUT_ALL) { 11749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = 0; 11759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 11779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 11789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return bits != 0; 11799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 11809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 11819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 11829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 11839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 11849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an input channel mask, 11859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio input or recording. 11869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an input channel, 11879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 11889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 11899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 11909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_in_mask(audio_channel_mask_t channel) 11919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 11929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 11939bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 11949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 11959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // TODO: We can now merge with from_out_mask and remove anding 11969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_IN_ALL; 11979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 11989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 11999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 12029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Returns the number of channels from an output channel mask, 12069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * used in the context of audio output or playback. 12079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * If a channel bit is set which could _not_ correspond to an output channel, 12089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * it is excluded from the count. 12099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns zero if the representation is invalid. 12109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline uint32_t audio_channel_count_from_out_mask(audio_channel_mask_t channel) 12129bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12139bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits = audio_channel_mask_get_bits(channel); 12149bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (audio_channel_mask_get_representation(channel)) { 12159bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_POSITION: 12169bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // TODO: We can now merge with from_in_mask and remove anding 12179bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits &= AUDIO_CHANNEL_OUT_ALL; 12189bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand // fall through 12199bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_CHANNEL_REPRESENTATION_INDEX: 12209bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return popcount(bits); 12219bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12229bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return 0; 12239bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12249bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12259bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 122621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten/* Derive a channel mask for index assignment from a channel count. 122721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * Returns the matching channel mask, 122821aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_NONE if the channel count is zero, 122921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten * or AUDIO_CHANNEL_INVALID if the channel count exceeds AUDIO_CHANNEL_COUNT_MAX. 123021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten */ 123121aa43a5ea032080aee301abc60780887f94665fGlenn Kastenstatic inline audio_channel_mask_t audio_channel_mask_for_index_assignment_from_count( 123221aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t channel_count) 123321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten{ 123421aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count == 0) { 123521aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_NONE; 123621aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 123721aa43a5ea032080aee301abc60780887f94665fGlenn Kasten if (channel_count > AUDIO_CHANNEL_COUNT_MAX) { 123821aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return AUDIO_CHANNEL_INVALID; 123921aa43a5ea032080aee301abc60780887f94665fGlenn Kasten } 124021aa43a5ea032080aee301abc60780887f94665fGlenn Kasten uint32_t bits = (1 << channel_count) - 1; 124121aa43a5ea032080aee301abc60780887f94665fGlenn Kasten return audio_channel_mask_from_representation_and_bits( 124221aa43a5ea032080aee301abc60780887f94665fGlenn Kasten AUDIO_CHANNEL_REPRESENTATION_INDEX, bits); 124321aa43a5ea032080aee301abc60780887f94665fGlenn Kasten} 124421aa43a5ea032080aee301abc60780887f94665fGlenn Kasten 12459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* Derive an output channel mask for position assignment from a channel count. 12469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * This is to be used when the content channel mask is unknown. The 1, 2, 4, 5, 6, 7 and 8 channel 12479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * cases are mapped to the standard game/home-theater layouts, but note that 4 is mapped to quad, 12489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * and not stereo + FC + mono surround. A channel count of 3 is arbitrarily mapped to stereo + FC 12499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * for continuity with stereo. 12509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 12519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 12529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 12539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default output channel mask is defined. 12549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_out_mask_from_count(uint32_t channel_count) 12569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 12579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 12589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 12599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 12609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 12619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 12629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_MONO; 12639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 12659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO; 12669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 3: 12689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_STEREO | AUDIO_CHANNEL_OUT_FRONT_CENTER; 12699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 4: // 4.0 12719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD; 12729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 5: // 5.0 12749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_QUAD | AUDIO_CHANNEL_OUT_FRONT_CENTER; 12759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 6: // 5.1 12779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1; 12789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 7: // 6.1 12809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_5POINT1 | AUDIO_CHANNEL_OUT_BACK_CENTER; 12819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 8: 12839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_OUT_7POINT1; 12849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 12859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 12869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_INVALID; 12879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 12889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return audio_channel_mask_from_representation_and_bits( 12899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand AUDIO_CHANNEL_REPRESENTATION_POSITION, bits); 12909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 12919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 12927cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten/* Derive a default input channel mask from a channel count. 12937cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten * Assumes a position mask for mono and stereo, or an index mask for channel counts > 2. 12949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * Returns the matching channel mask, 12959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_NONE if the channel count is zero, 12969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * or AUDIO_CHANNEL_INVALID if the channel count exceeds that of the 12979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand * configurations for which a default input channel mask is defined. 12989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand */ 12999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline audio_channel_mask_t audio_channel_in_mask_from_count(uint32_t channel_count) 13009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand uint32_t bits; 13029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (channel_count) { 13039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 0: 13049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return AUDIO_CHANNEL_NONE; 13059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 1: 13069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_MONO; 13079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case 2: 13099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand bits = AUDIO_CHANNEL_IN_STEREO; 13109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13117cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 3: 13127cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 4: 13137cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 5: 13147cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 6: 13157cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 7: 13167cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten case 8: 13177cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten // FIXME FCC_8 13187cb33cef3d5031ed0c14d114aec1ef7c972df476Glenn Kasten return audio_channel_mask_for_index_assignment_from_count(channel_count); 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 13269bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_valid_format(audio_format_t format) 13279bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13289bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format & AUDIO_FORMAT_MAIN_MASK) { 13299bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM: 13309bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 13319bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 13329bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 13339bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 13349bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 13359bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 13369bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 13379bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 13389bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13399bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 13409bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13419bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand /* not reached */ 13429bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_MP3: 13439bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_NB: 13449bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AMR_WB: 13459bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AAC: 13469bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V1: 13479bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_HE_AAC_V2: 13489bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_VORBIS: 13499bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_OPUS: 13509bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_AC3: 13519bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_E_AC3: 13529bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS: 13539bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_DTS_HD: 13549bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return true; 13559bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13569bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return false; 13579bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13589bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13599bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13609bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline bool audio_is_linear_pcm(audio_format_t format) 13619bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13629bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_PCM); 13639bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13649bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13659bd6157cdd2e513293005081c431604df4da6750Rom Lemarchandstatic inline size_t audio_bytes_per_sample(audio_format_t format) 13669bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13679bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size_t size = 0; 13689bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13699bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand switch (format) { 13709bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_32_BIT: 13719bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_24_BIT: 13729bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int32_t); 13739bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13749bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_24_BIT_PACKED: 13759bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t) * 3; 13769bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13779bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_16_BIT: 13789bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(int16_t); 13799bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13809bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_8_BIT: 13819bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(uint8_t); 13829bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13839bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand case AUDIO_FORMAT_PCM_FLOAT: 13849bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand size = sizeof(float); 13859bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13869bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand default: 13879bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand break; 13889bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand } 13899bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return size; 13909bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 13919bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13929bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand/* converts device address to string sent to audio HAL via set_parameters */ 1393ed5246d4a581cdc5aa16a27e8dd70d52fe8cd2bbArman Uguraystatic inline char *audio_device_address_to_parameter(audio_devices_t device, const char *address) 13949bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand{ 13959bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand const size_t kSize = AUDIO_DEVICE_MAX_ADDRESS_LEN + sizeof("a2dp_sink_address="); 13969bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand char param[kSize]; 13979bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 13989bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand if (device & AUDIO_DEVICE_OUT_ALL_A2DP) 13999bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "a2dp_sink_address", address); 14009bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else if (device & AUDIO_DEVICE_OUT_REMOTE_SUBMIX) 14019bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s=%s", "mix", address); 14029bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand else 14039bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand snprintf(param, kSize, "%s", address); 14049bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14059bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand return strdup(param); 14069bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand} 14079bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14089bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14099bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand__END_DECLS 14109bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand 14119bd6157cdd2e513293005081c431604df4da6750Rom Lemarchand#endif // ANDROID_AUDIO_CORE_H 1412