blob: 496dfc722c06415fbaff89bda692a5e2194ea617 [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
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -0800239ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
240 return convertReinterpret<audio_hw_sync_t>(aidl);
241}
242
243ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
244 return convertReinterpret<int32_t>(legacy);
245}
246
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800247ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
248 return convertReinterpret<pid_t>(aidl);
249}
250
251ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
252 return convertReinterpret<int32_t>(legacy);
253}
254
255ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
256 return convertReinterpret<uid_t>(aidl);
257}
258
259ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
260 return convertReinterpret<int32_t>(legacy);
261}
262
263ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
264 return String16(aidl.data(), aidl.size());
265}
266
267ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
268 return std::string(String8(legacy).c_str());
269}
270
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800271ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
272 return String8(aidl.data(), aidl.size());
273}
274
275ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
276 return std::string(legacy.c_str());
277}
278
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700279// The legacy enum is unnamed. Thus, we use int.
280ConversionResult<int> aidl2legacy_AudioPortConfigType(media::AudioPortConfigType aidl) {
281 switch (aidl) {
282 case media::AudioPortConfigType::SAMPLE_RATE:
283 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
284 case media::AudioPortConfigType::CHANNEL_MASK:
285 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
286 case media::AudioPortConfigType::FORMAT:
287 return AUDIO_PORT_CONFIG_FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800288 case media::AudioPortConfigType::GAIN:
289 return AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700290 case media::AudioPortConfigType::FLAGS:
291 return AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700292 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800293 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700294}
295
296// The legacy enum is unnamed. Thus, we use int.
297ConversionResult<media::AudioPortConfigType> legacy2aidl_AudioPortConfigType(int legacy) {
298 switch (legacy) {
299 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
300 return media::AudioPortConfigType::SAMPLE_RATE;
301 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
302 return media::AudioPortConfigType::CHANNEL_MASK;
303 case AUDIO_PORT_CONFIG_FORMAT:
304 return media::AudioPortConfigType::FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800305 case AUDIO_PORT_CONFIG_GAIN:
306 return media::AudioPortConfigType::GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700307 case AUDIO_PORT_CONFIG_FLAGS:
308 return media::AudioPortConfigType::FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700309 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800310 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700311}
312
313ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
314 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
315 aidl, aidl2legacy_AudioPortConfigType,
316 // AudioPortConfigType enum is index-based.
317 index2enum_index<media::AudioPortConfigType>,
318 // AUDIO_PORT_CONFIG_* flags are mask-based.
319 enumToMask_bitmask<unsigned int, int>);
320}
321
322ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
323 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
324 legacy, legacy2aidl_AudioPortConfigType,
325 // AUDIO_PORT_CONFIG_* flags are mask-based.
326 index2enum_bitmask<unsigned>,
327 // AudioPortConfigType enum is index-based.
328 enumToMask_index<int32_t, media::AudioPortConfigType>);
329}
330
331ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
332 // TODO(ytai): should we convert bit-by-bit?
333 // One problem here is that the representation is both opaque and is different based on the
334 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
335 return convertReinterpret<audio_channel_mask_t>(aidl);
336}
337
338ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
339 // TODO(ytai): should we convert bit-by-bit?
340 // One problem here is that the representation is both opaque and is different based on the
341 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
342 return convertReinterpret<int32_t>(legacy);
343}
344
345ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
346 media::AudioIoConfigEvent aidl) {
347 switch (aidl) {
348 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
349 return AUDIO_OUTPUT_REGISTERED;
350 case media::AudioIoConfigEvent::OUTPUT_OPENED:
351 return AUDIO_OUTPUT_OPENED;
352 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
353 return AUDIO_OUTPUT_CLOSED;
354 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
355 return AUDIO_OUTPUT_CONFIG_CHANGED;
356 case media::AudioIoConfigEvent::INPUT_REGISTERED:
357 return AUDIO_INPUT_REGISTERED;
358 case media::AudioIoConfigEvent::INPUT_OPENED:
359 return AUDIO_INPUT_OPENED;
360 case media::AudioIoConfigEvent::INPUT_CLOSED:
361 return AUDIO_INPUT_CLOSED;
362 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
363 return AUDIO_INPUT_CONFIG_CHANGED;
364 case media::AudioIoConfigEvent::CLIENT_STARTED:
365 return AUDIO_CLIENT_STARTED;
366 default:
367 return unexpected(BAD_VALUE);
368 }
369}
370
371ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
372 audio_io_config_event legacy) {
373 switch (legacy) {
374 case AUDIO_OUTPUT_REGISTERED:
375 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
376 case AUDIO_OUTPUT_OPENED:
377 return media::AudioIoConfigEvent::OUTPUT_OPENED;
378 case AUDIO_OUTPUT_CLOSED:
379 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
380 case AUDIO_OUTPUT_CONFIG_CHANGED:
381 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
382 case AUDIO_INPUT_REGISTERED:
383 return media::AudioIoConfigEvent::INPUT_REGISTERED;
384 case AUDIO_INPUT_OPENED:
385 return media::AudioIoConfigEvent::INPUT_OPENED;
386 case AUDIO_INPUT_CLOSED:
387 return media::AudioIoConfigEvent::INPUT_CLOSED;
388 case AUDIO_INPUT_CONFIG_CHANGED:
389 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
390 case AUDIO_CLIENT_STARTED:
391 return media::AudioIoConfigEvent::CLIENT_STARTED;
392 default:
393 return unexpected(BAD_VALUE);
394 }
395}
396
397ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
398 media::AudioPortRole aidl) {
399 switch (aidl) {
400 case media::AudioPortRole::NONE:
401 return AUDIO_PORT_ROLE_NONE;
402 case media::AudioPortRole::SOURCE:
403 return AUDIO_PORT_ROLE_SOURCE;
404 case media::AudioPortRole::SINK:
405 return AUDIO_PORT_ROLE_SINK;
406 default:
407 return unexpected(BAD_VALUE);
408 }
409}
410
411ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
412 audio_port_role_t legacy) {
413 switch (legacy) {
414 case AUDIO_PORT_ROLE_NONE:
415 return media::AudioPortRole::NONE;
416 case AUDIO_PORT_ROLE_SOURCE:
417 return media::AudioPortRole::SOURCE;
418 case AUDIO_PORT_ROLE_SINK:
419 return media::AudioPortRole::SINK;
420 default:
421 return unexpected(BAD_VALUE);
422 }
423}
424
425ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
426 media::AudioPortType aidl) {
427 switch (aidl) {
428 case media::AudioPortType::NONE:
429 return AUDIO_PORT_TYPE_NONE;
430 case media::AudioPortType::DEVICE:
431 return AUDIO_PORT_TYPE_DEVICE;
432 case media::AudioPortType::MIX:
433 return AUDIO_PORT_TYPE_MIX;
434 case media::AudioPortType::SESSION:
435 return AUDIO_PORT_TYPE_SESSION;
436 default:
437 return unexpected(BAD_VALUE);
438 }
439}
440
441ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
442 audio_port_type_t legacy) {
443 switch (legacy) {
444 case AUDIO_PORT_TYPE_NONE:
445 return media::AudioPortType::NONE;
446 case AUDIO_PORT_TYPE_DEVICE:
447 return media::AudioPortType::DEVICE;
448 case AUDIO_PORT_TYPE_MIX:
449 return media::AudioPortType::MIX;
450 case AUDIO_PORT_TYPE_SESSION:
451 return media::AudioPortType::SESSION;
452 default:
453 return unexpected(BAD_VALUE);
454 }
455}
456
457ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
458 media::audio::common::AudioFormat aidl) {
459 // This relies on AudioFormat being kept in sync with audio_format_t.
460 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
461 return static_cast<audio_format_t>(aidl);
462}
463
464ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
465 audio_format_t legacy) {
466 // This relies on AudioFormat being kept in sync with audio_format_t.
467 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
468 return static_cast<media::audio::common::AudioFormat>(legacy);
469}
470
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800471ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(media::AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700472 switch (aidl) {
473 case media::AudioGainMode::JOINT:
474 return AUDIO_GAIN_MODE_JOINT;
475 case media::AudioGainMode::CHANNELS:
476 return AUDIO_GAIN_MODE_CHANNELS;
477 case media::AudioGainMode::RAMP:
478 return AUDIO_GAIN_MODE_RAMP;
479 default:
480 return unexpected(BAD_VALUE);
481 }
482}
483
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800484ConversionResult<media::AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700485 switch (legacy) {
486 case AUDIO_GAIN_MODE_JOINT:
487 return media::AudioGainMode::JOINT;
488 case AUDIO_GAIN_MODE_CHANNELS:
489 return media::AudioGainMode::CHANNELS;
490 case AUDIO_GAIN_MODE_RAMP:
491 return media::AudioGainMode::RAMP;
492 default:
493 return unexpected(BAD_VALUE);
494 }
495}
496
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800497ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
498 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, media::AudioGainMode>(
499 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700500 // AudioGainMode is index-based.
501 index2enum_index<media::AudioGainMode>,
502 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800503 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700504}
505
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800506ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_mask_int32_t(audio_gain_mode_t legacy) {
507 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, audio_gain_mode_t>(
508 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700509 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800510 index2enum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700511 // AudioGainMode is index-based.
512 enumToMask_index<int32_t, media::AudioGainMode>);
513}
514
515ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
516 // TODO(ytai): bitfield?
517 return convertReinterpret<audio_devices_t>(aidl);
518}
519
520ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
521 // TODO(ytai): bitfield?
522 return convertReinterpret<int32_t>(legacy);
523}
524
525ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
526 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
527 audio_gain_config legacy;
528 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800529 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700530 legacy.channel_mask =
531 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
532 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
533 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
534 size_t numValues = isJoint ? 1
535 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
536 : audio_channel_count_from_out_mask(legacy.channel_mask);
537 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
538 return unexpected(BAD_VALUE);
539 }
540 for (size_t i = 0; i < numValues; ++i) {
541 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
542 }
543 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
544 return legacy;
545}
546
547ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
548 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
549 media::AudioGainConfig aidl;
550 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800551 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_mask_int32_t(legacy.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700552 aidl.channelMask =
553 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
554 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
555 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
556 size_t numValues = isJoint ? 1
557 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
558 : audio_channel_count_from_out_mask(legacy.channel_mask);
559 aidl.values.resize(numValues);
560 for (size_t i = 0; i < numValues; ++i) {
561 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
562 }
563 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
564 return aidl;
565}
566
567ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
568 media::AudioInputFlags aidl) {
569 switch (aidl) {
570 case media::AudioInputFlags::FAST:
571 return AUDIO_INPUT_FLAG_FAST;
572 case media::AudioInputFlags::HW_HOTWORD:
573 return AUDIO_INPUT_FLAG_HW_HOTWORD;
574 case media::AudioInputFlags::RAW:
575 return AUDIO_INPUT_FLAG_RAW;
576 case media::AudioInputFlags::SYNC:
577 return AUDIO_INPUT_FLAG_SYNC;
578 case media::AudioInputFlags::MMAP_NOIRQ:
579 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
580 case media::AudioInputFlags::VOIP_TX:
581 return AUDIO_INPUT_FLAG_VOIP_TX;
582 case media::AudioInputFlags::HW_AV_SYNC:
583 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
584 case media::AudioInputFlags::DIRECT:
585 return AUDIO_INPUT_FLAG_DIRECT;
586 default:
587 return unexpected(BAD_VALUE);
588 }
589}
590
591ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
592 audio_input_flags_t legacy) {
593 switch (legacy) {
594 case AUDIO_INPUT_FLAG_FAST:
595 return media::AudioInputFlags::FAST;
596 case AUDIO_INPUT_FLAG_HW_HOTWORD:
597 return media::AudioInputFlags::HW_HOTWORD;
598 case AUDIO_INPUT_FLAG_RAW:
599 return media::AudioInputFlags::RAW;
600 case AUDIO_INPUT_FLAG_SYNC:
601 return media::AudioInputFlags::SYNC;
602 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
603 return media::AudioInputFlags::MMAP_NOIRQ;
604 case AUDIO_INPUT_FLAG_VOIP_TX:
605 return media::AudioInputFlags::VOIP_TX;
606 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
607 return media::AudioInputFlags::HW_AV_SYNC;
608 case AUDIO_INPUT_FLAG_DIRECT:
609 return media::AudioInputFlags::DIRECT;
610 default:
611 return unexpected(BAD_VALUE);
612 }
613}
614
615ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
616 media::AudioOutputFlags aidl) {
617 switch (aidl) {
618 case media::AudioOutputFlags::DIRECT:
619 return AUDIO_OUTPUT_FLAG_DIRECT;
620 case media::AudioOutputFlags::PRIMARY:
621 return AUDIO_OUTPUT_FLAG_PRIMARY;
622 case media::AudioOutputFlags::FAST:
623 return AUDIO_OUTPUT_FLAG_FAST;
624 case media::AudioOutputFlags::DEEP_BUFFER:
625 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
626 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
627 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
628 case media::AudioOutputFlags::NON_BLOCKING:
629 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
630 case media::AudioOutputFlags::HW_AV_SYNC:
631 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
632 case media::AudioOutputFlags::TTS:
633 return AUDIO_OUTPUT_FLAG_TTS;
634 case media::AudioOutputFlags::RAW:
635 return AUDIO_OUTPUT_FLAG_RAW;
636 case media::AudioOutputFlags::SYNC:
637 return AUDIO_OUTPUT_FLAG_SYNC;
638 case media::AudioOutputFlags::IEC958_NONAUDIO:
639 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
640 case media::AudioOutputFlags::DIRECT_PCM:
641 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
642 case media::AudioOutputFlags::MMAP_NOIRQ:
643 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
644 case media::AudioOutputFlags::VOIP_RX:
645 return AUDIO_OUTPUT_FLAG_VOIP_RX;
646 case media::AudioOutputFlags::INCALL_MUSIC:
647 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
648 default:
649 return unexpected(BAD_VALUE);
650 }
651}
652
653ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
654 audio_output_flags_t legacy) {
655 switch (legacy) {
656 case AUDIO_OUTPUT_FLAG_DIRECT:
657 return media::AudioOutputFlags::DIRECT;
658 case AUDIO_OUTPUT_FLAG_PRIMARY:
659 return media::AudioOutputFlags::PRIMARY;
660 case AUDIO_OUTPUT_FLAG_FAST:
661 return media::AudioOutputFlags::FAST;
662 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
663 return media::AudioOutputFlags::DEEP_BUFFER;
664 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
665 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
666 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
667 return media::AudioOutputFlags::NON_BLOCKING;
668 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
669 return media::AudioOutputFlags::HW_AV_SYNC;
670 case AUDIO_OUTPUT_FLAG_TTS:
671 return media::AudioOutputFlags::TTS;
672 case AUDIO_OUTPUT_FLAG_RAW:
673 return media::AudioOutputFlags::RAW;
674 case AUDIO_OUTPUT_FLAG_SYNC:
675 return media::AudioOutputFlags::SYNC;
676 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
677 return media::AudioOutputFlags::IEC958_NONAUDIO;
678 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
679 return media::AudioOutputFlags::DIRECT_PCM;
680 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
681 return media::AudioOutputFlags::MMAP_NOIRQ;
682 case AUDIO_OUTPUT_FLAG_VOIP_RX:
683 return media::AudioOutputFlags::VOIP_RX;
684 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
685 return media::AudioOutputFlags::INCALL_MUSIC;
686 default:
687 return unexpected(BAD_VALUE);
688 }
689}
690
691ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
692 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
693
694 LegacyMask converted = VALUE_OR_RETURN(
695 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
696 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
697 index2enum_index<media::AudioInputFlags>,
698 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
699 return static_cast<audio_input_flags_t>(converted);
700}
701
702ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
703 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
704
705 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
706 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
707 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
708 index2enum_bitmask<audio_input_flags_t>,
709 enumToMask_index<int32_t, media::AudioInputFlags>);
710}
711
712ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700713 return convertBitmask<audio_output_flags_t,
714 int32_t,
715 audio_output_flags_t,
716 media::AudioOutputFlags>(
717 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
718 index2enum_index<media::AudioOutputFlags>,
719 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700720}
721
722ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
723 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
724
725 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
726 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
727 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
728 index2enum_bitmask<audio_output_flags_t>,
729 enumToMask_index<int32_t, media::AudioOutputFlags>);
730}
731
732ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
733 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
734 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700735 Direction dir = VALUE_OR_RETURN(direction(role, type));
736 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700737 case Direction::INPUT: {
738 legacy.input = VALUE_OR_RETURN(
739 aidl2legacy_audio_input_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, input))));
740 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700741 break;
742
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700743 case Direction::OUTPUT: {
744 legacy.output = VALUE_OR_RETURN(
745 aidl2legacy_audio_output_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, output))));
746 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700747 break;
748 }
749
750 return legacy;
751}
752
753ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
754 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
755 media::AudioIoFlags aidl;
756
757 Direction dir = VALUE_OR_RETURN(direction(role, type));
758 switch (dir) {
759 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700760 UNION_SET(aidl, input,
761 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700762 break;
763 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700764 UNION_SET(aidl, output,
765 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700766 break;
767 }
768 return aidl;
769}
770
771ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
772 const media::AudioPortConfigDeviceExt& aidl) {
773 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700774 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700775 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700776 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700777 return legacy;
778}
779
780ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
781 const audio_port_config_device_ext& legacy) {
782 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700783 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700784 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700785 aidl.address = VALUE_OR_RETURN(
786 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700787 return aidl;
788}
789
790ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
791 media::AudioStreamType aidl) {
792 switch (aidl) {
793 case media::AudioStreamType::DEFAULT:
794 return AUDIO_STREAM_DEFAULT;
795 case media::AudioStreamType::VOICE_CALL:
796 return AUDIO_STREAM_VOICE_CALL;
797 case media::AudioStreamType::SYSTEM:
798 return AUDIO_STREAM_SYSTEM;
799 case media::AudioStreamType::RING:
800 return AUDIO_STREAM_RING;
801 case media::AudioStreamType::MUSIC:
802 return AUDIO_STREAM_MUSIC;
803 case media::AudioStreamType::ALARM:
804 return AUDIO_STREAM_ALARM;
805 case media::AudioStreamType::NOTIFICATION:
806 return AUDIO_STREAM_NOTIFICATION;
807 case media::AudioStreamType::BLUETOOTH_SCO:
808 return AUDIO_STREAM_BLUETOOTH_SCO;
809 case media::AudioStreamType::ENFORCED_AUDIBLE:
810 return AUDIO_STREAM_ENFORCED_AUDIBLE;
811 case media::AudioStreamType::DTMF:
812 return AUDIO_STREAM_DTMF;
813 case media::AudioStreamType::TTS:
814 return AUDIO_STREAM_TTS;
815 case media::AudioStreamType::ACCESSIBILITY:
816 return AUDIO_STREAM_ACCESSIBILITY;
817 case media::AudioStreamType::ASSISTANT:
818 return AUDIO_STREAM_ASSISTANT;
819 case media::AudioStreamType::REROUTING:
820 return AUDIO_STREAM_REROUTING;
821 case media::AudioStreamType::PATCH:
822 return AUDIO_STREAM_PATCH;
823 case media::AudioStreamType::CALL_ASSISTANT:
824 return AUDIO_STREAM_CALL_ASSISTANT;
825 default:
826 return unexpected(BAD_VALUE);
827 }
828}
829
830ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
831 audio_stream_type_t legacy) {
832 switch (legacy) {
833 case AUDIO_STREAM_DEFAULT:
834 return media::AudioStreamType::DEFAULT;
835 case AUDIO_STREAM_VOICE_CALL:
836 return media::AudioStreamType::VOICE_CALL;
837 case AUDIO_STREAM_SYSTEM:
838 return media::AudioStreamType::SYSTEM;
839 case AUDIO_STREAM_RING:
840 return media::AudioStreamType::RING;
841 case AUDIO_STREAM_MUSIC:
842 return media::AudioStreamType::MUSIC;
843 case AUDIO_STREAM_ALARM:
844 return media::AudioStreamType::ALARM;
845 case AUDIO_STREAM_NOTIFICATION:
846 return media::AudioStreamType::NOTIFICATION;
847 case AUDIO_STREAM_BLUETOOTH_SCO:
848 return media::AudioStreamType::BLUETOOTH_SCO;
849 case AUDIO_STREAM_ENFORCED_AUDIBLE:
850 return media::AudioStreamType::ENFORCED_AUDIBLE;
851 case AUDIO_STREAM_DTMF:
852 return media::AudioStreamType::DTMF;
853 case AUDIO_STREAM_TTS:
854 return media::AudioStreamType::TTS;
855 case AUDIO_STREAM_ACCESSIBILITY:
856 return media::AudioStreamType::ACCESSIBILITY;
857 case AUDIO_STREAM_ASSISTANT:
858 return media::AudioStreamType::ASSISTANT;
859 case AUDIO_STREAM_REROUTING:
860 return media::AudioStreamType::REROUTING;
861 case AUDIO_STREAM_PATCH:
862 return media::AudioStreamType::PATCH;
863 case AUDIO_STREAM_CALL_ASSISTANT:
864 return media::AudioStreamType::CALL_ASSISTANT;
865 default:
866 return unexpected(BAD_VALUE);
867 }
868}
869
870ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
871 media::AudioSourceType aidl) {
872 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800873 case media::AudioSourceType::INVALID:
874 // This value does not have an enum
875 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700876 case media::AudioSourceType::DEFAULT:
877 return AUDIO_SOURCE_DEFAULT;
878 case media::AudioSourceType::MIC:
879 return AUDIO_SOURCE_MIC;
880 case media::AudioSourceType::VOICE_UPLINK:
881 return AUDIO_SOURCE_VOICE_UPLINK;
882 case media::AudioSourceType::VOICE_DOWNLINK:
883 return AUDIO_SOURCE_VOICE_DOWNLINK;
884 case media::AudioSourceType::VOICE_CALL:
885 return AUDIO_SOURCE_VOICE_CALL;
886 case media::AudioSourceType::CAMCORDER:
887 return AUDIO_SOURCE_CAMCORDER;
888 case media::AudioSourceType::VOICE_RECOGNITION:
889 return AUDIO_SOURCE_VOICE_RECOGNITION;
890 case media::AudioSourceType::VOICE_COMMUNICATION:
891 return AUDIO_SOURCE_VOICE_COMMUNICATION;
892 case media::AudioSourceType::REMOTE_SUBMIX:
893 return AUDIO_SOURCE_REMOTE_SUBMIX;
894 case media::AudioSourceType::UNPROCESSED:
895 return AUDIO_SOURCE_UNPROCESSED;
896 case media::AudioSourceType::VOICE_PERFORMANCE:
897 return AUDIO_SOURCE_VOICE_PERFORMANCE;
898 case media::AudioSourceType::ECHO_REFERENCE:
899 return AUDIO_SOURCE_ECHO_REFERENCE;
900 case media::AudioSourceType::FM_TUNER:
901 return AUDIO_SOURCE_FM_TUNER;
902 case media::AudioSourceType::HOTWORD:
903 return AUDIO_SOURCE_HOTWORD;
904 default:
905 return unexpected(BAD_VALUE);
906 }
907}
908
909ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
910 audio_source_t legacy) {
911 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800912 case AUDIO_SOURCE_INVALID:
913 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700914 case AUDIO_SOURCE_DEFAULT:
915 return media::AudioSourceType::DEFAULT;
916 case AUDIO_SOURCE_MIC:
917 return media::AudioSourceType::MIC;
918 case AUDIO_SOURCE_VOICE_UPLINK:
919 return media::AudioSourceType::VOICE_UPLINK;
920 case AUDIO_SOURCE_VOICE_DOWNLINK:
921 return media::AudioSourceType::VOICE_DOWNLINK;
922 case AUDIO_SOURCE_VOICE_CALL:
923 return media::AudioSourceType::VOICE_CALL;
924 case AUDIO_SOURCE_CAMCORDER:
925 return media::AudioSourceType::CAMCORDER;
926 case AUDIO_SOURCE_VOICE_RECOGNITION:
927 return media::AudioSourceType::VOICE_RECOGNITION;
928 case AUDIO_SOURCE_VOICE_COMMUNICATION:
929 return media::AudioSourceType::VOICE_COMMUNICATION;
930 case AUDIO_SOURCE_REMOTE_SUBMIX:
931 return media::AudioSourceType::REMOTE_SUBMIX;
932 case AUDIO_SOURCE_UNPROCESSED:
933 return media::AudioSourceType::UNPROCESSED;
934 case AUDIO_SOURCE_VOICE_PERFORMANCE:
935 return media::AudioSourceType::VOICE_PERFORMANCE;
936 case AUDIO_SOURCE_ECHO_REFERENCE:
937 return media::AudioSourceType::ECHO_REFERENCE;
938 case AUDIO_SOURCE_FM_TUNER:
939 return media::AudioSourceType::FM_TUNER;
940 case AUDIO_SOURCE_HOTWORD:
941 return media::AudioSourceType::HOTWORD;
942 default:
943 return unexpected(BAD_VALUE);
944 }
945}
946
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800947ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
948 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700949}
950
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800951ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
952 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700953}
954
955// This type is unnamed in the original definition, thus we name it here.
956using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
957
958ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
959 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
960 audio_port_config_mix_ext_usecase legacy;
961
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700962 switch (role) {
963 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700964 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800965 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700966 break;
967
968 case media::AudioPortRole::SOURCE:
969 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700970 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
971 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700972 break;
973
974 case media::AudioPortRole::SINK:
975 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700976 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
977 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700978 break;
979
980 default:
981 LOG_ALWAYS_FATAL("Shouldn't get here");
982 }
983 return legacy;
984}
985
986ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
987 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
988 media::AudioPortConfigMixExtUseCase aidl;
989
990 switch (role) {
991 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800992 UNION_SET(aidl, unspecified, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700993 break;
994 case AUDIO_PORT_ROLE_SOURCE:
995 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700996 UNION_SET(aidl, stream, VALUE_OR_RETURN(
997 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700998 break;
999 case AUDIO_PORT_ROLE_SINK:
1000 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001001 UNION_SET(aidl, source,
1002 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001003 break;
1004 default:
1005 LOG_ALWAYS_FATAL("Shouldn't get here");
1006 }
1007 return aidl;
1008}
1009
1010ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1011 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1012 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001013 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1014 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001015 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1016 return legacy;
1017}
1018
1019ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1020 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1021 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001022 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1023 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001024 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1025 return aidl;
1026}
1027
1028ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1029 const media::AudioPortConfigSessionExt& aidl) {
1030 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001031 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001032 return legacy;
1033}
1034
1035ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1036 const audio_port_config_session_ext& legacy) {
1037 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001038 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001039 return aidl;
1040}
1041
1042// This type is unnamed in the original definition, thus we name it here.
1043using audio_port_config_ext = decltype(audio_port_config::ext);
1044
1045ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1046 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1047 media::AudioPortRole role) {
1048 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001049 switch (type) {
1050 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001051 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001052 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001053 break;
1054 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001055 legacy.device = VALUE_OR_RETURN(
1056 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001057 break;
1058 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001059 legacy.mix = VALUE_OR_RETURN(
1060 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001061 break;
1062 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001063 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1064 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001065 break;
1066 default:
1067 LOG_ALWAYS_FATAL("Shouldn't get here");
1068 }
1069 return legacy;
1070}
1071
1072ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1073 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1074 media::AudioPortConfigExt aidl;
1075
1076 switch (type) {
1077 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001078 UNION_SET(aidl, unspecified, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001079 break;
1080 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001081 UNION_SET(aidl, device,
1082 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001083 break;
1084 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001085 UNION_SET(aidl, mix,
1086 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001087 break;
1088 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001089 UNION_SET(aidl, session,
1090 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001091 break;
1092 default:
1093 LOG_ALWAYS_FATAL("Shouldn't get here");
1094 }
1095 return aidl;
1096}
1097
1098ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1099 const media::AudioPortConfig& aidl) {
1100 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001101 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001102 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1103 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1104 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1105 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1106 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1107 }
1108 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1109 legacy.channel_mask =
1110 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1111 }
1112 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1113 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1114 }
1115 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1116 legacy.gain = VALUE_OR_RETURN(
1117 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1118 }
1119 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1120 legacy.flags = VALUE_OR_RETURN(
1121 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1122 }
1123 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1124 return legacy;
1125}
1126
1127ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1128 const audio_port_config& legacy) {
1129 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001130 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001131 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1132 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1133 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1134 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1135 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1136 }
1137 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1138 aidl.channelMask =
1139 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1140 }
1141 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1142 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1143 }
1144 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1145 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1146 legacy.gain, legacy.role, legacy.type));
1147 }
1148 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1149 aidl.flags = VALUE_OR_RETURN(
1150 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1151 }
1152 aidl.ext =
1153 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1154 return aidl;
1155}
1156
1157ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1158 const media::AudioPatch& aidl) {
1159 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001160 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001161 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1162 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1163 return unexpected(BAD_VALUE);
1164 }
1165 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1166 legacy.sinks[i] =
1167 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1168 }
1169 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1170 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1171 return unexpected(BAD_VALUE);
1172 }
1173 for (size_t i = 0; i < legacy.num_sources; ++i) {
1174 legacy.sources[i] =
1175 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1176 }
1177 return legacy;
1178}
1179
1180ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1181 const struct audio_patch& legacy) {
1182 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001183 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001184
1185 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1186 return unexpected(BAD_VALUE);
1187 }
1188 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1189 aidl.sinks.push_back(
1190 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1191 }
1192 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1193 return unexpected(BAD_VALUE);
1194 }
1195 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1196 aidl.sources.push_back(
1197 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1198 }
1199 return aidl;
1200}
1201
1202ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1203 const media::AudioIoDescriptor& aidl) {
1204 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001205 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001206 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1207 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1208 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1209 legacy->mChannelMask =
1210 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1211 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1212 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1213 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001214 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001215 return legacy;
1216}
1217
1218ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1219 const sp<AudioIoDescriptor>& legacy) {
1220 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001221 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001222 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1223 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1224 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001225 aidl.channelMask = VALUE_OR_RETURN(
1226 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001227 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1228 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1229 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001230 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001231 return aidl;
1232}
1233
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001234ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1235 AudioClient legacy;
1236 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1237 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1238 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1239 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1240 return legacy;
1241}
1242
1243ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1244 media::AudioClient aidl;
1245 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1246 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1247 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1248 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1249 return aidl;
1250}
1251
1252ConversionResult<audio_content_type_t>
1253aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1254 switch (aidl) {
1255 case media::AudioContentType::UNKNOWN:
1256 return AUDIO_CONTENT_TYPE_UNKNOWN;
1257 case media::AudioContentType::SPEECH:
1258 return AUDIO_CONTENT_TYPE_SPEECH;
1259 case media::AudioContentType::MUSIC:
1260 return AUDIO_CONTENT_TYPE_MUSIC;
1261 case media::AudioContentType::MOVIE:
1262 return AUDIO_CONTENT_TYPE_MOVIE;
1263 case media::AudioContentType::SONIFICATION:
1264 return AUDIO_CONTENT_TYPE_SONIFICATION;
1265 }
1266 return unexpected(BAD_VALUE);
1267}
1268
1269ConversionResult<media::AudioContentType>
1270legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1271 switch (legacy) {
1272 case AUDIO_CONTENT_TYPE_UNKNOWN:
1273 return media::AudioContentType::UNKNOWN;
1274 case AUDIO_CONTENT_TYPE_SPEECH:
1275 return media::AudioContentType::SPEECH;
1276 case AUDIO_CONTENT_TYPE_MUSIC:
1277 return media::AudioContentType::MUSIC;
1278 case AUDIO_CONTENT_TYPE_MOVIE:
1279 return media::AudioContentType::MOVIE;
1280 case AUDIO_CONTENT_TYPE_SONIFICATION:
1281 return media::AudioContentType::SONIFICATION;
1282 }
1283 return unexpected(BAD_VALUE);
1284}
1285
1286ConversionResult<audio_usage_t>
1287aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1288 switch (aidl) {
1289 case media::AudioUsage::UNKNOWN:
1290 return AUDIO_USAGE_UNKNOWN;
1291 case media::AudioUsage::MEDIA:
1292 return AUDIO_USAGE_MEDIA;
1293 case media::AudioUsage::VOICE_COMMUNICATION:
1294 return AUDIO_USAGE_VOICE_COMMUNICATION;
1295 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1296 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1297 case media::AudioUsage::ALARM:
1298 return AUDIO_USAGE_ALARM;
1299 case media::AudioUsage::NOTIFICATION:
1300 return AUDIO_USAGE_NOTIFICATION;
1301 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1302 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1303 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1304 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1305 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1306 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1307 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1308 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1309 case media::AudioUsage::NOTIFICATION_EVENT:
1310 return AUDIO_USAGE_NOTIFICATION_EVENT;
1311 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1312 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1313 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1314 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1315 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1316 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1317 case media::AudioUsage::GAME:
1318 return AUDIO_USAGE_GAME;
1319 case media::AudioUsage::VIRTUAL_SOURCE:
1320 return AUDIO_USAGE_VIRTUAL_SOURCE;
1321 case media::AudioUsage::ASSISTANT:
1322 return AUDIO_USAGE_ASSISTANT;
1323 case media::AudioUsage::CALL_ASSISTANT:
1324 return AUDIO_USAGE_CALL_ASSISTANT;
1325 case media::AudioUsage::EMERGENCY:
1326 return AUDIO_USAGE_EMERGENCY;
1327 case media::AudioUsage::SAFETY:
1328 return AUDIO_USAGE_SAFETY;
1329 case media::AudioUsage::VEHICLE_STATUS:
1330 return AUDIO_USAGE_VEHICLE_STATUS;
1331 case media::AudioUsage::ANNOUNCEMENT:
1332 return AUDIO_USAGE_ANNOUNCEMENT;
1333 }
1334 return unexpected(BAD_VALUE);
1335}
1336
1337ConversionResult<media::AudioUsage>
1338legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1339 switch (legacy) {
1340 case AUDIO_USAGE_UNKNOWN:
1341 return media::AudioUsage::UNKNOWN;
1342 case AUDIO_USAGE_MEDIA:
1343 return media::AudioUsage::MEDIA;
1344 case AUDIO_USAGE_VOICE_COMMUNICATION:
1345 return media::AudioUsage::VOICE_COMMUNICATION;
1346 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1347 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1348 case AUDIO_USAGE_ALARM:
1349 return media::AudioUsage::ALARM;
1350 case AUDIO_USAGE_NOTIFICATION:
1351 return media::AudioUsage::NOTIFICATION;
1352 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1353 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1354 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1355 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1356 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1357 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1358 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1359 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1360 case AUDIO_USAGE_NOTIFICATION_EVENT:
1361 return media::AudioUsage::NOTIFICATION_EVENT;
1362 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1363 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1364 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1365 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1366 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1367 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1368 case AUDIO_USAGE_GAME:
1369 return media::AudioUsage::GAME;
1370 case AUDIO_USAGE_VIRTUAL_SOURCE:
1371 return media::AudioUsage::VIRTUAL_SOURCE;
1372 case AUDIO_USAGE_ASSISTANT:
1373 return media::AudioUsage::ASSISTANT;
1374 case AUDIO_USAGE_CALL_ASSISTANT:
1375 return media::AudioUsage::CALL_ASSISTANT;
1376 case AUDIO_USAGE_EMERGENCY:
1377 return media::AudioUsage::EMERGENCY;
1378 case AUDIO_USAGE_SAFETY:
1379 return media::AudioUsage::SAFETY;
1380 case AUDIO_USAGE_VEHICLE_STATUS:
1381 return media::AudioUsage::VEHICLE_STATUS;
1382 case AUDIO_USAGE_ANNOUNCEMENT:
1383 return media::AudioUsage::ANNOUNCEMENT;
1384 }
1385 return unexpected(BAD_VALUE);
1386}
1387
1388ConversionResult<audio_flags_mask_t>
1389aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1390 switch (aidl) {
1391 case media::AudioFlag::AUDIBILITY_ENFORCED:
1392 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1393 case media::AudioFlag::SECURE:
1394 return AUDIO_FLAG_SECURE;
1395 case media::AudioFlag::SCO:
1396 return AUDIO_FLAG_SCO;
1397 case media::AudioFlag::BEACON:
1398 return AUDIO_FLAG_BEACON;
1399 case media::AudioFlag::HW_AV_SYNC:
1400 return AUDIO_FLAG_HW_AV_SYNC;
1401 case media::AudioFlag::HW_HOTWORD:
1402 return AUDIO_FLAG_HW_HOTWORD;
1403 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1404 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1405 case media::AudioFlag::BYPASS_MUTE:
1406 return AUDIO_FLAG_BYPASS_MUTE;
1407 case media::AudioFlag::LOW_LATENCY:
1408 return AUDIO_FLAG_LOW_LATENCY;
1409 case media::AudioFlag::DEEP_BUFFER:
1410 return AUDIO_FLAG_DEEP_BUFFER;
1411 case media::AudioFlag::NO_MEDIA_PROJECTION:
1412 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1413 case media::AudioFlag::MUTE_HAPTIC:
1414 return AUDIO_FLAG_MUTE_HAPTIC;
1415 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1416 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1417 case media::AudioFlag::CAPTURE_PRIVATE:
1418 return AUDIO_FLAG_CAPTURE_PRIVATE;
1419 }
1420 return unexpected(BAD_VALUE);
1421}
1422
1423ConversionResult<media::AudioFlag>
1424legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1425 switch (legacy) {
1426 case AUDIO_FLAG_NONE:
1427 return unexpected(BAD_VALUE);
1428 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1429 return media::AudioFlag::AUDIBILITY_ENFORCED;
1430 case AUDIO_FLAG_SECURE:
1431 return media::AudioFlag::SECURE;
1432 case AUDIO_FLAG_SCO:
1433 return media::AudioFlag::SCO;
1434 case AUDIO_FLAG_BEACON:
1435 return media::AudioFlag::BEACON;
1436 case AUDIO_FLAG_HW_AV_SYNC:
1437 return media::AudioFlag::HW_AV_SYNC;
1438 case AUDIO_FLAG_HW_HOTWORD:
1439 return media::AudioFlag::HW_HOTWORD;
1440 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1441 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1442 case AUDIO_FLAG_BYPASS_MUTE:
1443 return media::AudioFlag::BYPASS_MUTE;
1444 case AUDIO_FLAG_LOW_LATENCY:
1445 return media::AudioFlag::LOW_LATENCY;
1446 case AUDIO_FLAG_DEEP_BUFFER:
1447 return media::AudioFlag::DEEP_BUFFER;
1448 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1449 return media::AudioFlag::NO_MEDIA_PROJECTION;
1450 case AUDIO_FLAG_MUTE_HAPTIC:
1451 return media::AudioFlag::MUTE_HAPTIC;
1452 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1453 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1454 case AUDIO_FLAG_CAPTURE_PRIVATE:
1455 return media::AudioFlag::CAPTURE_PRIVATE;
1456 }
1457 return unexpected(BAD_VALUE);
1458}
1459
1460ConversionResult<audio_flags_mask_t>
1461aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1462 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1463 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1464 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1465}
1466
1467ConversionResult<int32_t>
1468legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1469 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001470 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1471 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001472 enumToMask_index<int32_t, media::AudioFlag>);
1473}
1474
1475ConversionResult<audio_attributes_t>
1476aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1477 audio_attributes_t legacy;
1478 legacy.content_type = VALUE_OR_RETURN(
1479 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1480 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1481 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1482 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1483 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1484 return legacy;
1485}
1486
1487ConversionResult<media::AudioAttributesInternal>
1488legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1489 media::AudioAttributesInternal aidl;
1490 aidl.contentType = VALUE_OR_RETURN(
1491 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1492 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1493 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1494 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1495 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1496 return aidl;
1497}
1498
1499ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001500aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001501 switch (aidl) {
1502 case media::AudioEncapsulationMode::NONE:
1503 return AUDIO_ENCAPSULATION_MODE_NONE;
1504 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1505 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1506 case media::AudioEncapsulationMode::HANDLE:
1507 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1508 }
1509 return unexpected(BAD_VALUE);
1510}
1511
1512ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001513legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001514 switch (legacy) {
1515 case AUDIO_ENCAPSULATION_MODE_NONE:
1516 return media::AudioEncapsulationMode::NONE;
1517 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1518 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1519 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1520 return media::AudioEncapsulationMode::HANDLE;
1521 }
1522 return unexpected(BAD_VALUE);
1523}
1524
1525ConversionResult<audio_offload_info_t>
1526aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1527 audio_offload_info_t legacy;
1528 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1529 legacy.size = sizeof(audio_offload_info_t);
1530 audio_config_base_t config = VALUE_OR_RETURN(
1531 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1532 legacy.sample_rate = config.sample_rate;
1533 legacy.channel_mask = config.channel_mask;
1534 legacy.format = config.format;
1535 legacy.stream_type = VALUE_OR_RETURN(
1536 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1537 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1538 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1539 legacy.has_video = aidl.hasVideo;
1540 legacy.is_streaming = aidl.isStreaming;
1541 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1542 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1543 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1544 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001545 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001546 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1547 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1548 return legacy;
1549}
1550
1551ConversionResult<media::AudioOffloadInfo>
1552legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1553 media::AudioOffloadInfo aidl;
1554 // Version 0.1 fields.
1555 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1556 return unexpected(BAD_VALUE);
1557 }
1558 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1559 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1560 aidl.config.channelMask = VALUE_OR_RETURN(
1561 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1562 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1563 aidl.streamType = VALUE_OR_RETURN(
1564 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1565 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1566 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1567 aidl.hasVideo = legacy.has_video;
1568 aidl.isStreaming = legacy.is_streaming;
1569 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1570 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1571 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1572
1573 // Version 0.2 fields.
1574 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1575 if (legacy.size <
1576 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1577 return unexpected(BAD_VALUE);
1578 }
1579 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001580 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001581 legacy.encapsulation_mode));
1582 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1583 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1584 }
1585 return aidl;
1586}
1587
1588ConversionResult<audio_config_t>
1589aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1590 audio_config_t legacy;
1591 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001592 legacy.channel_mask = VALUE_OR_RETURN(
1593 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001594 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001595 legacy.offload_info = VALUE_OR_RETURN(
1596 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001597 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1598 return legacy;
1599}
1600
1601ConversionResult<media::AudioConfig>
1602legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1603 media::AudioConfig aidl;
1604 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001605 aidl.channelMask = VALUE_OR_RETURN(
1606 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001607 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001608 aidl.offloadInfo = VALUE_OR_RETURN(
1609 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001610 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1611 return aidl;
1612}
1613
1614ConversionResult<audio_config_base_t>
1615aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1616 audio_config_base_t legacy;
1617 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001618 legacy.channel_mask = VALUE_OR_RETURN(
1619 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001620 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1621 return legacy;
1622}
1623
1624ConversionResult<media::AudioConfigBase>
1625legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1626 media::AudioConfigBase aidl;
1627 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001628 aidl.channelMask = VALUE_OR_RETURN(
1629 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001630 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1631 return aidl;
1632}
1633
1634ConversionResult<sp<IMemory>>
1635aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1636 sp<IMemory> legacy;
1637 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1638 return unexpected(BAD_VALUE);
1639 }
1640 return legacy;
1641}
1642
1643ConversionResult<media::SharedFileRegion>
1644legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1645 media::SharedFileRegion aidl;
1646 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1647 return unexpected(BAD_VALUE);
1648 }
1649 return aidl;
1650}
1651
1652ConversionResult<sp<IMemory>>
1653aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1654 sp<IMemory> legacy;
1655 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1656 return unexpected(BAD_VALUE);
1657 }
1658 return legacy;
1659}
1660
1661ConversionResult<std::optional<media::SharedFileRegion>>
1662legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1663 std::optional<media::SharedFileRegion> aidl;
1664 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1665 return unexpected(BAD_VALUE);
1666 }
1667 return aidl;
1668}
1669
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001670ConversionResult<AudioTimestamp>
1671aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1672 AudioTimestamp legacy;
1673 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1674 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1675 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1676 return legacy;
1677}
1678
1679ConversionResult<media::AudioTimestampInternal>
1680legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1681 media::AudioTimestampInternal aidl;
1682 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1683 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1684 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1685 return aidl;
1686}
1687
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001688ConversionResult<audio_uuid_t>
1689aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1690 audio_uuid_t legacy;
1691 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1692 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1693 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1694 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1695 if (aidl.node.size() != std::size(legacy.node)) {
1696 return unexpected(BAD_VALUE);
1697 }
1698 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1699 return legacy;
1700}
1701
1702ConversionResult<media::AudioUuid>
1703legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1704 media::AudioUuid aidl;
1705 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1706 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1707 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1708 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1709 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1710 return aidl;
1711}
1712
1713ConversionResult<effect_descriptor_t>
1714aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1715 effect_descriptor_t legacy;
1716 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1717 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1718 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1719 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1720 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1721 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1722 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1723 RETURN_IF_ERROR(
1724 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1725 return legacy;
1726}
1727
1728ConversionResult<media::EffectDescriptor>
1729legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1730 media::EffectDescriptor aidl;
1731 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1732 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1733 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1734 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1735 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1736 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1737 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1738 aidl.implementor = VALUE_OR_RETURN(
1739 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1740 return aidl;
1741}
1742
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001743ConversionResult<audio_encapsulation_metadata_type_t>
1744aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1745 media::AudioEncapsulationMetadataType aidl) {
1746 switch (aidl) {
1747 case media::AudioEncapsulationMetadataType::NONE:
1748 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1749 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1750 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1751 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1752 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1753 }
1754 return unexpected(BAD_VALUE);
1755}
1756
1757ConversionResult<media::AudioEncapsulationMetadataType>
1758legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1759 audio_encapsulation_metadata_type_t legacy) {
1760 switch (legacy) {
1761 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1762 return media::AudioEncapsulationMetadataType::NONE;
1763 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1764 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1765 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1766 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1767 }
1768 return unexpected(BAD_VALUE);
1769}
1770
1771ConversionResult<uint32_t>
1772aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1773 return convertBitmask<uint32_t,
1774 int32_t,
1775 audio_encapsulation_mode_t,
1776 media::AudioEncapsulationMode>(
1777 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1778 index2enum_index<media::AudioEncapsulationMode>,
1779 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1780}
1781
1782ConversionResult<int32_t>
1783legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1784 return convertBitmask<int32_t,
1785 uint32_t,
1786 media::AudioEncapsulationMode,
1787 audio_encapsulation_mode_t>(
1788 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1789 index2enum_index<audio_encapsulation_mode_t>,
1790 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1791}
1792
1793ConversionResult<uint32_t>
1794aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1795 return convertBitmask<uint32_t,
1796 int32_t,
1797 audio_encapsulation_metadata_type_t,
1798 media::AudioEncapsulationMetadataType>(
1799 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1800 index2enum_index<media::AudioEncapsulationMetadataType>,
1801 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1802}
1803
1804ConversionResult<int32_t>
1805legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1806 return convertBitmask<int32_t,
1807 uint32_t,
1808 media::AudioEncapsulationMetadataType,
1809 audio_encapsulation_metadata_type_t>(
1810 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1811 index2enum_index<audio_encapsulation_metadata_type_t>,
1812 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1813}
1814
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001815ConversionResult<audio_mix_latency_class_t>
1816aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(
1817 media::AudioMixLatencyClass aidl) {
1818 switch (aidl) {
1819 case media::AudioMixLatencyClass::LOW:
1820 return AUDIO_LATENCY_LOW;
1821 case media::AudioMixLatencyClass::NORMAL:
1822 return AUDIO_LATENCY_NORMAL;
1823 }
1824 return unexpected(BAD_VALUE);
1825}
1826
1827ConversionResult<media::AudioMixLatencyClass>
1828legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(
1829 audio_mix_latency_class_t legacy) {
1830 switch (legacy) {
1831 case AUDIO_LATENCY_LOW:
1832 return media::AudioMixLatencyClass::LOW;
1833 case AUDIO_LATENCY_NORMAL:
1834 return media::AudioMixLatencyClass::NORMAL;
1835 }
1836 return unexpected(BAD_VALUE);
1837}
1838
1839ConversionResult<audio_port_device_ext>
1840aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const media::AudioPortDeviceExt& aidl) {
1841 audio_port_device_ext legacy;
1842 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1843 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.device.type));
1844 RETURN_IF_ERROR(
1845 aidl2legacy_string(aidl.device.address, legacy.address, sizeof(legacy.address)));
1846 legacy.encapsulation_modes = VALUE_OR_RETURN(
1847 aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
1848 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
1849 aidl2legacy_AudioEncapsulationMetadataType_mask(aidl.encapsulationMetadataTypes));
1850 return legacy;
1851}
1852
1853ConversionResult<media::AudioPortDeviceExt>
1854legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext& legacy) {
1855 media::AudioPortDeviceExt aidl;
1856 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1857 aidl.device.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
1858 aidl.device.address = VALUE_OR_RETURN(
1859 legacy2aidl_string(legacy.address, sizeof(legacy.address)));
1860 aidl.encapsulationModes = VALUE_OR_RETURN(
1861 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
1862 aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
1863 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
1864 return aidl;
1865}
1866
1867ConversionResult<audio_port_mix_ext>
1868aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const media::AudioPortMixExt& aidl) {
1869 audio_port_mix_ext legacy;
1870 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1871 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
1872 legacy.latency_class = VALUE_OR_RETURN(
1873 aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(aidl.latencyClass));
1874 return legacy;
1875}
1876
1877ConversionResult<media::AudioPortMixExt>
1878legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy) {
1879 media::AudioPortMixExt aidl;
1880 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1881 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1882 aidl.latencyClass = VALUE_OR_RETURN(
1883 legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(legacy.latency_class));
1884 return aidl;
1885}
1886
1887ConversionResult<audio_port_session_ext>
1888aidl2legacy_AudioPortSessionExt_audio_port_session_ext(const media::AudioPortSessionExt& aidl) {
1889 audio_port_session_ext legacy;
1890 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
1891 return legacy;
1892}
1893
1894ConversionResult<media::AudioPortSessionExt>
1895legacy2aidl_audio_port_session_ext_AudioPortSessionExt(const audio_port_session_ext& legacy) {
1896 media::AudioPortSessionExt aidl;
1897 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
1898 return aidl;
1899}
1900
1901// This type is unnamed in the original definition, thus we name it here.
1902using audio_port_v7_ext = decltype(audio_port_v7::ext);
1903
1904ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt(
1905 const media::AudioPortExt& aidl, media::AudioPortType type) {
1906 audio_port_v7_ext legacy;
1907 switch (type) {
1908 case media::AudioPortType::NONE:
1909 // Just verify that the union is empty.
1910 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
1911 break;
1912 case media::AudioPortType::DEVICE:
1913 legacy.device = VALUE_OR_RETURN(
1914 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
1915 VALUE_OR_RETURN(UNION_GET(aidl, device))));
1916 break;
1917 case media::AudioPortType::MIX:
1918 legacy.mix = VALUE_OR_RETURN(
1919 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
1920 VALUE_OR_RETURN(UNION_GET(aidl, mix))));
1921 break;
1922 case media::AudioPortType::SESSION:
1923 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortSessionExt_audio_port_session_ext(
1924 VALUE_OR_RETURN(UNION_GET(aidl, session))));
1925 break;
1926 default:
1927 LOG_ALWAYS_FATAL("Shouldn't get here");
1928 }
1929 return legacy;
1930}
1931
1932ConversionResult<media::AudioPortExt> legacy2aidl_AudioPortExt(
1933 const audio_port_v7_ext& legacy, audio_port_type_t type) {
1934 media::AudioPortExt aidl;
1935 switch (type) {
1936 case AUDIO_PORT_TYPE_NONE:
1937 UNION_SET(aidl, unspecified, false);
1938 break;
1939 case AUDIO_PORT_TYPE_DEVICE:
1940 UNION_SET(aidl, device,
1941 VALUE_OR_RETURN(
1942 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device)));
1943 break;
1944 case AUDIO_PORT_TYPE_MIX:
1945 UNION_SET(aidl, mix,
1946 VALUE_OR_RETURN(legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix)));
1947 break;
1948 case AUDIO_PORT_TYPE_SESSION:
1949 UNION_SET(aidl, session,
1950 VALUE_OR_RETURN(legacy2aidl_audio_port_session_ext_AudioPortSessionExt(
1951 legacy.session)));
1952 break;
1953 default:
1954 LOG_ALWAYS_FATAL("Shouldn't get here");
1955 }
1956 return aidl;
1957}
1958
1959ConversionResult<audio_profile>
1960aidl2legacy_AudioProfile_audio_profile(const media::AudioProfile& aidl) {
1961 audio_profile legacy;
1962 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1963
1964 if (aidl.samplingRates.size() > std::size(legacy.sample_rates)) {
1965 return unexpected(BAD_VALUE);
1966 }
1967 RETURN_IF_ERROR(
1968 convertRange(aidl.samplingRates.begin(), aidl.samplingRates.end(), legacy.sample_rates,
1969 convertIntegral<int32_t, unsigned int>));
1970 legacy.num_sample_rates = aidl.samplingRates.size();
1971
1972 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
1973 return unexpected(BAD_VALUE);
1974 }
1975 RETURN_IF_ERROR(
1976 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
1977 aidl2legacy_int32_t_audio_channel_mask_t));
1978 legacy.num_channel_masks = aidl.channelMasks.size();
1979 return legacy;
1980}
1981
1982ConversionResult<media::AudioProfile>
1983legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy) {
1984 media::AudioProfile aidl;
1985 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1986
1987 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
1988 return unexpected(BAD_VALUE);
1989 }
1990 RETURN_IF_ERROR(
1991 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
1992 std::back_inserter(aidl.samplingRates),
1993 convertIntegral<unsigned int, int32_t>));
1994
1995 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
1996 return unexpected(BAD_VALUE);
1997 }
1998 RETURN_IF_ERROR(
1999 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2000 std::back_inserter(aidl.channelMasks),
2001 legacy2aidl_audio_channel_mask_t_int32_t));
2002 return aidl;
2003}
2004
2005ConversionResult<audio_gain>
2006aidl2legacy_AudioGain_audio_gain(const media::AudioGain& aidl) {
2007 audio_gain legacy;
2008 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
2009 legacy.channel_mask = VALUE_OR_RETURN(
2010 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
2011 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2012 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2013 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2014 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2015 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2016 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2017 return legacy;
2018}
2019
2020ConversionResult<media::AudioGain>
2021legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy) {
2022 media::AudioGain aidl;
2023 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_mask_int32_t(legacy.mode));
2024 aidl.channelMask = VALUE_OR_RETURN(
2025 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
2026 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2027 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2028 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2029 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2030 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2031 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2032 return aidl;
2033}
2034
2035ConversionResult<audio_port_v7>
2036aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2037 audio_port_v7 legacy;
2038 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2039 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
2040 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
2041 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2042
2043 if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2044 return unexpected(BAD_VALUE);
2045 }
2046 RETURN_IF_ERROR(convertRange(aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
2047 aidl2legacy_AudioProfile_audio_profile));
2048 legacy.num_audio_profiles = aidl.profiles.size();
2049
2050 if (aidl.gains.size() > std::size(legacy.gains)) {
2051 return unexpected(BAD_VALUE);
2052 }
2053 RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2054 aidl2legacy_AudioGain_audio_gain));
2055 legacy.num_gains = aidl.gains.size();
2056
2057 legacy.active_config = VALUE_OR_RETURN(
2058 aidl2legacy_AudioPortConfig_audio_port_config(aidl.activeConfig));
2059 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortExt(aidl.ext, aidl.type));
2060 return legacy;
2061}
2062
2063ConversionResult<media::AudioPort>
2064legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2065 media::AudioPort aidl;
2066 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2067 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2068 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2069 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2070
2071 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2072 return unexpected(BAD_VALUE);
2073 }
2074 RETURN_IF_ERROR(
2075 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2076 std::back_inserter(aidl.profiles),
2077 legacy2aidl_audio_profile_AudioProfile));
2078
2079 if (legacy.num_gains > std::size(legacy.gains)) {
2080 return unexpected(BAD_VALUE);
2081 }
2082 RETURN_IF_ERROR(
2083 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2084 std::back_inserter(aidl.gains),
2085 legacy2aidl_audio_gain_AudioGain));
2086
2087 aidl.activeConfig = VALUE_OR_RETURN(
2088 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
2089 aidl.ext = VALUE_OR_RETURN(legacy2aidl_AudioPortExt(legacy.ext, legacy.type));
2090 return aidl;
2091}
2092
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002093ConversionResult<audio_mode_t>
2094aidl2legacy_AudioMode_audio_mode_t(media::AudioMode aidl) {
2095 switch (aidl) {
2096 case media::AudioMode::INVALID:
2097 return AUDIO_MODE_INVALID;
2098 case media::AudioMode::CURRENT:
2099 return AUDIO_MODE_CURRENT;
2100 case media::AudioMode::NORMAL:
2101 return AUDIO_MODE_NORMAL;
2102 case media::AudioMode::RINGTONE:
2103 return AUDIO_MODE_RINGTONE;
2104 case media::AudioMode::IN_CALL:
2105 return AUDIO_MODE_IN_CALL;
2106 case media::AudioMode::IN_COMMUNICATION:
2107 return AUDIO_MODE_IN_COMMUNICATION;
2108 case media::AudioMode::CALL_SCREEN:
2109 return AUDIO_MODE_CALL_SCREEN;
2110 }
2111 return unexpected(BAD_VALUE);
2112}
2113
2114ConversionResult<media::AudioMode>
2115legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2116 switch (legacy) {
2117 case AUDIO_MODE_INVALID:
2118 return media::AudioMode::INVALID;
2119 case AUDIO_MODE_CURRENT:
2120 return media::AudioMode::CURRENT;
2121 case AUDIO_MODE_NORMAL:
2122 return media::AudioMode::NORMAL;
2123 case AUDIO_MODE_RINGTONE:
2124 return media::AudioMode::RINGTONE;
2125 case AUDIO_MODE_IN_CALL:
2126 return media::AudioMode::IN_CALL;
2127 case AUDIO_MODE_IN_COMMUNICATION:
2128 return media::AudioMode::IN_COMMUNICATION;
2129 case AUDIO_MODE_CALL_SCREEN:
2130 return media::AudioMode::CALL_SCREEN;
2131 case AUDIO_MODE_CNT:
2132 break;
2133 }
2134 return unexpected(BAD_VALUE);
2135}
2136
2137ConversionResult<audio_unique_id_use_t>
2138aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2139 switch (aidl) {
2140 case media::AudioUniqueIdUse::UNSPECIFIED:
2141 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2142 case media::AudioUniqueIdUse::SESSION:
2143 return AUDIO_UNIQUE_ID_USE_SESSION;
2144 case media::AudioUniqueIdUse::MODULE:
2145 return AUDIO_UNIQUE_ID_USE_MODULE;
2146 case media::AudioUniqueIdUse::EFFECT:
2147 return AUDIO_UNIQUE_ID_USE_EFFECT;
2148 case media::AudioUniqueIdUse::PATCH:
2149 return AUDIO_UNIQUE_ID_USE_PATCH;
2150 case media::AudioUniqueIdUse::OUTPUT:
2151 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2152 case media::AudioUniqueIdUse::INPUT:
2153 return AUDIO_UNIQUE_ID_USE_INPUT;
2154 case media::AudioUniqueIdUse::CLIENT:
2155 return AUDIO_UNIQUE_ID_USE_CLIENT;
2156 }
2157 return unexpected(BAD_VALUE);
2158}
2159
2160ConversionResult<media::AudioUniqueIdUse>
2161legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2162 switch (legacy) {
2163 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2164 return media::AudioUniqueIdUse::UNSPECIFIED;
2165 case AUDIO_UNIQUE_ID_USE_SESSION:
2166 return media::AudioUniqueIdUse::SESSION;
2167 case AUDIO_UNIQUE_ID_USE_MODULE:
2168 return media::AudioUniqueIdUse::MODULE;
2169 case AUDIO_UNIQUE_ID_USE_EFFECT:
2170 return media::AudioUniqueIdUse::EFFECT;
2171 case AUDIO_UNIQUE_ID_USE_PATCH:
2172 return media::AudioUniqueIdUse::PATCH;
2173 case AUDIO_UNIQUE_ID_USE_OUTPUT:
2174 return media::AudioUniqueIdUse::OUTPUT;
2175 case AUDIO_UNIQUE_ID_USE_INPUT:
2176 return media::AudioUniqueIdUse::INPUT;
2177 case AUDIO_UNIQUE_ID_USE_CLIENT:
2178 return media::AudioUniqueIdUse::CLIENT;
2179 case AUDIO_UNIQUE_ID_USE_MAX:
2180 break;
2181 }
2182 return unexpected(BAD_VALUE);
2183}
2184
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07002185} // namespace android