blob: f11f184912182311db33623c3e3d3fc0551d4e37 [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
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800463ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(media::AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700464 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
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800476ConversionResult<media::AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700477 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
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800489ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
490 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, media::AudioGainMode>(
491 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700492 // AudioGainMode is index-based.
493 index2enum_index<media::AudioGainMode>,
494 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800495 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700496}
497
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800498ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_mask_int32_t(audio_gain_mode_t legacy) {
499 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, audio_gain_mode_t>(
500 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700501 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800502 index2enum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700503 // 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));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800521 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700522 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));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800543 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_mask_int32_t(legacy.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700544 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.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800957 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
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-Tsvi0cf92652020-11-23 13:23:00 -0800984 UNION_SET(aidl, unspecified, 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;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001041 switch (type) {
1042 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001043 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001044 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001045 break;
1046 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001047 legacy.device = VALUE_OR_RETURN(
1048 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001049 break;
1050 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001051 legacy.mix = VALUE_OR_RETURN(
1052 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001053 break;
1054 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001055 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1056 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001057 break;
1058 default:
1059 LOG_ALWAYS_FATAL("Shouldn't get here");
1060 }
1061 return legacy;
1062}
1063
1064ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1065 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1066 media::AudioPortConfigExt aidl;
1067
1068 switch (type) {
1069 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001070 UNION_SET(aidl, unspecified, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001071 break;
1072 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001073 UNION_SET(aidl, device,
1074 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001075 break;
1076 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001077 UNION_SET(aidl, mix,
1078 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001079 break;
1080 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001081 UNION_SET(aidl, session,
1082 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001083 break;
1084 default:
1085 LOG_ALWAYS_FATAL("Shouldn't get here");
1086 }
1087 return aidl;
1088}
1089
1090ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1091 const media::AudioPortConfig& aidl) {
1092 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001093 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001094 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1095 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1096 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1097 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1098 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1099 }
1100 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1101 legacy.channel_mask =
1102 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1103 }
1104 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1105 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1106 }
1107 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1108 legacy.gain = VALUE_OR_RETURN(
1109 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1110 }
1111 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1112 legacy.flags = VALUE_OR_RETURN(
1113 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1114 }
1115 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1116 return legacy;
1117}
1118
1119ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1120 const audio_port_config& legacy) {
1121 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001122 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001123 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1124 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1125 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1126 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1127 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1128 }
1129 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1130 aidl.channelMask =
1131 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1132 }
1133 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1134 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1135 }
1136 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1137 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1138 legacy.gain, legacy.role, legacy.type));
1139 }
1140 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1141 aidl.flags = VALUE_OR_RETURN(
1142 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1143 }
1144 aidl.ext =
1145 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1146 return aidl;
1147}
1148
1149ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1150 const media::AudioPatch& aidl) {
1151 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001152 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001153 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1154 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1155 return unexpected(BAD_VALUE);
1156 }
1157 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1158 legacy.sinks[i] =
1159 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1160 }
1161 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1162 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1163 return unexpected(BAD_VALUE);
1164 }
1165 for (size_t i = 0; i < legacy.num_sources; ++i) {
1166 legacy.sources[i] =
1167 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1168 }
1169 return legacy;
1170}
1171
1172ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1173 const struct audio_patch& legacy) {
1174 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001175 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001176
1177 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1178 return unexpected(BAD_VALUE);
1179 }
1180 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1181 aidl.sinks.push_back(
1182 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1183 }
1184 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1185 return unexpected(BAD_VALUE);
1186 }
1187 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1188 aidl.sources.push_back(
1189 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1190 }
1191 return aidl;
1192}
1193
1194ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1195 const media::AudioIoDescriptor& aidl) {
1196 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001197 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001198 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1199 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1200 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1201 legacy->mChannelMask =
1202 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1203 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1204 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1205 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001206 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001207 return legacy;
1208}
1209
1210ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1211 const sp<AudioIoDescriptor>& legacy) {
1212 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001213 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001214 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1215 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1216 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001217 aidl.channelMask = VALUE_OR_RETURN(
1218 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001219 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1220 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1221 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001222 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001223 return aidl;
1224}
1225
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001226ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1227 AudioClient legacy;
1228 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1229 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1230 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1231 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1232 return legacy;
1233}
1234
1235ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1236 media::AudioClient aidl;
1237 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1238 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1239 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1240 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1241 return aidl;
1242}
1243
1244ConversionResult<audio_content_type_t>
1245aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1246 switch (aidl) {
1247 case media::AudioContentType::UNKNOWN:
1248 return AUDIO_CONTENT_TYPE_UNKNOWN;
1249 case media::AudioContentType::SPEECH:
1250 return AUDIO_CONTENT_TYPE_SPEECH;
1251 case media::AudioContentType::MUSIC:
1252 return AUDIO_CONTENT_TYPE_MUSIC;
1253 case media::AudioContentType::MOVIE:
1254 return AUDIO_CONTENT_TYPE_MOVIE;
1255 case media::AudioContentType::SONIFICATION:
1256 return AUDIO_CONTENT_TYPE_SONIFICATION;
1257 }
1258 return unexpected(BAD_VALUE);
1259}
1260
1261ConversionResult<media::AudioContentType>
1262legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1263 switch (legacy) {
1264 case AUDIO_CONTENT_TYPE_UNKNOWN:
1265 return media::AudioContentType::UNKNOWN;
1266 case AUDIO_CONTENT_TYPE_SPEECH:
1267 return media::AudioContentType::SPEECH;
1268 case AUDIO_CONTENT_TYPE_MUSIC:
1269 return media::AudioContentType::MUSIC;
1270 case AUDIO_CONTENT_TYPE_MOVIE:
1271 return media::AudioContentType::MOVIE;
1272 case AUDIO_CONTENT_TYPE_SONIFICATION:
1273 return media::AudioContentType::SONIFICATION;
1274 }
1275 return unexpected(BAD_VALUE);
1276}
1277
1278ConversionResult<audio_usage_t>
1279aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1280 switch (aidl) {
1281 case media::AudioUsage::UNKNOWN:
1282 return AUDIO_USAGE_UNKNOWN;
1283 case media::AudioUsage::MEDIA:
1284 return AUDIO_USAGE_MEDIA;
1285 case media::AudioUsage::VOICE_COMMUNICATION:
1286 return AUDIO_USAGE_VOICE_COMMUNICATION;
1287 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1288 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1289 case media::AudioUsage::ALARM:
1290 return AUDIO_USAGE_ALARM;
1291 case media::AudioUsage::NOTIFICATION:
1292 return AUDIO_USAGE_NOTIFICATION;
1293 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1294 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1295 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1296 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1297 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1298 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1299 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1300 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1301 case media::AudioUsage::NOTIFICATION_EVENT:
1302 return AUDIO_USAGE_NOTIFICATION_EVENT;
1303 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1304 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1305 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1306 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1307 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1308 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1309 case media::AudioUsage::GAME:
1310 return AUDIO_USAGE_GAME;
1311 case media::AudioUsage::VIRTUAL_SOURCE:
1312 return AUDIO_USAGE_VIRTUAL_SOURCE;
1313 case media::AudioUsage::ASSISTANT:
1314 return AUDIO_USAGE_ASSISTANT;
1315 case media::AudioUsage::CALL_ASSISTANT:
1316 return AUDIO_USAGE_CALL_ASSISTANT;
1317 case media::AudioUsage::EMERGENCY:
1318 return AUDIO_USAGE_EMERGENCY;
1319 case media::AudioUsage::SAFETY:
1320 return AUDIO_USAGE_SAFETY;
1321 case media::AudioUsage::VEHICLE_STATUS:
1322 return AUDIO_USAGE_VEHICLE_STATUS;
1323 case media::AudioUsage::ANNOUNCEMENT:
1324 return AUDIO_USAGE_ANNOUNCEMENT;
1325 }
1326 return unexpected(BAD_VALUE);
1327}
1328
1329ConversionResult<media::AudioUsage>
1330legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1331 switch (legacy) {
1332 case AUDIO_USAGE_UNKNOWN:
1333 return media::AudioUsage::UNKNOWN;
1334 case AUDIO_USAGE_MEDIA:
1335 return media::AudioUsage::MEDIA;
1336 case AUDIO_USAGE_VOICE_COMMUNICATION:
1337 return media::AudioUsage::VOICE_COMMUNICATION;
1338 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1339 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1340 case AUDIO_USAGE_ALARM:
1341 return media::AudioUsage::ALARM;
1342 case AUDIO_USAGE_NOTIFICATION:
1343 return media::AudioUsage::NOTIFICATION;
1344 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1345 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1346 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1347 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1348 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1349 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1350 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1351 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1352 case AUDIO_USAGE_NOTIFICATION_EVENT:
1353 return media::AudioUsage::NOTIFICATION_EVENT;
1354 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1355 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1356 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1357 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1358 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1359 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1360 case AUDIO_USAGE_GAME:
1361 return media::AudioUsage::GAME;
1362 case AUDIO_USAGE_VIRTUAL_SOURCE:
1363 return media::AudioUsage::VIRTUAL_SOURCE;
1364 case AUDIO_USAGE_ASSISTANT:
1365 return media::AudioUsage::ASSISTANT;
1366 case AUDIO_USAGE_CALL_ASSISTANT:
1367 return media::AudioUsage::CALL_ASSISTANT;
1368 case AUDIO_USAGE_EMERGENCY:
1369 return media::AudioUsage::EMERGENCY;
1370 case AUDIO_USAGE_SAFETY:
1371 return media::AudioUsage::SAFETY;
1372 case AUDIO_USAGE_VEHICLE_STATUS:
1373 return media::AudioUsage::VEHICLE_STATUS;
1374 case AUDIO_USAGE_ANNOUNCEMENT:
1375 return media::AudioUsage::ANNOUNCEMENT;
1376 }
1377 return unexpected(BAD_VALUE);
1378}
1379
1380ConversionResult<audio_flags_mask_t>
1381aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1382 switch (aidl) {
1383 case media::AudioFlag::AUDIBILITY_ENFORCED:
1384 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1385 case media::AudioFlag::SECURE:
1386 return AUDIO_FLAG_SECURE;
1387 case media::AudioFlag::SCO:
1388 return AUDIO_FLAG_SCO;
1389 case media::AudioFlag::BEACON:
1390 return AUDIO_FLAG_BEACON;
1391 case media::AudioFlag::HW_AV_SYNC:
1392 return AUDIO_FLAG_HW_AV_SYNC;
1393 case media::AudioFlag::HW_HOTWORD:
1394 return AUDIO_FLAG_HW_HOTWORD;
1395 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1396 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1397 case media::AudioFlag::BYPASS_MUTE:
1398 return AUDIO_FLAG_BYPASS_MUTE;
1399 case media::AudioFlag::LOW_LATENCY:
1400 return AUDIO_FLAG_LOW_LATENCY;
1401 case media::AudioFlag::DEEP_BUFFER:
1402 return AUDIO_FLAG_DEEP_BUFFER;
1403 case media::AudioFlag::NO_MEDIA_PROJECTION:
1404 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1405 case media::AudioFlag::MUTE_HAPTIC:
1406 return AUDIO_FLAG_MUTE_HAPTIC;
1407 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1408 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1409 case media::AudioFlag::CAPTURE_PRIVATE:
1410 return AUDIO_FLAG_CAPTURE_PRIVATE;
1411 }
1412 return unexpected(BAD_VALUE);
1413}
1414
1415ConversionResult<media::AudioFlag>
1416legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1417 switch (legacy) {
1418 case AUDIO_FLAG_NONE:
1419 return unexpected(BAD_VALUE);
1420 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1421 return media::AudioFlag::AUDIBILITY_ENFORCED;
1422 case AUDIO_FLAG_SECURE:
1423 return media::AudioFlag::SECURE;
1424 case AUDIO_FLAG_SCO:
1425 return media::AudioFlag::SCO;
1426 case AUDIO_FLAG_BEACON:
1427 return media::AudioFlag::BEACON;
1428 case AUDIO_FLAG_HW_AV_SYNC:
1429 return media::AudioFlag::HW_AV_SYNC;
1430 case AUDIO_FLAG_HW_HOTWORD:
1431 return media::AudioFlag::HW_HOTWORD;
1432 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1433 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1434 case AUDIO_FLAG_BYPASS_MUTE:
1435 return media::AudioFlag::BYPASS_MUTE;
1436 case AUDIO_FLAG_LOW_LATENCY:
1437 return media::AudioFlag::LOW_LATENCY;
1438 case AUDIO_FLAG_DEEP_BUFFER:
1439 return media::AudioFlag::DEEP_BUFFER;
1440 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1441 return media::AudioFlag::NO_MEDIA_PROJECTION;
1442 case AUDIO_FLAG_MUTE_HAPTIC:
1443 return media::AudioFlag::MUTE_HAPTIC;
1444 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1445 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1446 case AUDIO_FLAG_CAPTURE_PRIVATE:
1447 return media::AudioFlag::CAPTURE_PRIVATE;
1448 }
1449 return unexpected(BAD_VALUE);
1450}
1451
1452ConversionResult<audio_flags_mask_t>
1453aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1454 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1455 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1456 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1457}
1458
1459ConversionResult<int32_t>
1460legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1461 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001462 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1463 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001464 enumToMask_index<int32_t, media::AudioFlag>);
1465}
1466
1467ConversionResult<audio_attributes_t>
1468aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1469 audio_attributes_t legacy;
1470 legacy.content_type = VALUE_OR_RETURN(
1471 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1472 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1473 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1474 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1475 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1476 return legacy;
1477}
1478
1479ConversionResult<media::AudioAttributesInternal>
1480legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1481 media::AudioAttributesInternal aidl;
1482 aidl.contentType = VALUE_OR_RETURN(
1483 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1484 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1485 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1486 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1487 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1488 return aidl;
1489}
1490
1491ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001492aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001493 switch (aidl) {
1494 case media::AudioEncapsulationMode::NONE:
1495 return AUDIO_ENCAPSULATION_MODE_NONE;
1496 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1497 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1498 case media::AudioEncapsulationMode::HANDLE:
1499 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1500 }
1501 return unexpected(BAD_VALUE);
1502}
1503
1504ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001505legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001506 switch (legacy) {
1507 case AUDIO_ENCAPSULATION_MODE_NONE:
1508 return media::AudioEncapsulationMode::NONE;
1509 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1510 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1511 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1512 return media::AudioEncapsulationMode::HANDLE;
1513 }
1514 return unexpected(BAD_VALUE);
1515}
1516
1517ConversionResult<audio_offload_info_t>
1518aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1519 audio_offload_info_t legacy;
1520 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1521 legacy.size = sizeof(audio_offload_info_t);
1522 audio_config_base_t config = VALUE_OR_RETURN(
1523 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1524 legacy.sample_rate = config.sample_rate;
1525 legacy.channel_mask = config.channel_mask;
1526 legacy.format = config.format;
1527 legacy.stream_type = VALUE_OR_RETURN(
1528 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1529 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1530 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1531 legacy.has_video = aidl.hasVideo;
1532 legacy.is_streaming = aidl.isStreaming;
1533 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1534 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1535 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1536 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001537 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001538 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1539 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1540 return legacy;
1541}
1542
1543ConversionResult<media::AudioOffloadInfo>
1544legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1545 media::AudioOffloadInfo aidl;
1546 // Version 0.1 fields.
1547 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1548 return unexpected(BAD_VALUE);
1549 }
1550 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1551 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1552 aidl.config.channelMask = VALUE_OR_RETURN(
1553 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1554 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1555 aidl.streamType = VALUE_OR_RETURN(
1556 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1557 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1558 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1559 aidl.hasVideo = legacy.has_video;
1560 aidl.isStreaming = legacy.is_streaming;
1561 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1562 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1563 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1564
1565 // Version 0.2 fields.
1566 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1567 if (legacy.size <
1568 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1569 return unexpected(BAD_VALUE);
1570 }
1571 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001572 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001573 legacy.encapsulation_mode));
1574 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1575 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1576 }
1577 return aidl;
1578}
1579
1580ConversionResult<audio_config_t>
1581aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1582 audio_config_t legacy;
1583 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001584 legacy.channel_mask = VALUE_OR_RETURN(
1585 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001586 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001587 legacy.offload_info = VALUE_OR_RETURN(
1588 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001589 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1590 return legacy;
1591}
1592
1593ConversionResult<media::AudioConfig>
1594legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1595 media::AudioConfig aidl;
1596 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001597 aidl.channelMask = VALUE_OR_RETURN(
1598 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001599 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001600 aidl.offloadInfo = VALUE_OR_RETURN(
1601 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001602 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1603 return aidl;
1604}
1605
1606ConversionResult<audio_config_base_t>
1607aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1608 audio_config_base_t legacy;
1609 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001610 legacy.channel_mask = VALUE_OR_RETURN(
1611 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001612 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1613 return legacy;
1614}
1615
1616ConversionResult<media::AudioConfigBase>
1617legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1618 media::AudioConfigBase aidl;
1619 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001620 aidl.channelMask = VALUE_OR_RETURN(
1621 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001622 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1623 return aidl;
1624}
1625
1626ConversionResult<sp<IMemory>>
1627aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1628 sp<IMemory> legacy;
1629 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1630 return unexpected(BAD_VALUE);
1631 }
1632 return legacy;
1633}
1634
1635ConversionResult<media::SharedFileRegion>
1636legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1637 media::SharedFileRegion aidl;
1638 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1639 return unexpected(BAD_VALUE);
1640 }
1641 return aidl;
1642}
1643
1644ConversionResult<sp<IMemory>>
1645aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1646 sp<IMemory> legacy;
1647 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1648 return unexpected(BAD_VALUE);
1649 }
1650 return legacy;
1651}
1652
1653ConversionResult<std::optional<media::SharedFileRegion>>
1654legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1655 std::optional<media::SharedFileRegion> aidl;
1656 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1657 return unexpected(BAD_VALUE);
1658 }
1659 return aidl;
1660}
1661
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001662ConversionResult<AudioTimestamp>
1663aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1664 AudioTimestamp legacy;
1665 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1666 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1667 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1668 return legacy;
1669}
1670
1671ConversionResult<media::AudioTimestampInternal>
1672legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1673 media::AudioTimestampInternal aidl;
1674 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1675 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1676 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1677 return aidl;
1678}
1679
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001680ConversionResult<audio_uuid_t>
1681aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1682 audio_uuid_t legacy;
1683 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1684 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1685 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1686 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1687 if (aidl.node.size() != std::size(legacy.node)) {
1688 return unexpected(BAD_VALUE);
1689 }
1690 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1691 return legacy;
1692}
1693
1694ConversionResult<media::AudioUuid>
1695legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1696 media::AudioUuid aidl;
1697 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1698 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1699 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1700 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1701 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1702 return aidl;
1703}
1704
1705ConversionResult<effect_descriptor_t>
1706aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1707 effect_descriptor_t legacy;
1708 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1709 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1710 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1711 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1712 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1713 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1714 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1715 RETURN_IF_ERROR(
1716 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1717 return legacy;
1718}
1719
1720ConversionResult<media::EffectDescriptor>
1721legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1722 media::EffectDescriptor aidl;
1723 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1724 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1725 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1726 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1727 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1728 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1729 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1730 aidl.implementor = VALUE_OR_RETURN(
1731 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1732 return aidl;
1733}
1734
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001735ConversionResult<audio_encapsulation_metadata_type_t>
1736aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1737 media::AudioEncapsulationMetadataType aidl) {
1738 switch (aidl) {
1739 case media::AudioEncapsulationMetadataType::NONE:
1740 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1741 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1742 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1743 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1744 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1745 }
1746 return unexpected(BAD_VALUE);
1747}
1748
1749ConversionResult<media::AudioEncapsulationMetadataType>
1750legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1751 audio_encapsulation_metadata_type_t legacy) {
1752 switch (legacy) {
1753 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1754 return media::AudioEncapsulationMetadataType::NONE;
1755 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1756 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1757 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1758 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1759 }
1760 return unexpected(BAD_VALUE);
1761}
1762
1763ConversionResult<uint32_t>
1764aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1765 return convertBitmask<uint32_t,
1766 int32_t,
1767 audio_encapsulation_mode_t,
1768 media::AudioEncapsulationMode>(
1769 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1770 index2enum_index<media::AudioEncapsulationMode>,
1771 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1772}
1773
1774ConversionResult<int32_t>
1775legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1776 return convertBitmask<int32_t,
1777 uint32_t,
1778 media::AudioEncapsulationMode,
1779 audio_encapsulation_mode_t>(
1780 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1781 index2enum_index<audio_encapsulation_mode_t>,
1782 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1783}
1784
1785ConversionResult<uint32_t>
1786aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1787 return convertBitmask<uint32_t,
1788 int32_t,
1789 audio_encapsulation_metadata_type_t,
1790 media::AudioEncapsulationMetadataType>(
1791 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1792 index2enum_index<media::AudioEncapsulationMetadataType>,
1793 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1794}
1795
1796ConversionResult<int32_t>
1797legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1798 return convertBitmask<int32_t,
1799 uint32_t,
1800 media::AudioEncapsulationMetadataType,
1801 audio_encapsulation_metadata_type_t>(
1802 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1803 index2enum_index<audio_encapsulation_metadata_type_t>,
1804 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1805}
1806
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001807ConversionResult<audio_mix_latency_class_t>
1808aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(
1809 media::AudioMixLatencyClass aidl) {
1810 switch (aidl) {
1811 case media::AudioMixLatencyClass::LOW:
1812 return AUDIO_LATENCY_LOW;
1813 case media::AudioMixLatencyClass::NORMAL:
1814 return AUDIO_LATENCY_NORMAL;
1815 }
1816 return unexpected(BAD_VALUE);
1817}
1818
1819ConversionResult<media::AudioMixLatencyClass>
1820legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(
1821 audio_mix_latency_class_t legacy) {
1822 switch (legacy) {
1823 case AUDIO_LATENCY_LOW:
1824 return media::AudioMixLatencyClass::LOW;
1825 case AUDIO_LATENCY_NORMAL:
1826 return media::AudioMixLatencyClass::NORMAL;
1827 }
1828 return unexpected(BAD_VALUE);
1829}
1830
1831ConversionResult<audio_port_device_ext>
1832aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const media::AudioPortDeviceExt& aidl) {
1833 audio_port_device_ext legacy;
1834 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1835 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.device.type));
1836 RETURN_IF_ERROR(
1837 aidl2legacy_string(aidl.device.address, legacy.address, sizeof(legacy.address)));
1838 legacy.encapsulation_modes = VALUE_OR_RETURN(
1839 aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
1840 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
1841 aidl2legacy_AudioEncapsulationMetadataType_mask(aidl.encapsulationMetadataTypes));
1842 return legacy;
1843}
1844
1845ConversionResult<media::AudioPortDeviceExt>
1846legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext& legacy) {
1847 media::AudioPortDeviceExt aidl;
1848 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1849 aidl.device.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
1850 aidl.device.address = VALUE_OR_RETURN(
1851 legacy2aidl_string(legacy.address, sizeof(legacy.address)));
1852 aidl.encapsulationModes = VALUE_OR_RETURN(
1853 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
1854 aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
1855 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
1856 return aidl;
1857}
1858
1859ConversionResult<audio_port_mix_ext>
1860aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const media::AudioPortMixExt& aidl) {
1861 audio_port_mix_ext legacy;
1862 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1863 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
1864 legacy.latency_class = VALUE_OR_RETURN(
1865 aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(aidl.latencyClass));
1866 return legacy;
1867}
1868
1869ConversionResult<media::AudioPortMixExt>
1870legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy) {
1871 media::AudioPortMixExt aidl;
1872 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1873 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1874 aidl.latencyClass = VALUE_OR_RETURN(
1875 legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(legacy.latency_class));
1876 return aidl;
1877}
1878
1879ConversionResult<audio_port_session_ext>
1880aidl2legacy_AudioPortSessionExt_audio_port_session_ext(const media::AudioPortSessionExt& aidl) {
1881 audio_port_session_ext legacy;
1882 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
1883 return legacy;
1884}
1885
1886ConversionResult<media::AudioPortSessionExt>
1887legacy2aidl_audio_port_session_ext_AudioPortSessionExt(const audio_port_session_ext& legacy) {
1888 media::AudioPortSessionExt aidl;
1889 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
1890 return aidl;
1891}
1892
1893// This type is unnamed in the original definition, thus we name it here.
1894using audio_port_v7_ext = decltype(audio_port_v7::ext);
1895
1896ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt(
1897 const media::AudioPortExt& aidl, media::AudioPortType type) {
1898 audio_port_v7_ext legacy;
1899 switch (type) {
1900 case media::AudioPortType::NONE:
1901 // Just verify that the union is empty.
1902 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
1903 break;
1904 case media::AudioPortType::DEVICE:
1905 legacy.device = VALUE_OR_RETURN(
1906 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
1907 VALUE_OR_RETURN(UNION_GET(aidl, device))));
1908 break;
1909 case media::AudioPortType::MIX:
1910 legacy.mix = VALUE_OR_RETURN(
1911 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
1912 VALUE_OR_RETURN(UNION_GET(aidl, mix))));
1913 break;
1914 case media::AudioPortType::SESSION:
1915 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortSessionExt_audio_port_session_ext(
1916 VALUE_OR_RETURN(UNION_GET(aidl, session))));
1917 break;
1918 default:
1919 LOG_ALWAYS_FATAL("Shouldn't get here");
1920 }
1921 return legacy;
1922}
1923
1924ConversionResult<media::AudioPortExt> legacy2aidl_AudioPortExt(
1925 const audio_port_v7_ext& legacy, audio_port_type_t type) {
1926 media::AudioPortExt aidl;
1927 switch (type) {
1928 case AUDIO_PORT_TYPE_NONE:
1929 UNION_SET(aidl, unspecified, false);
1930 break;
1931 case AUDIO_PORT_TYPE_DEVICE:
1932 UNION_SET(aidl, device,
1933 VALUE_OR_RETURN(
1934 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device)));
1935 break;
1936 case AUDIO_PORT_TYPE_MIX:
1937 UNION_SET(aidl, mix,
1938 VALUE_OR_RETURN(legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix)));
1939 break;
1940 case AUDIO_PORT_TYPE_SESSION:
1941 UNION_SET(aidl, session,
1942 VALUE_OR_RETURN(legacy2aidl_audio_port_session_ext_AudioPortSessionExt(
1943 legacy.session)));
1944 break;
1945 default:
1946 LOG_ALWAYS_FATAL("Shouldn't get here");
1947 }
1948 return aidl;
1949}
1950
1951ConversionResult<audio_profile>
1952aidl2legacy_AudioProfile_audio_profile(const media::AudioProfile& aidl) {
1953 audio_profile legacy;
1954 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1955
1956 if (aidl.samplingRates.size() > std::size(legacy.sample_rates)) {
1957 return unexpected(BAD_VALUE);
1958 }
1959 RETURN_IF_ERROR(
1960 convertRange(aidl.samplingRates.begin(), aidl.samplingRates.end(), legacy.sample_rates,
1961 convertIntegral<int32_t, unsigned int>));
1962 legacy.num_sample_rates = aidl.samplingRates.size();
1963
1964 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
1965 return unexpected(BAD_VALUE);
1966 }
1967 RETURN_IF_ERROR(
1968 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
1969 aidl2legacy_int32_t_audio_channel_mask_t));
1970 legacy.num_channel_masks = aidl.channelMasks.size();
1971 return legacy;
1972}
1973
1974ConversionResult<media::AudioProfile>
1975legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy) {
1976 media::AudioProfile aidl;
1977 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1978
1979 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
1980 return unexpected(BAD_VALUE);
1981 }
1982 RETURN_IF_ERROR(
1983 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
1984 std::back_inserter(aidl.samplingRates),
1985 convertIntegral<unsigned int, int32_t>));
1986
1987 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
1988 return unexpected(BAD_VALUE);
1989 }
1990 RETURN_IF_ERROR(
1991 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
1992 std::back_inserter(aidl.channelMasks),
1993 legacy2aidl_audio_channel_mask_t_int32_t));
1994 return aidl;
1995}
1996
1997ConversionResult<audio_gain>
1998aidl2legacy_AudioGain_audio_gain(const media::AudioGain& aidl) {
1999 audio_gain legacy;
2000 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
2001 legacy.channel_mask = VALUE_OR_RETURN(
2002 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
2003 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2004 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2005 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2006 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2007 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2008 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2009 return legacy;
2010}
2011
2012ConversionResult<media::AudioGain>
2013legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy) {
2014 media::AudioGain aidl;
2015 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_mask_int32_t(legacy.mode));
2016 aidl.channelMask = VALUE_OR_RETURN(
2017 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
2018 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2019 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2020 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2021 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2022 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2023 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2024 return aidl;
2025}
2026
2027ConversionResult<audio_port_v7>
2028aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2029 audio_port_v7 legacy;
2030 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2031 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
2032 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
2033 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2034
2035 if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2036 return unexpected(BAD_VALUE);
2037 }
2038 RETURN_IF_ERROR(convertRange(aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
2039 aidl2legacy_AudioProfile_audio_profile));
2040 legacy.num_audio_profiles = aidl.profiles.size();
2041
2042 if (aidl.gains.size() > std::size(legacy.gains)) {
2043 return unexpected(BAD_VALUE);
2044 }
2045 RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2046 aidl2legacy_AudioGain_audio_gain));
2047 legacy.num_gains = aidl.gains.size();
2048
2049 legacy.active_config = VALUE_OR_RETURN(
2050 aidl2legacy_AudioPortConfig_audio_port_config(aidl.activeConfig));
2051 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortExt(aidl.ext, aidl.type));
2052 return legacy;
2053}
2054
2055ConversionResult<media::AudioPort>
2056legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2057 media::AudioPort aidl;
2058 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2059 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2060 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2061 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2062
2063 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2064 return unexpected(BAD_VALUE);
2065 }
2066 RETURN_IF_ERROR(
2067 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2068 std::back_inserter(aidl.profiles),
2069 legacy2aidl_audio_profile_AudioProfile));
2070
2071 if (legacy.num_gains > std::size(legacy.gains)) {
2072 return unexpected(BAD_VALUE);
2073 }
2074 RETURN_IF_ERROR(
2075 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2076 std::back_inserter(aidl.gains),
2077 legacy2aidl_audio_gain_AudioGain));
2078
2079 aidl.activeConfig = VALUE_OR_RETURN(
2080 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
2081 aidl.ext = VALUE_OR_RETURN(legacy2aidl_AudioPortExt(legacy.ext, legacy.type));
2082 return aidl;
2083}
2084
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07002085} // namespace android