ConfigParsingUtils.h revision 53615e29c99c5e9d2ca77aaefd7bf5c770513120
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#define STRING_TO_ENUM(string) { #string, string }
42#ifndef ARRAY_SIZE
43#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
44#endif
45
46const StringToEnum sDeviceNameToEnumTable[] = {
47    STRING_TO_ENUM(AUDIO_DEVICE_OUT_EARPIECE),
48    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER),
49    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE),
50    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET),
51    STRING_TO_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE),
52    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO),
53    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET),
54    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT),
55    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_SCO),
56    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP),
57    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES),
58    STRING_TO_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER),
59    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP),
60    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL),
61    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI),
62    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET),
63    STRING_TO_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET),
64    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY),
65    STRING_TO_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE),
66    STRING_TO_ENUM(AUDIO_DEVICE_OUT_ALL_USB),
67    STRING_TO_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX),
68    STRING_TO_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX),
69    STRING_TO_ENUM(AUDIO_DEVICE_OUT_LINE),
70    STRING_TO_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC),
71    STRING_TO_ENUM(AUDIO_DEVICE_OUT_SPDIF),
72    STRING_TO_ENUM(AUDIO_DEVICE_OUT_FM),
73    STRING_TO_ENUM(AUDIO_DEVICE_OUT_AUX_LINE),
74    STRING_TO_ENUM(AUDIO_DEVICE_IN_AMBIENT),
75    STRING_TO_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC),
76    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET),
77    STRING_TO_ENUM(AUDIO_DEVICE_IN_ALL_SCO),
78    STRING_TO_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET),
79    STRING_TO_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL),
80    STRING_TO_ENUM(AUDIO_DEVICE_IN_HDMI),
81    STRING_TO_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX),
82    STRING_TO_ENUM(AUDIO_DEVICE_IN_VOICE_CALL),
83    STRING_TO_ENUM(AUDIO_DEVICE_IN_BACK_MIC),
84    STRING_TO_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX),
85    STRING_TO_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET),
86    STRING_TO_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET),
87    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY),
88    STRING_TO_ENUM(AUDIO_DEVICE_IN_USB_DEVICE),
89    STRING_TO_ENUM(AUDIO_DEVICE_IN_FM_TUNER),
90    STRING_TO_ENUM(AUDIO_DEVICE_IN_TV_TUNER),
91    STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE),
92    STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF),
93    STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP),
94    STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK),
95};
96
97const StringToEnum sOutputFlagNameToEnumTable[] = {
98    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DIRECT),
99    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY),
100    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_FAST),
101    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER),
102    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD),
103    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING),
104    STRING_TO_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC),
105};
106
107const StringToEnum sInputFlagNameToEnumTable[] = {
108    STRING_TO_ENUM(AUDIO_INPUT_FLAG_FAST),
109    STRING_TO_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD),
110};
111
112const StringToEnum sFormatNameToEnumTable[] = {
113    STRING_TO_ENUM(AUDIO_FORMAT_PCM_16_BIT),
114    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_BIT),
115    STRING_TO_ENUM(AUDIO_FORMAT_PCM_32_BIT),
116    STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_24_BIT),
117    STRING_TO_ENUM(AUDIO_FORMAT_PCM_FLOAT),
118    STRING_TO_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED),
119    STRING_TO_ENUM(AUDIO_FORMAT_MP3),
120    STRING_TO_ENUM(AUDIO_FORMAT_AAC),
121    STRING_TO_ENUM(AUDIO_FORMAT_AAC_MAIN),
122    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LC),
123    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SSR),
124    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LTP),
125    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V1),
126    STRING_TO_ENUM(AUDIO_FORMAT_AAC_SCALABLE),
127    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ERLC),
128    STRING_TO_ENUM(AUDIO_FORMAT_AAC_LD),
129    STRING_TO_ENUM(AUDIO_FORMAT_AAC_HE_V2),
130    STRING_TO_ENUM(AUDIO_FORMAT_AAC_ELD),
131    STRING_TO_ENUM(AUDIO_FORMAT_VORBIS),
132    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V1),
133    STRING_TO_ENUM(AUDIO_FORMAT_HE_AAC_V2),
134    STRING_TO_ENUM(AUDIO_FORMAT_OPUS),
135    STRING_TO_ENUM(AUDIO_FORMAT_AC3),
136    STRING_TO_ENUM(AUDIO_FORMAT_E_AC3),
137};
138
139const StringToEnum sOutChannelsNameToEnumTable[] = {
140    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_MONO),
141    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
142    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_QUAD),
143    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
144    STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
145};
146
147const StringToEnum sInChannelsNameToEnumTable[] = {
148    STRING_TO_ENUM(AUDIO_CHANNEL_IN_MONO),
149    STRING_TO_ENUM(AUDIO_CHANNEL_IN_STEREO),
150    STRING_TO_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK),
151};
152
153const StringToEnum sGainModeNameToEnumTable[] = {
154    STRING_TO_ENUM(AUDIO_GAIN_MODE_JOINT),
155    STRING_TO_ENUM(AUDIO_GAIN_MODE_CHANNELS),
156    STRING_TO_ENUM(AUDIO_GAIN_MODE_RAMP),
157};
158
159class ConfigParsingUtils
160{
161public:
162    static uint32_t stringToEnum(const struct StringToEnum *table,
163            size_t size,
164            const char *name);
165    static const char *enumToString(const struct StringToEnum *table,
166            size_t size,
167            uint32_t value);
168    static bool stringToBool(const char *value);
169    static uint32_t parseOutputFlagNames(char *name);
170    static uint32_t parseInputFlagNames(char *name);
171    static audio_devices_t parseDeviceNames(char *name);
172
173    static void loadHwModules(cnode *root, HwModuleCollection &hwModules,
174                              DeviceVector &availableInputDevices,
175                              DeviceVector &availableOutputDevices,
176                              sp<DeviceDescriptor> &defaultOutputDevices,
177                              bool &isSpeakerDrcEnabled);
178
179    static void loadGlobalConfig(cnode *root, const sp<HwModule>& module,
180                                 DeviceVector &availableInputDevices,
181                                 DeviceVector &availableOutputDevices,
182                                 sp<DeviceDescriptor> &defaultOutputDevices,
183                                 bool &isSpeakerDrcEnabled);
184
185    static status_t loadAudioPolicyConfig(const char *path,
186                                          HwModuleCollection &hwModules,
187                                          DeviceVector &availableInputDevices,
188                                          DeviceVector &availableOutputDevices,
189                                          sp<DeviceDescriptor> &defaultOutputDevices,
190                                          bool &isSpeakerDrcEnabled);
191
192private:
193    static void loadHwModule(cnode *root, HwModuleCollection &hwModules,
194                             DeviceVector &availableInputDevices,
195                             DeviceVector &availableOutputDevices,
196                             sp<DeviceDescriptor> &defaultOutputDevices,
197                             bool &isSpeakerDrcEnabled);
198};
199
200}; // namespace android
201