blob: 31c071ed9ae9d9e77e318be298d9b54731ea0cba [file] [log] [blame]
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001/*
2 * Copyright (C) 2020 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
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070017#define LOG_TAG "AidlConversion"
18//#define LOG_NDEBUG 0
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070019#include <utils/Log.h>
20
21#include "media/AidlConversion.h"
22
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -080023#include <media/ShmemCompat.h>
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -070024
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070025////////////////////////////////////////////////////////////////////////////////////////////////////
26// Utilities
27
28namespace android {
29
30using base::unexpected;
31
32namespace {
33
34////////////////////////////////////////////////////////////////////////////////////////////////////
35// The code below establishes:
36// IntegralTypeOf<T>, which works for either integral types (in which case it evaluates to T), or
37// enum types (in which case it evaluates to std::underlying_type_T<T>).
38
39template<typename T, typename = std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>>
40struct IntegralTypeOfStruct {
41 using Type = T;
42};
43
44template<typename T>
45struct IntegralTypeOfStruct<T, std::enable_if_t<std::is_enum_v<T>>> {
46 using Type = std::underlying_type_t<T>;
47};
48
49template<typename T>
50using IntegralTypeOf = typename IntegralTypeOfStruct<T>::Type;
51
52////////////////////////////////////////////////////////////////////////////////////////////////////
53// Utilities for handling bitmasks.
54
55template<typename Enum>
56Enum index2enum_index(int index) {
57 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
58 return static_cast<Enum>(index);
59}
60
61template<typename Enum>
62Enum index2enum_bitmask(int index) {
63 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
64 return static_cast<Enum>(1 << index);
65}
66
67template<typename Mask, typename Enum>
68Mask enumToMask_bitmask(Enum e) {
69 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
70 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
71 return static_cast<Mask>(e);
72}
73
74template<typename Mask, typename Enum>
75Mask enumToMask_index(Enum e) {
76 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
77 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
78 return static_cast<Mask>(static_cast<std::make_unsigned_t<IntegralTypeOf<Mask>>>(1)
79 << static_cast<int>(e));
80}
81
82template<typename DestMask, typename SrcMask, typename DestEnum, typename SrcEnum>
83ConversionResult<DestMask> convertBitmask(
84 SrcMask src, const std::function<ConversionResult<DestEnum>(SrcEnum)>& enumConversion,
85 const std::function<SrcEnum(int)>& srcIndexToEnum,
86 const std::function<DestMask(DestEnum)>& destEnumToMask) {
87 using UnsignedDestMask = std::make_unsigned_t<IntegralTypeOf<DestMask>>;
88 using UnsignedSrcMask = std::make_unsigned_t<IntegralTypeOf<SrcMask>>;
89
90 UnsignedDestMask dest = static_cast<UnsignedDestMask>(0);
91 UnsignedSrcMask usrc = static_cast<UnsignedSrcMask>(src);
92
93 int srcBitIndex = 0;
94 while (usrc != 0) {
95 if (usrc & 1) {
96 SrcEnum srcEnum = srcIndexToEnum(srcBitIndex);
97 DestEnum destEnum = VALUE_OR_RETURN(enumConversion(srcEnum));
98 DestMask destMask = destEnumToMask(destEnum);
99 dest |= destMask;
100 }
101 ++srcBitIndex;
102 usrc >>= 1;
103 }
104 return static_cast<DestMask>(dest);
105}
106
107template<typename Mask, typename Enum>
108bool bitmaskIsSet(Mask mask, Enum index) {
109 return (mask & enumToMask_index<Mask, Enum>(index)) != 0;
110}
111
112////////////////////////////////////////////////////////////////////////////////////////////////////
113
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700114enum class Direction {
115 INPUT, OUTPUT
116};
117
118ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
119 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -0800120 case media::AudioPortType::NONE:
121 case media::AudioPortType::SESSION:
122 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700123 case media::AudioPortType::DEVICE:
124 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800125 case media::AudioPortRole::NONE:
126 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700127 case media::AudioPortRole::SOURCE:
128 return Direction::INPUT;
129 case media::AudioPortRole::SINK:
130 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700131 }
132 break;
133 case media::AudioPortType::MIX:
134 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800135 case media::AudioPortRole::NONE:
136 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700137 case media::AudioPortRole::SOURCE:
138 return Direction::OUTPUT;
139 case media::AudioPortRole::SINK:
140 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700141 }
142 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700143 }
144 return unexpected(BAD_VALUE);
145}
146
147ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
148 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -0800149 case AUDIO_PORT_TYPE_NONE:
150 case AUDIO_PORT_TYPE_SESSION:
151 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700152 case AUDIO_PORT_TYPE_DEVICE:
153 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800154 case AUDIO_PORT_ROLE_NONE:
155 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700156 case AUDIO_PORT_ROLE_SOURCE:
157 return Direction::INPUT;
158 case AUDIO_PORT_ROLE_SINK:
159 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700160 }
161 break;
162 case AUDIO_PORT_TYPE_MIX:
163 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800164 case AUDIO_PORT_ROLE_NONE:
165 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700166 case AUDIO_PORT_ROLE_SOURCE:
167 return Direction::OUTPUT;
168 case AUDIO_PORT_ROLE_SINK:
169 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700170 }
171 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700172 }
173 return unexpected(BAD_VALUE);
174}
175
176} // namespace
177
178////////////////////////////////////////////////////////////////////////////////////////////////////
179// Converters
180
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700181status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
182 if (aidl.size() > maxSize - 1) {
183 return BAD_VALUE;
184 }
185 aidl.copy(dest, aidl.size());
186 dest[aidl.size()] = '\0';
187 return OK;
188}
189
190ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
191 if (legacy == nullptr) {
192 return unexpected(BAD_VALUE);
193 }
194 if (strnlen(legacy, maxSize) == maxSize) {
195 // No null-terminator.
196 return unexpected(BAD_VALUE);
197 }
198 return std::string(legacy);
199}
200
201ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
202 return convertReinterpret<audio_module_handle_t>(aidl);
203}
204
205ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
206 return convertReinterpret<int32_t>(legacy);
207}
208
209ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
210 return convertReinterpret<audio_io_handle_t>(aidl);
211}
212
213ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
214 return convertReinterpret<int32_t>(legacy);
215}
216
217ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
218 return convertReinterpret<audio_port_handle_t>(aidl);
219}
220
221ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
222 return convertReinterpret<int32_t>(legacy);
223}
224
225ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
226 return convertReinterpret<audio_patch_handle_t>(aidl);
227}
228
229ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
230 return convertReinterpret<int32_t>(legacy);
231}
232
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800233ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
234 return convertReinterpret<audio_unique_id_t>(aidl);
235}
236
237ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
238 return convertReinterpret<int32_t>(legacy);
239}
240
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -0800241ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
242 return convertReinterpret<audio_hw_sync_t>(aidl);
243}
244
245ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
246 return convertReinterpret<int32_t>(legacy);
247}
248
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800249ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
250 return convertReinterpret<pid_t>(aidl);
251}
252
253ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
254 return convertReinterpret<int32_t>(legacy);
255}
256
257ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
258 return convertReinterpret<uid_t>(aidl);
259}
260
261ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
262 return convertReinterpret<int32_t>(legacy);
263}
264
265ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
266 return String16(aidl.data(), aidl.size());
267}
268
269ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
270 return std::string(String8(legacy).c_str());
271}
272
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800273ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
274 return String8(aidl.data(), aidl.size());
275}
276
277ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
278 return std::string(legacy.c_str());
279}
280
Andy Hung973638a2020-12-08 20:47:45 -0800281// The legacy enum is unnamed. Thus, we use int32_t.
282ConversionResult<int32_t> aidl2legacy_AudioPortConfigType_int32_t(
283 media::AudioPortConfigType aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700284 switch (aidl) {
285 case media::AudioPortConfigType::SAMPLE_RATE:
286 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
287 case media::AudioPortConfigType::CHANNEL_MASK:
288 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
289 case media::AudioPortConfigType::FORMAT:
290 return AUDIO_PORT_CONFIG_FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800291 case media::AudioPortConfigType::GAIN:
292 return AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700293 case media::AudioPortConfigType::FLAGS:
294 return AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700295 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800296 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700297}
298
Andy Hung973638a2020-12-08 20:47:45 -0800299// The legacy enum is unnamed. Thus, we use int32_t.
300ConversionResult<media::AudioPortConfigType> legacy2aidl_int32_t_AudioPortConfigType(
301 int32_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700302 switch (legacy) {
303 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
304 return media::AudioPortConfigType::SAMPLE_RATE;
305 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
306 return media::AudioPortConfigType::CHANNEL_MASK;
307 case AUDIO_PORT_CONFIG_FORMAT:
308 return media::AudioPortConfigType::FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800309 case AUDIO_PORT_CONFIG_GAIN:
310 return media::AudioPortConfigType::GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700311 case AUDIO_PORT_CONFIG_FLAGS:
312 return media::AudioPortConfigType::FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700313 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800314 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700315}
316
317ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
318 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
Andy Hung973638a2020-12-08 20:47:45 -0800319 aidl, aidl2legacy_AudioPortConfigType_int32_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700320 // AudioPortConfigType enum is index-based.
321 index2enum_index<media::AudioPortConfigType>,
322 // AUDIO_PORT_CONFIG_* flags are mask-based.
323 enumToMask_bitmask<unsigned int, int>);
324}
325
326ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
327 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
Andy Hung973638a2020-12-08 20:47:45 -0800328 legacy, legacy2aidl_int32_t_AudioPortConfigType,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700329 // AUDIO_PORT_CONFIG_* flags are mask-based.
330 index2enum_bitmask<unsigned>,
331 // AudioPortConfigType enum is index-based.
332 enumToMask_index<int32_t, media::AudioPortConfigType>);
333}
334
335ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
336 // TODO(ytai): should we convert bit-by-bit?
337 // One problem here is that the representation is both opaque and is different based on the
338 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
339 return convertReinterpret<audio_channel_mask_t>(aidl);
340}
341
342ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
343 // TODO(ytai): should we convert bit-by-bit?
344 // One problem here is that the representation is both opaque and is different based on the
345 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
346 return convertReinterpret<int32_t>(legacy);
347}
348
349ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
350 media::AudioIoConfigEvent aidl) {
351 switch (aidl) {
352 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
353 return AUDIO_OUTPUT_REGISTERED;
354 case media::AudioIoConfigEvent::OUTPUT_OPENED:
355 return AUDIO_OUTPUT_OPENED;
356 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
357 return AUDIO_OUTPUT_CLOSED;
358 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
359 return AUDIO_OUTPUT_CONFIG_CHANGED;
360 case media::AudioIoConfigEvent::INPUT_REGISTERED:
361 return AUDIO_INPUT_REGISTERED;
362 case media::AudioIoConfigEvent::INPUT_OPENED:
363 return AUDIO_INPUT_OPENED;
364 case media::AudioIoConfigEvent::INPUT_CLOSED:
365 return AUDIO_INPUT_CLOSED;
366 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
367 return AUDIO_INPUT_CONFIG_CHANGED;
368 case media::AudioIoConfigEvent::CLIENT_STARTED:
369 return AUDIO_CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700370 }
Andy Hung3f69c162020-12-09 12:08:48 -0800371 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700372}
373
374ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
375 audio_io_config_event legacy) {
376 switch (legacy) {
377 case AUDIO_OUTPUT_REGISTERED:
378 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
379 case AUDIO_OUTPUT_OPENED:
380 return media::AudioIoConfigEvent::OUTPUT_OPENED;
381 case AUDIO_OUTPUT_CLOSED:
382 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
383 case AUDIO_OUTPUT_CONFIG_CHANGED:
384 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
385 case AUDIO_INPUT_REGISTERED:
386 return media::AudioIoConfigEvent::INPUT_REGISTERED;
387 case AUDIO_INPUT_OPENED:
388 return media::AudioIoConfigEvent::INPUT_OPENED;
389 case AUDIO_INPUT_CLOSED:
390 return media::AudioIoConfigEvent::INPUT_CLOSED;
391 case AUDIO_INPUT_CONFIG_CHANGED:
392 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
393 case AUDIO_CLIENT_STARTED:
394 return media::AudioIoConfigEvent::CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700395 }
Andy Hung3f69c162020-12-09 12:08:48 -0800396 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700397}
398
399ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
400 media::AudioPortRole aidl) {
401 switch (aidl) {
402 case media::AudioPortRole::NONE:
403 return AUDIO_PORT_ROLE_NONE;
404 case media::AudioPortRole::SOURCE:
405 return AUDIO_PORT_ROLE_SOURCE;
406 case media::AudioPortRole::SINK:
407 return AUDIO_PORT_ROLE_SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700408 }
Andy Hung3f69c162020-12-09 12:08:48 -0800409 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700410}
411
412ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
413 audio_port_role_t legacy) {
414 switch (legacy) {
415 case AUDIO_PORT_ROLE_NONE:
416 return media::AudioPortRole::NONE;
417 case AUDIO_PORT_ROLE_SOURCE:
418 return media::AudioPortRole::SOURCE;
419 case AUDIO_PORT_ROLE_SINK:
420 return media::AudioPortRole::SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700421 }
Andy Hung3f69c162020-12-09 12:08:48 -0800422 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700423}
424
425ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
426 media::AudioPortType aidl) {
427 switch (aidl) {
428 case media::AudioPortType::NONE:
429 return AUDIO_PORT_TYPE_NONE;
430 case media::AudioPortType::DEVICE:
431 return AUDIO_PORT_TYPE_DEVICE;
432 case media::AudioPortType::MIX:
433 return AUDIO_PORT_TYPE_MIX;
434 case media::AudioPortType::SESSION:
435 return AUDIO_PORT_TYPE_SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700436 }
Andy Hung3f69c162020-12-09 12:08:48 -0800437 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700438}
439
440ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
441 audio_port_type_t legacy) {
442 switch (legacy) {
443 case AUDIO_PORT_TYPE_NONE:
444 return media::AudioPortType::NONE;
445 case AUDIO_PORT_TYPE_DEVICE:
446 return media::AudioPortType::DEVICE;
447 case AUDIO_PORT_TYPE_MIX:
448 return media::AudioPortType::MIX;
449 case AUDIO_PORT_TYPE_SESSION:
450 return media::AudioPortType::SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700451 }
Andy Hung3f69c162020-12-09 12:08:48 -0800452 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700453}
454
455ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
456 media::audio::common::AudioFormat aidl) {
457 // This relies on AudioFormat being kept in sync with audio_format_t.
458 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
459 return static_cast<audio_format_t>(aidl);
460}
461
462ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
463 audio_format_t legacy) {
464 // This relies on AudioFormat being kept in sync with audio_format_t.
465 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
466 return static_cast<media::audio::common::AudioFormat>(legacy);
467}
468
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800469ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(media::AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700470 switch (aidl) {
471 case media::AudioGainMode::JOINT:
472 return AUDIO_GAIN_MODE_JOINT;
473 case media::AudioGainMode::CHANNELS:
474 return AUDIO_GAIN_MODE_CHANNELS;
475 case media::AudioGainMode::RAMP:
476 return AUDIO_GAIN_MODE_RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700477 }
Andy Hung3f69c162020-12-09 12:08:48 -0800478 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700479}
480
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800481ConversionResult<media::AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700482 switch (legacy) {
483 case AUDIO_GAIN_MODE_JOINT:
484 return media::AudioGainMode::JOINT;
485 case AUDIO_GAIN_MODE_CHANNELS:
486 return media::AudioGainMode::CHANNELS;
487 case AUDIO_GAIN_MODE_RAMP:
488 return media::AudioGainMode::RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700489 }
Andy Hung3f69c162020-12-09 12:08:48 -0800490 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700491}
492
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800493ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
494 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, media::AudioGainMode>(
495 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700496 // AudioGainMode is index-based.
497 index2enum_index<media::AudioGainMode>,
498 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800499 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700500}
501
Andy Hung973638a2020-12-08 20:47:45 -0800502ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800503 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, audio_gain_mode_t>(
504 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700505 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800506 index2enum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700507 // AudioGainMode is index-based.
508 enumToMask_index<int32_t, media::AudioGainMode>);
509}
510
511ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
512 // TODO(ytai): bitfield?
513 return convertReinterpret<audio_devices_t>(aidl);
514}
515
516ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
517 // TODO(ytai): bitfield?
518 return convertReinterpret<int32_t>(legacy);
519}
520
521ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
522 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
523 audio_gain_config legacy;
524 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800525 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700526 legacy.channel_mask =
527 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
528 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
529 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
530 size_t numValues = isJoint ? 1
531 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
532 : audio_channel_count_from_out_mask(legacy.channel_mask);
533 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
534 return unexpected(BAD_VALUE);
535 }
536 for (size_t i = 0; i < numValues; ++i) {
537 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
538 }
539 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
540 return legacy;
541}
542
543ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
544 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
545 media::AudioGainConfig aidl;
546 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
Andy Hung973638a2020-12-08 20:47:45 -0800547 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700548 aidl.channelMask =
549 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
550 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
551 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
552 size_t numValues = isJoint ? 1
553 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
554 : audio_channel_count_from_out_mask(legacy.channel_mask);
555 aidl.values.resize(numValues);
556 for (size_t i = 0; i < numValues; ++i) {
557 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
558 }
559 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
560 return aidl;
561}
562
563ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
564 media::AudioInputFlags aidl) {
565 switch (aidl) {
566 case media::AudioInputFlags::FAST:
567 return AUDIO_INPUT_FLAG_FAST;
568 case media::AudioInputFlags::HW_HOTWORD:
569 return AUDIO_INPUT_FLAG_HW_HOTWORD;
570 case media::AudioInputFlags::RAW:
571 return AUDIO_INPUT_FLAG_RAW;
572 case media::AudioInputFlags::SYNC:
573 return AUDIO_INPUT_FLAG_SYNC;
574 case media::AudioInputFlags::MMAP_NOIRQ:
575 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
576 case media::AudioInputFlags::VOIP_TX:
577 return AUDIO_INPUT_FLAG_VOIP_TX;
578 case media::AudioInputFlags::HW_AV_SYNC:
579 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
580 case media::AudioInputFlags::DIRECT:
581 return AUDIO_INPUT_FLAG_DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700582 }
Andy Hung3f69c162020-12-09 12:08:48 -0800583 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700584}
585
586ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
587 audio_input_flags_t legacy) {
588 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -0800589 case AUDIO_INPUT_FLAG_NONE:
590 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700591 case AUDIO_INPUT_FLAG_FAST:
592 return media::AudioInputFlags::FAST;
593 case AUDIO_INPUT_FLAG_HW_HOTWORD:
594 return media::AudioInputFlags::HW_HOTWORD;
595 case AUDIO_INPUT_FLAG_RAW:
596 return media::AudioInputFlags::RAW;
597 case AUDIO_INPUT_FLAG_SYNC:
598 return media::AudioInputFlags::SYNC;
599 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
600 return media::AudioInputFlags::MMAP_NOIRQ;
601 case AUDIO_INPUT_FLAG_VOIP_TX:
602 return media::AudioInputFlags::VOIP_TX;
603 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
604 return media::AudioInputFlags::HW_AV_SYNC;
605 case AUDIO_INPUT_FLAG_DIRECT:
606 return media::AudioInputFlags::DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700607 }
Andy Hung3f69c162020-12-09 12:08:48 -0800608 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700609}
610
611ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
612 media::AudioOutputFlags aidl) {
613 switch (aidl) {
614 case media::AudioOutputFlags::DIRECT:
615 return AUDIO_OUTPUT_FLAG_DIRECT;
616 case media::AudioOutputFlags::PRIMARY:
617 return AUDIO_OUTPUT_FLAG_PRIMARY;
618 case media::AudioOutputFlags::FAST:
619 return AUDIO_OUTPUT_FLAG_FAST;
620 case media::AudioOutputFlags::DEEP_BUFFER:
621 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
622 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
623 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
624 case media::AudioOutputFlags::NON_BLOCKING:
625 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
626 case media::AudioOutputFlags::HW_AV_SYNC:
627 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
628 case media::AudioOutputFlags::TTS:
629 return AUDIO_OUTPUT_FLAG_TTS;
630 case media::AudioOutputFlags::RAW:
631 return AUDIO_OUTPUT_FLAG_RAW;
632 case media::AudioOutputFlags::SYNC:
633 return AUDIO_OUTPUT_FLAG_SYNC;
634 case media::AudioOutputFlags::IEC958_NONAUDIO:
635 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
636 case media::AudioOutputFlags::DIRECT_PCM:
637 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
638 case media::AudioOutputFlags::MMAP_NOIRQ:
639 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
640 case media::AudioOutputFlags::VOIP_RX:
641 return AUDIO_OUTPUT_FLAG_VOIP_RX;
642 case media::AudioOutputFlags::INCALL_MUSIC:
643 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +0100644 case media::AudioOutputFlags::GAPLESS_OFFLOAD:
645 return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700646 }
Andy Hung3f69c162020-12-09 12:08:48 -0800647 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700648}
649
650ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
651 audio_output_flags_t legacy) {
652 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -0800653 case AUDIO_OUTPUT_FLAG_NONE:
654 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700655 case AUDIO_OUTPUT_FLAG_DIRECT:
656 return media::AudioOutputFlags::DIRECT;
657 case AUDIO_OUTPUT_FLAG_PRIMARY:
658 return media::AudioOutputFlags::PRIMARY;
659 case AUDIO_OUTPUT_FLAG_FAST:
660 return media::AudioOutputFlags::FAST;
661 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
662 return media::AudioOutputFlags::DEEP_BUFFER;
663 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
664 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
665 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
666 return media::AudioOutputFlags::NON_BLOCKING;
667 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
668 return media::AudioOutputFlags::HW_AV_SYNC;
669 case AUDIO_OUTPUT_FLAG_TTS:
670 return media::AudioOutputFlags::TTS;
671 case AUDIO_OUTPUT_FLAG_RAW:
672 return media::AudioOutputFlags::RAW;
673 case AUDIO_OUTPUT_FLAG_SYNC:
674 return media::AudioOutputFlags::SYNC;
675 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
676 return media::AudioOutputFlags::IEC958_NONAUDIO;
677 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
678 return media::AudioOutputFlags::DIRECT_PCM;
679 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
680 return media::AudioOutputFlags::MMAP_NOIRQ;
681 case AUDIO_OUTPUT_FLAG_VOIP_RX:
682 return media::AudioOutputFlags::VOIP_RX;
683 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
684 return media::AudioOutputFlags::INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +0100685 case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
686 return media::AudioOutputFlags::GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700687 }
Andy Hung3f69c162020-12-09 12:08:48 -0800688 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700689}
690
Andy Hung973638a2020-12-08 20:47:45 -0800691ConversionResult<audio_input_flags_t> aidl2legacy_int32_t_audio_input_flags_t_mask(
692 int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700693 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
694
695 LegacyMask converted = VALUE_OR_RETURN(
696 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
697 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
698 index2enum_index<media::AudioInputFlags>,
699 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
700 return static_cast<audio_input_flags_t>(converted);
701}
702
Andy Hung973638a2020-12-08 20:47:45 -0800703ConversionResult<int32_t> legacy2aidl_audio_input_flags_t_int32_t_mask(
704 audio_input_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700705 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
706
707 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
708 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
709 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
710 index2enum_bitmask<audio_input_flags_t>,
711 enumToMask_index<int32_t, media::AudioInputFlags>);
712}
713
Andy Hung973638a2020-12-08 20:47:45 -0800714ConversionResult<audio_output_flags_t> aidl2legacy_int32_t_audio_output_flags_t_mask(
715 int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700716 return convertBitmask<audio_output_flags_t,
717 int32_t,
718 audio_output_flags_t,
719 media::AudioOutputFlags>(
720 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
721 index2enum_index<media::AudioOutputFlags>,
722 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700723}
724
Andy Hung973638a2020-12-08 20:47:45 -0800725ConversionResult<int32_t> legacy2aidl_audio_output_flags_t_int32_t_mask(
726 audio_output_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700727 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
728
729 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
730 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
731 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
732 index2enum_bitmask<audio_output_flags_t>,
733 enumToMask_index<int32_t, media::AudioOutputFlags>);
734}
735
736ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
737 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
738 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700739 Direction dir = VALUE_OR_RETURN(direction(role, type));
740 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700741 case Direction::INPUT: {
742 legacy.input = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -0800743 aidl2legacy_int32_t_audio_input_flags_t_mask(
744 VALUE_OR_RETURN(UNION_GET(aidl, input))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700745 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700746 break;
747
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700748 case Direction::OUTPUT: {
749 legacy.output = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -0800750 aidl2legacy_int32_t_audio_output_flags_t_mask(
751 VALUE_OR_RETURN(UNION_GET(aidl, output))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700752 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700753 break;
754 }
755
756 return legacy;
757}
758
759ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
760 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
761 media::AudioIoFlags aidl;
762
763 Direction dir = VALUE_OR_RETURN(direction(role, type));
764 switch (dir) {
765 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700766 UNION_SET(aidl, input,
Andy Hung973638a2020-12-08 20:47:45 -0800767 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(
768 legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700769 break;
770 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700771 UNION_SET(aidl, output,
Andy Hung973638a2020-12-08 20:47:45 -0800772 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(
773 legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700774 break;
775 }
776 return aidl;
777}
778
Andy Hung973638a2020-12-08 20:47:45 -0800779ConversionResult<audio_port_config_device_ext>
780aidl2legacy_AudioPortConfigDeviceExt_audio_port_config_device_ext(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700781 const media::AudioPortConfigDeviceExt& aidl) {
782 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700783 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700784 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700785 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700786 return legacy;
787}
788
Andy Hung973638a2020-12-08 20:47:45 -0800789ConversionResult<media::AudioPortConfigDeviceExt>
790legacy2aidl_audio_port_config_device_ext_AudioPortConfigDeviceExt(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700791 const audio_port_config_device_ext& legacy) {
792 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700793 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700794 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700795 aidl.address = VALUE_OR_RETURN(
796 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700797 return aidl;
798}
799
800ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
801 media::AudioStreamType aidl) {
802 switch (aidl) {
803 case media::AudioStreamType::DEFAULT:
804 return AUDIO_STREAM_DEFAULT;
805 case media::AudioStreamType::VOICE_CALL:
806 return AUDIO_STREAM_VOICE_CALL;
807 case media::AudioStreamType::SYSTEM:
808 return AUDIO_STREAM_SYSTEM;
809 case media::AudioStreamType::RING:
810 return AUDIO_STREAM_RING;
811 case media::AudioStreamType::MUSIC:
812 return AUDIO_STREAM_MUSIC;
813 case media::AudioStreamType::ALARM:
814 return AUDIO_STREAM_ALARM;
815 case media::AudioStreamType::NOTIFICATION:
816 return AUDIO_STREAM_NOTIFICATION;
817 case media::AudioStreamType::BLUETOOTH_SCO:
818 return AUDIO_STREAM_BLUETOOTH_SCO;
819 case media::AudioStreamType::ENFORCED_AUDIBLE:
820 return AUDIO_STREAM_ENFORCED_AUDIBLE;
821 case media::AudioStreamType::DTMF:
822 return AUDIO_STREAM_DTMF;
823 case media::AudioStreamType::TTS:
824 return AUDIO_STREAM_TTS;
825 case media::AudioStreamType::ACCESSIBILITY:
826 return AUDIO_STREAM_ACCESSIBILITY;
827 case media::AudioStreamType::ASSISTANT:
828 return AUDIO_STREAM_ASSISTANT;
829 case media::AudioStreamType::REROUTING:
830 return AUDIO_STREAM_REROUTING;
831 case media::AudioStreamType::PATCH:
832 return AUDIO_STREAM_PATCH;
833 case media::AudioStreamType::CALL_ASSISTANT:
834 return AUDIO_STREAM_CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700835 }
Andy Hung3f69c162020-12-09 12:08:48 -0800836 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700837}
838
839ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
840 audio_stream_type_t legacy) {
841 switch (legacy) {
842 case AUDIO_STREAM_DEFAULT:
843 return media::AudioStreamType::DEFAULT;
844 case AUDIO_STREAM_VOICE_CALL:
845 return media::AudioStreamType::VOICE_CALL;
846 case AUDIO_STREAM_SYSTEM:
847 return media::AudioStreamType::SYSTEM;
848 case AUDIO_STREAM_RING:
849 return media::AudioStreamType::RING;
850 case AUDIO_STREAM_MUSIC:
851 return media::AudioStreamType::MUSIC;
852 case AUDIO_STREAM_ALARM:
853 return media::AudioStreamType::ALARM;
854 case AUDIO_STREAM_NOTIFICATION:
855 return media::AudioStreamType::NOTIFICATION;
856 case AUDIO_STREAM_BLUETOOTH_SCO:
857 return media::AudioStreamType::BLUETOOTH_SCO;
858 case AUDIO_STREAM_ENFORCED_AUDIBLE:
859 return media::AudioStreamType::ENFORCED_AUDIBLE;
860 case AUDIO_STREAM_DTMF:
861 return media::AudioStreamType::DTMF;
862 case AUDIO_STREAM_TTS:
863 return media::AudioStreamType::TTS;
864 case AUDIO_STREAM_ACCESSIBILITY:
865 return media::AudioStreamType::ACCESSIBILITY;
866 case AUDIO_STREAM_ASSISTANT:
867 return media::AudioStreamType::ASSISTANT;
868 case AUDIO_STREAM_REROUTING:
869 return media::AudioStreamType::REROUTING;
870 case AUDIO_STREAM_PATCH:
871 return media::AudioStreamType::PATCH;
872 case AUDIO_STREAM_CALL_ASSISTANT:
873 return media::AudioStreamType::CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700874 }
Andy Hung3f69c162020-12-09 12:08:48 -0800875 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700876}
877
878ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
879 media::AudioSourceType aidl) {
880 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800881 case media::AudioSourceType::INVALID:
882 // This value does not have an enum
883 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700884 case media::AudioSourceType::DEFAULT:
885 return AUDIO_SOURCE_DEFAULT;
886 case media::AudioSourceType::MIC:
887 return AUDIO_SOURCE_MIC;
888 case media::AudioSourceType::VOICE_UPLINK:
889 return AUDIO_SOURCE_VOICE_UPLINK;
890 case media::AudioSourceType::VOICE_DOWNLINK:
891 return AUDIO_SOURCE_VOICE_DOWNLINK;
892 case media::AudioSourceType::VOICE_CALL:
893 return AUDIO_SOURCE_VOICE_CALL;
894 case media::AudioSourceType::CAMCORDER:
895 return AUDIO_SOURCE_CAMCORDER;
896 case media::AudioSourceType::VOICE_RECOGNITION:
897 return AUDIO_SOURCE_VOICE_RECOGNITION;
898 case media::AudioSourceType::VOICE_COMMUNICATION:
899 return AUDIO_SOURCE_VOICE_COMMUNICATION;
900 case media::AudioSourceType::REMOTE_SUBMIX:
901 return AUDIO_SOURCE_REMOTE_SUBMIX;
902 case media::AudioSourceType::UNPROCESSED:
903 return AUDIO_SOURCE_UNPROCESSED;
904 case media::AudioSourceType::VOICE_PERFORMANCE:
905 return AUDIO_SOURCE_VOICE_PERFORMANCE;
906 case media::AudioSourceType::ECHO_REFERENCE:
907 return AUDIO_SOURCE_ECHO_REFERENCE;
908 case media::AudioSourceType::FM_TUNER:
909 return AUDIO_SOURCE_FM_TUNER;
910 case media::AudioSourceType::HOTWORD:
911 return AUDIO_SOURCE_HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700912 }
Andy Hung3f69c162020-12-09 12:08:48 -0800913 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700914}
915
916ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
917 audio_source_t legacy) {
918 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800919 case AUDIO_SOURCE_INVALID:
920 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700921 case AUDIO_SOURCE_DEFAULT:
922 return media::AudioSourceType::DEFAULT;
923 case AUDIO_SOURCE_MIC:
924 return media::AudioSourceType::MIC;
925 case AUDIO_SOURCE_VOICE_UPLINK:
926 return media::AudioSourceType::VOICE_UPLINK;
927 case AUDIO_SOURCE_VOICE_DOWNLINK:
928 return media::AudioSourceType::VOICE_DOWNLINK;
929 case AUDIO_SOURCE_VOICE_CALL:
930 return media::AudioSourceType::VOICE_CALL;
931 case AUDIO_SOURCE_CAMCORDER:
932 return media::AudioSourceType::CAMCORDER;
933 case AUDIO_SOURCE_VOICE_RECOGNITION:
934 return media::AudioSourceType::VOICE_RECOGNITION;
935 case AUDIO_SOURCE_VOICE_COMMUNICATION:
936 return media::AudioSourceType::VOICE_COMMUNICATION;
937 case AUDIO_SOURCE_REMOTE_SUBMIX:
938 return media::AudioSourceType::REMOTE_SUBMIX;
939 case AUDIO_SOURCE_UNPROCESSED:
940 return media::AudioSourceType::UNPROCESSED;
941 case AUDIO_SOURCE_VOICE_PERFORMANCE:
942 return media::AudioSourceType::VOICE_PERFORMANCE;
943 case AUDIO_SOURCE_ECHO_REFERENCE:
944 return media::AudioSourceType::ECHO_REFERENCE;
945 case AUDIO_SOURCE_FM_TUNER:
946 return media::AudioSourceType::FM_TUNER;
947 case AUDIO_SOURCE_HOTWORD:
948 return media::AudioSourceType::HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700949 }
Andy Hung3f69c162020-12-09 12:08:48 -0800950 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700951}
952
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800953ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
954 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700955}
956
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800957ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
958 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700959}
960
961// This type is unnamed in the original definition, thus we name it here.
962using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
963
964ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
965 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
966 audio_port_config_mix_ext_usecase legacy;
967
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700968 switch (role) {
969 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700970 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800971 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -0800972 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700973
974 case media::AudioPortRole::SOURCE:
975 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700976 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
977 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Andy Hung3f69c162020-12-09 12:08:48 -0800978 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700979
980 case media::AudioPortRole::SINK:
981 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700982 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
983 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Andy Hung3f69c162020-12-09 12:08:48 -0800984 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700985 }
Andy Hung3f69c162020-12-09 12:08:48 -0800986 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700987}
988
989ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
990 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
991 media::AudioPortConfigMixExtUseCase aidl;
992
993 switch (role) {
994 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800995 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -0800996 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700997 case AUDIO_PORT_ROLE_SOURCE:
998 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700999 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1000 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Andy Hung3f69c162020-12-09 12:08:48 -08001001 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001002 case AUDIO_PORT_ROLE_SINK:
1003 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001004 UNION_SET(aidl, source,
1005 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Andy Hung3f69c162020-12-09 12:08:48 -08001006 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001007 }
Andy Hung3f69c162020-12-09 12:08:48 -08001008 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001009}
1010
1011ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1012 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1013 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001014 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1015 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001016 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1017 return legacy;
1018}
1019
1020ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1021 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1022 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001023 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1024 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001025 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1026 return aidl;
1027}
1028
Andy Hung973638a2020-12-08 20:47:45 -08001029ConversionResult<audio_port_config_session_ext>
1030aidl2legacy_AudioPortConfigSessionExt_audio_port_config_session_ext(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001031 const media::AudioPortConfigSessionExt& aidl) {
1032 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001033 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001034 return legacy;
1035}
1036
Andy Hung973638a2020-12-08 20:47:45 -08001037ConversionResult<media::AudioPortConfigSessionExt>
1038legacy2aidl_audio_port_config_session_ext_AudioPortConfigSessionExt(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001039 const audio_port_config_session_ext& legacy) {
1040 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001041 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001042 return aidl;
1043}
1044
1045// This type is unnamed in the original definition, thus we name it here.
1046using audio_port_config_ext = decltype(audio_port_config::ext);
1047
1048ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1049 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1050 media::AudioPortRole role) {
1051 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001052 switch (type) {
1053 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001054 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001055 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001056 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001057 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001058 legacy.device = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001059 aidl2legacy_AudioPortConfigDeviceExt_audio_port_config_device_ext(
1060 VALUE_OR_RETURN(UNION_GET(aidl, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08001061 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001062 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001063 legacy.mix = VALUE_OR_RETURN(
1064 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Andy Hung3f69c162020-12-09 12:08:48 -08001065 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001066 case media::AudioPortType::SESSION:
Andy Hung973638a2020-12-08 20:47:45 -08001067 legacy.session = VALUE_OR_RETURN(
1068 aidl2legacy_AudioPortConfigSessionExt_audio_port_config_session_ext(
1069 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08001070 return legacy;
1071
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001072 }
Andy Hung3f69c162020-12-09 12:08:48 -08001073 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001074}
1075
1076ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1077 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1078 media::AudioPortConfigExt aidl;
1079
1080 switch (type) {
1081 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001082 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001083 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001084 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001085 UNION_SET(aidl, device,
Andy Hung973638a2020-12-08 20:47:45 -08001086 VALUE_OR_RETURN(
1087 legacy2aidl_audio_port_config_device_ext_AudioPortConfigDeviceExt(
1088 legacy.device)));
Andy Hung3f69c162020-12-09 12:08:48 -08001089 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001090 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001091 UNION_SET(aidl, mix,
1092 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Andy Hung3f69c162020-12-09 12:08:48 -08001093 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001094 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001095 UNION_SET(aidl, session,
Andy Hung973638a2020-12-08 20:47:45 -08001096 VALUE_OR_RETURN(
1097 legacy2aidl_audio_port_config_session_ext_AudioPortConfigSessionExt(
1098 legacy.session)));
Andy Hung3f69c162020-12-09 12:08:48 -08001099 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001100 }
Andy Hung3f69c162020-12-09 12:08:48 -08001101 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001102}
1103
1104ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1105 const media::AudioPortConfig& aidl) {
1106 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001107 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001108 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1109 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1110 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1111 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1112 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1113 }
1114 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1115 legacy.channel_mask =
1116 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1117 }
1118 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1119 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1120 }
1121 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1122 legacy.gain = VALUE_OR_RETURN(
1123 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1124 }
1125 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1126 legacy.flags = VALUE_OR_RETURN(
1127 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1128 }
1129 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1130 return legacy;
1131}
1132
1133ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1134 const audio_port_config& legacy) {
1135 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001136 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001137 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1138 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1139 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1140 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1141 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1142 }
1143 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1144 aidl.channelMask =
1145 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1146 }
1147 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1148 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1149 }
1150 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1151 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1152 legacy.gain, legacy.role, legacy.type));
1153 }
1154 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1155 aidl.flags = VALUE_OR_RETURN(
1156 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1157 }
1158 aidl.ext =
1159 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1160 return aidl;
1161}
1162
1163ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1164 const media::AudioPatch& aidl) {
1165 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001166 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001167 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1168 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1169 return unexpected(BAD_VALUE);
1170 }
1171 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1172 legacy.sinks[i] =
1173 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1174 }
1175 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1176 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1177 return unexpected(BAD_VALUE);
1178 }
1179 for (size_t i = 0; i < legacy.num_sources; ++i) {
1180 legacy.sources[i] =
1181 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1182 }
1183 return legacy;
1184}
1185
1186ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1187 const struct audio_patch& legacy) {
1188 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001189 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001190
1191 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1192 return unexpected(BAD_VALUE);
1193 }
1194 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1195 aidl.sinks.push_back(
1196 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1197 }
1198 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1199 return unexpected(BAD_VALUE);
1200 }
1201 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1202 aidl.sources.push_back(
1203 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1204 }
1205 return aidl;
1206}
1207
1208ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1209 const media::AudioIoDescriptor& aidl) {
1210 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001211 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001212 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1213 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1214 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1215 legacy->mChannelMask =
1216 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1217 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1218 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1219 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001220 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001221 return legacy;
1222}
1223
1224ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1225 const sp<AudioIoDescriptor>& legacy) {
1226 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001227 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001228 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1229 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1230 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001231 aidl.channelMask = VALUE_OR_RETURN(
1232 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001233 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1234 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1235 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001236 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001237 return aidl;
1238}
1239
Andy Hung973638a2020-12-08 20:47:45 -08001240ConversionResult<AudioClient> aidl2legacy_AudioClient_AudioClient(
1241 const media::AudioClient& aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001242 AudioClient legacy;
1243 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1244 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1245 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1246 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1247 return legacy;
1248}
1249
Andy Hung973638a2020-12-08 20:47:45 -08001250ConversionResult<media::AudioClient> legacy2aidl_AudioClient_AudioClient(
1251 const AudioClient& legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001252 media::AudioClient aidl;
1253 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1254 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1255 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1256 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1257 return aidl;
1258}
1259
1260ConversionResult<audio_content_type_t>
1261aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1262 switch (aidl) {
1263 case media::AudioContentType::UNKNOWN:
1264 return AUDIO_CONTENT_TYPE_UNKNOWN;
1265 case media::AudioContentType::SPEECH:
1266 return AUDIO_CONTENT_TYPE_SPEECH;
1267 case media::AudioContentType::MUSIC:
1268 return AUDIO_CONTENT_TYPE_MUSIC;
1269 case media::AudioContentType::MOVIE:
1270 return AUDIO_CONTENT_TYPE_MOVIE;
1271 case media::AudioContentType::SONIFICATION:
1272 return AUDIO_CONTENT_TYPE_SONIFICATION;
1273 }
1274 return unexpected(BAD_VALUE);
1275}
1276
1277ConversionResult<media::AudioContentType>
1278legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1279 switch (legacy) {
1280 case AUDIO_CONTENT_TYPE_UNKNOWN:
1281 return media::AudioContentType::UNKNOWN;
1282 case AUDIO_CONTENT_TYPE_SPEECH:
1283 return media::AudioContentType::SPEECH;
1284 case AUDIO_CONTENT_TYPE_MUSIC:
1285 return media::AudioContentType::MUSIC;
1286 case AUDIO_CONTENT_TYPE_MOVIE:
1287 return media::AudioContentType::MOVIE;
1288 case AUDIO_CONTENT_TYPE_SONIFICATION:
1289 return media::AudioContentType::SONIFICATION;
1290 }
1291 return unexpected(BAD_VALUE);
1292}
1293
1294ConversionResult<audio_usage_t>
1295aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1296 switch (aidl) {
1297 case media::AudioUsage::UNKNOWN:
1298 return AUDIO_USAGE_UNKNOWN;
1299 case media::AudioUsage::MEDIA:
1300 return AUDIO_USAGE_MEDIA;
1301 case media::AudioUsage::VOICE_COMMUNICATION:
1302 return AUDIO_USAGE_VOICE_COMMUNICATION;
1303 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1304 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1305 case media::AudioUsage::ALARM:
1306 return AUDIO_USAGE_ALARM;
1307 case media::AudioUsage::NOTIFICATION:
1308 return AUDIO_USAGE_NOTIFICATION;
1309 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1310 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1311 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1312 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1313 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1314 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1315 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1316 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1317 case media::AudioUsage::NOTIFICATION_EVENT:
1318 return AUDIO_USAGE_NOTIFICATION_EVENT;
1319 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1320 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1321 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1322 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1323 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1324 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1325 case media::AudioUsage::GAME:
1326 return AUDIO_USAGE_GAME;
1327 case media::AudioUsage::VIRTUAL_SOURCE:
1328 return AUDIO_USAGE_VIRTUAL_SOURCE;
1329 case media::AudioUsage::ASSISTANT:
1330 return AUDIO_USAGE_ASSISTANT;
1331 case media::AudioUsage::CALL_ASSISTANT:
1332 return AUDIO_USAGE_CALL_ASSISTANT;
1333 case media::AudioUsage::EMERGENCY:
1334 return AUDIO_USAGE_EMERGENCY;
1335 case media::AudioUsage::SAFETY:
1336 return AUDIO_USAGE_SAFETY;
1337 case media::AudioUsage::VEHICLE_STATUS:
1338 return AUDIO_USAGE_VEHICLE_STATUS;
1339 case media::AudioUsage::ANNOUNCEMENT:
1340 return AUDIO_USAGE_ANNOUNCEMENT;
1341 }
1342 return unexpected(BAD_VALUE);
1343}
1344
1345ConversionResult<media::AudioUsage>
1346legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1347 switch (legacy) {
1348 case AUDIO_USAGE_UNKNOWN:
1349 return media::AudioUsage::UNKNOWN;
1350 case AUDIO_USAGE_MEDIA:
1351 return media::AudioUsage::MEDIA;
1352 case AUDIO_USAGE_VOICE_COMMUNICATION:
1353 return media::AudioUsage::VOICE_COMMUNICATION;
1354 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1355 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1356 case AUDIO_USAGE_ALARM:
1357 return media::AudioUsage::ALARM;
1358 case AUDIO_USAGE_NOTIFICATION:
1359 return media::AudioUsage::NOTIFICATION;
1360 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1361 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1362 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1363 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1364 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1365 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1366 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1367 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1368 case AUDIO_USAGE_NOTIFICATION_EVENT:
1369 return media::AudioUsage::NOTIFICATION_EVENT;
1370 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1371 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1372 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1373 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1374 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1375 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1376 case AUDIO_USAGE_GAME:
1377 return media::AudioUsage::GAME;
1378 case AUDIO_USAGE_VIRTUAL_SOURCE:
1379 return media::AudioUsage::VIRTUAL_SOURCE;
1380 case AUDIO_USAGE_ASSISTANT:
1381 return media::AudioUsage::ASSISTANT;
1382 case AUDIO_USAGE_CALL_ASSISTANT:
1383 return media::AudioUsage::CALL_ASSISTANT;
1384 case AUDIO_USAGE_EMERGENCY:
1385 return media::AudioUsage::EMERGENCY;
1386 case AUDIO_USAGE_SAFETY:
1387 return media::AudioUsage::SAFETY;
1388 case AUDIO_USAGE_VEHICLE_STATUS:
1389 return media::AudioUsage::VEHICLE_STATUS;
1390 case AUDIO_USAGE_ANNOUNCEMENT:
1391 return media::AudioUsage::ANNOUNCEMENT;
1392 }
1393 return unexpected(BAD_VALUE);
1394}
1395
1396ConversionResult<audio_flags_mask_t>
1397aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1398 switch (aidl) {
1399 case media::AudioFlag::AUDIBILITY_ENFORCED:
1400 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1401 case media::AudioFlag::SECURE:
1402 return AUDIO_FLAG_SECURE;
1403 case media::AudioFlag::SCO:
1404 return AUDIO_FLAG_SCO;
1405 case media::AudioFlag::BEACON:
1406 return AUDIO_FLAG_BEACON;
1407 case media::AudioFlag::HW_AV_SYNC:
1408 return AUDIO_FLAG_HW_AV_SYNC;
1409 case media::AudioFlag::HW_HOTWORD:
1410 return AUDIO_FLAG_HW_HOTWORD;
1411 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1412 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1413 case media::AudioFlag::BYPASS_MUTE:
1414 return AUDIO_FLAG_BYPASS_MUTE;
1415 case media::AudioFlag::LOW_LATENCY:
1416 return AUDIO_FLAG_LOW_LATENCY;
1417 case media::AudioFlag::DEEP_BUFFER:
1418 return AUDIO_FLAG_DEEP_BUFFER;
1419 case media::AudioFlag::NO_MEDIA_PROJECTION:
1420 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1421 case media::AudioFlag::MUTE_HAPTIC:
1422 return AUDIO_FLAG_MUTE_HAPTIC;
1423 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1424 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1425 case media::AudioFlag::CAPTURE_PRIVATE:
1426 return AUDIO_FLAG_CAPTURE_PRIVATE;
1427 }
1428 return unexpected(BAD_VALUE);
1429}
1430
1431ConversionResult<media::AudioFlag>
1432legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1433 switch (legacy) {
1434 case AUDIO_FLAG_NONE:
1435 return unexpected(BAD_VALUE);
1436 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1437 return media::AudioFlag::AUDIBILITY_ENFORCED;
1438 case AUDIO_FLAG_SECURE:
1439 return media::AudioFlag::SECURE;
1440 case AUDIO_FLAG_SCO:
1441 return media::AudioFlag::SCO;
1442 case AUDIO_FLAG_BEACON:
1443 return media::AudioFlag::BEACON;
1444 case AUDIO_FLAG_HW_AV_SYNC:
1445 return media::AudioFlag::HW_AV_SYNC;
1446 case AUDIO_FLAG_HW_HOTWORD:
1447 return media::AudioFlag::HW_HOTWORD;
1448 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1449 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1450 case AUDIO_FLAG_BYPASS_MUTE:
1451 return media::AudioFlag::BYPASS_MUTE;
1452 case AUDIO_FLAG_LOW_LATENCY:
1453 return media::AudioFlag::LOW_LATENCY;
1454 case AUDIO_FLAG_DEEP_BUFFER:
1455 return media::AudioFlag::DEEP_BUFFER;
1456 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1457 return media::AudioFlag::NO_MEDIA_PROJECTION;
1458 case AUDIO_FLAG_MUTE_HAPTIC:
1459 return media::AudioFlag::MUTE_HAPTIC;
1460 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1461 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1462 case AUDIO_FLAG_CAPTURE_PRIVATE:
1463 return media::AudioFlag::CAPTURE_PRIVATE;
1464 }
1465 return unexpected(BAD_VALUE);
1466}
1467
1468ConversionResult<audio_flags_mask_t>
1469aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1470 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1471 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1472 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1473}
1474
1475ConversionResult<int32_t>
1476legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1477 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001478 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1479 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001480 enumToMask_index<int32_t, media::AudioFlag>);
1481}
1482
1483ConversionResult<audio_attributes_t>
1484aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1485 audio_attributes_t legacy;
1486 legacy.content_type = VALUE_OR_RETURN(
1487 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1488 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1489 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1490 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1491 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1492 return legacy;
1493}
1494
1495ConversionResult<media::AudioAttributesInternal>
1496legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1497 media::AudioAttributesInternal aidl;
1498 aidl.contentType = VALUE_OR_RETURN(
1499 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1500 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1501 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1502 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1503 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1504 return aidl;
1505}
1506
1507ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001508aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001509 switch (aidl) {
1510 case media::AudioEncapsulationMode::NONE:
1511 return AUDIO_ENCAPSULATION_MODE_NONE;
1512 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1513 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1514 case media::AudioEncapsulationMode::HANDLE:
1515 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1516 }
1517 return unexpected(BAD_VALUE);
1518}
1519
1520ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001521legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001522 switch (legacy) {
1523 case AUDIO_ENCAPSULATION_MODE_NONE:
1524 return media::AudioEncapsulationMode::NONE;
1525 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1526 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1527 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1528 return media::AudioEncapsulationMode::HANDLE;
1529 }
1530 return unexpected(BAD_VALUE);
1531}
1532
1533ConversionResult<audio_offload_info_t>
1534aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1535 audio_offload_info_t legacy;
1536 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1537 legacy.size = sizeof(audio_offload_info_t);
1538 audio_config_base_t config = VALUE_OR_RETURN(
1539 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1540 legacy.sample_rate = config.sample_rate;
1541 legacy.channel_mask = config.channel_mask;
1542 legacy.format = config.format;
1543 legacy.stream_type = VALUE_OR_RETURN(
1544 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1545 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1546 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1547 legacy.has_video = aidl.hasVideo;
1548 legacy.is_streaming = aidl.isStreaming;
1549 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1550 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1551 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1552 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001553 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001554 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1555 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1556 return legacy;
1557}
1558
1559ConversionResult<media::AudioOffloadInfo>
1560legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1561 media::AudioOffloadInfo aidl;
1562 // Version 0.1 fields.
1563 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1564 return unexpected(BAD_VALUE);
1565 }
1566 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1567 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1568 aidl.config.channelMask = VALUE_OR_RETURN(
1569 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1570 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1571 aidl.streamType = VALUE_OR_RETURN(
1572 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1573 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1574 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1575 aidl.hasVideo = legacy.has_video;
1576 aidl.isStreaming = legacy.is_streaming;
1577 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1578 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1579 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1580
1581 // Version 0.2 fields.
1582 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1583 if (legacy.size <
1584 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1585 return unexpected(BAD_VALUE);
1586 }
1587 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001588 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001589 legacy.encapsulation_mode));
1590 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1591 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1592 }
1593 return aidl;
1594}
1595
1596ConversionResult<audio_config_t>
1597aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1598 audio_config_t legacy;
1599 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001600 legacy.channel_mask = VALUE_OR_RETURN(
1601 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001602 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001603 legacy.offload_info = VALUE_OR_RETURN(
1604 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001605 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1606 return legacy;
1607}
1608
1609ConversionResult<media::AudioConfig>
1610legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1611 media::AudioConfig aidl;
1612 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001613 aidl.channelMask = VALUE_OR_RETURN(
1614 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001615 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001616 aidl.offloadInfo = VALUE_OR_RETURN(
1617 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001618 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1619 return aidl;
1620}
1621
1622ConversionResult<audio_config_base_t>
1623aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1624 audio_config_base_t legacy;
1625 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001626 legacy.channel_mask = VALUE_OR_RETURN(
1627 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001628 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1629 return legacy;
1630}
1631
1632ConversionResult<media::AudioConfigBase>
1633legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1634 media::AudioConfigBase aidl;
1635 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001636 aidl.channelMask = VALUE_OR_RETURN(
1637 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001638 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1639 return aidl;
1640}
1641
1642ConversionResult<sp<IMemory>>
1643aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1644 sp<IMemory> legacy;
1645 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1646 return unexpected(BAD_VALUE);
1647 }
1648 return legacy;
1649}
1650
1651ConversionResult<media::SharedFileRegion>
1652legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1653 media::SharedFileRegion aidl;
1654 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1655 return unexpected(BAD_VALUE);
1656 }
1657 return aidl;
1658}
1659
1660ConversionResult<sp<IMemory>>
1661aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1662 sp<IMemory> legacy;
1663 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1664 return unexpected(BAD_VALUE);
1665 }
1666 return legacy;
1667}
1668
1669ConversionResult<std::optional<media::SharedFileRegion>>
1670legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1671 std::optional<media::SharedFileRegion> aidl;
1672 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1673 return unexpected(BAD_VALUE);
1674 }
1675 return aidl;
1676}
1677
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001678ConversionResult<AudioTimestamp>
Andy Hung973638a2020-12-08 20:47:45 -08001679aidl2legacy_AudioTimestampInternal_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001680 AudioTimestamp legacy;
1681 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1682 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1683 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1684 return legacy;
1685}
1686
1687ConversionResult<media::AudioTimestampInternal>
Andy Hung973638a2020-12-08 20:47:45 -08001688legacy2aidl_AudioTimestamp_AudioTimestampInternal(const AudioTimestamp& legacy) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001689 media::AudioTimestampInternal aidl;
1690 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1691 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1692 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1693 return aidl;
1694}
1695
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001696ConversionResult<audio_uuid_t>
1697aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1698 audio_uuid_t legacy;
1699 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1700 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1701 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1702 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1703 if (aidl.node.size() != std::size(legacy.node)) {
1704 return unexpected(BAD_VALUE);
1705 }
1706 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1707 return legacy;
1708}
1709
1710ConversionResult<media::AudioUuid>
1711legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1712 media::AudioUuid aidl;
1713 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1714 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1715 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1716 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1717 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1718 return aidl;
1719}
1720
1721ConversionResult<effect_descriptor_t>
1722aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1723 effect_descriptor_t legacy;
1724 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1725 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1726 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1727 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1728 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1729 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1730 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1731 RETURN_IF_ERROR(
1732 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1733 return legacy;
1734}
1735
1736ConversionResult<media::EffectDescriptor>
1737legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1738 media::EffectDescriptor aidl;
1739 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1740 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1741 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1742 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1743 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1744 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1745 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1746 aidl.implementor = VALUE_OR_RETURN(
1747 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1748 return aidl;
1749}
1750
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001751ConversionResult<audio_encapsulation_metadata_type_t>
1752aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1753 media::AudioEncapsulationMetadataType aidl) {
1754 switch (aidl) {
1755 case media::AudioEncapsulationMetadataType::NONE:
1756 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1757 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1758 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1759 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1760 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1761 }
1762 return unexpected(BAD_VALUE);
1763}
1764
1765ConversionResult<media::AudioEncapsulationMetadataType>
1766legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1767 audio_encapsulation_metadata_type_t legacy) {
1768 switch (legacy) {
1769 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1770 return media::AudioEncapsulationMetadataType::NONE;
1771 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1772 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1773 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1774 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1775 }
1776 return unexpected(BAD_VALUE);
1777}
1778
1779ConversionResult<uint32_t>
1780aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1781 return convertBitmask<uint32_t,
1782 int32_t,
1783 audio_encapsulation_mode_t,
1784 media::AudioEncapsulationMode>(
1785 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1786 index2enum_index<media::AudioEncapsulationMode>,
1787 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1788}
1789
1790ConversionResult<int32_t>
1791legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1792 return convertBitmask<int32_t,
1793 uint32_t,
1794 media::AudioEncapsulationMode,
1795 audio_encapsulation_mode_t>(
1796 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1797 index2enum_index<audio_encapsulation_mode_t>,
1798 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1799}
1800
1801ConversionResult<uint32_t>
1802aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1803 return convertBitmask<uint32_t,
1804 int32_t,
1805 audio_encapsulation_metadata_type_t,
1806 media::AudioEncapsulationMetadataType>(
1807 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1808 index2enum_index<media::AudioEncapsulationMetadataType>,
1809 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1810}
1811
1812ConversionResult<int32_t>
1813legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1814 return convertBitmask<int32_t,
1815 uint32_t,
1816 media::AudioEncapsulationMetadataType,
1817 audio_encapsulation_metadata_type_t>(
1818 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1819 index2enum_index<audio_encapsulation_metadata_type_t>,
1820 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1821}
1822
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001823ConversionResult<audio_mix_latency_class_t>
1824aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(
1825 media::AudioMixLatencyClass aidl) {
1826 switch (aidl) {
1827 case media::AudioMixLatencyClass::LOW:
1828 return AUDIO_LATENCY_LOW;
1829 case media::AudioMixLatencyClass::NORMAL:
1830 return AUDIO_LATENCY_NORMAL;
1831 }
1832 return unexpected(BAD_VALUE);
1833}
1834
1835ConversionResult<media::AudioMixLatencyClass>
1836legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(
1837 audio_mix_latency_class_t legacy) {
1838 switch (legacy) {
1839 case AUDIO_LATENCY_LOW:
1840 return media::AudioMixLatencyClass::LOW;
1841 case AUDIO_LATENCY_NORMAL:
1842 return media::AudioMixLatencyClass::NORMAL;
1843 }
1844 return unexpected(BAD_VALUE);
1845}
1846
1847ConversionResult<audio_port_device_ext>
1848aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const media::AudioPortDeviceExt& aidl) {
1849 audio_port_device_ext legacy;
1850 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1851 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.device.type));
1852 RETURN_IF_ERROR(
1853 aidl2legacy_string(aidl.device.address, legacy.address, sizeof(legacy.address)));
1854 legacy.encapsulation_modes = VALUE_OR_RETURN(
1855 aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
1856 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
1857 aidl2legacy_AudioEncapsulationMetadataType_mask(aidl.encapsulationMetadataTypes));
1858 return legacy;
1859}
1860
1861ConversionResult<media::AudioPortDeviceExt>
1862legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext& legacy) {
1863 media::AudioPortDeviceExt aidl;
1864 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1865 aidl.device.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
1866 aidl.device.address = VALUE_OR_RETURN(
1867 legacy2aidl_string(legacy.address, sizeof(legacy.address)));
1868 aidl.encapsulationModes = VALUE_OR_RETURN(
1869 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
1870 aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
1871 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
1872 return aidl;
1873}
1874
1875ConversionResult<audio_port_mix_ext>
1876aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const media::AudioPortMixExt& aidl) {
1877 audio_port_mix_ext legacy;
1878 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1879 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
1880 legacy.latency_class = VALUE_OR_RETURN(
1881 aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(aidl.latencyClass));
1882 return legacy;
1883}
1884
1885ConversionResult<media::AudioPortMixExt>
1886legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy) {
1887 media::AudioPortMixExt aidl;
1888 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1889 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1890 aidl.latencyClass = VALUE_OR_RETURN(
1891 legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(legacy.latency_class));
1892 return aidl;
1893}
1894
1895ConversionResult<audio_port_session_ext>
1896aidl2legacy_AudioPortSessionExt_audio_port_session_ext(const media::AudioPortSessionExt& aidl) {
1897 audio_port_session_ext legacy;
1898 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
1899 return legacy;
1900}
1901
1902ConversionResult<media::AudioPortSessionExt>
1903legacy2aidl_audio_port_session_ext_AudioPortSessionExt(const audio_port_session_ext& legacy) {
1904 media::AudioPortSessionExt aidl;
1905 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
1906 return aidl;
1907}
1908
1909// This type is unnamed in the original definition, thus we name it here.
1910using audio_port_v7_ext = decltype(audio_port_v7::ext);
1911
1912ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt(
1913 const media::AudioPortExt& aidl, media::AudioPortType type) {
1914 audio_port_v7_ext legacy;
1915 switch (type) {
1916 case media::AudioPortType::NONE:
1917 // Just verify that the union is empty.
1918 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001919 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001920 case media::AudioPortType::DEVICE:
1921 legacy.device = VALUE_OR_RETURN(
1922 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
1923 VALUE_OR_RETURN(UNION_GET(aidl, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08001924 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001925 case media::AudioPortType::MIX:
1926 legacy.mix = VALUE_OR_RETURN(
1927 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
1928 VALUE_OR_RETURN(UNION_GET(aidl, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08001929 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001930 case media::AudioPortType::SESSION:
1931 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortSessionExt_audio_port_session_ext(
1932 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08001933 return legacy;
1934
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001935 }
Andy Hung3f69c162020-12-09 12:08:48 -08001936 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001937}
1938
1939ConversionResult<media::AudioPortExt> legacy2aidl_AudioPortExt(
1940 const audio_port_v7_ext& legacy, audio_port_type_t type) {
1941 media::AudioPortExt aidl;
1942 switch (type) {
1943 case AUDIO_PORT_TYPE_NONE:
1944 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001945 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001946 case AUDIO_PORT_TYPE_DEVICE:
1947 UNION_SET(aidl, device,
1948 VALUE_OR_RETURN(
1949 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device)));
Andy Hung3f69c162020-12-09 12:08:48 -08001950 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001951 case AUDIO_PORT_TYPE_MIX:
1952 UNION_SET(aidl, mix,
1953 VALUE_OR_RETURN(legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix)));
Andy Hung3f69c162020-12-09 12:08:48 -08001954 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001955 case AUDIO_PORT_TYPE_SESSION:
1956 UNION_SET(aidl, session,
1957 VALUE_OR_RETURN(legacy2aidl_audio_port_session_ext_AudioPortSessionExt(
1958 legacy.session)));
Andy Hung3f69c162020-12-09 12:08:48 -08001959 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001960 }
Andy Hung3f69c162020-12-09 12:08:48 -08001961 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001962}
1963
1964ConversionResult<audio_profile>
1965aidl2legacy_AudioProfile_audio_profile(const media::AudioProfile& aidl) {
1966 audio_profile legacy;
1967 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1968
1969 if (aidl.samplingRates.size() > std::size(legacy.sample_rates)) {
1970 return unexpected(BAD_VALUE);
1971 }
1972 RETURN_IF_ERROR(
1973 convertRange(aidl.samplingRates.begin(), aidl.samplingRates.end(), legacy.sample_rates,
1974 convertIntegral<int32_t, unsigned int>));
1975 legacy.num_sample_rates = aidl.samplingRates.size();
1976
1977 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
1978 return unexpected(BAD_VALUE);
1979 }
1980 RETURN_IF_ERROR(
1981 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
1982 aidl2legacy_int32_t_audio_channel_mask_t));
1983 legacy.num_channel_masks = aidl.channelMasks.size();
1984 return legacy;
1985}
1986
1987ConversionResult<media::AudioProfile>
1988legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy) {
1989 media::AudioProfile aidl;
1990 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1991
1992 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
1993 return unexpected(BAD_VALUE);
1994 }
1995 RETURN_IF_ERROR(
1996 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
1997 std::back_inserter(aidl.samplingRates),
1998 convertIntegral<unsigned int, int32_t>));
1999
2000 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2001 return unexpected(BAD_VALUE);
2002 }
2003 RETURN_IF_ERROR(
2004 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2005 std::back_inserter(aidl.channelMasks),
2006 legacy2aidl_audio_channel_mask_t_int32_t));
2007 return aidl;
2008}
2009
2010ConversionResult<audio_gain>
2011aidl2legacy_AudioGain_audio_gain(const media::AudioGain& aidl) {
2012 audio_gain legacy;
2013 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
2014 legacy.channel_mask = VALUE_OR_RETURN(
2015 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
2016 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2017 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2018 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2019 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2020 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2021 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2022 return legacy;
2023}
2024
2025ConversionResult<media::AudioGain>
2026legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy) {
2027 media::AudioGain aidl;
Andy Hung973638a2020-12-08 20:47:45 -08002028 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002029 aidl.channelMask = VALUE_OR_RETURN(
2030 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
2031 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2032 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2033 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2034 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2035 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2036 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2037 return aidl;
2038}
2039
2040ConversionResult<audio_port_v7>
2041aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2042 audio_port_v7 legacy;
2043 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2044 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
2045 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
2046 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2047
2048 if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2049 return unexpected(BAD_VALUE);
2050 }
2051 RETURN_IF_ERROR(convertRange(aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
2052 aidl2legacy_AudioProfile_audio_profile));
2053 legacy.num_audio_profiles = aidl.profiles.size();
2054
2055 if (aidl.gains.size() > std::size(legacy.gains)) {
2056 return unexpected(BAD_VALUE);
2057 }
2058 RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2059 aidl2legacy_AudioGain_audio_gain));
2060 legacy.num_gains = aidl.gains.size();
2061
2062 legacy.active_config = VALUE_OR_RETURN(
2063 aidl2legacy_AudioPortConfig_audio_port_config(aidl.activeConfig));
2064 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortExt(aidl.ext, aidl.type));
2065 return legacy;
2066}
2067
2068ConversionResult<media::AudioPort>
2069legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2070 media::AudioPort aidl;
2071 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2072 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2073 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2074 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2075
2076 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2077 return unexpected(BAD_VALUE);
2078 }
2079 RETURN_IF_ERROR(
2080 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2081 std::back_inserter(aidl.profiles),
2082 legacy2aidl_audio_profile_AudioProfile));
2083
2084 if (legacy.num_gains > std::size(legacy.gains)) {
2085 return unexpected(BAD_VALUE);
2086 }
2087 RETURN_IF_ERROR(
2088 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2089 std::back_inserter(aidl.gains),
2090 legacy2aidl_audio_gain_AudioGain));
2091
2092 aidl.activeConfig = VALUE_OR_RETURN(
2093 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
2094 aidl.ext = VALUE_OR_RETURN(legacy2aidl_AudioPortExt(legacy.ext, legacy.type));
2095 return aidl;
2096}
2097
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002098ConversionResult<audio_mode_t>
2099aidl2legacy_AudioMode_audio_mode_t(media::AudioMode aidl) {
2100 switch (aidl) {
2101 case media::AudioMode::INVALID:
2102 return AUDIO_MODE_INVALID;
2103 case media::AudioMode::CURRENT:
2104 return AUDIO_MODE_CURRENT;
2105 case media::AudioMode::NORMAL:
2106 return AUDIO_MODE_NORMAL;
2107 case media::AudioMode::RINGTONE:
2108 return AUDIO_MODE_RINGTONE;
2109 case media::AudioMode::IN_CALL:
2110 return AUDIO_MODE_IN_CALL;
2111 case media::AudioMode::IN_COMMUNICATION:
2112 return AUDIO_MODE_IN_COMMUNICATION;
2113 case media::AudioMode::CALL_SCREEN:
2114 return AUDIO_MODE_CALL_SCREEN;
2115 }
2116 return unexpected(BAD_VALUE);
2117}
2118
2119ConversionResult<media::AudioMode>
2120legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2121 switch (legacy) {
2122 case AUDIO_MODE_INVALID:
2123 return media::AudioMode::INVALID;
2124 case AUDIO_MODE_CURRENT:
2125 return media::AudioMode::CURRENT;
2126 case AUDIO_MODE_NORMAL:
2127 return media::AudioMode::NORMAL;
2128 case AUDIO_MODE_RINGTONE:
2129 return media::AudioMode::RINGTONE;
2130 case AUDIO_MODE_IN_CALL:
2131 return media::AudioMode::IN_CALL;
2132 case AUDIO_MODE_IN_COMMUNICATION:
2133 return media::AudioMode::IN_COMMUNICATION;
2134 case AUDIO_MODE_CALL_SCREEN:
2135 return media::AudioMode::CALL_SCREEN;
2136 case AUDIO_MODE_CNT:
2137 break;
2138 }
2139 return unexpected(BAD_VALUE);
2140}
2141
2142ConversionResult<audio_unique_id_use_t>
2143aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2144 switch (aidl) {
2145 case media::AudioUniqueIdUse::UNSPECIFIED:
2146 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2147 case media::AudioUniqueIdUse::SESSION:
2148 return AUDIO_UNIQUE_ID_USE_SESSION;
2149 case media::AudioUniqueIdUse::MODULE:
2150 return AUDIO_UNIQUE_ID_USE_MODULE;
2151 case media::AudioUniqueIdUse::EFFECT:
2152 return AUDIO_UNIQUE_ID_USE_EFFECT;
2153 case media::AudioUniqueIdUse::PATCH:
2154 return AUDIO_UNIQUE_ID_USE_PATCH;
2155 case media::AudioUniqueIdUse::OUTPUT:
2156 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2157 case media::AudioUniqueIdUse::INPUT:
2158 return AUDIO_UNIQUE_ID_USE_INPUT;
2159 case media::AudioUniqueIdUse::CLIENT:
2160 return AUDIO_UNIQUE_ID_USE_CLIENT;
2161 }
2162 return unexpected(BAD_VALUE);
2163}
2164
2165ConversionResult<media::AudioUniqueIdUse>
2166legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2167 switch (legacy) {
2168 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2169 return media::AudioUniqueIdUse::UNSPECIFIED;
2170 case AUDIO_UNIQUE_ID_USE_SESSION:
2171 return media::AudioUniqueIdUse::SESSION;
2172 case AUDIO_UNIQUE_ID_USE_MODULE:
2173 return media::AudioUniqueIdUse::MODULE;
2174 case AUDIO_UNIQUE_ID_USE_EFFECT:
2175 return media::AudioUniqueIdUse::EFFECT;
2176 case AUDIO_UNIQUE_ID_USE_PATCH:
2177 return media::AudioUniqueIdUse::PATCH;
2178 case AUDIO_UNIQUE_ID_USE_OUTPUT:
2179 return media::AudioUniqueIdUse::OUTPUT;
2180 case AUDIO_UNIQUE_ID_USE_INPUT:
2181 return media::AudioUniqueIdUse::INPUT;
2182 case AUDIO_UNIQUE_ID_USE_CLIENT:
2183 return media::AudioUniqueIdUse::CLIENT;
2184 case AUDIO_UNIQUE_ID_USE_MAX:
2185 break;
2186 }
2187 return unexpected(BAD_VALUE);
2188}
2189
Ytai Ben-Tsvi7e7a79d2020-12-15 16:48:16 -08002190ConversionResult<volume_group_t>
2191aidl2legacy_int32_t_volume_group_t(int32_t aidl) {
2192 return convertReinterpret<volume_group_t>(aidl);
2193}
2194
2195ConversionResult<int32_t>
2196legacy2aidl_volume_group_t_int32_t(volume_group_t legacy) {
2197 return convertReinterpret<int32_t>(legacy);
2198}
2199
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07002200} // namespace android