开篇先贴上一个高通的例子,后续基于此文件做具体分析。

1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2 <!-- Copyright (c) 2016-2019, The Linux Foundation. All rights reserved
3      Not a Contribution.
4 -->
5 <!-- Copyright (C) 2015 The Android Open Source Project
6 
7      Licensed under the Apache License, Version 2.0 (the "License");
8      you may not use this file except in compliance with the License.
9      You may obtain a copy of the License at
10 
11           http://www.apache.org/licenses/LICENSE-2.0
12 
13      Unless required by applicable law or agreed to in writing, software
14      distributed under the License is distributed on an "AS IS" BASIS,
15      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16      See the License for the specific language governing permissions and
17      limitations under the License.
18 -->
19 
20 <audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
21     <!-- version section contains a “version” tag in the form “major.minor” e.g version=”1.0” -->
22 
23     <!-- Global configuration Decalaration -->
24     <globalConfiguration speaker_drc_enabled="true"/>
25 
26     <!-- Modules section:
27         There is one section per audio HW module present on the platform.
28         Each module section will contains two mandatory tags for audio HAL “halVersion” and “name”.
29         The module names are the same as in current .conf file:
30                 “primary”, “A2DP”, “remote_submix”, “USB”
31         Each module will contain the following sections:
32         “devicePorts”: a list of device descriptors for all input and output devices accessible via this
33         module.
34         This contains both permanently attached devices and removable devices.
35             "gain": constraints applied to the millibel values:
36                 - maxValueMB >= minValueMB
37                 - defaultValueMB >= minValueMB && defaultValueMB <= maxValueMB
38                 - (maxValueMB - minValueMB) % stepValueMB == 0
39                 - (defaultValueMB - minValueMB) % stepValueMB == 0
40         “mixPorts”: listing all output and input streams exposed by the audio HAL
41         “routes”: list of possible connections between input and output devices or between stream and
42         devices.
43             "route": is defined by an attribute:
44                 -"type": <mux|mix> means all sources are mutual exclusive (mux) or can be mixed (mix)
45                 -"sink": the sink involved in this route
46                 -"sources": all the sources than can be connected to the sink via vis route
47         “attachedDevices”: permanently attached devices.
48         The attachedDevices section is a list of devices names. The names correspond to device names
49         defined in <devicePorts> section.
50         “defaultOutputDevice”: device to be used by default when no policy rule applies
51     -->
52     <modules>
53         <!-- Primary Audio HAL -->
54         <module name="primary" halVersion="3.0">
55             <attachedDevices>
56                 <item>Media Bus</item>
57                 <item>Sys Notification Bus</item>
58                 <item>Nav Guidance Bus</item>
59                 <item>Phone Bus</item>
60                 <item>Tts Bus</item>
61                 <item>Vr Tts Bus</item>
62                 <item>Boot Music Bus</item>
63                 <item>Chime Tts Bus</item>
64                 <item>BT Codriver Bus</item>
65                 <item>Projection Vr Tts Bus</item>
66                 <item>Ringtone Bus</item>
67                 <item>Built-In Mic</item>
68                 <item>Built-In Back Mic</item>
69                 <item>FM Tuner</item>
70                 <item>Speaker</item>
71                 <item>Projection Vr Bus In</item>
72                 <item>Projection Phone Bus In</item>
73                 <item>Local Vr Bus In</item>
74                 <item>Projection Esiri Bus In</item>
75             </attachedDevices>
76             <defaultOutputDevice>Media Bus</defaultOutputDevice>
77             <mixPorts>
78                 <mixPort name="media" role="source"
79                          flags="AUDIO_OUTPUT_FLAG_PRIMARY">
80                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
81                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
82                 </mixPort>
83                 <mixPort name="sys_notification" role="source">
84                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
85                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
86                 </mixPort>
87                 <mixPort name="nav_guidance" role="source">
88                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
89                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
90                 </mixPort>
91                 <mixPort name="phone" role="source">
92                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
93                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
94                 </mixPort>
95                 <mixPort name="tts" role="source">
96                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
97                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
98                 </mixPort>
99                 <mixPort name="vr_tts" role="source">
100                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
101                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
102                 </mixPort>
103                 <mixPort name="boot_music" role="source">
104                     <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
105                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
106                 </mixPort>
107                 <mixPort name="chime_tts" role="source">
108                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
109                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
110                 </mixPort>
111                 <mixPort name="bt_codriver" role="source"
112                          flags="AUDIO_OUTPUT_FLAG_RIGHT_ZONE">
113                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
114                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
115                 </mixPort>
116                 <mixPort name="primary output" role="source" flags="AUDIO_OUTPUT_FLAG_FAST|AUDIO_OUTPUT_FLAG_PRIMARY">
117                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
118                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
119                 </mixPort>
120                 <mixPort name="raw" role="source"
121                         flags="AUDIO_OUTPUT_FLAG_FAST|AUDIO_OUTPUT_FLAG_RAW">
122                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
123                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
124                 </mixPort>
125                 <mixPort name="deep_buffer" role="source"
126                         flags="AUDIO_OUTPUT_FLAG_DEEP_BUFFER">
127                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
128                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
129                 </mixPort>
130                 <mixPort name="mmap_no_irq_out" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ">
131                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
132                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
133                 </mixPort>
134                 <mixPort name="hifi_playback" role="source" />
135                 <mixPort name="compress_passthrough" role="source"
136                         flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
137                     <profile name="" format="dynamic"
138                              samplingRates="dynamic" channelMasks="dynamic"/>
139                 </mixPort>
140                 <mixPort name="direct_pcm" role="source"
141                         flags="AUDIO_OUTPUT_FLAG_DIRECT">
142                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
143                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
144                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
145                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
146                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
147                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
148                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
149                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
150                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
151                   <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
152                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
153                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
154                 </mixPort>
155 
156                 <mixPort name="bt_codriver_direct_pcm" role="source"
157                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_RIGHT_ZONE">
158                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
159                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
160                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
161                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
162                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
163                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
164                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
165                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
166                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
167                   <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
168                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000,352800,384000"
169                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
170                 </mixPort>
171                 <mixPort name="compressed_offload" role="source"
172                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
173                     <profile name="" format="AUDIO_FORMAT_MP3"
174                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
175                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
176                     <profile name="" format="AUDIO_FORMAT_FLAC"
177                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
178                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
179                     <profile name="" format="AUDIO_FORMAT_ALAC"
180                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
181                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
182                     <profile name="" format="AUDIO_FORMAT_APE"
183                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
184                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
185                     <profile name="" format="AUDIO_FORMAT_AAC_LC"
186                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
187                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
188                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V1"
189                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
190                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
191                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
192                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
193                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
194                     <profile name="" format="AUDIO_FORMAT_DTS"
195                              samplingRates="32000,44100,48000"
196                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1"/>
197                     <profile name="" format="AUDIO_FORMAT_DTS_HD"
198                              samplingRates="32000,44100,48000,64000,88200,96000,128000,176400,192000"
199                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
200                     <profile name="" format="AUDIO_FORMAT_WMA"
201                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
202                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
203                     <profile name="" format="AUDIO_FORMAT_WMA_PRO"
204                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
205                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
206                     <profile name="" format="AUDIO_FORMAT_VORBIS"
207                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
208                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
209                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_LC"
210                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
211                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
212                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V1"
213                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
214                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
215                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V2"
216                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
217                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
218                 </mixPort>
219 
220                 <mixPort name="bt_codriver_offload" role="source"
221                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING|AUDIO_OUTPUT_FLAG_RIGHT_ZONE">
222                     <profile name="" format="AUDIO_FORMAT_MP3"
223                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
224                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
225                     <profile name="" format="AUDIO_FORMAT_FLAC"
226                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
227                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
228                     <profile name="" format="AUDIO_FORMAT_ALAC"
229                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
230                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
231                     <profile name="" format="AUDIO_FORMAT_APE"
232                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
233                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
234                     <profile name="" format="AUDIO_FORMAT_AAC_LC"
235                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
236                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
237                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V1"
238                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
239                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
240                     <profile name="" format="AUDIO_FORMAT_AAC_HE_V2"
241                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
242                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
243                     <profile name="" format="AUDIO_FORMAT_DTS"
244                              samplingRates="32000,44100,48000"
245                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1"/>
246                     <profile name="" format="AUDIO_FORMAT_DTS_HD"
247                              samplingRates="32000,44100,48000,64000,88200,96000,128000,176400,192000"
248                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
249                     <profile name="" format="AUDIO_FORMAT_WMA"
250                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
251                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
252                     <profile name="" format="AUDIO_FORMAT_WMA_PRO"
253                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
254                              channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_2POINT1,AUDIO_CHANNEL_OUT_QUAD,AUDIO_CHANNEL_OUT_PENTA,AUDIO_CHANNEL_OUT_5POINT1,AUDIO_CHANNEL_OUT_6POINT1,AUDIO_CHANNEL_OUT_7POINT1"/>
255                     <profile name="" format="AUDIO_FORMAT_VORBIS"
256                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000,128000,176400,192000"
257                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
258                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_LC"
259                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
260                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
261                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V1"
262                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
263                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
264                     <profile name="" format="AUDIO_FORMAT_AAC_ADTS_HE_V2"
265                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,64000,88200,96000"
266                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
267                 </mixPort>
268                 <mixPort name="dsd_compress_passthrough" role="source"
269                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING">
270                     <profile name="" format="AUDIO_FORMAT_DSD"
271                              samplingRates="2822400,5644800"
272                              channelMasks="AUDIO_CHANNEL_OUT_STEREO,AUDIO_CHANNEL_OUT_MONO"/>
273                 </mixPort>
274                 <mixPort name="voice_tx" role="source">
275                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
276                              samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
277                 </mixPort>
278                 <mixPort name="voip_rx" role="source"
279                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_VOIP_RX">
280                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
281                              samplingRates="8000,16000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
282                 </mixPort>
283                 <mixPort name="projection_vr_downlink" role="source">
284                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
285                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
286                 </mixPort>
287                 <mixPort name="projection_phone_downlink" role="source"
288                          flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_DIRECT_PROJECTION">
289                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
290                              samplingRates="8000,16000,24000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
291                 </mixPort>
292                 <mixPort name="ringtone" role="source">
293                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
294                              samplingRates="16000,44100,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
295                 </mixPort>
296 
297                 <mixPort name="primary input" role="sink" maxOpenCount="2" maxActiveCount="2">
298                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
299                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
300                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_INDEX_MASK_7"/>
301                 </mixPort>
302                 <mixPort name="surround_sound" role="sink">
303                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
304                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
305                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_IN_5POINT1,AUDIO_CHANNEL_INDEX_MASK_6"/>
306                 </mixPort>
307                 <mixPort name="record_24" role="sink">
308                     <profile name="" format="AUDIO_FORMAT_PCM_24_BIT_PACKED"
309                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,192000"
310                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4"/>
311                     <profile name="" format="AUDIO_FORMAT_PCM_8_24_BIT"
312                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,192000"
313                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3,AUDIO_CHANNEL_INDEX_MASK_4"/>
314                 </mixPort>
315                 <mixPort name="voice_rx" role="sink">
316                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
317                              samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
318                 </mixPort>
319                 <mixPort name="mmap_no_irq_in" role="sink" flags="AUDIO_INPUT_FLAG_MMAP_NOIRQ">
320                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
321                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
322                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_3"/>
323                 </mixPort>
324                 <mixPort name="projection_vr_uplink" role="sink" flags="AUDIO_INPUT_FLAG_PROJECTION_VR">
325                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
326                              samplingRates="8000,16000,24000"
327                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
328                 </mixPort>
329                 <mixPort name="projection_phone_uplink" role="sink" flags="AUDIO_INPUT_FLAG_PROJECTION_PHONE">
330                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
331                              samplingRates="8000,16000,24000,32000,48000"
332                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
333                 </mixPort>
334                 <mixPort name="local_vr_uplink" role="sink" flags="AUDIO_INPUT_FLAG_LOCAL_VR">
335                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
336                              samplingRates="16000"
337                              channelMasks="AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_INDEX_MASK_7"/>
338                 </mixPort>
339                 <mixPort name="projection_esiri_uplink" role="sink">
340                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
341                              samplingRates="16000"
342                              channelMasks="AUDIO_CHANNEL_INDEX_MASK_7,AUDIO_CHANNEL_INDEX_MASK_8"/>
343                 </mixPort>
344             </mixPorts>
345 
346             <devicePorts>
347                 <!-- Output devices declaration, i.e. Sink DEVICE PORT -->
348                 <devicePort tagName="Media Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
349                         address="BUS00_MEDIA">
350                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
351                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
352                     <gains>
353                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
354                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
355                     </gains>
356                 </devicePort>
357                 <devicePort tagName="Sys Notification Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
358                         address="BUS01_SYS_NOTIFICATION">
359                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
360                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
361                     <gains>
362                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
363                                 minValueMB="-7800" maxValueMB="-4800" defaultValueMB="-4800" stepValueMB="3000"/>
364                     </gains>
365                 </devicePort>
366                 <devicePort tagName="Nav Guidance Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
367                         address="BUS02_NAV_GUIDANCE">
368                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
369                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
370                     <gains>
371                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
372                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
373                     </gains>
374                 </devicePort>
375                 <devicePort tagName="Phone Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
376                         address="BUS03_PHONE">
377                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
378                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
379                     <gains>
380                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
381                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
382                     </gains>
383                 </devicePort>
384                 <devicePort tagName="Tts Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
385                         address="BUS04_TTS">
386                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
387                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
388                     <gains>
389                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
390                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
391                     </gains>
392                 </devicePort>
393                 <devicePort tagName="Vr Tts Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
394                         address="BUS05_VR_TTS">
395                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
396                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
397                     <gains>
398                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
399                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
400                     </gains>
401                 </devicePort>
402                 <devicePort tagName="Boot Music Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
403                         address="BUS07_BOOT_MUSIC">
404                     <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
405                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
406                     <gains>
407                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
408                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
409                     </gains>
410                 </devicePort>
411                 <devicePort tagName="Chime Tts Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
412                         address="BUS08_CHIME_TTS">
413                     <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
414                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
415                     <gains>
416                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
417                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
418                     </gains>
419                 </devicePort>
420                 <devicePort tagName="BT Codriver Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
421                         address="BUS09_BT_CODRIVER">
422                     <profile name="" format="AUDIO_FORMAT_PCM_32_BIT"
423                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
424                     <gains>
425                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
426                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
427                     </gains>
428                 </devicePort>
429                 <devicePort tagName="Projection Vr Tts Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
430                         address="BUS11_PROJECTION_VR_TTS">
431                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
432                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
433                     <gains>
434                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
435                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
436                     </gains>
437                 </devicePort>
438                 <devicePort tagName="Ringtone Bus" role="sink" type="AUDIO_DEVICE_OUT_BUS"
439                         address="BUS12_RINGTONE">
440                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
441                              samplingRates="16000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
442                     <gains>
443                         <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
444                                 minValueMB="-7800" maxValueMB="0" defaultValueMB="-5800" stepValueMB="200"/>
445                     </gains>
446                 </devicePort>
447                 <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
448                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
449                             samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
450                 </devicePort>
451                 <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
452                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
453                              samplingRates="8000,16000,24000,32000,48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
454                 </devicePort>
455                 <devicePort tagName="Wired Headset" type="AUDIO_DEVICE_OUT_WIRED_HEADSET" role="sink">
456                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
457                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
458                 </devicePort>
459                 <devicePort tagName="Wired Headphones" type="AUDIO_DEVICE_OUT_WIRED_HEADPHONE" role="sink">
460                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
461                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
462                 </devicePort>
463                 <devicePort tagName="Line" type="AUDIO_DEVICE_OUT_LINE" role="sink">
464                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
465                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
466                 </devicePort>
467                 <devicePort tagName="BT SCO" type="AUDIO_DEVICE_OUT_BLUETOOTH_SCO" role="sink">
468                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
469                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
470                 </devicePort>
471                 <devicePort tagName="BT SCO Headset" type="AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET" role="sink">
472                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
473                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
474                 </devicePort>
475                 <devicePort tagName="BT SCO Car Kit" type="AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT" role="sink">
476                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
477                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
478                 </devicePort>
479                 <devicePort tagName="BT SCO All" type="AUDIO_DEVICE_OUT_ALL_SCO" role="sink">
480                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
481                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_OUT_MONO"/>
482                 </devicePort>
483                 <devicePort tagName="Telephony Tx" type="AUDIO_DEVICE_OUT_TELEPHONY_TX" role="sink">
484                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
485                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
486                 </devicePort>
487                 <devicePort tagName="HDMI" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink">
488                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
489                              samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="dynamic"/>
490                 </devicePort>
491                 <devicePort tagName="Proxy" type="AUDIO_DEVICE_OUT_PROXY" role="sink">
492                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
493                              samplingRates="8000,11025,16000,22050,32000,44100,48000,64000,88200,96000,128000,176400,192000" channelMasks="dynamic"/>
494                 </devicePort>
495                 <devicePort tagName="FM" type="AUDIO_DEVICE_OUT_FM" role="sink">
496                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
497                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_MONO,AUDIO_CHANNEL_OUT_STEREO"/>
498                 </devicePort>
499                 <devicePort tagName="BT A2DP Out" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP" role="sink">
500                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
501                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
502                 </devicePort>
503                 <devicePort tagName="BT A2DP Headphones" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES" role="sink">
504                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
505                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
506                 </devicePort>
507                 <devicePort tagName="BT A2DP Speaker" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER" role="sink">
508                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
509                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
510                 </devicePort>
511 
512                 <!-- Input devices declaration, i.e. Source DEVICE PORT -->
513                 <devicePort tagName="Built-In Mic" type="AUDIO_DEVICE_IN_BUILTIN_MIC" role="source">
514                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
515                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
516                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_INDEX_MASK_7"/>
517                 </devicePort>
518                 <devicePort tagName="Built-In Back Mic" type="AUDIO_DEVICE_IN_BACK_MIC" role="source">
519                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
520                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
521                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK,AUDIO_CHANNEL_INDEX_MASK_6,AUDIO_CHANNEL_INDEX_MASK_7"/>
522                 </devicePort>
523                 <devicePort tagName="FM Tuner" type="AUDIO_DEVICE_IN_FM_TUNER" role="source" address="tuner0">
524                     <gains>
525                         <gain name="gain_2" mode="AUDIO_GAIN_MODE_JOINT"
526                               minValueMB="0"
527                               maxValueMB="480"
528                               defaultValueMB="240"
529                               stepValueMB="16"/>
530                     </gains>
531                 </devicePort>
532                 <devicePort tagName="Wired Headset Mic" type="AUDIO_DEVICE_IN_WIRED_HEADSET" role="source">
533                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
534                              samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
535                              channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO,AUDIO_CHANNEL_IN_FRONT_BACK"/>
536                 </devicePort>
537                 <devicePort tagName="BT SCO Headset Mic" type="AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET" role="source">
538                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
539                              samplingRates="8000,16000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
540                 </devicePort>
541                 <devicePort tagName="Telephony Rx" type="AUDIO_DEVICE_IN_TELEPHONY_RX" role="source">
542                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
543                              samplingRates="8000,16000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
544                 </devicePort>
545                 <devicePort tagName="Projection Vr Bus In" type="AUDIO_DEVICE_IN_BUS" role="source"
546                         address="BUS01_PROJECTION_VR_BUS_IN">
547                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
548                              samplingRates="16000,24000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
549                 </devicePort>
550                 <devicePort tagName="Projection Phone Bus In" type="AUDIO_DEVICE_IN_BUS" role="source"
551                         address="BUS02_PROJECTION_PHONE_BUS_IN">
552                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
553                              samplingRates="8000,16000,24000,32000,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
554                 </devicePort>
555                 <devicePort tagName="Local Vr Bus In" type="AUDIO_DEVICE_IN_BUS" role="source"
556                         address="BUS03_LOCAL_VR_BUS_IN">
557                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
558                              samplingRates="16000" channelMasks="AUDIO_CHANNEL_INDEX_MASK_4,AUDIO_CHANNEL_INDEX_MASK_7"/>
559                 </devicePort>
560                 <devicePort tagName="Projection Esiri Bus In" type="AUDIO_DEVICE_IN_BUS" role="source"
561                         address="BUS05_PROJECTION_ESIRI_BUS_IN">
562                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
563                              samplingRates="16000" channelMasks="AUDIO_CHANNEL_INDEX_MASK_7,AUDIO_CHANNEL_INDEX_MASK_8"/>
564                 </devicePort>
565             </devicePorts>
566             <!-- route declaration, i.e. list all available sources for a given sink -->
567             <routes>
568                 <route type="mix" sink="Media Bus"
569                        sources="media,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out"/>
570                 <route type="mix" sink="Sys Notification Bus"
571                        sources="sys_notification"/>
572                 <route type="mix" sink="Nav Guidance Bus"
573                        sources="nav_guidance"/>
574                 <route type="mix" sink="Phone Bus"
575                        sources="phone"/>
576                 <route type="mix" sink="Tts Bus"
577                        sources="tts"/>
578                 <route type="mix" sink="Vr Tts Bus"
579                        sources="vr_tts"/>
580                 <route type="mix" sink="Boot Music Bus"
581                        sources="boot_music"/>
582                 <route type="mix" sink="Chime Tts Bus"
583                        sources="chime_tts"/>
584                 <route type="mix" sink="BT Codriver Bus"
585                        sources="bt_codriver,bt_codriver_offload,bt_codriver_direct_pcm"/>
586                 <route type="mix" sink="Projection Vr Tts Bus"
587                        sources="projection_vr_downlink"/>
588                 <route type="mix" sink="Ringtone Bus"
589                        sources="ringtone"/>
590                 <route type="mix" sink="Earpiece"
591                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out"/>
592                 <route type="mix" sink="Speaker"
593                        sources="primary output,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out,projection_phone_downlink"/>
594                 <route type="mix" sink="Wired Headset"
595                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,dsd_compress_passthrough,voip_rx,mmap_no_irq_out"/>
596                 <route type="mix" sink="Wired Headphones"
597                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,dsd_compress_passthrough,voip_rx,mmap_no_irq_out"/>
598                 <route type="mix" sink="Line"
599                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,dsd_compress_passthrough,voip_rx,mmap_no_irq_out"/>
600                 <route type="mix" sink="HDMI"
601                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,compress_passthrough,voip_rx"/>
602                 <route type="mix" sink="Proxy"
603                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload"/>
604                 <route type="mix" sink="FM"
605                        sources="primary output"/>
606                 <route type="mix" sink="BT SCO All"
607                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
608                 <route type="mix" sink="Telephony Tx"
609                        sources="voice_tx"/>
610                 <route type="mix" sink="voice_rx"
611                        sources="Telephony Rx"/>
612                 <route type="mix" sink="primary input"
613                        sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic,FM Tuner,Telephony Rx"/>
614                 <route type="mix" sink="surround_sound"
615                        sources="Built-In Mic,Built-In Back Mic"/>
616                 <route type="mix" sink="record_24"
617                        sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
618                 <route type="mix" sink="mmap_no_irq_in"
619                        sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic"/>
620                 <route type="mix" sink="BT A2DP Out"
621                        sources="primary output,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
622                 <route type="mix" sink="BT A2DP Headphones"
623                        sources="primary output,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
624                 <route type="mix" sink="BT A2DP Speaker"
625                        sources="primary output,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
626                 <route type="mix" sink="projection_vr_uplink"
627                        sources="Projection Vr Bus In"/>
628                 <route type="mix" sink="projection_phone_uplink"
629                        sources="Projection Phone Bus In"/>
630                 <route type="mix" sink="local_vr_uplink"
631                        sources="Local Vr Bus In"/>
632                 <route type="mix" sink="projection_esiri_uplink"
633                        sources="Projection Esiri Bus In"/>
634             </routes>
635 
636         </module>
637
638         <!-- A2DP Audio HAL -->
639         <module name="a2dp" halVersion="2.0">
640             <mixPorts>
641                 <mixPort name="a2dp input" role="sink">
642                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
643                              samplingRates="44100,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
644                 </mixPort>
645             </mixPorts>
646 
647             <devicePorts>
648                 <devicePort tagName="BT A2DP In" type="AUDIO_DEVICE_IN_BLUETOOTH_A2DP" role="source">
649                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
650                              samplingRates="44100,48000" channelMasks="AUDIO_CHANNEL_IN_MONO,AUDIO_CHANNEL_IN_STEREO"/>
651                 </devicePort>
652             </devicePorts>
653 
654             <routes>
655                 <route type="mix" sink="a2dp input"
656                        sources="BT A2DP In"/>
657             </routes>
658         </module>

