blob: a27cf78e5ab6957ae25aa55258136144ee0b3e27 [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;
Eric Laurent90fe31c2020-11-26 20:06:35 +0100648 case media::AudioOutputFlags::GAPLESS_OFFLOAD:
649 return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700650 default:
651 return unexpected(BAD_VALUE);
652 }
653}
654
655ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
656 audio_output_flags_t legacy) {
657 switch (legacy) {
658 case AUDIO_OUTPUT_FLAG_DIRECT:
659 return media::AudioOutputFlags::DIRECT;
660 case AUDIO_OUTPUT_FLAG_PRIMARY:
661 return media::AudioOutputFlags::PRIMARY;
662 case AUDIO_OUTPUT_FLAG_FAST:
663 return media::AudioOutputFlags::FAST;
664 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
665 return media::AudioOutputFlags::DEEP_BUFFER;
666 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
667 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
668 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
669 return media::AudioOutputFlags::NON_BLOCKING;
670 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
671 return media::AudioOutputFlags::HW_AV_SYNC;
672 case AUDIO_OUTPUT_FLAG_TTS:
673 return media::AudioOutputFlags::TTS;
674 case AUDIO_OUTPUT_FLAG_RAW:
675 return media::AudioOutputFlags::RAW;
676 case AUDIO_OUTPUT_FLAG_SYNC:
677 return media::AudioOutputFlags::SYNC;
678 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
679 return media::AudioOutputFlags::IEC958_NONAUDIO;
680 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
681 return media::AudioOutputFlags::DIRECT_PCM;
682 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
683 return media::AudioOutputFlags::MMAP_NOIRQ;
684 case AUDIO_OUTPUT_FLAG_VOIP_RX:
685 return media::AudioOutputFlags::VOIP_RX;
686 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
687 return media::AudioOutputFlags::INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +0100688 case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
689 return media::AudioOutputFlags::GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700690 default:
691 return unexpected(BAD_VALUE);
692 }
693}
694
695ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
696 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
697
698 LegacyMask converted = VALUE_OR_RETURN(
699 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
700 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
701 index2enum_index<media::AudioInputFlags>,
702 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
703 return static_cast<audio_input_flags_t>(converted);
704}
705
706ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
707 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
708
709 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
710 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
711 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
712 index2enum_bitmask<audio_input_flags_t>,
713 enumToMask_index<int32_t, media::AudioInputFlags>);
714}
715
716ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700717 return convertBitmask<audio_output_flags_t,
718 int32_t,
719 audio_output_flags_t,
720 media::AudioOutputFlags>(
721 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
722 index2enum_index<media::AudioOutputFlags>,
723 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700724}
725
726ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
727 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
728
729 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
730 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
731 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
732 index2enum_bitmask<audio_output_flags_t>,
733 enumToMask_index<int32_t, media::AudioOutputFlags>);
734}
735
736ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
737 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
738 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700739 Direction dir = VALUE_OR_RETURN(direction(role, type));
740 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700741 case Direction::INPUT: {
742 legacy.input = VALUE_OR_RETURN(
743 aidl2legacy_audio_input_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, input))));
744 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700745 break;
746
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700747 case Direction::OUTPUT: {
748 legacy.output = VALUE_OR_RETURN(
749 aidl2legacy_audio_output_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, output))));
750 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700751 break;
752 }
753
754 return legacy;
755}
756
757ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
758 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
759 media::AudioIoFlags aidl;
760
761 Direction dir = VALUE_OR_RETURN(direction(role, type));
762 switch (dir) {
763 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700764 UNION_SET(aidl, input,
765 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700766 break;
767 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700768 UNION_SET(aidl, output,
769 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700770 break;
771 }
772 return aidl;
773}
774
775ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
776 const media::AudioPortConfigDeviceExt& aidl) {
777 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700778 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700779 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700780 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700781 return legacy;
782}
783
784ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
785 const audio_port_config_device_ext& legacy) {
786 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700787 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700788 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700789 aidl.address = VALUE_OR_RETURN(
790 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700791 return aidl;
792}
793
794ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
795 media::AudioStreamType aidl) {
796 switch (aidl) {
797 case media::AudioStreamType::DEFAULT:
798 return AUDIO_STREAM_DEFAULT;
799 case media::AudioStreamType::VOICE_CALL:
800 return AUDIO_STREAM_VOICE_CALL;
801 case media::AudioStreamType::SYSTEM:
802 return AUDIO_STREAM_SYSTEM;
803 case media::AudioStreamType::RING:
804 return AUDIO_STREAM_RING;
805 case media::AudioStreamType::MUSIC:
806 return AUDIO_STREAM_MUSIC;
807 case media::AudioStreamType::ALARM:
808 return AUDIO_STREAM_ALARM;
809 case media::AudioStreamType::NOTIFICATION:
810 return AUDIO_STREAM_NOTIFICATION;
811 case media::AudioStreamType::BLUETOOTH_SCO:
812 return AUDIO_STREAM_BLUETOOTH_SCO;
813 case media::AudioStreamType::ENFORCED_AUDIBLE:
814 return AUDIO_STREAM_ENFORCED_AUDIBLE;
815 case media::AudioStreamType::DTMF:
816 return AUDIO_STREAM_DTMF;
817 case media::AudioStreamType::TTS:
818 return AUDIO_STREAM_TTS;
819 case media::AudioStreamType::ACCESSIBILITY:
820 return AUDIO_STREAM_ACCESSIBILITY;
821 case media::AudioStreamType::ASSISTANT:
822 return AUDIO_STREAM_ASSISTANT;
823 case media::AudioStreamType::REROUTING:
824 return AUDIO_STREAM_REROUTING;
825 case media::AudioStreamType::PATCH:
826 return AUDIO_STREAM_PATCH;
827 case media::AudioStreamType::CALL_ASSISTANT:
828 return AUDIO_STREAM_CALL_ASSISTANT;
829 default:
830 return unexpected(BAD_VALUE);
831 }
832}
833
834ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
835 audio_stream_type_t legacy) {
836 switch (legacy) {
837 case AUDIO_STREAM_DEFAULT:
838 return media::AudioStreamType::DEFAULT;
839 case AUDIO_STREAM_VOICE_CALL:
840 return media::AudioStreamType::VOICE_CALL;
841 case AUDIO_STREAM_SYSTEM:
842 return media::AudioStreamType::SYSTEM;
843 case AUDIO_STREAM_RING:
844 return media::AudioStreamType::RING;
845 case AUDIO_STREAM_MUSIC:
846 return media::AudioStreamType::MUSIC;
847 case AUDIO_STREAM_ALARM:
848 return media::AudioStreamType::ALARM;
849 case AUDIO_STREAM_NOTIFICATION:
850 return media::AudioStreamType::NOTIFICATION;
851 case AUDIO_STREAM_BLUETOOTH_SCO:
852 return media::AudioStreamType::BLUETOOTH_SCO;
853 case AUDIO_STREAM_ENFORCED_AUDIBLE:
854 return media::AudioStreamType::ENFORCED_AUDIBLE;
855 case AUDIO_STREAM_DTMF:
856 return media::AudioStreamType::DTMF;
857 case AUDIO_STREAM_TTS:
858 return media::AudioStreamType::TTS;
859 case AUDIO_STREAM_ACCESSIBILITY:
860 return media::AudioStreamType::ACCESSIBILITY;
861 case AUDIO_STREAM_ASSISTANT:
862 return media::AudioStreamType::ASSISTANT;
863 case AUDIO_STREAM_REROUTING:
864 return media::AudioStreamType::REROUTING;
865 case AUDIO_STREAM_PATCH:
866 return media::AudioStreamType::PATCH;
867 case AUDIO_STREAM_CALL_ASSISTANT:
868 return media::AudioStreamType::CALL_ASSISTANT;
869 default:
870 return unexpected(BAD_VALUE);
871 }
872}
873
874ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
875 media::AudioSourceType aidl) {
876 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800877 case media::AudioSourceType::INVALID:
878 // This value does not have an enum
879 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700880 case media::AudioSourceType::DEFAULT:
881 return AUDIO_SOURCE_DEFAULT;
882 case media::AudioSourceType::MIC:
883 return AUDIO_SOURCE_MIC;
884 case media::AudioSourceType::VOICE_UPLINK:
885 return AUDIO_SOURCE_VOICE_UPLINK;
886 case media::AudioSourceType::VOICE_DOWNLINK:
887 return AUDIO_SOURCE_VOICE_DOWNLINK;
888 case media::AudioSourceType::VOICE_CALL:
889 return AUDIO_SOURCE_VOICE_CALL;
890 case media::AudioSourceType::CAMCORDER:
891 return AUDIO_SOURCE_CAMCORDER;
892 case media::AudioSourceType::VOICE_RECOGNITION:
893 return AUDIO_SOURCE_VOICE_RECOGNITION;
894 case media::AudioSourceType::VOICE_COMMUNICATION:
895 return AUDIO_SOURCE_VOICE_COMMUNICATION;
896 case media::AudioSourceType::REMOTE_SUBMIX:
897 return AUDIO_SOURCE_REMOTE_SUBMIX;
898 case media::AudioSourceType::UNPROCESSED:
899 return AUDIO_SOURCE_UNPROCESSED;
900 case media::AudioSourceType::VOICE_PERFORMANCE:
901 return AUDIO_SOURCE_VOICE_PERFORMANCE;
902 case media::AudioSourceType::ECHO_REFERENCE:
903 return AUDIO_SOURCE_ECHO_REFERENCE;
904 case media::AudioSourceType::FM_TUNER:
905 return AUDIO_SOURCE_FM_TUNER;
906 case media::AudioSourceType::HOTWORD:
907 return AUDIO_SOURCE_HOTWORD;
908 default:
909 return unexpected(BAD_VALUE);
910 }
911}
912
913ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
914 audio_source_t legacy) {
915 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800916 case AUDIO_SOURCE_INVALID:
917 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700918 case AUDIO_SOURCE_DEFAULT:
919 return media::AudioSourceType::DEFAULT;
920 case AUDIO_SOURCE_MIC:
921 return media::AudioSourceType::MIC;
922 case AUDIO_SOURCE_VOICE_UPLINK:
923 return media::AudioSourceType::VOICE_UPLINK;
924 case AUDIO_SOURCE_VOICE_DOWNLINK:
925 return media::AudioSourceType::VOICE_DOWNLINK;
926 case AUDIO_SOURCE_VOICE_CALL:
927 return media::AudioSourceType::VOICE_CALL;
928 case AUDIO_SOURCE_CAMCORDER:
929 return media::AudioSourceType::CAMCORDER;
930 case AUDIO_SOURCE_VOICE_RECOGNITION:
931 return media::AudioSourceType::VOICE_RECOGNITION;
932 case AUDIO_SOURCE_VOICE_COMMUNICATION:
933 return media::AudioSourceType::VOICE_COMMUNICATION;
934 case AUDIO_SOURCE_REMOTE_SUBMIX:
935 return media::AudioSourceType::REMOTE_SUBMIX;
936 case AUDIO_SOURCE_UNPROCESSED:
937 return media::AudioSourceType::UNPROCESSED;
938 case AUDIO_SOURCE_VOICE_PERFORMANCE:
939 return media::AudioSourceType::VOICE_PERFORMANCE;
940 case AUDIO_SOURCE_ECHO_REFERENCE:
941 return media::AudioSourceType::ECHO_REFERENCE;
942 case AUDIO_SOURCE_FM_TUNER:
943 return media::AudioSourceType::FM_TUNER;
944 case AUDIO_SOURCE_HOTWORD:
945 return media::AudioSourceType::HOTWORD;
946 default:
947 return unexpected(BAD_VALUE);
948 }
949}
950
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800951ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
952 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700953}
954
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800955ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
956 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700957}
958
959// This type is unnamed in the original definition, thus we name it here.
960using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
961
962ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
963 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
964 audio_port_config_mix_ext_usecase legacy;
965
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700966 switch (role) {
967 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700968 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800969 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700970 break;
971
972 case media::AudioPortRole::SOURCE:
973 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700974 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
975 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700976 break;
977
978 case media::AudioPortRole::SINK:
979 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700980 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
981 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700982 break;
983
984 default:
985 LOG_ALWAYS_FATAL("Shouldn't get here");
986 }
987 return legacy;
988}
989
990ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
991 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
992 media::AudioPortConfigMixExtUseCase aidl;
993
994 switch (role) {
995 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -0800996 UNION_SET(aidl, unspecified, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700997 break;
998 case AUDIO_PORT_ROLE_SOURCE:
999 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001000 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1001 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001002 break;
1003 case AUDIO_PORT_ROLE_SINK:
1004 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001005 UNION_SET(aidl, source,
1006 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001007 break;
1008 default:
1009 LOG_ALWAYS_FATAL("Shouldn't get here");
1010 }
1011 return aidl;
1012}
1013
1014ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1015 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1016 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001017 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1018 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001019 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1020 return legacy;
1021}
1022
1023ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1024 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1025 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001026 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1027 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001028 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1029 return aidl;
1030}
1031
1032ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1033 const media::AudioPortConfigSessionExt& aidl) {
1034 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001035 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001036 return legacy;
1037}
1038
1039ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1040 const audio_port_config_session_ext& legacy) {
1041 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001042 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001043 return aidl;
1044}
1045
1046// This type is unnamed in the original definition, thus we name it here.
1047using audio_port_config_ext = decltype(audio_port_config::ext);
1048
1049ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1050 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1051 media::AudioPortRole role) {
1052 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001053 switch (type) {
1054 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001055 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001056 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001057 break;
1058 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001059 legacy.device = VALUE_OR_RETURN(
1060 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001061 break;
1062 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001063 legacy.mix = VALUE_OR_RETURN(
1064 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001065 break;
1066 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001067 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1068 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001069 break;
1070 default:
1071 LOG_ALWAYS_FATAL("Shouldn't get here");
1072 }
1073 return legacy;
1074}
1075
1076ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1077 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1078 media::AudioPortConfigExt aidl;
1079
1080 switch (type) {
1081 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001082 UNION_SET(aidl, unspecified, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001083 break;
1084 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001085 UNION_SET(aidl, device,
1086 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001087 break;
1088 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001089 UNION_SET(aidl, mix,
1090 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001091 break;
1092 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001093 UNION_SET(aidl, session,
1094 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001095 break;
1096 default:
1097 LOG_ALWAYS_FATAL("Shouldn't get here");
1098 }
1099 return aidl;
1100}
1101
1102ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1103 const media::AudioPortConfig& aidl) {
1104 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001105 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001106 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1107 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1108 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1109 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1110 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1111 }
1112 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1113 legacy.channel_mask =
1114 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1115 }
1116 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1117 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1118 }
1119 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1120 legacy.gain = VALUE_OR_RETURN(
1121 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1122 }
1123 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1124 legacy.flags = VALUE_OR_RETURN(
1125 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1126 }
1127 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1128 return legacy;
1129}
1130
1131ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1132 const audio_port_config& legacy) {
1133 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001134 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001135 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1136 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1137 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1138 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1139 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1140 }
1141 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1142 aidl.channelMask =
1143 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1144 }
1145 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1146 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1147 }
1148 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1149 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1150 legacy.gain, legacy.role, legacy.type));
1151 }
1152 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1153 aidl.flags = VALUE_OR_RETURN(
1154 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1155 }
1156 aidl.ext =
1157 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1158 return aidl;
1159}
1160
1161ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1162 const media::AudioPatch& aidl) {
1163 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001164 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001165 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1166 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1167 return unexpected(BAD_VALUE);
1168 }
1169 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1170 legacy.sinks[i] =
1171 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1172 }
1173 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1174 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1175 return unexpected(BAD_VALUE);
1176 }
1177 for (size_t i = 0; i < legacy.num_sources; ++i) {
1178 legacy.sources[i] =
1179 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1180 }
1181 return legacy;
1182}
1183
1184ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1185 const struct audio_patch& legacy) {
1186 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001187 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001188
1189 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1190 return unexpected(BAD_VALUE);
1191 }
1192 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1193 aidl.sinks.push_back(
1194 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1195 }
1196 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1197 return unexpected(BAD_VALUE);
1198 }
1199 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1200 aidl.sources.push_back(
1201 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1202 }
1203 return aidl;
1204}
1205
1206ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1207 const media::AudioIoDescriptor& aidl) {
1208 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001209 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001210 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1211 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1212 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1213 legacy->mChannelMask =
1214 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1215 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1216 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1217 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001218 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001219 return legacy;
1220}
1221
1222ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1223 const sp<AudioIoDescriptor>& legacy) {
1224 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001225 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001226 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1227 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1228 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001229 aidl.channelMask = VALUE_OR_RETURN(
1230 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001231 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1232 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1233 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001234 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001235 return aidl;
1236}
1237
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001238ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1239 AudioClient legacy;
1240 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1241 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1242 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1243 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1244 return legacy;
1245}
1246
1247ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1248 media::AudioClient aidl;
1249 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1250 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1251 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1252 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1253 return aidl;
1254}
1255
1256ConversionResult<audio_content_type_t>
1257aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1258 switch (aidl) {
1259 case media::AudioContentType::UNKNOWN:
1260 return AUDIO_CONTENT_TYPE_UNKNOWN;
1261 case media::AudioContentType::SPEECH:
1262 return AUDIO_CONTENT_TYPE_SPEECH;
1263 case media::AudioContentType::MUSIC:
1264 return AUDIO_CONTENT_TYPE_MUSIC;
1265 case media::AudioContentType::MOVIE:
1266 return AUDIO_CONTENT_TYPE_MOVIE;
1267 case media::AudioContentType::SONIFICATION:
1268 return AUDIO_CONTENT_TYPE_SONIFICATION;
1269 }
1270 return unexpected(BAD_VALUE);
1271}
1272
1273ConversionResult<media::AudioContentType>
1274legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1275 switch (legacy) {
1276 case AUDIO_CONTENT_TYPE_UNKNOWN:
1277 return media::AudioContentType::UNKNOWN;
1278 case AUDIO_CONTENT_TYPE_SPEECH:
1279 return media::AudioContentType::SPEECH;
1280 case AUDIO_CONTENT_TYPE_MUSIC:
1281 return media::AudioContentType::MUSIC;
1282 case AUDIO_CONTENT_TYPE_MOVIE:
1283 return media::AudioContentType::MOVIE;
1284 case AUDIO_CONTENT_TYPE_SONIFICATION:
1285 return media::AudioContentType::SONIFICATION;
1286 }
1287 return unexpected(BAD_VALUE);
1288}
1289
1290ConversionResult<audio_usage_t>
1291aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1292 switch (aidl) {
1293 case media::AudioUsage::UNKNOWN:
1294 return AUDIO_USAGE_UNKNOWN;
1295 case media::AudioUsage::MEDIA:
1296 return AUDIO_USAGE_MEDIA;
1297 case media::AudioUsage::VOICE_COMMUNICATION:
1298 return AUDIO_USAGE_VOICE_COMMUNICATION;
1299 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1300 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1301 case media::AudioUsage::ALARM:
1302 return AUDIO_USAGE_ALARM;
1303 case media::AudioUsage::NOTIFICATION:
1304 return AUDIO_USAGE_NOTIFICATION;
1305 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1306 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1307 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1308 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1309 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1310 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1311 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1312 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1313 case media::AudioUsage::NOTIFICATION_EVENT:
1314 return AUDIO_USAGE_NOTIFICATION_EVENT;
1315 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1316 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1317 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1318 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1319 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1320 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1321 case media::AudioUsage::GAME:
1322 return AUDIO_USAGE_GAME;
1323 case media::AudioUsage::VIRTUAL_SOURCE:
1324 return AUDIO_USAGE_VIRTUAL_SOURCE;
1325 case media::AudioUsage::ASSISTANT:
1326 return AUDIO_USAGE_ASSISTANT;
1327 case media::AudioUsage::CALL_ASSISTANT:
1328 return AUDIO_USAGE_CALL_ASSISTANT;
1329 case media::AudioUsage::EMERGENCY:
1330 return AUDIO_USAGE_EMERGENCY;
1331 case media::AudioUsage::SAFETY:
1332 return AUDIO_USAGE_SAFETY;
1333 case media::AudioUsage::VEHICLE_STATUS:
1334 return AUDIO_USAGE_VEHICLE_STATUS;
1335 case media::AudioUsage::ANNOUNCEMENT:
1336 return AUDIO_USAGE_ANNOUNCEMENT;
1337 }
1338 return unexpected(BAD_VALUE);
1339}
1340
1341ConversionResult<media::AudioUsage>
1342legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1343 switch (legacy) {
1344 case AUDIO_USAGE_UNKNOWN:
1345 return media::AudioUsage::UNKNOWN;
1346 case AUDIO_USAGE_MEDIA:
1347 return media::AudioUsage::MEDIA;
1348 case AUDIO_USAGE_VOICE_COMMUNICATION:
1349 return media::AudioUsage::VOICE_COMMUNICATION;
1350 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1351 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1352 case AUDIO_USAGE_ALARM:
1353 return media::AudioUsage::ALARM;
1354 case AUDIO_USAGE_NOTIFICATION:
1355 return media::AudioUsage::NOTIFICATION;
1356 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1357 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1358 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1359 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1360 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1361 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1362 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1363 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1364 case AUDIO_USAGE_NOTIFICATION_EVENT:
1365 return media::AudioUsage::NOTIFICATION_EVENT;
1366 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1367 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1368 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1369 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1370 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1371 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1372 case AUDIO_USAGE_GAME:
1373 return media::AudioUsage::GAME;
1374 case AUDIO_USAGE_VIRTUAL_SOURCE:
1375 return media::AudioUsage::VIRTUAL_SOURCE;
1376 case AUDIO_USAGE_ASSISTANT:
1377 return media::AudioUsage::ASSISTANT;
1378 case AUDIO_USAGE_CALL_ASSISTANT:
1379 return media::AudioUsage::CALL_ASSISTANT;
1380 case AUDIO_USAGE_EMERGENCY:
1381 return media::AudioUsage::EMERGENCY;
1382 case AUDIO_USAGE_SAFETY:
1383 return media::AudioUsage::SAFETY;
1384 case AUDIO_USAGE_VEHICLE_STATUS:
1385 return media::AudioUsage::VEHICLE_STATUS;
1386 case AUDIO_USAGE_ANNOUNCEMENT:
1387 return media::AudioUsage::ANNOUNCEMENT;
1388 }
1389 return unexpected(BAD_VALUE);
1390}
1391
1392ConversionResult<audio_flags_mask_t>
1393aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1394 switch (aidl) {
1395 case media::AudioFlag::AUDIBILITY_ENFORCED:
1396 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1397 case media::AudioFlag::SECURE:
1398 return AUDIO_FLAG_SECURE;
1399 case media::AudioFlag::SCO:
1400 return AUDIO_FLAG_SCO;
1401 case media::AudioFlag::BEACON:
1402 return AUDIO_FLAG_BEACON;
1403 case media::AudioFlag::HW_AV_SYNC:
1404 return AUDIO_FLAG_HW_AV_SYNC;
1405 case media::AudioFlag::HW_HOTWORD:
1406 return AUDIO_FLAG_HW_HOTWORD;
1407 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1408 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1409 case media::AudioFlag::BYPASS_MUTE:
1410 return AUDIO_FLAG_BYPASS_MUTE;
1411 case media::AudioFlag::LOW_LATENCY:
1412 return AUDIO_FLAG_LOW_LATENCY;
1413 case media::AudioFlag::DEEP_BUFFER:
1414 return AUDIO_FLAG_DEEP_BUFFER;
1415 case media::AudioFlag::NO_MEDIA_PROJECTION:
1416 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1417 case media::AudioFlag::MUTE_HAPTIC:
1418 return AUDIO_FLAG_MUTE_HAPTIC;
1419 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1420 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1421 case media::AudioFlag::CAPTURE_PRIVATE:
1422 return AUDIO_FLAG_CAPTURE_PRIVATE;
1423 }
1424 return unexpected(BAD_VALUE);
1425}
1426
1427ConversionResult<media::AudioFlag>
1428legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1429 switch (legacy) {
1430 case AUDIO_FLAG_NONE:
1431 return unexpected(BAD_VALUE);
1432 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1433 return media::AudioFlag::AUDIBILITY_ENFORCED;
1434 case AUDIO_FLAG_SECURE:
1435 return media::AudioFlag::SECURE;
1436 case AUDIO_FLAG_SCO:
1437 return media::AudioFlag::SCO;
1438 case AUDIO_FLAG_BEACON:
1439 return media::AudioFlag::BEACON;
1440 case AUDIO_FLAG_HW_AV_SYNC:
1441 return media::AudioFlag::HW_AV_SYNC;
1442 case AUDIO_FLAG_HW_HOTWORD:
1443 return media::AudioFlag::HW_HOTWORD;
1444 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1445 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1446 case AUDIO_FLAG_BYPASS_MUTE:
1447 return media::AudioFlag::BYPASS_MUTE;
1448 case AUDIO_FLAG_LOW_LATENCY:
1449 return media::AudioFlag::LOW_LATENCY;
1450 case AUDIO_FLAG_DEEP_BUFFER:
1451 return media::AudioFlag::DEEP_BUFFER;
1452 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1453 return media::AudioFlag::NO_MEDIA_PROJECTION;
1454 case AUDIO_FLAG_MUTE_HAPTIC:
1455 return media::AudioFlag::MUTE_HAPTIC;
1456 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1457 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1458 case AUDIO_FLAG_CAPTURE_PRIVATE:
1459 return media::AudioFlag::CAPTURE_PRIVATE;
1460 }
1461 return unexpected(BAD_VALUE);
1462}
1463
1464ConversionResult<audio_flags_mask_t>
1465aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1466 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1467 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1468 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1469}
1470
1471ConversionResult<int32_t>
1472legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1473 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001474 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1475 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001476 enumToMask_index<int32_t, media::AudioFlag>);
1477}
1478
1479ConversionResult<audio_attributes_t>
1480aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1481 audio_attributes_t legacy;
1482 legacy.content_type = VALUE_OR_RETURN(
1483 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1484 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1485 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1486 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1487 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1488 return legacy;
1489}
1490
1491ConversionResult<media::AudioAttributesInternal>
1492legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1493 media::AudioAttributesInternal aidl;
1494 aidl.contentType = VALUE_OR_RETURN(
1495 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1496 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1497 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1498 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1499 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1500 return aidl;
1501}
1502
1503ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001504aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001505 switch (aidl) {
1506 case media::AudioEncapsulationMode::NONE:
1507 return AUDIO_ENCAPSULATION_MODE_NONE;
1508 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1509 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1510 case media::AudioEncapsulationMode::HANDLE:
1511 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1512 }
1513 return unexpected(BAD_VALUE);
1514}
1515
1516ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001517legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001518 switch (legacy) {
1519 case AUDIO_ENCAPSULATION_MODE_NONE:
1520 return media::AudioEncapsulationMode::NONE;
1521 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1522 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1523 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1524 return media::AudioEncapsulationMode::HANDLE;
1525 }
1526 return unexpected(BAD_VALUE);
1527}
1528
1529ConversionResult<audio_offload_info_t>
1530aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1531 audio_offload_info_t legacy;
1532 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1533 legacy.size = sizeof(audio_offload_info_t);
1534 audio_config_base_t config = VALUE_OR_RETURN(
1535 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1536 legacy.sample_rate = config.sample_rate;
1537 legacy.channel_mask = config.channel_mask;
1538 legacy.format = config.format;
1539 legacy.stream_type = VALUE_OR_RETURN(
1540 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1541 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1542 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1543 legacy.has_video = aidl.hasVideo;
1544 legacy.is_streaming = aidl.isStreaming;
1545 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1546 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1547 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1548 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001549 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001550 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1551 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1552 return legacy;
1553}
1554
1555ConversionResult<media::AudioOffloadInfo>
1556legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1557 media::AudioOffloadInfo aidl;
1558 // Version 0.1 fields.
1559 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1560 return unexpected(BAD_VALUE);
1561 }
1562 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1563 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1564 aidl.config.channelMask = VALUE_OR_RETURN(
1565 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1566 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1567 aidl.streamType = VALUE_OR_RETURN(
1568 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1569 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1570 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1571 aidl.hasVideo = legacy.has_video;
1572 aidl.isStreaming = legacy.is_streaming;
1573 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1574 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1575 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1576
1577 // Version 0.2 fields.
1578 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1579 if (legacy.size <
1580 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1581 return unexpected(BAD_VALUE);
1582 }
1583 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001584 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001585 legacy.encapsulation_mode));
1586 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1587 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1588 }
1589 return aidl;
1590}
1591
1592ConversionResult<audio_config_t>
1593aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1594 audio_config_t legacy;
1595 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001596 legacy.channel_mask = VALUE_OR_RETURN(
1597 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001598 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001599 legacy.offload_info = VALUE_OR_RETURN(
1600 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001601 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1602 return legacy;
1603}
1604
1605ConversionResult<media::AudioConfig>
1606legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1607 media::AudioConfig aidl;
1608 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001609 aidl.channelMask = VALUE_OR_RETURN(
1610 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001611 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001612 aidl.offloadInfo = VALUE_OR_RETURN(
1613 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001614 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1615 return aidl;
1616}
1617
1618ConversionResult<audio_config_base_t>
1619aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1620 audio_config_base_t legacy;
1621 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001622 legacy.channel_mask = VALUE_OR_RETURN(
1623 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001624 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1625 return legacy;
1626}
1627
1628ConversionResult<media::AudioConfigBase>
1629legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1630 media::AudioConfigBase aidl;
1631 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001632 aidl.channelMask = VALUE_OR_RETURN(
1633 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001634 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1635 return aidl;
1636}
1637
1638ConversionResult<sp<IMemory>>
1639aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1640 sp<IMemory> legacy;
1641 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1642 return unexpected(BAD_VALUE);
1643 }
1644 return legacy;
1645}
1646
1647ConversionResult<media::SharedFileRegion>
1648legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1649 media::SharedFileRegion aidl;
1650 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1651 return unexpected(BAD_VALUE);
1652 }
1653 return aidl;
1654}
1655
1656ConversionResult<sp<IMemory>>
1657aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1658 sp<IMemory> legacy;
1659 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1660 return unexpected(BAD_VALUE);
1661 }
1662 return legacy;
1663}
1664
1665ConversionResult<std::optional<media::SharedFileRegion>>
1666legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1667 std::optional<media::SharedFileRegion> aidl;
1668 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1669 return unexpected(BAD_VALUE);
1670 }
1671 return aidl;
1672}
1673
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001674ConversionResult<AudioTimestamp>
1675aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1676 AudioTimestamp legacy;
1677 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1678 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1679 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1680 return legacy;
1681}
1682
1683ConversionResult<media::AudioTimestampInternal>
1684legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1685 media::AudioTimestampInternal aidl;
1686 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1687 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1688 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1689 return aidl;
1690}
1691
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001692ConversionResult<audio_uuid_t>
1693aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1694 audio_uuid_t legacy;
1695 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1696 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1697 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1698 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1699 if (aidl.node.size() != std::size(legacy.node)) {
1700 return unexpected(BAD_VALUE);
1701 }
1702 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1703 return legacy;
1704}
1705
1706ConversionResult<media::AudioUuid>
1707legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1708 media::AudioUuid aidl;
1709 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1710 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1711 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1712 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1713 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1714 return aidl;
1715}
1716
1717ConversionResult<effect_descriptor_t>
1718aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1719 effect_descriptor_t legacy;
1720 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1721 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1722 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1723 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1724 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1725 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1726 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1727 RETURN_IF_ERROR(
1728 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1729 return legacy;
1730}
1731
1732ConversionResult<media::EffectDescriptor>
1733legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1734 media::EffectDescriptor aidl;
1735 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1736 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1737 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1738 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1739 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1740 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1741 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1742 aidl.implementor = VALUE_OR_RETURN(
1743 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1744 return aidl;
1745}
1746
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001747ConversionResult<audio_encapsulation_metadata_type_t>
1748aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1749 media::AudioEncapsulationMetadataType aidl) {
1750 switch (aidl) {
1751 case media::AudioEncapsulationMetadataType::NONE:
1752 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1753 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1754 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1755 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1756 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1757 }
1758 return unexpected(BAD_VALUE);
1759}
1760
1761ConversionResult<media::AudioEncapsulationMetadataType>
1762legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1763 audio_encapsulation_metadata_type_t legacy) {
1764 switch (legacy) {
1765 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1766 return media::AudioEncapsulationMetadataType::NONE;
1767 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1768 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1769 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1770 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1771 }
1772 return unexpected(BAD_VALUE);
1773}
1774
1775ConversionResult<uint32_t>
1776aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1777 return convertBitmask<uint32_t,
1778 int32_t,
1779 audio_encapsulation_mode_t,
1780 media::AudioEncapsulationMode>(
1781 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1782 index2enum_index<media::AudioEncapsulationMode>,
1783 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1784}
1785
1786ConversionResult<int32_t>
1787legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1788 return convertBitmask<int32_t,
1789 uint32_t,
1790 media::AudioEncapsulationMode,
1791 audio_encapsulation_mode_t>(
1792 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1793 index2enum_index<audio_encapsulation_mode_t>,
1794 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1795}
1796
1797ConversionResult<uint32_t>
1798aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1799 return convertBitmask<uint32_t,
1800 int32_t,
1801 audio_encapsulation_metadata_type_t,
1802 media::AudioEncapsulationMetadataType>(
1803 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1804 index2enum_index<media::AudioEncapsulationMetadataType>,
1805 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1806}
1807
1808ConversionResult<int32_t>
1809legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1810 return convertBitmask<int32_t,
1811 uint32_t,
1812 media::AudioEncapsulationMetadataType,
1813 audio_encapsulation_metadata_type_t>(
1814 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1815 index2enum_index<audio_encapsulation_metadata_type_t>,
1816 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1817}
1818
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001819ConversionResult<audio_mix_latency_class_t>
1820aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(
1821 media::AudioMixLatencyClass aidl) {
1822 switch (aidl) {
1823 case media::AudioMixLatencyClass::LOW:
1824 return AUDIO_LATENCY_LOW;
1825 case media::AudioMixLatencyClass::NORMAL:
1826 return AUDIO_LATENCY_NORMAL;
1827 }
1828 return unexpected(BAD_VALUE);
1829}
1830
1831ConversionResult<media::AudioMixLatencyClass>
1832legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(
1833 audio_mix_latency_class_t legacy) {
1834 switch (legacy) {
1835 case AUDIO_LATENCY_LOW:
1836 return media::AudioMixLatencyClass::LOW;
1837 case AUDIO_LATENCY_NORMAL:
1838 return media::AudioMixLatencyClass::NORMAL;
1839 }
1840 return unexpected(BAD_VALUE);
1841}
1842
1843ConversionResult<audio_port_device_ext>
1844aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const media::AudioPortDeviceExt& aidl) {
1845 audio_port_device_ext legacy;
1846 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1847 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.device.type));
1848 RETURN_IF_ERROR(
1849 aidl2legacy_string(aidl.device.address, legacy.address, sizeof(legacy.address)));
1850 legacy.encapsulation_modes = VALUE_OR_RETURN(
1851 aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
1852 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
1853 aidl2legacy_AudioEncapsulationMetadataType_mask(aidl.encapsulationMetadataTypes));
1854 return legacy;
1855}
1856
1857ConversionResult<media::AudioPortDeviceExt>
1858legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext& legacy) {
1859 media::AudioPortDeviceExt aidl;
1860 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1861 aidl.device.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
1862 aidl.device.address = VALUE_OR_RETURN(
1863 legacy2aidl_string(legacy.address, sizeof(legacy.address)));
1864 aidl.encapsulationModes = VALUE_OR_RETURN(
1865 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
1866 aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
1867 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
1868 return aidl;
1869}
1870
1871ConversionResult<audio_port_mix_ext>
1872aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const media::AudioPortMixExt& aidl) {
1873 audio_port_mix_ext legacy;
1874 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1875 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
1876 legacy.latency_class = VALUE_OR_RETURN(
1877 aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(aidl.latencyClass));
1878 return legacy;
1879}
1880
1881ConversionResult<media::AudioPortMixExt>
1882legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy) {
1883 media::AudioPortMixExt aidl;
1884 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1885 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1886 aidl.latencyClass = VALUE_OR_RETURN(
1887 legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(legacy.latency_class));
1888 return aidl;
1889}
1890
1891ConversionResult<audio_port_session_ext>
1892aidl2legacy_AudioPortSessionExt_audio_port_session_ext(const media::AudioPortSessionExt& aidl) {
1893 audio_port_session_ext legacy;
1894 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
1895 return legacy;
1896}
1897
1898ConversionResult<media::AudioPortSessionExt>
1899legacy2aidl_audio_port_session_ext_AudioPortSessionExt(const audio_port_session_ext& legacy) {
1900 media::AudioPortSessionExt aidl;
1901 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
1902 return aidl;
1903}
1904
1905// This type is unnamed in the original definition, thus we name it here.
1906using audio_port_v7_ext = decltype(audio_port_v7::ext);
1907
1908ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt(
1909 const media::AudioPortExt& aidl, media::AudioPortType type) {
1910 audio_port_v7_ext legacy;
1911 switch (type) {
1912 case media::AudioPortType::NONE:
1913 // Just verify that the union is empty.
1914 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
1915 break;
1916 case media::AudioPortType::DEVICE:
1917 legacy.device = VALUE_OR_RETURN(
1918 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
1919 VALUE_OR_RETURN(UNION_GET(aidl, device))));
1920 break;
1921 case media::AudioPortType::MIX:
1922 legacy.mix = VALUE_OR_RETURN(
1923 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
1924 VALUE_OR_RETURN(UNION_GET(aidl, mix))));
1925 break;
1926 case media::AudioPortType::SESSION:
1927 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortSessionExt_audio_port_session_ext(
1928 VALUE_OR_RETURN(UNION_GET(aidl, session))));
1929 break;
1930 default:
1931 LOG_ALWAYS_FATAL("Shouldn't get here");
1932 }
1933 return legacy;
1934}
1935
1936ConversionResult<media::AudioPortExt> legacy2aidl_AudioPortExt(
1937 const audio_port_v7_ext& legacy, audio_port_type_t type) {
1938 media::AudioPortExt aidl;
1939 switch (type) {
1940 case AUDIO_PORT_TYPE_NONE:
1941 UNION_SET(aidl, unspecified, false);
1942 break;
1943 case AUDIO_PORT_TYPE_DEVICE:
1944 UNION_SET(aidl, device,
1945 VALUE_OR_RETURN(
1946 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device)));
1947 break;
1948 case AUDIO_PORT_TYPE_MIX:
1949 UNION_SET(aidl, mix,
1950 VALUE_OR_RETURN(legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix)));
1951 break;
1952 case AUDIO_PORT_TYPE_SESSION:
1953 UNION_SET(aidl, session,
1954 VALUE_OR_RETURN(legacy2aidl_audio_port_session_ext_AudioPortSessionExt(
1955 legacy.session)));
1956 break;
1957 default:
1958 LOG_ALWAYS_FATAL("Shouldn't get here");
1959 }
1960 return aidl;
1961}
1962
1963ConversionResult<audio_profile>
1964aidl2legacy_AudioProfile_audio_profile(const media::AudioProfile& aidl) {
1965 audio_profile legacy;
1966 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1967
1968 if (aidl.samplingRates.size() > std::size(legacy.sample_rates)) {
1969 return unexpected(BAD_VALUE);
1970 }
1971 RETURN_IF_ERROR(
1972 convertRange(aidl.samplingRates.begin(), aidl.samplingRates.end(), legacy.sample_rates,
1973 convertIntegral<int32_t, unsigned int>));
1974 legacy.num_sample_rates = aidl.samplingRates.size();
1975
1976 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
1977 return unexpected(BAD_VALUE);
1978 }
1979 RETURN_IF_ERROR(
1980 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
1981 aidl2legacy_int32_t_audio_channel_mask_t));
1982 legacy.num_channel_masks = aidl.channelMasks.size();
1983 return legacy;
1984}
1985
1986ConversionResult<media::AudioProfile>
1987legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy) {
1988 media::AudioProfile aidl;
1989 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1990
1991 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
1992 return unexpected(BAD_VALUE);
1993 }
1994 RETURN_IF_ERROR(
1995 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
1996 std::back_inserter(aidl.samplingRates),
1997 convertIntegral<unsigned int, int32_t>));
1998
1999 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2000 return unexpected(BAD_VALUE);
2001 }
2002 RETURN_IF_ERROR(
2003 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2004 std::back_inserter(aidl.channelMasks),
2005 legacy2aidl_audio_channel_mask_t_int32_t));
2006 return aidl;
2007}
2008
2009ConversionResult<audio_gain>
2010aidl2legacy_AudioGain_audio_gain(const media::AudioGain& aidl) {
2011 audio_gain legacy;
2012 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
2013 legacy.channel_mask = VALUE_OR_RETURN(
2014 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
2015 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2016 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2017 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2018 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2019 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2020 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2021 return legacy;
2022}
2023
2024ConversionResult<media::AudioGain>
2025legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy) {
2026 media::AudioGain aidl;
2027 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_mask_int32_t(legacy.mode));
2028 aidl.channelMask = VALUE_OR_RETURN(
2029 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
2030 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2031 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2032 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2033 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2034 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2035 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2036 return aidl;
2037}
2038
2039ConversionResult<audio_port_v7>
2040aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2041 audio_port_v7 legacy;
2042 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2043 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
2044 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
2045 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2046
2047 if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2048 return unexpected(BAD_VALUE);
2049 }
2050 RETURN_IF_ERROR(convertRange(aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
2051 aidl2legacy_AudioProfile_audio_profile));
2052 legacy.num_audio_profiles = aidl.profiles.size();
2053
2054 if (aidl.gains.size() > std::size(legacy.gains)) {
2055 return unexpected(BAD_VALUE);
2056 }
2057 RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2058 aidl2legacy_AudioGain_audio_gain));
2059 legacy.num_gains = aidl.gains.size();
2060
2061 legacy.active_config = VALUE_OR_RETURN(
2062 aidl2legacy_AudioPortConfig_audio_port_config(aidl.activeConfig));
2063 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortExt(aidl.ext, aidl.type));
2064 return legacy;
2065}
2066
2067ConversionResult<media::AudioPort>
2068legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2069 media::AudioPort aidl;
2070 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2071 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2072 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2073 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2074
2075 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2076 return unexpected(BAD_VALUE);
2077 }
2078 RETURN_IF_ERROR(
2079 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2080 std::back_inserter(aidl.profiles),
2081 legacy2aidl_audio_profile_AudioProfile));
2082
2083 if (legacy.num_gains > std::size(legacy.gains)) {
2084 return unexpected(BAD_VALUE);
2085 }
2086 RETURN_IF_ERROR(
2087 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2088 std::back_inserter(aidl.gains),
2089 legacy2aidl_audio_gain_AudioGain));
2090
2091 aidl.activeConfig = VALUE_OR_RETURN(
2092 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
2093 aidl.ext = VALUE_OR_RETURN(legacy2aidl_AudioPortExt(legacy.ext, legacy.type));
2094 return aidl;
2095}
2096
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002097ConversionResult<audio_mode_t>
2098aidl2legacy_AudioMode_audio_mode_t(media::AudioMode aidl) {
2099 switch (aidl) {
2100 case media::AudioMode::INVALID:
2101 return AUDIO_MODE_INVALID;
2102 case media::AudioMode::CURRENT:
2103 return AUDIO_MODE_CURRENT;
2104 case media::AudioMode::NORMAL:
2105 return AUDIO_MODE_NORMAL;
2106 case media::AudioMode::RINGTONE:
2107 return AUDIO_MODE_RINGTONE;
2108 case media::AudioMode::IN_CALL:
2109 return AUDIO_MODE_IN_CALL;
2110 case media::AudioMode::IN_COMMUNICATION:
2111 return AUDIO_MODE_IN_COMMUNICATION;
2112 case media::AudioMode::CALL_SCREEN:
2113 return AUDIO_MODE_CALL_SCREEN;
2114 }
2115 return unexpected(BAD_VALUE);
2116}
2117
2118ConversionResult<media::AudioMode>
2119legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2120 switch (legacy) {
2121 case AUDIO_MODE_INVALID:
2122 return media::AudioMode::INVALID;
2123 case AUDIO_MODE_CURRENT:
2124 return media::AudioMode::CURRENT;
2125 case AUDIO_MODE_NORMAL:
2126 return media::AudioMode::NORMAL;
2127 case AUDIO_MODE_RINGTONE:
2128 return media::AudioMode::RINGTONE;
2129 case AUDIO_MODE_IN_CALL:
2130 return media::AudioMode::IN_CALL;
2131 case AUDIO_MODE_IN_COMMUNICATION:
2132 return media::AudioMode::IN_COMMUNICATION;
2133 case AUDIO_MODE_CALL_SCREEN:
2134 return media::AudioMode::CALL_SCREEN;
2135 case AUDIO_MODE_CNT:
2136 break;
2137 }
2138 return unexpected(BAD_VALUE);
2139}
2140
2141ConversionResult<audio_unique_id_use_t>
2142aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2143 switch (aidl) {
2144 case media::AudioUniqueIdUse::UNSPECIFIED:
2145 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2146 case media::AudioUniqueIdUse::SESSION:
2147 return AUDIO_UNIQUE_ID_USE_SESSION;
2148 case media::AudioUniqueIdUse::MODULE:
2149 return AUDIO_UNIQUE_ID_USE_MODULE;
2150 case media::AudioUniqueIdUse::EFFECT:
2151 return AUDIO_UNIQUE_ID_USE_EFFECT;
2152 case media::AudioUniqueIdUse::PATCH:
2153 return AUDIO_UNIQUE_ID_USE_PATCH;
2154 case media::AudioUniqueIdUse::OUTPUT:
2155 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2156 case media::AudioUniqueIdUse::INPUT:
2157 return AUDIO_UNIQUE_ID_USE_INPUT;
2158 case media::AudioUniqueIdUse::CLIENT:
2159 return AUDIO_UNIQUE_ID_USE_CLIENT;
2160 }
2161 return unexpected(BAD_VALUE);
2162}
2163
2164ConversionResult<media::AudioUniqueIdUse>
2165legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2166 switch (legacy) {
2167 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2168 return media::AudioUniqueIdUse::UNSPECIFIED;
2169 case AUDIO_UNIQUE_ID_USE_SESSION:
2170 return media::AudioUniqueIdUse::SESSION;
2171 case AUDIO_UNIQUE_ID_USE_MODULE:
2172 return media::AudioUniqueIdUse::MODULE;
2173 case AUDIO_UNIQUE_ID_USE_EFFECT:
2174 return media::AudioUniqueIdUse::EFFECT;
2175 case AUDIO_UNIQUE_ID_USE_PATCH:
2176 return media::AudioUniqueIdUse::PATCH;
2177 case AUDIO_UNIQUE_ID_USE_OUTPUT:
2178 return media::AudioUniqueIdUse::OUTPUT;
2179 case AUDIO_UNIQUE_ID_USE_INPUT:
2180 return media::AudioUniqueIdUse::INPUT;
2181 case AUDIO_UNIQUE_ID_USE_CLIENT:
2182 return media::AudioUniqueIdUse::CLIENT;
2183 case AUDIO_UNIQUE_ID_USE_MAX:
2184 break;
2185 }
2186 return unexpected(BAD_VALUE);
2187}
2188
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07002189} // namespace android