1 /* 2 * Copyright (C) 2016 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 #ifndef ANDROID_TYPE_CONVERTER_H_ 18 #define ANDROID_TYPE_CONVERTER_H_ 19 20 #include <string> 21 #include <string.h> 22 23 #include <system/audio.h> 24 #include <utils/Log.h> 25 #include <utils/Vector.h> 26 #include <utils/SortedVector.h> 27 28 #include <media/AudioParameter.h> 29 #include "convert.h" 30 31 namespace android { 32 33 struct SampleRateTraits 34 { 35 typedef uint32_t Type; 36 typedef SortedVector<Type> Collection; 37 }; 38 struct DeviceTraits 39 { 40 typedef audio_devices_t Type; 41 typedef Vector<Type> Collection; 42 }; 43 struct OutputDeviceTraits : public DeviceTraits {}; 44 struct InputDeviceTraits : public DeviceTraits {}; 45 struct OutputFlagTraits 46 { 47 typedef audio_output_flags_t Type; 48 typedef Vector<Type> Collection; 49 }; 50 struct InputFlagTraits 51 { 52 typedef audio_input_flags_t Type; 53 typedef Vector<Type> Collection; 54 }; 55 struct FormatTraits 56 { 57 typedef audio_format_t Type; 58 typedef Vector<Type> Collection; 59 }; 60 struct ChannelTraits 61 { 62 typedef audio_channel_mask_t Type; 63 typedef SortedVector<Type> Collection; 64 }; 65 struct OutputChannelTraits : public ChannelTraits {}; 66 struct InputChannelTraits : public ChannelTraits {}; 67 struct ChannelIndexTraits : public ChannelTraits {}; 68 struct GainModeTraits 69 { 70 typedef audio_gain_mode_t Type; 71 typedef Vector<Type> Collection; 72 }; 73 struct StreamTraits 74 { 75 typedef audio_stream_type_t Type; 76 typedef Vector<Type> Collection; 77 }; 78 struct AudioModeTraits 79 { 80 typedef audio_mode_t Type; 81 typedef Vector<Type> Collection; 82 }; 83 struct UsageTraits 84 { 85 typedef audio_usage_t Type; 86 typedef Vector<Type> Collection; 87 }; 88 struct SourceTraits 89 { 90 typedef audio_source_t Type; 91 typedef Vector<Type> Collection; 92 }; 93 template <typename T> 94 struct DefaultTraits 95 { 96 typedef T Type; 97 typedef Vector<Type> Collection; 98 }; 99 100 template <class Traits> 101 static void collectionFromString(const std::string &str, typename Traits::Collection &collection, 102 const char *del = AudioParameter::valueListSeparator) 103 { 104 char *literal = strdup(str.c_str()); 105 for (const char *cstr = strtok(literal, del); cstr != NULL; cstr = strtok(NULL, del)) { 106 typename Traits::Type value; 107 if (utilities::convertTo<std::string, typename Traits::Type >(cstr, value)) { 108 collection.add(value); 109 } 110 } 111 free(literal); 112 } 113 114 template <class Traits> 115 class TypeConverter 116 { 117 public: 118 static bool toString(const typename Traits::Type &value, std::string &str); 119 120 static bool fromString(const std::string &str, typename Traits::Type &result); 121 122 static void collectionFromString(const std::string &str, 123 typename Traits::Collection &collection, 124 const char *del = AudioParameter::valueListSeparator); 125 126 static uint32_t maskFromString( 127 const std::string &str, const char *del = AudioParameter::valueListSeparator); 128 129 static void maskToString( 130 uint32_t mask, std::string &str, const char *del = AudioParameter::valueListSeparator); 131 132 protected: 133 struct Table { 134 const char *literal; 135 typename Traits::Type value; 136 }; 137 138 static const Table mTable[]; 139 }; 140 141 template <class Traits> 142 inline bool TypeConverter<Traits>::toString(const typename Traits::Type &value, std::string &str) 143 { 144 for (size_t i = 0; mTable[i].literal; i++) { 145 if (mTable[i].value == value) { 146 str = mTable[i].literal; 147 return true; 148 } 149 } 150 char result[64]; 151 snprintf(result, sizeof(result), "Unknown enum value %d", value); 152 str = result; 153 return false; 154 } 155 156 template <class Traits> 157 inline bool TypeConverter<Traits>::fromString(const std::string &str, typename Traits::Type &result) 158 { 159 for (size_t i = 0; mTable[i].literal; i++) { 160 if (strcmp(mTable[i].literal, str.c_str()) == 0) { 161 ALOGV("stringToEnum() found %s", mTable[i].literal); 162 result = mTable[i].value; 163 return true; 164 } 165 } 166 return false; 167 } 168 169 template <class Traits> 170 inline void TypeConverter<Traits>::collectionFromString(const std::string &str, 171 typename Traits::Collection &collection, 172 const char *del) 173 { 174 char *literal = strdup(str.c_str()); 175 176 for (const char *cstr = strtok(literal, del); cstr != NULL; cstr = strtok(NULL, del)) { 177 typename Traits::Type value; 178 if (fromString(cstr, value)) { 179 collection.add(value); 180 } 181 } 182 free(literal); 183 } 184 185 template <class Traits> 186 inline uint32_t TypeConverter<Traits>::maskFromString(const std::string &str, const char *del) 187 { 188 char *literal = strdup(str.c_str()); 189 uint32_t value = 0; 190 for (const char *cstr = strtok(literal, del); cstr != NULL; cstr = strtok(NULL, del)) { 191 typename Traits::Type type; 192 if (fromString(cstr, type)) { 193 value |= static_cast<uint32_t>(type); 194 } 195 } 196 free(literal); 197 return value; 198 } 199 200 template <class Traits> 201 inline void TypeConverter<Traits>::maskToString(uint32_t mask, std::string &str, const char *del) 202 { 203 if (mask != 0) { 204 bool first_flag = true; 205 for (size_t i = 0; mTable[i].literal; i++) { 206 if (mTable[i].value != 0 && (mask & mTable[i].value) == mTable[i].value) { 207 if (!first_flag) str += del; 208 first_flag = false; 209 str += mTable[i].literal; 210 } 211 } 212 } else { 213 toString(static_cast<typename Traits::Type>(0), str); 214 } 215 } 216 217 typedef TypeConverter<OutputDeviceTraits> OutputDeviceConverter; 218 typedef TypeConverter<InputDeviceTraits> InputDeviceConverter; 219 typedef TypeConverter<OutputFlagTraits> OutputFlagConverter; 220 typedef TypeConverter<InputFlagTraits> InputFlagConverter; 221 typedef TypeConverter<FormatTraits> FormatConverter; 222 typedef TypeConverter<OutputChannelTraits> OutputChannelConverter; 223 typedef TypeConverter<InputChannelTraits> InputChannelConverter; 224 typedef TypeConverter<ChannelIndexTraits> ChannelIndexConverter; 225 typedef TypeConverter<GainModeTraits> GainModeConverter; 226 typedef TypeConverter<StreamTraits> StreamTypeConverter; 227 typedef TypeConverter<AudioModeTraits> AudioModeConverter; 228 typedef TypeConverter<UsageTraits> UsageTypeConverter; 229 typedef TypeConverter<SourceTraits> SourceTypeConverter; 230 231 bool deviceFromString(const std::string& literalDevice, audio_devices_t& device); 232 233 bool deviceToString(audio_devices_t device, std::string& literalDevice); 234 235 SampleRateTraits::Collection samplingRatesFromString( 236 const std::string &samplingRates, const char *del = AudioParameter::valueListSeparator); 237 238 FormatTraits::Collection formatsFromString( 239 const std::string &formats, const char *del = AudioParameter::valueListSeparator); 240 241 audio_format_t formatFromString( 242 const std::string &literalFormat, audio_format_t defaultFormat = AUDIO_FORMAT_DEFAULT); 243 244 audio_channel_mask_t channelMaskFromString(const std::string &literalChannels); 245 246 ChannelTraits::Collection channelMasksFromString( 247 const std::string &channels, const char *del = AudioParameter::valueListSeparator); 248 249 InputChannelTraits::Collection inputChannelMasksFromString( 250 const std::string &inChannels, const char *del = AudioParameter::valueListSeparator); 251 252 OutputChannelTraits::Collection outputChannelMasksFromString( 253 const std::string &outChannels, const char *del = AudioParameter::valueListSeparator); 254 255 }; // namespace android 256 257 #endif /*ANDROID_TYPE_CONVERTER_H_*/ 258