概括来说,这个文件定义了系统会使用到的音频设备,支持的音频流,以及设备与流之间的走向关系。devicePort对应设备,mixPort对应流,routes对应走向关系。

module:

module对应不同的hal实现,从文件中我们看到有primary,a2dp,两个module,

需要注意的是AudioFlinger中通过hal接口IDevicesFactory.openDevice(string device) 打开的就是这个module,而不是一个真实的扬声器或者耳机之类的设备。

每个module都会有一个audio_hal的实现,通常会命名为audio_hw.c,代码路径如下:

android/vendor/qcom/opensource/audio-hal/primary-hal/hal/
android/system/bt/audio_a2dp_hw/
对应到设备端,会看到有两个库,分别是:

audio.primary.sdm845.so
audio.a2dp.default.so


attachedDevices:


永久连接的设备,是devicePort中的一部分。

defaultOutputDevice:


当无策略规则适用时默认会使用这个设备

mixPort:


每一个mixPort都对应一个音频输入或者输出流。

其中role有两个角色,source代表此流可以用于输出,如输出到扬声器。sink代表此流可以用于接受输入,如麦克风采集到数据后输出到此流。

flag和profile用于指定此流支持的一些属性配置。

devicePort:


对应一个真实设备。可以是永久连接的设备,也可以是动态插拔的外设。同样role有source和sink两个角色。profile于指定此流支持的一些属性配置。

