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 "policy.h" 20 #include <Volume.h> 21 #include <system/audio.h> 22 #include <convert/convert.h> 23 #include <utils/Log.h> 24 #include <string> 25 #include <utils/Vector.h> 26 #include <utils/SortedVector.h> 27 28 namespace android { 29 30 struct SampleRateTraits 31 { 32 typedef uint32_t Type; 33 typedef SortedVector<Type> Collection; 34 }; 35 struct DeviceTraits 36 { 37 typedef audio_devices_t Type; 38 typedef Vector<Type> Collection; 39 }; 40 struct OutputFlagTraits 41 { 42 typedef audio_output_flags_t Type; 43 typedef Vector<Type> Collection; 44 }; 45 struct InputFlagTraits 46 { 47 typedef audio_input_flags_t Type; 48 typedef Vector<Type> Collection; 49 }; 50 struct FormatTraits 51 { 52 typedef audio_format_t Type; 53 typedef Vector<Type> Collection; 54 }; 55 struct ChannelTraits 56 { 57 typedef audio_channel_mask_t Type; 58 typedef SortedVector<Type> Collection; 59 }; 60 struct OutputChannelTraits : public ChannelTraits {}; 61 struct InputChannelTraits : public ChannelTraits {}; 62 struct ChannelIndexTraits : public ChannelTraits {}; 63 struct GainModeTraits 64 { 65 typedef audio_gain_mode_t Type; 66 typedef Vector<Type> Collection; 67 }; 68 struct StreamTraits 69 { 70 typedef audio_stream_type_t Type; 71 typedef Vector<Type> Collection; 72 }; 73 struct DeviceCategoryTraits 74 { 75 typedef device_category Type; 76 typedef Vector<Type> Collection; 77 }; 78 template <typename T> 79 struct DefaultTraits 80 { 81 typedef T Type; 82 typedef Vector<Type> Collection; 83 }; 84 85 template <class Traits> 86 static void collectionFromString(const std::string &str, typename Traits::Collection &collection, 87 const char *del = "|") 88 { 89 char *literal = strdup(str.c_str()); 90 for (const char *cstr = strtok(literal, del); cstr != NULL; cstr = strtok(NULL, del)) { 91 typename Traits::Type value; 92 if (utilities::convertTo<std::string, typename Traits::Type >(cstr, value)) { 93 collection.add(value); 94 } 95 } 96 free(literal); 97 } 98 99 template <class Traits> 100 class TypeConverter 101 { 102 public: 103 static bool toString(const typename Traits::Type &value, std::string &str); 104 105 static bool fromString(const std::string &str, typename Traits::Type &result); 106 107 static void collectionFromString(const std::string &str, 108 typename Traits::Collection &collection, 109 const char *del = "|"); 110 111 static uint32_t maskFromString(const std::string &str, const char *del = "|"); 112 113 protected: 114 struct Table { 115 const char *literal; 116 typename Traits::Type value; 117 }; 118 119 static const Table mTable[]; 120 static const size_t mSize; 121 }; 122 123 typedef TypeConverter<DeviceTraits> DeviceConverter; 124 typedef TypeConverter<OutputFlagTraits> OutputFlagConverter; 125 typedef TypeConverter<InputFlagTraits> InputFlagConverter; 126 typedef TypeConverter<FormatTraits> FormatConverter; 127 typedef TypeConverter<OutputChannelTraits> OutputChannelConverter; 128 typedef TypeConverter<InputChannelTraits> InputChannelConverter; 129 typedef TypeConverter<ChannelIndexTraits> ChannelIndexConverter; 130 typedef TypeConverter<GainModeTraits> GainModeConverter; 131 typedef TypeConverter<StreamTraits> StreamTypeConverter; 132 typedef TypeConverter<DeviceCategoryTraits> DeviceCategoryConverter; 133 134 static SampleRateTraits::Collection samplingRatesFromString(const std::string &samplingRates, 135 const char *del = "|") 136 { 137 SampleRateTraits::Collection samplingRateCollection; 138 collectionFromString<SampleRateTraits>(samplingRates, samplingRateCollection, del); 139 return samplingRateCollection; 140 } 141 142 static FormatTraits::Collection formatsFromString(const std::string &formats, const char *del = "|") 143 { 144 FormatTraits::Collection formatCollection; 145 FormatConverter::collectionFromString(formats, formatCollection, del); 146 return formatCollection; 147 } 148 149 static audio_format_t formatFromString(const std::string &literalFormat) 150 { 151 audio_format_t format; 152 if (literalFormat.empty()) { 153 return gDynamicFormat; 154 } 155 FormatConverter::fromString(literalFormat, format); 156 return format; 157 } 158 159 static audio_channel_mask_t channelMaskFromString(const std::string &literalChannels) 160 { 161 audio_channel_mask_t channels; 162 if (!OutputChannelConverter::fromString(literalChannels, channels) || 163 !InputChannelConverter::fromString(literalChannels, channels)) { 164 return AUDIO_CHANNEL_INVALID; 165 } 166 return channels; 167 } 168 169 static ChannelTraits::Collection channelMasksFromString(const std::string &channels, 170 const char *del = "|") 171 { 172 ChannelTraits::Collection channelMaskCollection; 173 OutputChannelConverter::collectionFromString(channels, channelMaskCollection, del); 174 InputChannelConverter::collectionFromString(channels, channelMaskCollection, del); 175 ChannelIndexConverter::collectionFromString(channels, channelMaskCollection, del); 176 return channelMaskCollection; 177 } 178 179 static InputChannelTraits::Collection inputChannelMasksFromString(const std::string &inChannels, 180 const char *del = "|") 181 { 182 InputChannelTraits::Collection inputChannelMaskCollection; 183 InputChannelConverter::collectionFromString(inChannels, inputChannelMaskCollection, del); 184 ChannelIndexConverter::collectionFromString(inChannels, inputChannelMaskCollection, del); 185 return inputChannelMaskCollection; 186 } 187 188 static OutputChannelTraits::Collection outputChannelMasksFromString(const std::string &outChannels, 189 const char *del = "|") 190 { 191 OutputChannelTraits::Collection outputChannelMaskCollection; 192 OutputChannelConverter::collectionFromString(outChannels, outputChannelMaskCollection, del); 193 ChannelIndexConverter::collectionFromString(outChannels, outputChannelMaskCollection, del); 194 return outputChannelMaskCollection; 195 } 196 197 }; // namespace android 198 199