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