type用于设备的唯一标识。

routes:


用于连接设备和流,列出所有可能的连接。

type:表示所有音源相互排斥(mux)或可以混合(mix)。

sink: 可以是设备,也可以是流。每一个route只有一个sink。

source: 同样可以是设备,也可以是流。每一个route中可包含多个source。

<route type="mix" sink="Earpiece" sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out"/>
<route type="mix" sink="primary input" sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic,FM Tuner,Telephony Rx"/>
<route type="mix" sink="Speaker" sources="primary output,direct_pcm,compressed_offload,voip_rx,mmap_no_irq_out,projection_phone_downlink"/>

<route type="mix" sink="Wired Headset" sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,dsd_compress_passthrough,voip_rx,mmap_no_irq_out"/>

以上配置可以解释为:

1.假定音频流要输出到耳机或扬声器,那么可以采用的音频流(mixPort)可以是primary output, raw 等等。

2.假定音频流要输出到primary input。那么可以使用的设备有 Built-In Mic,Built-In Back Mic等麦克风。

从配置文件中可以看到不同的sink,可能有相同的source。那么具体采用那个source会根据音频策略来决定。比如:

1. 从上层传来了一个compressed_offload的流,到底是输出到耳机还是内置扬声器,会根据是否插入耳机和耳机的优先级来判定。

