blob: ded3ebdae2ca021245d146dc192bc419298c7ec2 [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) {
120 case media::AudioPortType::DEVICE:
121 switch (role) {
122 case media::AudioPortRole::SOURCE:
123 return Direction::INPUT;
124 case media::AudioPortRole::SINK:
125 return Direction::OUTPUT;
126 default:
127 break;
128 }
129 break;
130 case media::AudioPortType::MIX:
131 switch (role) {
132 case media::AudioPortRole::SOURCE:
133 return Direction::OUTPUT;
134 case media::AudioPortRole::SINK:
135 return Direction::INPUT;
136 default:
137 break;
138 }
139 break;
140 default:
141 break;
142 }
143 return unexpected(BAD_VALUE);
144}
145
146ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
147 switch (type) {
148 case AUDIO_PORT_TYPE_DEVICE:
149 switch (role) {
150 case AUDIO_PORT_ROLE_SOURCE:
151 return Direction::INPUT;
152 case AUDIO_PORT_ROLE_SINK:
153 return Direction::OUTPUT;
154 default:
155 break;
156 }
157 break;
158 case AUDIO_PORT_TYPE_MIX:
159 switch (role) {
160 case AUDIO_PORT_ROLE_SOURCE:
161 return Direction::OUTPUT;
162 case AUDIO_PORT_ROLE_SINK:
163 return Direction::INPUT;
164 default:
165 break;
166 }
167 break;
168 default:
169 break;
170 }
171 return unexpected(BAD_VALUE);
172}
173
174} // namespace
175
176////////////////////////////////////////////////////////////////////////////////////////////////////
177// Converters
178
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700179status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
180 if (aidl.size() > maxSize - 1) {
181 return BAD_VALUE;
182 }
183 aidl.copy(dest, aidl.size());
184 dest[aidl.size()] = '\0';
185 return OK;
186}
187
188ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
189 if (legacy == nullptr) {
190 return unexpected(BAD_VALUE);
191 }
192 if (strnlen(legacy, maxSize) == maxSize) {
193 // No null-terminator.
194 return unexpected(BAD_VALUE);
195 }
196 return std::string(legacy);
197}
198
199ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
200 return convertReinterpret<audio_module_handle_t>(aidl);
201}
202
203ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
204 return convertReinterpret<int32_t>(legacy);
205}
206
207ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
208 return convertReinterpret<audio_io_handle_t>(aidl);
209}
210
211ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
212 return convertReinterpret<int32_t>(legacy);
213}
214
215ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
216 return convertReinterpret<audio_port_handle_t>(aidl);
217}
218
219ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
220 return convertReinterpret<int32_t>(legacy);
221}
222
223ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
224 return convertReinterpret<audio_patch_handle_t>(aidl);
225}
226
227ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
228 return convertReinterpret<int32_t>(legacy);
229}
230
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800231ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
232 return convertReinterpret<audio_unique_id_t>(aidl);
233}
234
235ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
236 return convertReinterpret<int32_t>(legacy);
237}
238
239ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
240 return convertReinterpret<pid_t>(aidl);
241}
242
243ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
244 return convertReinterpret<int32_t>(legacy);
245}
246
247ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
248 return convertReinterpret<uid_t>(aidl);
249}
250
251ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
252 return convertReinterpret<int32_t>(legacy);
253}
254
255ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
256 return String16(aidl.data(), aidl.size());
257}
258
259ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
260 return std::string(String8(legacy).c_str());
261}
262
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800263ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
264 return String8(aidl.data(), aidl.size());
265}
266
267ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
268 return std::string(legacy.c_str());
269}
270
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700271// The legacy enum is unnamed. Thus, we use int.
272ConversionResult<int> aidl2legacy_AudioPortConfigType(media::AudioPortConfigType aidl) {
273 switch (aidl) {
274 case media::AudioPortConfigType::SAMPLE_RATE:
275 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
276 case media::AudioPortConfigType::CHANNEL_MASK:
277 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
278 case media::AudioPortConfigType::FORMAT:
279 return AUDIO_PORT_CONFIG_FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800280 case media::AudioPortConfigType::GAIN:
281 return AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700282 case media::AudioPortConfigType::FLAGS:
283 return AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700284 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800285 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700286}
287
288// The legacy enum is unnamed. Thus, we use int.
289ConversionResult<media::AudioPortConfigType> legacy2aidl_AudioPortConfigType(int legacy) {
290 switch (legacy) {
291 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
292 return media::AudioPortConfigType::SAMPLE_RATE;
293 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
294 return media::AudioPortConfigType::CHANNEL_MASK;
295 case AUDIO_PORT_CONFIG_FORMAT:
296 return media::AudioPortConfigType::FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800297 case AUDIO_PORT_CONFIG_GAIN:
298 return media::AudioPortConfigType::GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700299 case AUDIO_PORT_CONFIG_FLAGS:
300 return media::AudioPortConfigType::FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700301 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800302 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700303}
304
305ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
306 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
307 aidl, aidl2legacy_AudioPortConfigType,
308 // AudioPortConfigType enum is index-based.
309 index2enum_index<media::AudioPortConfigType>,
310 // AUDIO_PORT_CONFIG_* flags are mask-based.
311 enumToMask_bitmask<unsigned int, int>);
312}
313
314ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
315 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
316 legacy, legacy2aidl_AudioPortConfigType,
317 // AUDIO_PORT_CONFIG_* flags are mask-based.
318 index2enum_bitmask<unsigned>,
319 // AudioPortConfigType enum is index-based.
320 enumToMask_index<int32_t, media::AudioPortConfigType>);
321}
322
323ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
324 // TODO(ytai): should we convert bit-by-bit?
325 // One problem here is that the representation is both opaque and is different based on the
326 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
327 return convertReinterpret<audio_channel_mask_t>(aidl);
328}
329
330ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
331 // TODO(ytai): should we convert bit-by-bit?
332 // One problem here is that the representation is both opaque and is different based on the
333 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
334 return convertReinterpret<int32_t>(legacy);
335}
336
337ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
338 media::AudioIoConfigEvent aidl) {
339 switch (aidl) {
340 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
341 return AUDIO_OUTPUT_REGISTERED;
342 case media::AudioIoConfigEvent::OUTPUT_OPENED:
343 return AUDIO_OUTPUT_OPENED;
344 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
345 return AUDIO_OUTPUT_CLOSED;
346 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
347 return AUDIO_OUTPUT_CONFIG_CHANGED;
348 case media::AudioIoConfigEvent::INPUT_REGISTERED:
349 return AUDIO_INPUT_REGISTERED;
350 case media::AudioIoConfigEvent::INPUT_OPENED:
351 return AUDIO_INPUT_OPENED;
352 case media::AudioIoConfigEvent::INPUT_CLOSED:
353 return AUDIO_INPUT_CLOSED;
354 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
355 return AUDIO_INPUT_CONFIG_CHANGED;
356 case media::AudioIoConfigEvent::CLIENT_STARTED:
357 return AUDIO_CLIENT_STARTED;
358 default:
359 return unexpected(BAD_VALUE);
360 }
361}
362
363ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
364 audio_io_config_event legacy) {
365 switch (legacy) {
366 case AUDIO_OUTPUT_REGISTERED:
367 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
368 case AUDIO_OUTPUT_OPENED:
369 return media::AudioIoConfigEvent::OUTPUT_OPENED;
370 case AUDIO_OUTPUT_CLOSED:
371 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
372 case AUDIO_OUTPUT_CONFIG_CHANGED:
373 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
374 case AUDIO_INPUT_REGISTERED:
375 return media::AudioIoConfigEvent::INPUT_REGISTERED;
376 case AUDIO_INPUT_OPENED:
377 return media::AudioIoConfigEvent::INPUT_OPENED;
378 case AUDIO_INPUT_CLOSED:
379 return media::AudioIoConfigEvent::INPUT_CLOSED;
380 case AUDIO_INPUT_CONFIG_CHANGED:
381 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
382 case AUDIO_CLIENT_STARTED:
383 return media::AudioIoConfigEvent::CLIENT_STARTED;
384 default:
385 return unexpected(BAD_VALUE);
386 }
387}
388
389ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
390 media::AudioPortRole aidl) {
391 switch (aidl) {
392 case media::AudioPortRole::NONE:
393 return AUDIO_PORT_ROLE_NONE;
394 case media::AudioPortRole::SOURCE:
395 return AUDIO_PORT_ROLE_SOURCE;
396 case media::AudioPortRole::SINK:
397 return AUDIO_PORT_ROLE_SINK;
398 default:
399 return unexpected(BAD_VALUE);
400 }
401}
402
403ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
404 audio_port_role_t legacy) {
405 switch (legacy) {
406 case AUDIO_PORT_ROLE_NONE:
407 return media::AudioPortRole::NONE;
408 case AUDIO_PORT_ROLE_SOURCE:
409 return media::AudioPortRole::SOURCE;
410 case AUDIO_PORT_ROLE_SINK:
411 return media::AudioPortRole::SINK;
412 default:
413 return unexpected(BAD_VALUE);
414 }
415}
416
417ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
418 media::AudioPortType aidl) {
419 switch (aidl) {
420 case media::AudioPortType::NONE:
421 return AUDIO_PORT_TYPE_NONE;
422 case media::AudioPortType::DEVICE:
423 return AUDIO_PORT_TYPE_DEVICE;
424 case media::AudioPortType::MIX:
425 return AUDIO_PORT_TYPE_MIX;
426 case media::AudioPortType::SESSION:
427 return AUDIO_PORT_TYPE_SESSION;
428 default:
429 return unexpected(BAD_VALUE);
430 }
431}
432
433ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
434 audio_port_type_t legacy) {
435 switch (legacy) {
436 case AUDIO_PORT_TYPE_NONE:
437 return media::AudioPortType::NONE;
438 case AUDIO_PORT_TYPE_DEVICE:
439 return media::AudioPortType::DEVICE;
440 case AUDIO_PORT_TYPE_MIX:
441 return media::AudioPortType::MIX;
442 case AUDIO_PORT_TYPE_SESSION:
443 return media::AudioPortType::SESSION;
444 default:
445 return unexpected(BAD_VALUE);
446 }
447}
448
449ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
450 media::audio::common::AudioFormat aidl) {
451 // This relies on AudioFormat being kept in sync with audio_format_t.
452 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
453 return static_cast<audio_format_t>(aidl);
454}
455
456ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
457 audio_format_t legacy) {
458 // This relies on AudioFormat being kept in sync with audio_format_t.
459 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
460 return static_cast<media::audio::common::AudioFormat>(legacy);
461}
462
463ConversionResult<int> aidl2legacy_AudioGainMode_int(media::AudioGainMode aidl) {
464 switch (aidl) {
465 case media::AudioGainMode::JOINT:
466 return AUDIO_GAIN_MODE_JOINT;
467 case media::AudioGainMode::CHANNELS:
468 return AUDIO_GAIN_MODE_CHANNELS;
469 case media::AudioGainMode::RAMP:
470 return AUDIO_GAIN_MODE_RAMP;
471 default:
472 return unexpected(BAD_VALUE);
473 }
474}
475
476ConversionResult<media::AudioGainMode> legacy2aidl_int_AudioGainMode(int legacy) {
477 switch (legacy) {
478 case AUDIO_GAIN_MODE_JOINT:
479 return media::AudioGainMode::JOINT;
480 case AUDIO_GAIN_MODE_CHANNELS:
481 return media::AudioGainMode::CHANNELS;
482 case AUDIO_GAIN_MODE_RAMP:
483 return media::AudioGainMode::RAMP;
484 default:
485 return unexpected(BAD_VALUE);
486 }
487}
488
489ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t(int32_t aidl) {
490 return convertBitmask<audio_gain_mode_t, int32_t, int, media::AudioGainMode>(
491 aidl, aidl2legacy_AudioGainMode_int,
492 // AudioGainMode is index-based.
493 index2enum_index<media::AudioGainMode>,
494 // AUDIO_GAIN_MODE_* constants are mask-based.
495 enumToMask_bitmask<audio_gain_mode_t, int>);
496}
497
498ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t(audio_gain_mode_t legacy) {
499 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, int>(
500 legacy, legacy2aidl_int_AudioGainMode,
501 // AUDIO_GAIN_MODE_* constants are mask-based.
502 index2enum_bitmask<int>,
503 // AudioGainMode is index-based.
504 enumToMask_index<int32_t, media::AudioGainMode>);
505}
506
507ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
508 // TODO(ytai): bitfield?
509 return convertReinterpret<audio_devices_t>(aidl);
510}
511
512ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
513 // TODO(ytai): bitfield?
514 return convertReinterpret<int32_t>(legacy);
515}
516
517ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
518 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
519 audio_gain_config legacy;
520 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
521 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t(aidl.mode));
522 legacy.channel_mask =
523 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
524 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
525 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
526 size_t numValues = isJoint ? 1
527 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
528 : audio_channel_count_from_out_mask(legacy.channel_mask);
529 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
530 return unexpected(BAD_VALUE);
531 }
532 for (size_t i = 0; i < numValues; ++i) {
533 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
534 }
535 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
536 return legacy;
537}
538
539ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
540 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
541 media::AudioGainConfig aidl;
542 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
543 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t(legacy.mode));
544 aidl.channelMask =
545 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
546 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
547 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
548 size_t numValues = isJoint ? 1
549 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
550 : audio_channel_count_from_out_mask(legacy.channel_mask);
551 aidl.values.resize(numValues);
552 for (size_t i = 0; i < numValues; ++i) {
553 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
554 }
555 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
556 return aidl;
557}
558
559ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
560 media::AudioInputFlags aidl) {
561 switch (aidl) {
562 case media::AudioInputFlags::FAST:
563 return AUDIO_INPUT_FLAG_FAST;
564 case media::AudioInputFlags::HW_HOTWORD:
565 return AUDIO_INPUT_FLAG_HW_HOTWORD;
566 case media::AudioInputFlags::RAW:
567 return AUDIO_INPUT_FLAG_RAW;
568 case media::AudioInputFlags::SYNC:
569 return AUDIO_INPUT_FLAG_SYNC;
570 case media::AudioInputFlags::MMAP_NOIRQ:
571 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
572 case media::AudioInputFlags::VOIP_TX:
573 return AUDIO_INPUT_FLAG_VOIP_TX;
574 case media::AudioInputFlags::HW_AV_SYNC:
575 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
576 case media::AudioInputFlags::DIRECT:
577 return AUDIO_INPUT_FLAG_DIRECT;
578 default:
579 return unexpected(BAD_VALUE);
580 }
581}
582
583ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
584 audio_input_flags_t legacy) {
585 switch (legacy) {
586 case AUDIO_INPUT_FLAG_FAST:
587 return media::AudioInputFlags::FAST;
588 case AUDIO_INPUT_FLAG_HW_HOTWORD:
589 return media::AudioInputFlags::HW_HOTWORD;
590 case AUDIO_INPUT_FLAG_RAW:
591 return media::AudioInputFlags::RAW;
592 case AUDIO_INPUT_FLAG_SYNC:
593 return media::AudioInputFlags::SYNC;
594 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
595 return media::AudioInputFlags::MMAP_NOIRQ;
596 case AUDIO_INPUT_FLAG_VOIP_TX:
597 return media::AudioInputFlags::VOIP_TX;
598 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
599 return media::AudioInputFlags::HW_AV_SYNC;
600 case AUDIO_INPUT_FLAG_DIRECT:
601 return media::AudioInputFlags::DIRECT;
602 default:
603 return unexpected(BAD_VALUE);
604 }
605}
606
607ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
608 media::AudioOutputFlags aidl) {
609 switch (aidl) {
610 case media::AudioOutputFlags::DIRECT:
611 return AUDIO_OUTPUT_FLAG_DIRECT;
612 case media::AudioOutputFlags::PRIMARY:
613 return AUDIO_OUTPUT_FLAG_PRIMARY;
614 case media::AudioOutputFlags::FAST:
615 return AUDIO_OUTPUT_FLAG_FAST;
616 case media::AudioOutputFlags::DEEP_BUFFER:
617 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
618 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
619 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
620 case media::AudioOutputFlags::NON_BLOCKING:
621 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
622 case media::AudioOutputFlags::HW_AV_SYNC:
623 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
624 case media::AudioOutputFlags::TTS:
625 return AUDIO_OUTPUT_FLAG_TTS;
626 case media::AudioOutputFlags::RAW:
627 return AUDIO_OUTPUT_FLAG_RAW;
628 case media::AudioOutputFlags::SYNC:
629 return AUDIO_OUTPUT_FLAG_SYNC;
630 case media::AudioOutputFlags::IEC958_NONAUDIO:
631 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
632 case media::AudioOutputFlags::DIRECT_PCM:
633 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
634 case media::AudioOutputFlags::MMAP_NOIRQ:
635 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
636 case media::AudioOutputFlags::VOIP_RX:
637 return AUDIO_OUTPUT_FLAG_VOIP_RX;
638 case media::AudioOutputFlags::INCALL_MUSIC:
639 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
640 default:
641 return unexpected(BAD_VALUE);
642 }
643}
644
645ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
646 audio_output_flags_t legacy) {
647 switch (legacy) {
648 case AUDIO_OUTPUT_FLAG_DIRECT:
649 return media::AudioOutputFlags::DIRECT;
650 case AUDIO_OUTPUT_FLAG_PRIMARY:
651 return media::AudioOutputFlags::PRIMARY;
652 case AUDIO_OUTPUT_FLAG_FAST:
653 return media::AudioOutputFlags::FAST;
654 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
655 return media::AudioOutputFlags::DEEP_BUFFER;
656 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
657 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
658 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
659 return media::AudioOutputFlags::NON_BLOCKING;
660 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
661 return media::AudioOutputFlags::HW_AV_SYNC;
662 case AUDIO_OUTPUT_FLAG_TTS:
663 return media::AudioOutputFlags::TTS;
664 case AUDIO_OUTPUT_FLAG_RAW:
665 return media::AudioOutputFlags::RAW;
666 case AUDIO_OUTPUT_FLAG_SYNC:
667 return media::AudioOutputFlags::SYNC;
668 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
669 return media::AudioOutputFlags::IEC958_NONAUDIO;
670 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
671 return media::AudioOutputFlags::DIRECT_PCM;
672 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
673 return media::AudioOutputFlags::MMAP_NOIRQ;
674 case AUDIO_OUTPUT_FLAG_VOIP_RX:
675 return media::AudioOutputFlags::VOIP_RX;
676 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
677 return media::AudioOutputFlags::INCALL_MUSIC;
678 default:
679 return unexpected(BAD_VALUE);
680 }
681}
682
683ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
684 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
685
686 LegacyMask converted = VALUE_OR_RETURN(
687 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
688 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
689 index2enum_index<media::AudioInputFlags>,
690 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
691 return static_cast<audio_input_flags_t>(converted);
692}
693
694ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
695 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
696
697 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
698 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
699 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
700 index2enum_bitmask<audio_input_flags_t>,
701 enumToMask_index<int32_t, media::AudioInputFlags>);
702}
703
704ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700705 return convertBitmask<audio_output_flags_t,
706 int32_t,
707 audio_output_flags_t,
708 media::AudioOutputFlags>(
709 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
710 index2enum_index<media::AudioOutputFlags>,
711 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700712}
713
714ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
715 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
716
717 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
718 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
719 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
720 index2enum_bitmask<audio_output_flags_t>,
721 enumToMask_index<int32_t, media::AudioOutputFlags>);
722}
723
724ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
725 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
726 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700727 Direction dir = VALUE_OR_RETURN(direction(role, type));
728 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700729 case Direction::INPUT: {
730 legacy.input = VALUE_OR_RETURN(
731 aidl2legacy_audio_input_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, input))));
732 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700733 break;
734
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700735 case Direction::OUTPUT: {
736 legacy.output = VALUE_OR_RETURN(
737 aidl2legacy_audio_output_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, output))));
738 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700739 break;
740 }
741
742 return legacy;
743}
744
745ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
746 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
747 media::AudioIoFlags aidl;
748
749 Direction dir = VALUE_OR_RETURN(direction(role, type));
750 switch (dir) {
751 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700752 UNION_SET(aidl, input,
753 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700754 break;
755 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700756 UNION_SET(aidl, output,
757 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700758 break;
759 }
760 return aidl;
761}
762
763ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
764 const media::AudioPortConfigDeviceExt& aidl) {
765 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700766 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700767 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700768 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700769 return legacy;
770}
771
772ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
773 const audio_port_config_device_ext& legacy) {
774 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700775 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700776 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700777 aidl.address = VALUE_OR_RETURN(
778 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700779 return aidl;
780}
781
782ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
783 media::AudioStreamType aidl) {
784 switch (aidl) {
785 case media::AudioStreamType::DEFAULT:
786 return AUDIO_STREAM_DEFAULT;
787 case media::AudioStreamType::VOICE_CALL:
788 return AUDIO_STREAM_VOICE_CALL;
789 case media::AudioStreamType::SYSTEM:
790 return AUDIO_STREAM_SYSTEM;
791 case media::AudioStreamType::RING:
792 return AUDIO_STREAM_RING;
793 case media::AudioStreamType::MUSIC:
794 return AUDIO_STREAM_MUSIC;
795 case media::AudioStreamType::ALARM:
796 return AUDIO_STREAM_ALARM;
797 case media::AudioStreamType::NOTIFICATION:
798 return AUDIO_STREAM_NOTIFICATION;
799 case media::AudioStreamType::BLUETOOTH_SCO:
800 return AUDIO_STREAM_BLUETOOTH_SCO;
801 case media::AudioStreamType::ENFORCED_AUDIBLE:
802 return AUDIO_STREAM_ENFORCED_AUDIBLE;
803 case media::AudioStreamType::DTMF:
804 return AUDIO_STREAM_DTMF;
805 case media::AudioStreamType::TTS:
806 return AUDIO_STREAM_TTS;
807 case media::AudioStreamType::ACCESSIBILITY:
808 return AUDIO_STREAM_ACCESSIBILITY;
809 case media::AudioStreamType::ASSISTANT:
810 return AUDIO_STREAM_ASSISTANT;
811 case media::AudioStreamType::REROUTING:
812 return AUDIO_STREAM_REROUTING;
813 case media::AudioStreamType::PATCH:
814 return AUDIO_STREAM_PATCH;
815 case media::AudioStreamType::CALL_ASSISTANT:
816 return AUDIO_STREAM_CALL_ASSISTANT;
817 default:
818 return unexpected(BAD_VALUE);
819 }
820}
821
822ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
823 audio_stream_type_t legacy) {
824 switch (legacy) {
825 case AUDIO_STREAM_DEFAULT:
826 return media::AudioStreamType::DEFAULT;
827 case AUDIO_STREAM_VOICE_CALL:
828 return media::AudioStreamType::VOICE_CALL;
829 case AUDIO_STREAM_SYSTEM:
830 return media::AudioStreamType::SYSTEM;
831 case AUDIO_STREAM_RING:
832 return media::AudioStreamType::RING;
833 case AUDIO_STREAM_MUSIC:
834 return media::AudioStreamType::MUSIC;
835 case AUDIO_STREAM_ALARM:
836 return media::AudioStreamType::ALARM;
837 case AUDIO_STREAM_NOTIFICATION:
838 return media::AudioStreamType::NOTIFICATION;
839 case AUDIO_STREAM_BLUETOOTH_SCO:
840 return media::AudioStreamType::BLUETOOTH_SCO;
841 case AUDIO_STREAM_ENFORCED_AUDIBLE:
842 return media::AudioStreamType::ENFORCED_AUDIBLE;
843 case AUDIO_STREAM_DTMF:
844 return media::AudioStreamType::DTMF;
845 case AUDIO_STREAM_TTS:
846 return media::AudioStreamType::TTS;
847 case AUDIO_STREAM_ACCESSIBILITY:
848 return media::AudioStreamType::ACCESSIBILITY;
849 case AUDIO_STREAM_ASSISTANT:
850 return media::AudioStreamType::ASSISTANT;
851 case AUDIO_STREAM_REROUTING:
852 return media::AudioStreamType::REROUTING;
853 case AUDIO_STREAM_PATCH:
854 return media::AudioStreamType::PATCH;
855 case AUDIO_STREAM_CALL_ASSISTANT:
856 return media::AudioStreamType::CALL_ASSISTANT;
857 default:
858 return unexpected(BAD_VALUE);
859 }
860}
861
862ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
863 media::AudioSourceType aidl) {
864 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800865 case media::AudioSourceType::INVALID:
866 // This value does not have an enum
867 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700868 case media::AudioSourceType::DEFAULT:
869 return AUDIO_SOURCE_DEFAULT;
870 case media::AudioSourceType::MIC:
871 return AUDIO_SOURCE_MIC;
872 case media::AudioSourceType::VOICE_UPLINK:
873 return AUDIO_SOURCE_VOICE_UPLINK;
874 case media::AudioSourceType::VOICE_DOWNLINK:
875 return AUDIO_SOURCE_VOICE_DOWNLINK;
876 case media::AudioSourceType::VOICE_CALL:
877 return AUDIO_SOURCE_VOICE_CALL;
878 case media::AudioSourceType::CAMCORDER:
879 return AUDIO_SOURCE_CAMCORDER;
880 case media::AudioSourceType::VOICE_RECOGNITION:
881 return AUDIO_SOURCE_VOICE_RECOGNITION;
882 case media::AudioSourceType::VOICE_COMMUNICATION:
883 return AUDIO_SOURCE_VOICE_COMMUNICATION;
884 case media::AudioSourceType::REMOTE_SUBMIX:
885 return AUDIO_SOURCE_REMOTE_SUBMIX;
886 case media::AudioSourceType::UNPROCESSED:
887 return AUDIO_SOURCE_UNPROCESSED;
888 case media::AudioSourceType::VOICE_PERFORMANCE:
889 return AUDIO_SOURCE_VOICE_PERFORMANCE;
890 case media::AudioSourceType::ECHO_REFERENCE:
891 return AUDIO_SOURCE_ECHO_REFERENCE;
892 case media::AudioSourceType::FM_TUNER:
893 return AUDIO_SOURCE_FM_TUNER;
894 case media::AudioSourceType::HOTWORD:
895 return AUDIO_SOURCE_HOTWORD;
896 default:
897 return unexpected(BAD_VALUE);
898 }
899}
900
901ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
902 audio_source_t legacy) {
903 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800904 case AUDIO_SOURCE_INVALID:
905 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700906 case AUDIO_SOURCE_DEFAULT:
907 return media::AudioSourceType::DEFAULT;
908 case AUDIO_SOURCE_MIC:
909 return media::AudioSourceType::MIC;
910 case AUDIO_SOURCE_VOICE_UPLINK:
911 return media::AudioSourceType::VOICE_UPLINK;
912 case AUDIO_SOURCE_VOICE_DOWNLINK:
913 return media::AudioSourceType::VOICE_DOWNLINK;
914 case AUDIO_SOURCE_VOICE_CALL:
915 return media::AudioSourceType::VOICE_CALL;
916 case AUDIO_SOURCE_CAMCORDER:
917 return media::AudioSourceType::CAMCORDER;
918 case AUDIO_SOURCE_VOICE_RECOGNITION:
919 return media::AudioSourceType::VOICE_RECOGNITION;
920 case AUDIO_SOURCE_VOICE_COMMUNICATION:
921 return media::AudioSourceType::VOICE_COMMUNICATION;
922 case AUDIO_SOURCE_REMOTE_SUBMIX:
923 return media::AudioSourceType::REMOTE_SUBMIX;
924 case AUDIO_SOURCE_UNPROCESSED:
925 return media::AudioSourceType::UNPROCESSED;
926 case AUDIO_SOURCE_VOICE_PERFORMANCE:
927 return media::AudioSourceType::VOICE_PERFORMANCE;
928 case AUDIO_SOURCE_ECHO_REFERENCE:
929 return media::AudioSourceType::ECHO_REFERENCE;
930 case AUDIO_SOURCE_FM_TUNER:
931 return media::AudioSourceType::FM_TUNER;
932 case AUDIO_SOURCE_HOTWORD:
933 return media::AudioSourceType::HOTWORD;
934 default:
935 return unexpected(BAD_VALUE);
936 }
937}
938
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800939ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
940 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700941}
942
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800943ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
944 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700945}
946
947// This type is unnamed in the original definition, thus we name it here.
948using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
949
950ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
951 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
952 audio_port_config_mix_ext_usecase legacy;
953
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700954 switch (role) {
955 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700956 // Just verify that the union is empty.
957 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700958 break;
959
960 case media::AudioPortRole::SOURCE:
961 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700962 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
963 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700964 break;
965
966 case media::AudioPortRole::SINK:
967 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700968 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
969 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700970 break;
971
972 default:
973 LOG_ALWAYS_FATAL("Shouldn't get here");
974 }
975 return legacy;
976}
977
978ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
979 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
980 media::AudioPortConfigMixExtUseCase aidl;
981
982 switch (role) {
983 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700984 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700985 break;
986 case AUDIO_PORT_ROLE_SOURCE:
987 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700988 UNION_SET(aidl, stream, VALUE_OR_RETURN(
989 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700990 break;
991 case AUDIO_PORT_ROLE_SINK:
992 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700993 UNION_SET(aidl, source,
994 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700995 break;
996 default:
997 LOG_ALWAYS_FATAL("Shouldn't get here");
998 }
999 return aidl;
1000}
1001
1002ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1003 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1004 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001005 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1006 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001007 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1008 return legacy;
1009}
1010
1011ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1012 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1013 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001014 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1015 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001016 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1017 return aidl;
1018}
1019
1020ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1021 const media::AudioPortConfigSessionExt& aidl) {
1022 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001023 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001024 return legacy;
1025}
1026
1027ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1028 const audio_port_config_session_ext& legacy) {
1029 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001030 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001031 return aidl;
1032}
1033
1034// This type is unnamed in the original definition, thus we name it here.
1035using audio_port_config_ext = decltype(audio_port_config::ext);
1036
1037ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1038 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1039 media::AudioPortRole role) {
1040 audio_port_config_ext legacy;
1041 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
1042 // one of the them has size 1 and the rest are empty.
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001043 switch (type) {
1044 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001045 // Just verify that the union is empty.
1046 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001047 break;
1048 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001049 legacy.device = VALUE_OR_RETURN(
1050 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001051 break;
1052 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001053 legacy.mix = VALUE_OR_RETURN(
1054 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001055 break;
1056 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001057 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1058 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001059 break;
1060 default:
1061 LOG_ALWAYS_FATAL("Shouldn't get here");
1062 }
1063 return legacy;
1064}
1065
1066ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1067 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1068 media::AudioPortConfigExt aidl;
1069
1070 switch (type) {
1071 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001072 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001073 break;
1074 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001075 UNION_SET(aidl, device,
1076 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001077 break;
1078 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001079 UNION_SET(aidl, mix,
1080 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001081 break;
1082 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001083 UNION_SET(aidl, session,
1084 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001085 break;
1086 default:
1087 LOG_ALWAYS_FATAL("Shouldn't get here");
1088 }
1089 return aidl;
1090}
1091
1092ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1093 const media::AudioPortConfig& aidl) {
1094 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001095 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001096 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1097 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1098 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1099 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1100 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1101 }
1102 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1103 legacy.channel_mask =
1104 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1105 }
1106 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1107 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1108 }
1109 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1110 legacy.gain = VALUE_OR_RETURN(
1111 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1112 }
1113 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1114 legacy.flags = VALUE_OR_RETURN(
1115 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1116 }
1117 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1118 return legacy;
1119}
1120
1121ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1122 const audio_port_config& legacy) {
1123 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001124 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001125 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1126 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1127 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1128 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1129 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1130 }
1131 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1132 aidl.channelMask =
1133 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1134 }
1135 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1136 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1137 }
1138 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1139 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1140 legacy.gain, legacy.role, legacy.type));
1141 }
1142 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1143 aidl.flags = VALUE_OR_RETURN(
1144 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1145 }
1146 aidl.ext =
1147 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1148 return aidl;
1149}
1150
1151ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1152 const media::AudioPatch& aidl) {
1153 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001154 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001155 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1156 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1157 return unexpected(BAD_VALUE);
1158 }
1159 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1160 legacy.sinks[i] =
1161 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1162 }
1163 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1164 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1165 return unexpected(BAD_VALUE);
1166 }
1167 for (size_t i = 0; i < legacy.num_sources; ++i) {
1168 legacy.sources[i] =
1169 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1170 }
1171 return legacy;
1172}
1173
1174ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1175 const struct audio_patch& legacy) {
1176 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001177 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001178
1179 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1180 return unexpected(BAD_VALUE);
1181 }
1182 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1183 aidl.sinks.push_back(
1184 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1185 }
1186 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1187 return unexpected(BAD_VALUE);
1188 }
1189 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1190 aidl.sources.push_back(
1191 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1192 }
1193 return aidl;
1194}
1195
1196ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1197 const media::AudioIoDescriptor& aidl) {
1198 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001199 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001200 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1201 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1202 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1203 legacy->mChannelMask =
1204 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1205 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1206 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1207 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001208 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001209 return legacy;
1210}
1211
1212ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1213 const sp<AudioIoDescriptor>& legacy) {
1214 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001215 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001216 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1217 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1218 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001219 aidl.channelMask = VALUE_OR_RETURN(
1220 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001221 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1222 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1223 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001224 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001225 return aidl;
1226}
1227
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001228ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1229 AudioClient legacy;
1230 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1231 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1232 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1233 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1234 return legacy;
1235}
1236
1237ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1238 media::AudioClient aidl;
1239 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1240 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1241 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1242 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1243 return aidl;
1244}
1245
1246ConversionResult<audio_content_type_t>
1247aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1248 switch (aidl) {
1249 case media::AudioContentType::UNKNOWN:
1250 return AUDIO_CONTENT_TYPE_UNKNOWN;
1251 case media::AudioContentType::SPEECH:
1252 return AUDIO_CONTENT_TYPE_SPEECH;
1253 case media::AudioContentType::MUSIC:
1254 return AUDIO_CONTENT_TYPE_MUSIC;
1255 case media::AudioContentType::MOVIE:
1256 return AUDIO_CONTENT_TYPE_MOVIE;
1257 case media::AudioContentType::SONIFICATION:
1258 return AUDIO_CONTENT_TYPE_SONIFICATION;
1259 }
1260 return unexpected(BAD_VALUE);
1261}
1262
1263ConversionResult<media::AudioContentType>
1264legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1265 switch (legacy) {
1266 case AUDIO_CONTENT_TYPE_UNKNOWN:
1267 return media::AudioContentType::UNKNOWN;
1268 case AUDIO_CONTENT_TYPE_SPEECH:
1269 return media::AudioContentType::SPEECH;
1270 case AUDIO_CONTENT_TYPE_MUSIC:
1271 return media::AudioContentType::MUSIC;
1272 case AUDIO_CONTENT_TYPE_MOVIE:
1273 return media::AudioContentType::MOVIE;
1274 case AUDIO_CONTENT_TYPE_SONIFICATION:
1275 return media::AudioContentType::SONIFICATION;
1276 }
1277 return unexpected(BAD_VALUE);
1278}
1279
1280ConversionResult<audio_usage_t>
1281aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1282 switch (aidl) {
1283 case media::AudioUsage::UNKNOWN:
1284 return AUDIO_USAGE_UNKNOWN;
1285 case media::AudioUsage::MEDIA:
1286 return AUDIO_USAGE_MEDIA;
1287 case media::AudioUsage::VOICE_COMMUNICATION:
1288 return AUDIO_USAGE_VOICE_COMMUNICATION;
1289 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1290 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1291 case media::AudioUsage::ALARM:
1292 return AUDIO_USAGE_ALARM;
1293 case media::AudioUsage::NOTIFICATION:
1294 return AUDIO_USAGE_NOTIFICATION;
1295 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1296 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1297 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1298 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1299 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1300 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1301 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1302 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1303 case media::AudioUsage::NOTIFICATION_EVENT:
1304 return AUDIO_USAGE_NOTIFICATION_EVENT;
1305 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1306 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1307 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1308 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1309 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1310 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1311 case media::AudioUsage::GAME:
1312 return AUDIO_USAGE_GAME;
1313 case media::AudioUsage::VIRTUAL_SOURCE:
1314 return AUDIO_USAGE_VIRTUAL_SOURCE;
1315 case media::AudioUsage::ASSISTANT:
1316 return AUDIO_USAGE_ASSISTANT;
1317 case media::AudioUsage::CALL_ASSISTANT:
1318 return AUDIO_USAGE_CALL_ASSISTANT;
1319 case media::AudioUsage::EMERGENCY:
1320 return AUDIO_USAGE_EMERGENCY;
1321 case media::AudioUsage::SAFETY:
1322 return AUDIO_USAGE_SAFETY;
1323 case media::AudioUsage::VEHICLE_STATUS:
1324 return AUDIO_USAGE_VEHICLE_STATUS;
1325 case media::AudioUsage::ANNOUNCEMENT:
1326 return AUDIO_USAGE_ANNOUNCEMENT;
1327 }
1328 return unexpected(BAD_VALUE);
1329}
1330
1331ConversionResult<media::AudioUsage>
1332legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1333 switch (legacy) {
1334 case AUDIO_USAGE_UNKNOWN:
1335 return media::AudioUsage::UNKNOWN;
1336 case AUDIO_USAGE_MEDIA:
1337 return media::AudioUsage::MEDIA;
1338 case AUDIO_USAGE_VOICE_COMMUNICATION:
1339 return media::AudioUsage::VOICE_COMMUNICATION;
1340 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1341 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1342 case AUDIO_USAGE_ALARM:
1343 return media::AudioUsage::ALARM;
1344 case AUDIO_USAGE_NOTIFICATION:
1345 return media::AudioUsage::NOTIFICATION;
1346 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1347 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1348 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1349 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1350 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1351 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1352 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1353 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1354 case AUDIO_USAGE_NOTIFICATION_EVENT:
1355 return media::AudioUsage::NOTIFICATION_EVENT;
1356 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1357 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1358 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1359 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1360 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1361 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1362 case AUDIO_USAGE_GAME:
1363 return media::AudioUsage::GAME;
1364 case AUDIO_USAGE_VIRTUAL_SOURCE:
1365 return media::AudioUsage::VIRTUAL_SOURCE;
1366 case AUDIO_USAGE_ASSISTANT:
1367 return media::AudioUsage::ASSISTANT;
1368 case AUDIO_USAGE_CALL_ASSISTANT:
1369 return media::AudioUsage::CALL_ASSISTANT;
1370 case AUDIO_USAGE_EMERGENCY:
1371 return media::AudioUsage::EMERGENCY;
1372 case AUDIO_USAGE_SAFETY:
1373 return media::AudioUsage::SAFETY;
1374 case AUDIO_USAGE_VEHICLE_STATUS:
1375 return media::AudioUsage::VEHICLE_STATUS;
1376 case AUDIO_USAGE_ANNOUNCEMENT:
1377 return media::AudioUsage::ANNOUNCEMENT;
1378 }
1379 return unexpected(BAD_VALUE);
1380}
1381
1382ConversionResult<audio_flags_mask_t>
1383aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1384 switch (aidl) {
1385 case media::AudioFlag::AUDIBILITY_ENFORCED:
1386 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1387 case media::AudioFlag::SECURE:
1388 return AUDIO_FLAG_SECURE;
1389 case media::AudioFlag::SCO:
1390 return AUDIO_FLAG_SCO;
1391 case media::AudioFlag::BEACON:
1392 return AUDIO_FLAG_BEACON;
1393 case media::AudioFlag::HW_AV_SYNC:
1394 return AUDIO_FLAG_HW_AV_SYNC;
1395 case media::AudioFlag::HW_HOTWORD:
1396 return AUDIO_FLAG_HW_HOTWORD;
1397 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1398 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1399 case media::AudioFlag::BYPASS_MUTE:
1400 return AUDIO_FLAG_BYPASS_MUTE;
1401 case media::AudioFlag::LOW_LATENCY:
1402 return AUDIO_FLAG_LOW_LATENCY;
1403 case media::AudioFlag::DEEP_BUFFER:
1404 return AUDIO_FLAG_DEEP_BUFFER;
1405 case media::AudioFlag::NO_MEDIA_PROJECTION:
1406 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1407 case media::AudioFlag::MUTE_HAPTIC:
1408 return AUDIO_FLAG_MUTE_HAPTIC;
1409 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1410 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1411 case media::AudioFlag::CAPTURE_PRIVATE:
1412 return AUDIO_FLAG_CAPTURE_PRIVATE;
1413 }
1414 return unexpected(BAD_VALUE);
1415}
1416
1417ConversionResult<media::AudioFlag>
1418legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1419 switch (legacy) {
1420 case AUDIO_FLAG_NONE:
1421 return unexpected(BAD_VALUE);
1422 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1423 return media::AudioFlag::AUDIBILITY_ENFORCED;
1424 case AUDIO_FLAG_SECURE:
1425 return media::AudioFlag::SECURE;
1426 case AUDIO_FLAG_SCO:
1427 return media::AudioFlag::SCO;
1428 case AUDIO_FLAG_BEACON:
1429 return media::AudioFlag::BEACON;
1430 case AUDIO_FLAG_HW_AV_SYNC:
1431 return media::AudioFlag::HW_AV_SYNC;
1432 case AUDIO_FLAG_HW_HOTWORD:
1433 return media::AudioFlag::HW_HOTWORD;
1434 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1435 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1436 case AUDIO_FLAG_BYPASS_MUTE:
1437 return media::AudioFlag::BYPASS_MUTE;
1438 case AUDIO_FLAG_LOW_LATENCY:
1439 return media::AudioFlag::LOW_LATENCY;
1440 case AUDIO_FLAG_DEEP_BUFFER:
1441 return media::AudioFlag::DEEP_BUFFER;
1442 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1443 return media::AudioFlag::NO_MEDIA_PROJECTION;
1444 case AUDIO_FLAG_MUTE_HAPTIC:
1445 return media::AudioFlag::MUTE_HAPTIC;
1446 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1447 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1448 case AUDIO_FLAG_CAPTURE_PRIVATE:
1449 return media::AudioFlag::CAPTURE_PRIVATE;
1450 }
1451 return unexpected(BAD_VALUE);
1452}
1453
1454ConversionResult<audio_flags_mask_t>
1455aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1456 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1457 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1458 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1459}
1460
1461ConversionResult<int32_t>
1462legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1463 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001464 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1465 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001466 enumToMask_index<int32_t, media::AudioFlag>);
1467}
1468
1469ConversionResult<audio_attributes_t>
1470aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1471 audio_attributes_t legacy;
1472 legacy.content_type = VALUE_OR_RETURN(
1473 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1474 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1475 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1476 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1477 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1478 return legacy;
1479}
1480
1481ConversionResult<media::AudioAttributesInternal>
1482legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1483 media::AudioAttributesInternal aidl;
1484 aidl.contentType = VALUE_OR_RETURN(
1485 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1486 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1487 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1488 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1489 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1490 return aidl;
1491}
1492
1493ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001494aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001495 switch (aidl) {
1496 case media::AudioEncapsulationMode::NONE:
1497 return AUDIO_ENCAPSULATION_MODE_NONE;
1498 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1499 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1500 case media::AudioEncapsulationMode::HANDLE:
1501 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1502 }
1503 return unexpected(BAD_VALUE);
1504}
1505
1506ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001507legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001508 switch (legacy) {
1509 case AUDIO_ENCAPSULATION_MODE_NONE:
1510 return media::AudioEncapsulationMode::NONE;
1511 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1512 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1513 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1514 return media::AudioEncapsulationMode::HANDLE;
1515 }
1516 return unexpected(BAD_VALUE);
1517}
1518
1519ConversionResult<audio_offload_info_t>
1520aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1521 audio_offload_info_t legacy;
1522 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1523 legacy.size = sizeof(audio_offload_info_t);
1524 audio_config_base_t config = VALUE_OR_RETURN(
1525 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1526 legacy.sample_rate = config.sample_rate;
1527 legacy.channel_mask = config.channel_mask;
1528 legacy.format = config.format;
1529 legacy.stream_type = VALUE_OR_RETURN(
1530 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1531 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1532 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1533 legacy.has_video = aidl.hasVideo;
1534 legacy.is_streaming = aidl.isStreaming;
1535 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1536 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1537 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1538 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001539 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001540 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1541 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1542 return legacy;
1543}
1544
1545ConversionResult<media::AudioOffloadInfo>
1546legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1547 media::AudioOffloadInfo aidl;
1548 // Version 0.1 fields.
1549 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1550 return unexpected(BAD_VALUE);
1551 }
1552 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1553 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1554 aidl.config.channelMask = VALUE_OR_RETURN(
1555 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1556 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1557 aidl.streamType = VALUE_OR_RETURN(
1558 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1559 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1560 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1561 aidl.hasVideo = legacy.has_video;
1562 aidl.isStreaming = legacy.is_streaming;
1563 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1564 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1565 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1566
1567 // Version 0.2 fields.
1568 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1569 if (legacy.size <
1570 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1571 return unexpected(BAD_VALUE);
1572 }
1573 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001574 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001575 legacy.encapsulation_mode));
1576 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1577 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1578 }
1579 return aidl;
1580}
1581
1582ConversionResult<audio_config_t>
1583aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1584 audio_config_t legacy;
1585 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001586 legacy.channel_mask = VALUE_OR_RETURN(
1587 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001588 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001589 legacy.offload_info = VALUE_OR_RETURN(
1590 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001591 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1592 return legacy;
1593}
1594
1595ConversionResult<media::AudioConfig>
1596legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1597 media::AudioConfig aidl;
1598 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001599 aidl.channelMask = VALUE_OR_RETURN(
1600 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001601 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001602 aidl.offloadInfo = VALUE_OR_RETURN(
1603 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001604 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1605 return aidl;
1606}
1607
1608ConversionResult<audio_config_base_t>
1609aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1610 audio_config_base_t legacy;
1611 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001612 legacy.channel_mask = VALUE_OR_RETURN(
1613 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001614 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1615 return legacy;
1616}
1617
1618ConversionResult<media::AudioConfigBase>
1619legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1620 media::AudioConfigBase aidl;
1621 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001622 aidl.channelMask = VALUE_OR_RETURN(
1623 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001624 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1625 return aidl;
1626}
1627
1628ConversionResult<sp<IMemory>>
1629aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1630 sp<IMemory> legacy;
1631 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1632 return unexpected(BAD_VALUE);
1633 }
1634 return legacy;
1635}
1636
1637ConversionResult<media::SharedFileRegion>
1638legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1639 media::SharedFileRegion aidl;
1640 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1641 return unexpected(BAD_VALUE);
1642 }
1643 return aidl;
1644}
1645
1646ConversionResult<sp<IMemory>>
1647aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1648 sp<IMemory> legacy;
1649 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1650 return unexpected(BAD_VALUE);
1651 }
1652 return legacy;
1653}
1654
1655ConversionResult<std::optional<media::SharedFileRegion>>
1656legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1657 std::optional<media::SharedFileRegion> aidl;
1658 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1659 return unexpected(BAD_VALUE);
1660 }
1661 return aidl;
1662}
1663
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001664ConversionResult<AudioTimestamp>
1665aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1666 AudioTimestamp legacy;
1667 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1668 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1669 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1670 return legacy;
1671}
1672
1673ConversionResult<media::AudioTimestampInternal>
1674legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1675 media::AudioTimestampInternal aidl;
1676 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1677 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1678 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1679 return aidl;
1680}
1681
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001682ConversionResult<audio_uuid_t>
1683aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1684 audio_uuid_t legacy;
1685 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1686 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1687 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1688 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1689 if (aidl.node.size() != std::size(legacy.node)) {
1690 return unexpected(BAD_VALUE);
1691 }
1692 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1693 return legacy;
1694}
1695
1696ConversionResult<media::AudioUuid>
1697legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1698 media::AudioUuid aidl;
1699 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1700 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1701 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1702 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1703 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1704 return aidl;
1705}
1706
1707ConversionResult<effect_descriptor_t>
1708aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1709 effect_descriptor_t legacy;
1710 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1711 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1712 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1713 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1714 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1715 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1716 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1717 RETURN_IF_ERROR(
1718 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1719 return legacy;
1720}
1721
1722ConversionResult<media::EffectDescriptor>
1723legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1724 media::EffectDescriptor aidl;
1725 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1726 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1727 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1728 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1729 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1730 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1731 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1732 aidl.implementor = VALUE_OR_RETURN(
1733 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1734 return aidl;
1735}
1736
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001737ConversionResult<audio_encapsulation_metadata_type_t>
1738aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1739 media::AudioEncapsulationMetadataType aidl) {
1740 switch (aidl) {
1741 case media::AudioEncapsulationMetadataType::NONE:
1742 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1743 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1744 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1745 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1746 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1747 }
1748 return unexpected(BAD_VALUE);
1749}
1750
1751ConversionResult<media::AudioEncapsulationMetadataType>
1752legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1753 audio_encapsulation_metadata_type_t legacy) {
1754 switch (legacy) {
1755 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1756 return media::AudioEncapsulationMetadataType::NONE;
1757 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1758 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1759 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1760 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1761 }
1762 return unexpected(BAD_VALUE);
1763}
1764
1765ConversionResult<uint32_t>
1766aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1767 return convertBitmask<uint32_t,
1768 int32_t,
1769 audio_encapsulation_mode_t,
1770 media::AudioEncapsulationMode>(
1771 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1772 index2enum_index<media::AudioEncapsulationMode>,
1773 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1774}
1775
1776ConversionResult<int32_t>
1777legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1778 return convertBitmask<int32_t,
1779 uint32_t,
1780 media::AudioEncapsulationMode,
1781 audio_encapsulation_mode_t>(
1782 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1783 index2enum_index<audio_encapsulation_mode_t>,
1784 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1785}
1786
1787ConversionResult<uint32_t>
1788aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1789 return convertBitmask<uint32_t,
1790 int32_t,
1791 audio_encapsulation_metadata_type_t,
1792 media::AudioEncapsulationMetadataType>(
1793 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1794 index2enum_index<media::AudioEncapsulationMetadataType>,
1795 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1796}
1797
1798ConversionResult<int32_t>
1799legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1800 return convertBitmask<int32_t,
1801 uint32_t,
1802 media::AudioEncapsulationMetadataType,
1803 audio_encapsulation_metadata_type_t>(
1804 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1805 index2enum_index<audio_encapsulation_metadata_type_t>,
1806 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1807}
1808
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001809} // namespace android