blob: 64da1dc468600b7e12cf9ae97e1c940ed9c6002c [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
19#include <system/audio.h>
20#include <utils/Log.h>
21
22#include "media/AidlConversion.h"
23
24#define VALUE_OR_RETURN(result) \
25 ({ \
26 auto _tmp = (result); \
27 if (!_tmp.ok()) return unexpected(_tmp.error()); \
28 _tmp.value(); \
29 })
30
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -070031#define RETURN_IF_ERROR(result) \
32 if (status_t _tmp = (result); _tmp != OK) return unexpected(_tmp);
33
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070034////////////////////////////////////////////////////////////////////////////////////////////////////
35// Utilities
36
37namespace android {
38
39using base::unexpected;
40
41namespace {
42
43////////////////////////////////////////////////////////////////////////////////////////////////////
44// The code below establishes:
45// IntegralTypeOf<T>, which works for either integral types (in which case it evaluates to T), or
46// enum types (in which case it evaluates to std::underlying_type_T<T>).
47
48template<typename T, typename = std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>>
49struct IntegralTypeOfStruct {
50 using Type = T;
51};
52
53template<typename T>
54struct IntegralTypeOfStruct<T, std::enable_if_t<std::is_enum_v<T>>> {
55 using Type = std::underlying_type_t<T>;
56};
57
58template<typename T>
59using IntegralTypeOf = typename IntegralTypeOfStruct<T>::Type;
60
61////////////////////////////////////////////////////////////////////////////////////////////////////
62// Utilities for handling bitmasks.
63
64template<typename Enum>
65Enum index2enum_index(int index) {
66 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
67 return static_cast<Enum>(index);
68}
69
70template<typename Enum>
71Enum index2enum_bitmask(int index) {
72 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
73 return static_cast<Enum>(1 << index);
74}
75
76template<typename Mask, typename Enum>
77Mask enumToMask_bitmask(Enum e) {
78 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
79 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
80 return static_cast<Mask>(e);
81}
82
83template<typename Mask, typename Enum>
84Mask enumToMask_index(Enum e) {
85 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
86 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
87 return static_cast<Mask>(static_cast<std::make_unsigned_t<IntegralTypeOf<Mask>>>(1)
88 << static_cast<int>(e));
89}
90
91template<typename DestMask, typename SrcMask, typename DestEnum, typename SrcEnum>
92ConversionResult<DestMask> convertBitmask(
93 SrcMask src, const std::function<ConversionResult<DestEnum>(SrcEnum)>& enumConversion,
94 const std::function<SrcEnum(int)>& srcIndexToEnum,
95 const std::function<DestMask(DestEnum)>& destEnumToMask) {
96 using UnsignedDestMask = std::make_unsigned_t<IntegralTypeOf<DestMask>>;
97 using UnsignedSrcMask = std::make_unsigned_t<IntegralTypeOf<SrcMask>>;
98
99 UnsignedDestMask dest = static_cast<UnsignedDestMask>(0);
100 UnsignedSrcMask usrc = static_cast<UnsignedSrcMask>(src);
101
102 int srcBitIndex = 0;
103 while (usrc != 0) {
104 if (usrc & 1) {
105 SrcEnum srcEnum = srcIndexToEnum(srcBitIndex);
106 DestEnum destEnum = VALUE_OR_RETURN(enumConversion(srcEnum));
107 DestMask destMask = destEnumToMask(destEnum);
108 dest |= destMask;
109 }
110 ++srcBitIndex;
111 usrc >>= 1;
112 }
113 return static_cast<DestMask>(dest);
114}
115
116template<typename Mask, typename Enum>
117bool bitmaskIsSet(Mask mask, Enum index) {
118 return (mask & enumToMask_index<Mask, Enum>(index)) != 0;
119}
120
121////////////////////////////////////////////////////////////////////////////////////////////////////
122
123template<typename To, typename From>
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700124ConversionResult<To> convertReinterpret(From from) {
125 static_assert(sizeof(From) == sizeof(To));
126 return static_cast<To>(from);
127}
128
129enum class Direction {
130 INPUT, OUTPUT
131};
132
133ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
134 switch (type) {
135 case media::AudioPortType::DEVICE:
136 switch (role) {
137 case media::AudioPortRole::SOURCE:
138 return Direction::INPUT;
139 case media::AudioPortRole::SINK:
140 return Direction::OUTPUT;
141 default:
142 break;
143 }
144 break;
145 case media::AudioPortType::MIX:
146 switch (role) {
147 case media::AudioPortRole::SOURCE:
148 return Direction::OUTPUT;
149 case media::AudioPortRole::SINK:
150 return Direction::INPUT;
151 default:
152 break;
153 }
154 break;
155 default:
156 break;
157 }
158 return unexpected(BAD_VALUE);
159}
160
161ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
162 switch (type) {
163 case AUDIO_PORT_TYPE_DEVICE:
164 switch (role) {
165 case AUDIO_PORT_ROLE_SOURCE:
166 return Direction::INPUT;
167 case AUDIO_PORT_ROLE_SINK:
168 return Direction::OUTPUT;
169 default:
170 break;
171 }
172 break;
173 case AUDIO_PORT_TYPE_MIX:
174 switch (role) {
175 case AUDIO_PORT_ROLE_SOURCE:
176 return Direction::OUTPUT;
177 case AUDIO_PORT_ROLE_SINK:
178 return Direction::INPUT;
179 default:
180 break;
181 }
182 break;
183 default:
184 break;
185 }
186 return unexpected(BAD_VALUE);
187}
188
189} // namespace
190
191////////////////////////////////////////////////////////////////////////////////////////////////////
192// Converters
193
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700194status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
195 if (aidl.size() > maxSize - 1) {
196 return BAD_VALUE;
197 }
198 aidl.copy(dest, aidl.size());
199 dest[aidl.size()] = '\0';
200 return OK;
201}
202
203ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
204 if (legacy == nullptr) {
205 return unexpected(BAD_VALUE);
206 }
207 if (strnlen(legacy, maxSize) == maxSize) {
208 // No null-terminator.
209 return unexpected(BAD_VALUE);
210 }
211 return std::string(legacy);
212}
213
214ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
215 return convertReinterpret<audio_module_handle_t>(aidl);
216}
217
218ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
219 return convertReinterpret<int32_t>(legacy);
220}
221
222ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
223 return convertReinterpret<audio_io_handle_t>(aidl);
224}
225
226ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
227 return convertReinterpret<int32_t>(legacy);
228}
229
230ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
231 return convertReinterpret<audio_port_handle_t>(aidl);
232}
233
234ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
235 return convertReinterpret<int32_t>(legacy);
236}
237
238ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
239 return convertReinterpret<audio_patch_handle_t>(aidl);
240}
241
242ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
243 return convertReinterpret<int32_t>(legacy);
244}
245
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700246// The legacy enum is unnamed. Thus, we use int.
247ConversionResult<int> aidl2legacy_AudioPortConfigType(media::AudioPortConfigType aidl) {
248 switch (aidl) {
249 case media::AudioPortConfigType::SAMPLE_RATE:
250 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
251 case media::AudioPortConfigType::CHANNEL_MASK:
252 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
253 case media::AudioPortConfigType::FORMAT:
254 return AUDIO_PORT_CONFIG_FORMAT;
255 case media::AudioPortConfigType::FLAGS:
256 return AUDIO_PORT_CONFIG_FLAGS;
257 default:
258 return unexpected(BAD_VALUE);
259 }
260}
261
262// The legacy enum is unnamed. Thus, we use int.
263ConversionResult<media::AudioPortConfigType> legacy2aidl_AudioPortConfigType(int legacy) {
264 switch (legacy) {
265 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
266 return media::AudioPortConfigType::SAMPLE_RATE;
267 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
268 return media::AudioPortConfigType::CHANNEL_MASK;
269 case AUDIO_PORT_CONFIG_FORMAT:
270 return media::AudioPortConfigType::FORMAT;
271 case AUDIO_PORT_CONFIG_FLAGS:
272 return media::AudioPortConfigType::FLAGS;
273 default:
274 return unexpected(BAD_VALUE);
275 }
276}
277
278ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
279 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
280 aidl, aidl2legacy_AudioPortConfigType,
281 // AudioPortConfigType enum is index-based.
282 index2enum_index<media::AudioPortConfigType>,
283 // AUDIO_PORT_CONFIG_* flags are mask-based.
284 enumToMask_bitmask<unsigned int, int>);
285}
286
287ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
288 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
289 legacy, legacy2aidl_AudioPortConfigType,
290 // AUDIO_PORT_CONFIG_* flags are mask-based.
291 index2enum_bitmask<unsigned>,
292 // AudioPortConfigType enum is index-based.
293 enumToMask_index<int32_t, media::AudioPortConfigType>);
294}
295
296ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
297 // TODO(ytai): should we convert bit-by-bit?
298 // One problem here is that the representation is both opaque and is different based on the
299 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
300 return convertReinterpret<audio_channel_mask_t>(aidl);
301}
302
303ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
304 // TODO(ytai): should we convert bit-by-bit?
305 // One problem here is that the representation is both opaque and is different based on the
306 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
307 return convertReinterpret<int32_t>(legacy);
308}
309
310ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
311 media::AudioIoConfigEvent aidl) {
312 switch (aidl) {
313 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
314 return AUDIO_OUTPUT_REGISTERED;
315 case media::AudioIoConfigEvent::OUTPUT_OPENED:
316 return AUDIO_OUTPUT_OPENED;
317 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
318 return AUDIO_OUTPUT_CLOSED;
319 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
320 return AUDIO_OUTPUT_CONFIG_CHANGED;
321 case media::AudioIoConfigEvent::INPUT_REGISTERED:
322 return AUDIO_INPUT_REGISTERED;
323 case media::AudioIoConfigEvent::INPUT_OPENED:
324 return AUDIO_INPUT_OPENED;
325 case media::AudioIoConfigEvent::INPUT_CLOSED:
326 return AUDIO_INPUT_CLOSED;
327 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
328 return AUDIO_INPUT_CONFIG_CHANGED;
329 case media::AudioIoConfigEvent::CLIENT_STARTED:
330 return AUDIO_CLIENT_STARTED;
331 default:
332 return unexpected(BAD_VALUE);
333 }
334}
335
336ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
337 audio_io_config_event legacy) {
338 switch (legacy) {
339 case AUDIO_OUTPUT_REGISTERED:
340 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
341 case AUDIO_OUTPUT_OPENED:
342 return media::AudioIoConfigEvent::OUTPUT_OPENED;
343 case AUDIO_OUTPUT_CLOSED:
344 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
345 case AUDIO_OUTPUT_CONFIG_CHANGED:
346 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
347 case AUDIO_INPUT_REGISTERED:
348 return media::AudioIoConfigEvent::INPUT_REGISTERED;
349 case AUDIO_INPUT_OPENED:
350 return media::AudioIoConfigEvent::INPUT_OPENED;
351 case AUDIO_INPUT_CLOSED:
352 return media::AudioIoConfigEvent::INPUT_CLOSED;
353 case AUDIO_INPUT_CONFIG_CHANGED:
354 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
355 case AUDIO_CLIENT_STARTED:
356 return media::AudioIoConfigEvent::CLIENT_STARTED;
357 default:
358 return unexpected(BAD_VALUE);
359 }
360}
361
362ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
363 media::AudioPortRole aidl) {
364 switch (aidl) {
365 case media::AudioPortRole::NONE:
366 return AUDIO_PORT_ROLE_NONE;
367 case media::AudioPortRole::SOURCE:
368 return AUDIO_PORT_ROLE_SOURCE;
369 case media::AudioPortRole::SINK:
370 return AUDIO_PORT_ROLE_SINK;
371 default:
372 return unexpected(BAD_VALUE);
373 }
374}
375
376ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
377 audio_port_role_t legacy) {
378 switch (legacy) {
379 case AUDIO_PORT_ROLE_NONE:
380 return media::AudioPortRole::NONE;
381 case AUDIO_PORT_ROLE_SOURCE:
382 return media::AudioPortRole::SOURCE;
383 case AUDIO_PORT_ROLE_SINK:
384 return media::AudioPortRole::SINK;
385 default:
386 return unexpected(BAD_VALUE);
387 }
388}
389
390ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
391 media::AudioPortType aidl) {
392 switch (aidl) {
393 case media::AudioPortType::NONE:
394 return AUDIO_PORT_TYPE_NONE;
395 case media::AudioPortType::DEVICE:
396 return AUDIO_PORT_TYPE_DEVICE;
397 case media::AudioPortType::MIX:
398 return AUDIO_PORT_TYPE_MIX;
399 case media::AudioPortType::SESSION:
400 return AUDIO_PORT_TYPE_SESSION;
401 default:
402 return unexpected(BAD_VALUE);
403 }
404}
405
406ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
407 audio_port_type_t legacy) {
408 switch (legacy) {
409 case AUDIO_PORT_TYPE_NONE:
410 return media::AudioPortType::NONE;
411 case AUDIO_PORT_TYPE_DEVICE:
412 return media::AudioPortType::DEVICE;
413 case AUDIO_PORT_TYPE_MIX:
414 return media::AudioPortType::MIX;
415 case AUDIO_PORT_TYPE_SESSION:
416 return media::AudioPortType::SESSION;
417 default:
418 return unexpected(BAD_VALUE);
419 }
420}
421
422ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
423 media::audio::common::AudioFormat aidl) {
424 // This relies on AudioFormat being kept in sync with audio_format_t.
425 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
426 return static_cast<audio_format_t>(aidl);
427}
428
429ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
430 audio_format_t legacy) {
431 // This relies on AudioFormat being kept in sync with audio_format_t.
432 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
433 return static_cast<media::audio::common::AudioFormat>(legacy);
434}
435
436ConversionResult<int> aidl2legacy_AudioGainMode_int(media::AudioGainMode aidl) {
437 switch (aidl) {
438 case media::AudioGainMode::JOINT:
439 return AUDIO_GAIN_MODE_JOINT;
440 case media::AudioGainMode::CHANNELS:
441 return AUDIO_GAIN_MODE_CHANNELS;
442 case media::AudioGainMode::RAMP:
443 return AUDIO_GAIN_MODE_RAMP;
444 default:
445 return unexpected(BAD_VALUE);
446 }
447}
448
449ConversionResult<media::AudioGainMode> legacy2aidl_int_AudioGainMode(int legacy) {
450 switch (legacy) {
451 case AUDIO_GAIN_MODE_JOINT:
452 return media::AudioGainMode::JOINT;
453 case AUDIO_GAIN_MODE_CHANNELS:
454 return media::AudioGainMode::CHANNELS;
455 case AUDIO_GAIN_MODE_RAMP:
456 return media::AudioGainMode::RAMP;
457 default:
458 return unexpected(BAD_VALUE);
459 }
460}
461
462ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t(int32_t aidl) {
463 return convertBitmask<audio_gain_mode_t, int32_t, int, media::AudioGainMode>(
464 aidl, aidl2legacy_AudioGainMode_int,
465 // AudioGainMode is index-based.
466 index2enum_index<media::AudioGainMode>,
467 // AUDIO_GAIN_MODE_* constants are mask-based.
468 enumToMask_bitmask<audio_gain_mode_t, int>);
469}
470
471ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t(audio_gain_mode_t legacy) {
472 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, int>(
473 legacy, legacy2aidl_int_AudioGainMode,
474 // AUDIO_GAIN_MODE_* constants are mask-based.
475 index2enum_bitmask<int>,
476 // AudioGainMode is index-based.
477 enumToMask_index<int32_t, media::AudioGainMode>);
478}
479
480ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
481 // TODO(ytai): bitfield?
482 return convertReinterpret<audio_devices_t>(aidl);
483}
484
485ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
486 // TODO(ytai): bitfield?
487 return convertReinterpret<int32_t>(legacy);
488}
489
490ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
491 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
492 audio_gain_config legacy;
493 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
494 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t(aidl.mode));
495 legacy.channel_mask =
496 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
497 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
498 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
499 size_t numValues = isJoint ? 1
500 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
501 : audio_channel_count_from_out_mask(legacy.channel_mask);
502 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
503 return unexpected(BAD_VALUE);
504 }
505 for (size_t i = 0; i < numValues; ++i) {
506 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
507 }
508 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
509 return legacy;
510}
511
512ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
513 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
514 media::AudioGainConfig aidl;
515 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
516 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t(legacy.mode));
517 aidl.channelMask =
518 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
519 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
520 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
521 size_t numValues = isJoint ? 1
522 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
523 : audio_channel_count_from_out_mask(legacy.channel_mask);
524 aidl.values.resize(numValues);
525 for (size_t i = 0; i < numValues; ++i) {
526 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
527 }
528 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
529 return aidl;
530}
531
532ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
533 media::AudioInputFlags aidl) {
534 switch (aidl) {
535 case media::AudioInputFlags::FAST:
536 return AUDIO_INPUT_FLAG_FAST;
537 case media::AudioInputFlags::HW_HOTWORD:
538 return AUDIO_INPUT_FLAG_HW_HOTWORD;
539 case media::AudioInputFlags::RAW:
540 return AUDIO_INPUT_FLAG_RAW;
541 case media::AudioInputFlags::SYNC:
542 return AUDIO_INPUT_FLAG_SYNC;
543 case media::AudioInputFlags::MMAP_NOIRQ:
544 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
545 case media::AudioInputFlags::VOIP_TX:
546 return AUDIO_INPUT_FLAG_VOIP_TX;
547 case media::AudioInputFlags::HW_AV_SYNC:
548 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
549 case media::AudioInputFlags::DIRECT:
550 return AUDIO_INPUT_FLAG_DIRECT;
551 default:
552 return unexpected(BAD_VALUE);
553 }
554}
555
556ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
557 audio_input_flags_t legacy) {
558 switch (legacy) {
559 case AUDIO_INPUT_FLAG_FAST:
560 return media::AudioInputFlags::FAST;
561 case AUDIO_INPUT_FLAG_HW_HOTWORD:
562 return media::AudioInputFlags::HW_HOTWORD;
563 case AUDIO_INPUT_FLAG_RAW:
564 return media::AudioInputFlags::RAW;
565 case AUDIO_INPUT_FLAG_SYNC:
566 return media::AudioInputFlags::SYNC;
567 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
568 return media::AudioInputFlags::MMAP_NOIRQ;
569 case AUDIO_INPUT_FLAG_VOIP_TX:
570 return media::AudioInputFlags::VOIP_TX;
571 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
572 return media::AudioInputFlags::HW_AV_SYNC;
573 case AUDIO_INPUT_FLAG_DIRECT:
574 return media::AudioInputFlags::DIRECT;
575 default:
576 return unexpected(BAD_VALUE);
577 }
578}
579
580ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
581 media::AudioOutputFlags aidl) {
582 switch (aidl) {
583 case media::AudioOutputFlags::DIRECT:
584 return AUDIO_OUTPUT_FLAG_DIRECT;
585 case media::AudioOutputFlags::PRIMARY:
586 return AUDIO_OUTPUT_FLAG_PRIMARY;
587 case media::AudioOutputFlags::FAST:
588 return AUDIO_OUTPUT_FLAG_FAST;
589 case media::AudioOutputFlags::DEEP_BUFFER:
590 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
591 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
592 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
593 case media::AudioOutputFlags::NON_BLOCKING:
594 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
595 case media::AudioOutputFlags::HW_AV_SYNC:
596 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
597 case media::AudioOutputFlags::TTS:
598 return AUDIO_OUTPUT_FLAG_TTS;
599 case media::AudioOutputFlags::RAW:
600 return AUDIO_OUTPUT_FLAG_RAW;
601 case media::AudioOutputFlags::SYNC:
602 return AUDIO_OUTPUT_FLAG_SYNC;
603 case media::AudioOutputFlags::IEC958_NONAUDIO:
604 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
605 case media::AudioOutputFlags::DIRECT_PCM:
606 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
607 case media::AudioOutputFlags::MMAP_NOIRQ:
608 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
609 case media::AudioOutputFlags::VOIP_RX:
610 return AUDIO_OUTPUT_FLAG_VOIP_RX;
611 case media::AudioOutputFlags::INCALL_MUSIC:
612 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
613 default:
614 return unexpected(BAD_VALUE);
615 }
616}
617
618ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
619 audio_output_flags_t legacy) {
620 switch (legacy) {
621 case AUDIO_OUTPUT_FLAG_DIRECT:
622 return media::AudioOutputFlags::DIRECT;
623 case AUDIO_OUTPUT_FLAG_PRIMARY:
624 return media::AudioOutputFlags::PRIMARY;
625 case AUDIO_OUTPUT_FLAG_FAST:
626 return media::AudioOutputFlags::FAST;
627 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
628 return media::AudioOutputFlags::DEEP_BUFFER;
629 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
630 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
631 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
632 return media::AudioOutputFlags::NON_BLOCKING;
633 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
634 return media::AudioOutputFlags::HW_AV_SYNC;
635 case AUDIO_OUTPUT_FLAG_TTS:
636 return media::AudioOutputFlags::TTS;
637 case AUDIO_OUTPUT_FLAG_RAW:
638 return media::AudioOutputFlags::RAW;
639 case AUDIO_OUTPUT_FLAG_SYNC:
640 return media::AudioOutputFlags::SYNC;
641 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
642 return media::AudioOutputFlags::IEC958_NONAUDIO;
643 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
644 return media::AudioOutputFlags::DIRECT_PCM;
645 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
646 return media::AudioOutputFlags::MMAP_NOIRQ;
647 case AUDIO_OUTPUT_FLAG_VOIP_RX:
648 return media::AudioOutputFlags::VOIP_RX;
649 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
650 return media::AudioOutputFlags::INCALL_MUSIC;
651 default:
652 return unexpected(BAD_VALUE);
653 }
654}
655
656ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
657 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
658
659 LegacyMask converted = VALUE_OR_RETURN(
660 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
661 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
662 index2enum_index<media::AudioInputFlags>,
663 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
664 return static_cast<audio_input_flags_t>(converted);
665}
666
667ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
668 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
669
670 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
671 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
672 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
673 index2enum_bitmask<audio_input_flags_t>,
674 enumToMask_index<int32_t, media::AudioInputFlags>);
675}
676
677ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700678 return convertBitmask<audio_output_flags_t,
679 int32_t,
680 audio_output_flags_t,
681 media::AudioOutputFlags>(
682 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
683 index2enum_index<media::AudioOutputFlags>,
684 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700685}
686
687ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
688 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
689
690 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
691 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
692 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
693 index2enum_bitmask<audio_output_flags_t>,
694 enumToMask_index<int32_t, media::AudioOutputFlags>);
695}
696
697ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
698 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
699 audio_io_flags legacy;
700 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
701 // one of the them has size 1 and the rest are empty.
702 size_t totalSize = aidl.input.size() + aidl.output.size();
703 if (totalSize > 1) {
704 return unexpected(BAD_VALUE);
705 }
706
707 Direction dir = VALUE_OR_RETURN(direction(role, type));
708 switch (dir) {
709 case Direction::INPUT:
710 if (aidl.input.empty()) {
711 return unexpected(BAD_VALUE);
712 }
713 legacy.input = VALUE_OR_RETURN(aidl2legacy_audio_input_flags_mask(aidl.input[0]));
714 break;
715
716 case Direction::OUTPUT:
717 if (aidl.output.empty()) {
718 return unexpected(BAD_VALUE);
719 }
720 legacy.output = VALUE_OR_RETURN(aidl2legacy_audio_output_flags_mask(aidl.output[0]));
721 break;
722 }
723
724 return legacy;
725}
726
727ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
728 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
729 media::AudioIoFlags aidl;
730
731 Direction dir = VALUE_OR_RETURN(direction(role, type));
732 switch (dir) {
733 case Direction::INPUT:
734 aidl.input.push_back(VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
735 break;
736 case Direction::OUTPUT:
737 aidl.output.push_back(
738 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
739 break;
740 }
741 return aidl;
742}
743
744ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
745 const media::AudioPortConfigDeviceExt& aidl) {
746 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700747 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700748 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700749 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700750 return legacy;
751}
752
753ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
754 const audio_port_config_device_ext& legacy) {
755 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700756 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700757 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700758 aidl.address = VALUE_OR_RETURN(
759 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700760 return aidl;
761}
762
763ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
764 media::AudioStreamType aidl) {
765 switch (aidl) {
766 case media::AudioStreamType::DEFAULT:
767 return AUDIO_STREAM_DEFAULT;
768 case media::AudioStreamType::VOICE_CALL:
769 return AUDIO_STREAM_VOICE_CALL;
770 case media::AudioStreamType::SYSTEM:
771 return AUDIO_STREAM_SYSTEM;
772 case media::AudioStreamType::RING:
773 return AUDIO_STREAM_RING;
774 case media::AudioStreamType::MUSIC:
775 return AUDIO_STREAM_MUSIC;
776 case media::AudioStreamType::ALARM:
777 return AUDIO_STREAM_ALARM;
778 case media::AudioStreamType::NOTIFICATION:
779 return AUDIO_STREAM_NOTIFICATION;
780 case media::AudioStreamType::BLUETOOTH_SCO:
781 return AUDIO_STREAM_BLUETOOTH_SCO;
782 case media::AudioStreamType::ENFORCED_AUDIBLE:
783 return AUDIO_STREAM_ENFORCED_AUDIBLE;
784 case media::AudioStreamType::DTMF:
785 return AUDIO_STREAM_DTMF;
786 case media::AudioStreamType::TTS:
787 return AUDIO_STREAM_TTS;
788 case media::AudioStreamType::ACCESSIBILITY:
789 return AUDIO_STREAM_ACCESSIBILITY;
790 case media::AudioStreamType::ASSISTANT:
791 return AUDIO_STREAM_ASSISTANT;
792 case media::AudioStreamType::REROUTING:
793 return AUDIO_STREAM_REROUTING;
794 case media::AudioStreamType::PATCH:
795 return AUDIO_STREAM_PATCH;
796 case media::AudioStreamType::CALL_ASSISTANT:
797 return AUDIO_STREAM_CALL_ASSISTANT;
798 default:
799 return unexpected(BAD_VALUE);
800 }
801}
802
803ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
804 audio_stream_type_t legacy) {
805 switch (legacy) {
806 case AUDIO_STREAM_DEFAULT:
807 return media::AudioStreamType::DEFAULT;
808 case AUDIO_STREAM_VOICE_CALL:
809 return media::AudioStreamType::VOICE_CALL;
810 case AUDIO_STREAM_SYSTEM:
811 return media::AudioStreamType::SYSTEM;
812 case AUDIO_STREAM_RING:
813 return media::AudioStreamType::RING;
814 case AUDIO_STREAM_MUSIC:
815 return media::AudioStreamType::MUSIC;
816 case AUDIO_STREAM_ALARM:
817 return media::AudioStreamType::ALARM;
818 case AUDIO_STREAM_NOTIFICATION:
819 return media::AudioStreamType::NOTIFICATION;
820 case AUDIO_STREAM_BLUETOOTH_SCO:
821 return media::AudioStreamType::BLUETOOTH_SCO;
822 case AUDIO_STREAM_ENFORCED_AUDIBLE:
823 return media::AudioStreamType::ENFORCED_AUDIBLE;
824 case AUDIO_STREAM_DTMF:
825 return media::AudioStreamType::DTMF;
826 case AUDIO_STREAM_TTS:
827 return media::AudioStreamType::TTS;
828 case AUDIO_STREAM_ACCESSIBILITY:
829 return media::AudioStreamType::ACCESSIBILITY;
830 case AUDIO_STREAM_ASSISTANT:
831 return media::AudioStreamType::ASSISTANT;
832 case AUDIO_STREAM_REROUTING:
833 return media::AudioStreamType::REROUTING;
834 case AUDIO_STREAM_PATCH:
835 return media::AudioStreamType::PATCH;
836 case AUDIO_STREAM_CALL_ASSISTANT:
837 return media::AudioStreamType::CALL_ASSISTANT;
838 default:
839 return unexpected(BAD_VALUE);
840 }
841}
842
843ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
844 media::AudioSourceType aidl) {
845 switch (aidl) {
846 case media::AudioSourceType::DEFAULT:
847 return AUDIO_SOURCE_DEFAULT;
848 case media::AudioSourceType::MIC:
849 return AUDIO_SOURCE_MIC;
850 case media::AudioSourceType::VOICE_UPLINK:
851 return AUDIO_SOURCE_VOICE_UPLINK;
852 case media::AudioSourceType::VOICE_DOWNLINK:
853 return AUDIO_SOURCE_VOICE_DOWNLINK;
854 case media::AudioSourceType::VOICE_CALL:
855 return AUDIO_SOURCE_VOICE_CALL;
856 case media::AudioSourceType::CAMCORDER:
857 return AUDIO_SOURCE_CAMCORDER;
858 case media::AudioSourceType::VOICE_RECOGNITION:
859 return AUDIO_SOURCE_VOICE_RECOGNITION;
860 case media::AudioSourceType::VOICE_COMMUNICATION:
861 return AUDIO_SOURCE_VOICE_COMMUNICATION;
862 case media::AudioSourceType::REMOTE_SUBMIX:
863 return AUDIO_SOURCE_REMOTE_SUBMIX;
864 case media::AudioSourceType::UNPROCESSED:
865 return AUDIO_SOURCE_UNPROCESSED;
866 case media::AudioSourceType::VOICE_PERFORMANCE:
867 return AUDIO_SOURCE_VOICE_PERFORMANCE;
868 case media::AudioSourceType::ECHO_REFERENCE:
869 return AUDIO_SOURCE_ECHO_REFERENCE;
870 case media::AudioSourceType::FM_TUNER:
871 return AUDIO_SOURCE_FM_TUNER;
872 case media::AudioSourceType::HOTWORD:
873 return AUDIO_SOURCE_HOTWORD;
874 default:
875 return unexpected(BAD_VALUE);
876 }
877}
878
879ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
880 audio_source_t legacy) {
881 switch (legacy) {
882 case AUDIO_SOURCE_DEFAULT:
883 return media::AudioSourceType::DEFAULT;
884 case AUDIO_SOURCE_MIC:
885 return media::AudioSourceType::MIC;
886 case AUDIO_SOURCE_VOICE_UPLINK:
887 return media::AudioSourceType::VOICE_UPLINK;
888 case AUDIO_SOURCE_VOICE_DOWNLINK:
889 return media::AudioSourceType::VOICE_DOWNLINK;
890 case AUDIO_SOURCE_VOICE_CALL:
891 return media::AudioSourceType::VOICE_CALL;
892 case AUDIO_SOURCE_CAMCORDER:
893 return media::AudioSourceType::CAMCORDER;
894 case AUDIO_SOURCE_VOICE_RECOGNITION:
895 return media::AudioSourceType::VOICE_RECOGNITION;
896 case AUDIO_SOURCE_VOICE_COMMUNICATION:
897 return media::AudioSourceType::VOICE_COMMUNICATION;
898 case AUDIO_SOURCE_REMOTE_SUBMIX:
899 return media::AudioSourceType::REMOTE_SUBMIX;
900 case AUDIO_SOURCE_UNPROCESSED:
901 return media::AudioSourceType::UNPROCESSED;
902 case AUDIO_SOURCE_VOICE_PERFORMANCE:
903 return media::AudioSourceType::VOICE_PERFORMANCE;
904 case AUDIO_SOURCE_ECHO_REFERENCE:
905 return media::AudioSourceType::ECHO_REFERENCE;
906 case AUDIO_SOURCE_FM_TUNER:
907 return media::AudioSourceType::FM_TUNER;
908 case AUDIO_SOURCE_HOTWORD:
909 return media::AudioSourceType::HOTWORD;
910 default:
911 return unexpected(BAD_VALUE);
912 }
913}
914
915ConversionResult<audio_session_t> aidl2legacy_AudioSessionType_audio_session_t(
916 media::AudioSessionType aidl) {
917 switch (aidl) {
918 case media::AudioSessionType::DEVICE:
919 return AUDIO_SESSION_DEVICE;
920 case media::AudioSessionType::OUTPUT_STAGE:
921 return AUDIO_SESSION_OUTPUT_STAGE;
922 case media::AudioSessionType::OUTPUT_MIX:
923 return AUDIO_SESSION_OUTPUT_MIX;
924 default:
925 return unexpected(BAD_VALUE);
926 }
927}
928
929ConversionResult<media::AudioSessionType> legacy2aidl_audio_session_t_AudioSessionType(
930 audio_session_t legacy) {
931 switch (legacy) {
932 case AUDIO_SESSION_DEVICE:
933 return media::AudioSessionType::DEVICE;
934 case AUDIO_SESSION_OUTPUT_STAGE:
935 return media::AudioSessionType::OUTPUT_STAGE;
936 case AUDIO_SESSION_OUTPUT_MIX:
937 return media::AudioSessionType::OUTPUT_MIX;
938 default:
939 return unexpected(BAD_VALUE);
940 }
941}
942
943// This type is unnamed in the original definition, thus we name it here.
944using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
945
946ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
947 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
948 audio_port_config_mix_ext_usecase legacy;
949
950 // Our way of representing a union in AIDL is to have multiple vectors and require that exactly
951 // one of the them has size 1 and the rest are empty.
952 size_t totalSize = aidl.stream.size() + aidl.source.size();
953 if (totalSize > 1) {
954 return unexpected(BAD_VALUE);
955 }
956
957 switch (role) {
958 case media::AudioPortRole::NONE:
959 if (totalSize != 0) {
960 return unexpected(BAD_VALUE);
961 }
962 break;
963
964 case media::AudioPortRole::SOURCE:
965 // This is not a bug. A SOURCE role corresponds to the stream field.
966 if (aidl.stream.empty()) {
967 return unexpected(BAD_VALUE);
968 }
969 legacy.stream = VALUE_OR_RETURN(
970 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.stream[0]));
971 break;
972
973 case media::AudioPortRole::SINK:
974 // This is not a bug. A SINK role corresponds to the source field.
975 if (aidl.source.empty()) {
976 return unexpected(BAD_VALUE);
977 }
978 legacy.source =
979 VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source[0]));
980 break;
981
982 default:
983 LOG_ALWAYS_FATAL("Shouldn't get here");
984 }
985 return legacy;
986}
987
988ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
989 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
990 media::AudioPortConfigMixExtUseCase aidl;
991
992 switch (role) {
993 case AUDIO_PORT_ROLE_NONE:
994 break;
995 case AUDIO_PORT_ROLE_SOURCE:
996 // This is not a bug. A SOURCE role corresponds to the stream field.
997 aidl.stream.push_back(VALUE_OR_RETURN(
998 legacy2aidl_audio_stream_type_t_AudioStreamType(
999 legacy.stream)));
1000 break;
1001 case AUDIO_PORT_ROLE_SINK:
1002 // This is not a bug. A SINK role corresponds to the source field.
1003 aidl.source.push_back(
1004 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
1005 break;
1006 default:
1007 LOG_ALWAYS_FATAL("Shouldn't get here");
1008 }
1009 return aidl;
1010}
1011
1012ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1013 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1014 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001015 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1016 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001017 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1018 return legacy;
1019}
1020
1021ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1022 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1023 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001024 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1025 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001026 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1027 return aidl;
1028}
1029
1030ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1031 const media::AudioPortConfigSessionExt& aidl) {
1032 audio_port_config_session_ext legacy;
1033 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioSessionType_audio_session_t(aidl.session));
1034 return legacy;
1035}
1036
1037ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1038 const audio_port_config_session_ext& legacy) {
1039 media::AudioPortConfigSessionExt aidl;
1040 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_AudioSessionType(legacy.session));
1041 return aidl;
1042}
1043
1044// This type is unnamed in the original definition, thus we name it here.
1045using audio_port_config_ext = decltype(audio_port_config::ext);
1046
1047ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1048 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1049 media::AudioPortRole role) {
1050 audio_port_config_ext legacy;
1051 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
1052 // one of the them has size 1 and the rest are empty.
1053 size_t totalSize = aidl.device.size() + aidl.mix.size() + aidl.session.size();
1054 if (totalSize > 1) {
1055 return unexpected(BAD_VALUE);
1056 }
1057 switch (type) {
1058 case media::AudioPortType::NONE:
1059 if (totalSize != 0) {
1060 return unexpected(BAD_VALUE);
1061 }
1062 break;
1063 case media::AudioPortType::DEVICE:
1064 if (aidl.device.empty()) {
1065 return unexpected(BAD_VALUE);
1066 }
1067 legacy.device = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigDeviceExt(aidl.device[0]));
1068 break;
1069 case media::AudioPortType::MIX:
1070 if (aidl.mix.empty()) {
1071 return unexpected(BAD_VALUE);
1072 }
1073 legacy.mix = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExt(aidl.mix[0], role));
1074 break;
1075 case media::AudioPortType::SESSION:
1076 if (aidl.session.empty()) {
1077 return unexpected(BAD_VALUE);
1078 }
1079 legacy.session =
1080 VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(aidl.session[0]));
1081 break;
1082 default:
1083 LOG_ALWAYS_FATAL("Shouldn't get here");
1084 }
1085 return legacy;
1086}
1087
1088ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1089 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1090 media::AudioPortConfigExt aidl;
1091
1092 switch (type) {
1093 case AUDIO_PORT_TYPE_NONE:
1094 break;
1095 case AUDIO_PORT_TYPE_DEVICE:
1096 aidl.device.push_back(
1097 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
1098 break;
1099 case AUDIO_PORT_TYPE_MIX:
1100 aidl.mix.push_back(
1101 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
1102 break;
1103 case AUDIO_PORT_TYPE_SESSION:
1104 aidl.session.push_back(
1105 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
1106 break;
1107 default:
1108 LOG_ALWAYS_FATAL("Shouldn't get here");
1109 }
1110 return aidl;
1111}
1112
1113ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1114 const media::AudioPortConfig& aidl) {
1115 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001116 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001117 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1118 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1119 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1120 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1121 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1122 }
1123 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1124 legacy.channel_mask =
1125 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1126 }
1127 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1128 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1129 }
1130 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1131 legacy.gain = VALUE_OR_RETURN(
1132 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1133 }
1134 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1135 legacy.flags = VALUE_OR_RETURN(
1136 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1137 }
1138 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1139 return legacy;
1140}
1141
1142ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1143 const audio_port_config& legacy) {
1144 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001145 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001146 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1147 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1148 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1149 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1150 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1151 }
1152 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1153 aidl.channelMask =
1154 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1155 }
1156 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1157 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1158 }
1159 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1160 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1161 legacy.gain, legacy.role, legacy.type));
1162 }
1163 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1164 aidl.flags = VALUE_OR_RETURN(
1165 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1166 }
1167 aidl.ext =
1168 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1169 return aidl;
1170}
1171
1172ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1173 const media::AudioPatch& aidl) {
1174 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001175 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001176 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1177 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1178 return unexpected(BAD_VALUE);
1179 }
1180 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1181 legacy.sinks[i] =
1182 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1183 }
1184 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1185 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1186 return unexpected(BAD_VALUE);
1187 }
1188 for (size_t i = 0; i < legacy.num_sources; ++i) {
1189 legacy.sources[i] =
1190 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1191 }
1192 return legacy;
1193}
1194
1195ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1196 const struct audio_patch& legacy) {
1197 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001198 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001199
1200 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1201 return unexpected(BAD_VALUE);
1202 }
1203 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1204 aidl.sinks.push_back(
1205 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1206 }
1207 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1208 return unexpected(BAD_VALUE);
1209 }
1210 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1211 aidl.sources.push_back(
1212 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1213 }
1214 return aidl;
1215}
1216
1217ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1218 const media::AudioIoDescriptor& aidl) {
1219 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001220 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001221 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1222 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1223 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1224 legacy->mChannelMask =
1225 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1226 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1227 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1228 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001229 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001230 return legacy;
1231}
1232
1233ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1234 const sp<AudioIoDescriptor>& legacy) {
1235 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001236 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001237 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1238 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1239 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001240 aidl.channelMask = VALUE_OR_RETURN(
1241 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001242 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1243 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1244 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001245 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001246 return aidl;
1247}
1248
1249} // namespace android