ConfigParsingUtils.h revision bf29173d6d63536ae9f8cfd1d02153237ee23612
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "DeviceDescriptor.h"
20#include "HwModule.h"
21#include "audio_policy_conf.h"
22#include <system/audio.h>
23#include <utils/Log.h>
24#include <utils/Vector.h>
25#include <utils/SortedVector.h>
26#include <cutils/config_utils.h>
27#include <utils/RefBase.h>
28#include <system/audio_policy.h>
29
30namespace android {
31
32// ----------------------------------------------------------------------------
33// Definitions for audio_policy.conf file parsing
34// ----------------------------------------------------------------------------
35
36struct StringToEnum {
37    const char *name;
38    uint32_t value;
39};
40
41// TODO: move to a separate file. Should be in sync with audio.h.
42#define STRING_TO_ENUM(string) { #string, (uint32_t)(string) } // uint32_t cast removes warning
43#define NAME_TO_ENUM(name, value) { name, value }
44#ifndef ARRAY_SIZE
45#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
46#endif
47
48const StringToEnum sDeviceTypeToEnumTable[] = {
49    STRING_TO_ENUM(AUDIO_DEVICE_OUT_EARPIECE),
50    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER),
51    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE),
52    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET),
53    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
54    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
55    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
56    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
57    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_SCO),
58    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
59    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
60    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
61    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP),
62    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL),
63    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI),
64    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
65    STRING_TO_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
66    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY),
67    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE),
68    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_USB),
69    STRING_TO_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
70    STRING_TO_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX),
71    STRING_TO_ENUM(AUDIO_DEVICE_OUT_LINE),
72    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC),
73    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPDIF),
74    STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM),
75    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_LINE),
76    STRING_TO_ENUM(AUDIO_DEVICE_OUT_IP),
77    STRING_TO_ENUM(AUDIO_DEVICE_IN_AMBIENT),
78    STRING_TO_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC),
79    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
80    STRING_TO_ENUM(AUDIO_DEVICE_IN_ALL_SCO),
81    STRING_TO_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET),
82    STRING_TO_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL),
83    STRING_TO_ENUM(AUDIO_DEVICE_IN_HDMI),
84    STRING_TO_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX),
85    STRING_TO_ENUM(AUDIO_DEVICE_IN_VOICE_CALL),
86    STRING_TO_ENUM(AUDIO_DEVICE_IN_BACK_MIC),
87    STRING_TO_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX),
88    STRING_TO_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
89    STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
90    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY),
91    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE),
92    STRING_TO_ENUM(AUDIO_DEVICE_IN_FM_TUNER),
93    STRING_TO_ENUM(AUDIO_DEVICE_IN_TV_TUNER),
94    STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE),
95    STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF),
96    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
97    STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK),
98    STRING_TO_ENUM(AUDIO_DEVICE_IN_IP),
99};
100
101const StringToEnum sDeviceNameToEnumTable[] = {
102    NAME_TO_ENUM("Earpiece", AUDIO_DEVICE_OUT_EARPIECE),
103    NAME_TO_ENUM("Speaker", AUDIO_DEVICE_OUT_SPEAKER),
104    NAME_TO_ENUM("Speaker Protected", AUDIO_DEVICE_OUT_SPEAKER_SAFE),
105    NAME_TO_ENUM("Wired Headset", AUDIO_DEVICE_OUT_WIRED_HEADSET),
106    NAME_TO_ENUM("Wired Headphones", AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
107    NAME_TO_ENUM("BT SCO", AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
108    NAME_TO_ENUM("BT SCO Headset", AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
109    NAME_TO_ENUM("BT SCO Car Kit", AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
110    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_SCO),
111    NAME_TO_ENUM("BT A2DP Out", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
112    NAME_TO_ENUM("BT A2DP Headphones", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
113    NAME_TO_ENUM("BT A2DP Speaker", AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
114    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_A2DP),
115    NAME_TO_ENUM("HDMI Out", AUDIO_DEVICE_OUT_AUX_DIGITAL),
116    NAME_TO_ENUM("HDMI Out", AUDIO_DEVICE_OUT_HDMI),
117    NAME_TO_ENUM("Analog Dock Out", AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
118    NAME_TO_ENUM("Digital Dock Out", AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
119    NAME_TO_ENUM("USB Host Out", AUDIO_DEVICE_OUT_USB_ACCESSORY),
120    NAME_TO_ENUM("USB Device Out", AUDIO_DEVICE_OUT_USB_DEVICE),
121    NAME_TO_ENUM("", AUDIO_DEVICE_OUT_ALL_USB),
122    NAME_TO_ENUM("Reroute Submix Out", AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
123    NAME_TO_ENUM("Telephony Tx", AUDIO_DEVICE_OUT_TELEPHONY_TX),
124    NAME_TO_ENUM("Line Out", AUDIO_DEVICE_OUT_LINE),
125    NAME_TO_ENUM("HDMI ARC Out", AUDIO_DEVICE_OUT_HDMI_ARC),
126    NAME_TO_ENUM("S/PDIF Out", AUDIO_DEVICE_OUT_SPDIF),
127    NAME_TO_ENUM("FM transceiver Out", AUDIO_DEVICE_OUT_FM),
128    NAME_TO_ENUM("Aux Line Out", AUDIO_DEVICE_OUT_AUX_LINE),
129    NAME_TO_ENUM("IP Out", AUDIO_DEVICE_OUT_IP),
130    NAME_TO_ENUM("Ambient Mic", AUDIO_DEVICE_IN_AMBIENT),
131    NAME_TO_ENUM("Built-In Mic", AUDIO_DEVICE_IN_BUILTIN_MIC),
132    NAME_TO_ENUM("BT SCO Headset Mic", AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
133    NAME_TO_ENUM("", AUDIO_DEVICE_IN_ALL_SCO),
134    NAME_TO_ENUM("Wired Headset Mic", AUDIO_DEVICE_IN_WIRED_HEADSET),
135    NAME_TO_ENUM("HDMI In", AUDIO_DEVICE_IN_AUX_DIGITAL),
136    NAME_TO_ENUM("HDMI In", AUDIO_DEVICE_IN_HDMI),
137    NAME_TO_ENUM("Telephony Rx", AUDIO_DEVICE_IN_TELEPHONY_RX),
138    NAME_TO_ENUM("Telephony Rx", AUDIO_DEVICE_IN_VOICE_CALL),
139    NAME_TO_ENUM("Built-In Back Mic", AUDIO_DEVICE_IN_BACK_MIC),
140    NAME_TO_ENUM("Reroute Submix In", AUDIO_DEVICE_IN_REMOTE_SUBMIX),
141    NAME_TO_ENUM("Analog Dock In", AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
142    NAME_TO_ENUM("Digital Dock In", AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
143    NAME_TO_ENUM("USB Host In", AUDIO_DEVICE_IN_USB_ACCESSORY),
144    NAME_TO_ENUM("USB Device In", AUDIO_DEVICE_IN_USB_DEVICE),
145    NAME_TO_ENUM("FM Tuner In", AUDIO_DEVICE_IN_FM_TUNER),
146    NAME_TO_ENUM("TV Tuner In", AUDIO_DEVICE_IN_TV_TUNER),
147    NAME_TO_ENUM("Line In", AUDIO_DEVICE_IN_LINE),
148    NAME_TO_ENUM("S/PDIF In", AUDIO_DEVICE_IN_SPDIF),
149    NAME_TO_ENUM("BT A2DP In", AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
150    NAME_TO_ENUM("Loopback In", AUDIO_DEVICE_IN_LOOPBACK),
151    NAME_TO_ENUM("IP In", AUDIO_DEVICE_IN_IP),
152};
153
154const StringToEnum sOutputFlagNameToEnumTable[] = {
155    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DIRECT),
156    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY),
157    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_FAST),
158    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
159    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD),
160    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING),
161    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC),
162    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_TTS),
163    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_RAW),
164    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_SYNC),
165};
166
167const StringToEnum sInputFlagNameToEnumTable[] = {
168    STRING_TO_ENUM(AUDIO_INPUT_FLAG_FAST),
169    STRING_TO_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD),
170    STRING_TO_ENUM(AUDIO_INPUT_FLAG_RAW),
171    STRING_TO_ENUM(AUDIO_INPUT_FLAG_SYNC),
172};
173
174const StringToEnum sFormatNameToEnumTable[] = {
175    STRING_TO_ENUM(AUDIO_FORMAT_PCM_16_BIT),
176    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_BIT),
177    STRING_TO_ENUM(AUDIO_FORMAT_PCM_32_BIT),
178    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_24_BIT),
179    STRING_TO_ENUM(AUDIO_FORMAT_PCM_FLOAT),
180    STRING_TO_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED),
181    STRING_TO_ENUM(AUDIO_FORMAT_MP3),
182    STRING_TO_ENUM(AUDIO_FORMAT_AAC),
183    STRING_TO_ENUM(AUDIO_FORMAT_AAC_MAIN),
184    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LC),
185    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SSR),
186    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LTP),
187    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V1),
188    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SCALABLE),
189    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ERLC),
190    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LD),
191    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V2),
192    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ELD),
193    STRING_TO_ENUM(AUDIO_FORMAT_VORBIS),
194    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V1),
195    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V2),
196    STRING_TO_ENUM(AUDIO_FORMAT_OPUS),
197    STRING_TO_ENUM(AUDIO_FORMAT_AC3),
198    STRING_TO_ENUM(AUDIO_FORMAT_E_AC3),
199    STRING_TO_ENUM(AUDIO_FORMAT_DTS),
200    STRING_TO_ENUM(AUDIO_FORMAT_DTS_HD),
201};
202
203const StringToEnum sOutChannelsNameToEnumTable[] = {
204    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_MONO),
205    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
206    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_QUAD),
207    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
208    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
209};
210
211const StringToEnum sInChannelsNameToEnumTable[] = {
212    STRING_TO_ENUM(AUDIO_CHANNEL_IN_MONO),
213    STRING_TO_ENUM(AUDIO_CHANNEL_IN_STEREO),
214    STRING_TO_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK),
215};
216
217const StringToEnum sIndexChannelsNameToEnumTable[] = {
218    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_1),
219    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_2),
220    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_3),
221    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_4),
222    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_5),
223    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_6),
224    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_7),
225    STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_8),
226};
227
228const StringToEnum sGainModeNameToEnumTable[] = {
229    STRING_TO_ENUM(AUDIO_GAIN_MODE_JOINT),
230    STRING_TO_ENUM(AUDIO_GAIN_MODE_CHANNELS),
231    STRING_TO_ENUM(AUDIO_GAIN_MODE_RAMP),
232};
233
234class ConfigParsingUtils
235{
236public:
237    static uint32_t stringToEnum(const struct StringToEnum *table,
238            size_t size,
239            const char *name);
240    static const char *enumToString(const struct StringToEnum *table,
241            size_t size,
242            uint32_t value);
243    static bool stringToBool(const char *value);
244    static uint32_t parseOutputFlagNames(char *name);
245    static uint32_t parseInputFlagNames(char *name);
246    static audio_devices_t parseDeviceNames(char *name);
247
248    static void loadHwModules(cnode *root, HwModuleCollection &hwModules,
249                              DeviceVector &availableInputDevices,
250                              DeviceVector &availableOutputDevices,
251                              sp<DeviceDescriptor> &defaultOutputDevices,
252                              bool &isSpeakerDrcEnabled);
253
254    static void loadGlobalConfig(cnode *root, const sp<HwModule>& module,
255                                 DeviceVector &availableInputDevices,
256                                 DeviceVector &availableOutputDevices,
257                                 sp<DeviceDescriptor> &defaultOutputDevices,
258                                 bool &isSpeakerDrcEnabled);
259
260    static status_t loadAudioPolicyConfig(const char *path,
261                                          HwModuleCollection &hwModules,
262                                          DeviceVector &availableInputDevices,
263                                          DeviceVector &availableOutputDevices,
264                                          sp<DeviceDescriptor> &defaultOutputDevices,
265                                          bool &isSpeakerDrcEnabled);
266
267private:
268    static void loadHwModule(cnode *root, HwModuleCollection &hwModules,
269                             DeviceVector &availableInputDevices,
270                             DeviceVector &availableOutputDevices,
271                             sp<DeviceDescriptor> &defaultOutputDevices,
272                             bool &isSpeakerDrcEnabled);
273};
274
275}; // namespace android
276