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