TypeConverter.cpp revision a8ecc2c72ca26389bd6b0162181d60aaeaca8149
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#include "TypeConverter.h" 18 19namespace android { 20 21#define MAKE_STRING_FROM_ENUM(string) { #string, string } 22 23template <> 24const DeviceConverter::Table DeviceConverter::mTable[] = { 25 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_EARPIECE), 26 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_SPEAKER), 27 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_SPEAKER_SAFE), 28 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADSET), 29 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_WIRED_HEADPHONE), 30 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO), 31 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET), 32 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT), 33 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_ALL_SCO), 34 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP), 35 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES), 36 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), 37 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_ALL_A2DP), 38 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_AUX_DIGITAL), 39 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_HDMI), 40 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET), 41 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET), 42 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_USB_ACCESSORY), 43 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_USB_DEVICE), 44 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_ALL_USB), 45 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_REMOTE_SUBMIX), 46 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_TELEPHONY_TX), 47 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_LINE), 48 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_HDMI_ARC), 49 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_SPDIF), 50 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_FM), 51 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_AUX_LINE), 52 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_OUT_IP), 53 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_AMBIENT), 54 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_BUILTIN_MIC), 55 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET), 56 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_ALL_SCO), 57 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_WIRED_HEADSET), 58 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_AUX_DIGITAL), 59 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_HDMI), 60 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_TELEPHONY_RX), 61 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_VOICE_CALL), 62 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_BACK_MIC), 63 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_REMOTE_SUBMIX), 64 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET), 65 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET), 66 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_USB_ACCESSORY), 67 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_USB_DEVICE), 68 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_FM_TUNER), 69 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_TV_TUNER), 70 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_LINE), 71 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_SPDIF), 72 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP), 73 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_LOOPBACK), 74 MAKE_STRING_FROM_ENUM(AUDIO_DEVICE_IN_IP), 75}; 76 77template<> 78const size_t DeviceConverter::mSize = sizeof(DeviceConverter::mTable) / 79 sizeof(DeviceConverter::mTable[0]); 80 81 82template <> 83const OutputFlagConverter::Table OutputFlagConverter::mTable[] = { 84 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_DIRECT), 85 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_PRIMARY), 86 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_FAST), 87 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_DEEP_BUFFER), 88 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD), 89 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_NON_BLOCKING), 90 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_HW_AV_SYNC), 91 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_TTS), 92 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_RAW), 93 MAKE_STRING_FROM_ENUM(AUDIO_OUTPUT_FLAG_SYNC), 94}; 95template<> 96const size_t OutputFlagConverter::mSize = sizeof(OutputFlagConverter::mTable) / 97 sizeof(OutputFlagConverter::mTable[0]); 98 99 100template <> 101const InputFlagConverter::Table InputFlagConverter::mTable[] = { 102 MAKE_STRING_FROM_ENUM(AUDIO_INPUT_FLAG_FAST), 103 MAKE_STRING_FROM_ENUM(AUDIO_INPUT_FLAG_HW_HOTWORD), 104 MAKE_STRING_FROM_ENUM(AUDIO_INPUT_FLAG_RAW), 105 MAKE_STRING_FROM_ENUM(AUDIO_INPUT_FLAG_SYNC), 106}; 107template<> 108const size_t InputFlagConverter::mSize = sizeof(InputFlagConverter::mTable) / 109 sizeof(InputFlagConverter::mTable[0]); 110 111 112template <> 113const FormatConverter::Table FormatConverter::mTable[] = { 114 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_16_BIT), 115 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_8_BIT), 116 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_32_BIT), 117 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_8_24_BIT), 118 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_FLOAT), 119 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED), 120 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MP3), 121 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC), 122 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_MAIN), 123 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LC), 124 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_SSR), 125 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LTP), 126 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_HE_V1), 127 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_SCALABLE), 128 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ERLC), 129 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LD), 130 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_HE_V2), 131 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ELD), 132 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_VORBIS), 133 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_HE_AAC_V1), 134 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_HE_AAC_V2), 135 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_OPUS), 136 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AC3), 137 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_E_AC3), 138 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DTS), 139 MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DTS_HD), 140}; 141template<> 142const size_t FormatConverter::mSize = sizeof(FormatConverter::mTable) / 143 sizeof(FormatConverter::mTable[0]); 144 145 146template <> 147const OutputChannelConverter::Table OutputChannelConverter::mTable[] = { 148 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_OUT_MONO), 149 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_OUT_STEREO), 150 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_OUT_QUAD), 151 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_OUT_5POINT1), 152 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_OUT_7POINT1), 153}; 154template<> 155const size_t OutputChannelConverter::mSize = sizeof(OutputChannelConverter::mTable) / 156 sizeof(OutputChannelConverter::mTable[0]); 157 158 159template <> 160const InputChannelConverter::Table InputChannelConverter::mTable[] = { 161 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_IN_MONO), 162 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_IN_STEREO), 163 MAKE_STRING_FROM_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK), 164}; 165template<> 166const size_t InputChannelConverter::mSize = sizeof(InputChannelConverter::mTable) / 167 sizeof(InputChannelConverter::mTable[0]); 168 169 170template <> 171const ChannelIndexConverter::Table ChannelIndexConverter::mTable[] = { 172 "AUDIO_CHANNEL_INDEX_MASK_1", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_1), 173 "AUDIO_CHANNEL_INDEX_MASK_2", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_2), 174 "AUDIO_CHANNEL_INDEX_MASK_3", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_3), 175 "AUDIO_CHANNEL_INDEX_MASK_4", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_4), 176 "AUDIO_CHANNEL_INDEX_MASK_5", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_5), 177 "AUDIO_CHANNEL_INDEX_MASK_6", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_6), 178 "AUDIO_CHANNEL_INDEX_MASK_7", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_7), 179 "AUDIO_CHANNEL_INDEX_MASK_8", static_cast<audio_channel_mask_t>(AUDIO_CHANNEL_INDEX_MASK_8), 180}; 181template<> 182const size_t ChannelIndexConverter::mSize = sizeof(ChannelIndexConverter::mTable) / 183 sizeof(ChannelIndexConverter::mTable[0]); 184 185 186template <> 187const GainModeConverter::Table GainModeConverter::mTable[] = { 188 MAKE_STRING_FROM_ENUM(AUDIO_GAIN_MODE_JOINT), 189 MAKE_STRING_FROM_ENUM(AUDIO_GAIN_MODE_CHANNELS), 190 MAKE_STRING_FROM_ENUM(AUDIO_GAIN_MODE_RAMP), 191}; 192 193template<> 194const size_t GainModeConverter::mSize = sizeof(GainModeConverter::mTable) / 195 sizeof(GainModeConverter::mTable[0]); 196 197 198template <typename T, typename SupportedType> 199bool TypeConverter<T, SupportedType>::toString(const T &value, std::string &str) 200{ 201 for (size_t i = 0; i < mSize; i++) { 202 if (mTable[i].value == value) { 203 str = mTable[i].literal; 204 return true; 205 } 206 } 207 return false; 208} 209 210template <typename T, typename SupportedType> 211bool TypeConverter<T, SupportedType>::fromString(const std::string &str, T &result) 212{ 213 for (size_t i = 0; i < mSize; i++) { 214 if (strcmp(mTable[i].literal, str.c_str()) == 0) { 215 ALOGV("stringToEnum() found %s", mTable[i].literal); 216 result = mTable[i].value; 217 return true; 218 } 219 } 220 return false; 221} 222 223template <typename T, typename SupportedType> 224void TypeConverter<T, SupportedType>::collectionFromString(const std::string &str, 225 Vector<T> &collection) 226{ 227 char *literal = strdup(str.c_str()); 228 229 for (const char *cstr = strtok(literal, "|"); cstr != NULL; cstr = strtok(NULL, "|")) { 230 T value; 231 if (fromString(cstr, value)) { 232 collection.add(value); 233 } 234 } 235 free(literal); 236} 237 238template <typename T, typename SupportedType> 239uint32_t TypeConverter<T, SupportedType>::maskFromString(const std::string &str) 240{ 241 char *literal = strdup(str.c_str()); 242 uint32_t value = 0; 243 for (const char *cstr = strtok(literal, "|"); cstr != NULL; cstr = strtok(NULL, "|")) { 244 T type; 245 if (fromString(cstr, type)) { 246 value |= static_cast<uint32_t>(type); 247 } 248 } 249 free(literal); 250 return value; 251} 252 253template class TypeConverter<audio_devices_t, Devices>; 254template class TypeConverter<audio_output_flags_t, OutputFlags>; 255template class TypeConverter<audio_input_flags_t, InputFlags>; 256template class TypeConverter<audio_format_t, Formats>; 257template class TypeConverter<audio_channel_mask_t, OutputChannel>; 258template class TypeConverter<audio_channel_mask_t, InputChannel>; 259template class TypeConverter<audio_channel_mask_t, ChannelIndex>; 260template class TypeConverter<audio_gain_mode_t, GainMode>; 261 262}; // namespace android 263 264