2. 上层传来请求录音请求,不管是普通录音,还是voip语音电话录音,会从可用的录音设备中查找优先级最高的一个设备进行录音。

audio_policy_configuration初始化逻辑:

audio_policy_configuration.xml在AudioPolicyManager初始化时会被解析。

首先遍历module,再分别遍历输出mixport和输入mixport。如果mixport找到的设备出现在attachedDevices中才会打开此流。

4866 void AudioPolicyManager::onNewAudioModulesAvailableInt(DeviceVector *newDevices)
4867  {
4868      for (const auto& hwModule : mHwModulesAll) {
4869          if (std::find(mHwModules.begin(), mHwModules.end(), hwModule) != mHwModules.end()) {
4870              continue;
4871          }
4872          hwModule->setHandle(mpClientInterface->loadHwModule(hwModule->getName()));
4873          if (hwModule->getHandle() == AUDIO_MODULE_HANDLE_NONE) {
4874              ALOGW("could not open HW module %s", hwModule->getName());
4875              continue;
4876          }
4877          mHwModules.push_back(hwModule);
4878          // open all output streams needed to access attached devices
4879          // except for direct output streams that are only opened when they are actually
4880          // required by an app.
4881          // This also validates mAvailableOutputDevices list
4882          for (const auto& outProfile : hwModule->getOutputProfiles()) {
4883              if (!outProfile->canOpenNewIo()) {
4884                  ALOGE("Invalid Output profile max open count %u for profile %s",
4885                        outProfile->maxOpenCount, outProfile->getTagName().c_str());
4886                  continue;
4887              }
4888              if (!outProfile->hasSupportedDevices()) {
4889                  ALOGW("Output profile contains no device on module %s", hwModule->getName());
4890                  continue;
4891              }
4892              if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_TTS) != 0) {
4893                  mTtsOutputAvailable = true;
4894              }
4895              if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_DIRECT) != 0) {
4896                  continue;
4897              }
4898              const DeviceVector &supportedDevices = outProfile->getSupportedDevices();
4899              DeviceVector availProfileDevices = supportedDevices.filter(mOutputDevicesAll);
4900              sp<DeviceDescriptor> supportedDevice = 0;
4901              if (supportedDevices.contains(mDefaultOutputDevice)) {
4902                  supportedDevice = mDefaultOutputDevice;
4903              } else {
4904                  // choose first device present in profile's SupportedDevices also part of
4905                  // mAvailableOutputDevices.
4906                  if (availProfileDevices.isEmpty()) {
4907                      continue;
4908                  }
4909                  supportedDevice = availProfileDevices.itemAt(0);
4910              }
4911              if (!mOutputDevicesAll.contains(supportedDevice)) {
4912                  continue;
4913              }
4914              sp<SwAudioOutputDescriptor> outputDesc = new SwAudioOutputDescriptor(outProfile,
4915                                                                                   mpClientInterface);
4916              audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
4917              status_t status = outputDesc->open(nullptr, DeviceVector(supportedDevice),
4918                                                 AUDIO_STREAM_DEFAULT,
4919                                                 AUDIO_OUTPUT_FLAG_NONE, &output);
4920              if (status != NO_ERROR) {
4921                  ALOGW("Cannot open output stream for devices %s on hw module %s",
4922                        supportedDevice->toString().c_str(), hwModule->getName());
4923                  continue;
4924              }
4925              for (const auto &device : availProfileDevices) {
4926                  // give a valid ID to an attached device once confirmed it is reachable
4927                  if (!device->isAttached()) {
4928                      device->attach(hwModule);
4929                      mAvailableOutputDevices.add(device);
4930                      device->setEncapsulationInfoFromHal(mpClientInterface);
4931                      if (newDevices) newDevices->add(device);
4932                      setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
4933                  }
4934              }
4935              if (mPrimaryOutput == 0 &&
4936                      outProfile->getFlags() & AUDIO_OUTPUT_FLAG_PRIMARY) {
4937                  mPrimaryOutput = outputDesc;
4938              }
4939              if ((outProfile->getFlags() & AUDIO_OUTPUT_FLAG_DIRECT) != 0) {
4940                  outputDesc->close();
4941              } else {
4942                  addOutput(output, outputDesc);
4943                  ALOGI("open output stream for device %s on hw module %s mSamplingRate = %d, mFormat = %d, mChannelMask = %d, mFlags = %d",
4944                      outputDesc->devices().toString().c_str(), hwModule->getName(), outputDesc->getSamplingRate(),
4945                      outputDesc->getFormat(), outputDesc->getChannelMask(), outProfile->getFlags());
4946                  setOutputDevices(outputDesc,
4947                                   DeviceVector(supportedDevice),
4948                                   true,
4949                                   0,
4950                                   NULL);
4951              }
4952          }
4953          // open input streams needed to access attached devices to validate
4954          // mAvailableInputDevices list
4955          for (const auto& inProfile : hwModule->getInputProfiles()) {
4956              if (!inProfile->canOpenNewIo()) {
4957                  ALOGE("Invalid Input profile max open count %u for profile %s",
4958                        inProfile->maxOpenCount, inProfile->getTagName().c_str());
4959                  continue;
4960              }
4961              if (!inProfile->hasSupportedDevices()) {
4962                  ALOGW("Input profile contains no device on module %s", hwModule->getName());
4963                  continue;
4964              }
4965              // chose first device present in profile's SupportedDevices also part of
4966              // available input devices
4967              const DeviceVector &supportedDevices = inProfile->getSupportedDevices();
4968              DeviceVector availProfileDevices = supportedDevices.filter(mInputDevicesAll);
4969              if (availProfileDevices.isEmpty()) {
4970                  ALOGE("%s: Input device list is empty!", __FUNCTION__);
4971                  continue;
4972              }
4973              sp<AudioInputDescriptor> inputDesc =
4974                      new AudioInputDescriptor(inProfile, mpClientInterface);
4975  
4976              audio_io_handle_t input = AUDIO_IO_HANDLE_NONE;
4977              status_t status = inputDesc->open(nullptr,
4978                                                availProfileDevices.itemAt(0),
4979                                                AUDIO_SOURCE_MIC,
4980                                                AUDIO_INPUT_FLAG_NONE,
4981                                                &input);
4982              if (status != NO_ERROR) {
4983                  ALOGW("Cannot open input stream for device %s on hw module %s",
4984                        availProfileDevices.toString().c_str(),
4985                        hwModule->getName());
4986                  continue;
4987              }
4988              for (const auto &device : availProfileDevices) {
4989                  // give a valid ID to an attached device once confirmed it is reachable
4990                  if (!device->isAttached()) {
4991                      device->attach(hwModule);
4992                      device->importAudioPortAndPickAudioProfile(inProfile, true);
4993                      mAvailableInputDevices.add(device);
4994                      if (newDevices) newDevices->add(device);
4995                      setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
4996                  }
4997              }
4998              inputDesc->close();
4999          }
5000      }
5001  }

比如在打开primary module时:

1. 遍历第一个输出mixport(primary output),routes中包含primary output的有:Earpiece, Speaker, Wired Headset, Wired Headphones, BT SCO, BT SCO Headset,, BT A2DP Out, BT A2DP Headphones, BT A2DP Speaker, HDMI, USB Device Out, Line, FM, Proxy。这部分设备Earpiece和Speaker存在于attachedDevices中,因此primary output流会被打开。

2. 遍历第六个输出mixport(compress_passthrough),routes中包含compress_passthrough的有:HDMI,这个设备不在attachedDevices中,因此开机初始化时compress_passthrough流不会被打开。只有当HDMI插入时才会打开。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部