blob: 1355f544b7eecf7ab83681db2fcfd544a543c86d [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
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -080024#include <media/ShmemCompat.h>
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -070025
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070026////////////////////////////////////////////////////////////////////////////////////////////////////
27// Utilities
28
29namespace android {
30
31using base::unexpected;
32
33namespace {
34
35////////////////////////////////////////////////////////////////////////////////////////////////////
36// The code below establishes:
37// IntegralTypeOf<T>, which works for either integral types (in which case it evaluates to T), or
38// enum types (in which case it evaluates to std::underlying_type_T<T>).
39
40template<typename T, typename = std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>>
41struct IntegralTypeOfStruct {
42 using Type = T;
43};
44
45template<typename T>
46struct IntegralTypeOfStruct<T, std::enable_if_t<std::is_enum_v<T>>> {
47 using Type = std::underlying_type_t<T>;
48};
49
50template<typename T>
51using IntegralTypeOf = typename IntegralTypeOfStruct<T>::Type;
52
53////////////////////////////////////////////////////////////////////////////////////////////////////
54// Utilities for handling bitmasks.
55
56template<typename Enum>
57Enum index2enum_index(int index) {
58 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
59 return static_cast<Enum>(index);
60}
61
62template<typename Enum>
63Enum index2enum_bitmask(int index) {
64 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
65 return static_cast<Enum>(1 << index);
66}
67
68template<typename Mask, typename Enum>
69Mask enumToMask_bitmask(Enum e) {
70 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
71 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
72 return static_cast<Mask>(e);
73}
74
75template<typename Mask, typename Enum>
76Mask enumToMask_index(Enum e) {
77 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
78 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
79 return static_cast<Mask>(static_cast<std::make_unsigned_t<IntegralTypeOf<Mask>>>(1)
80 << static_cast<int>(e));
81}
82
83template<typename DestMask, typename SrcMask, typename DestEnum, typename SrcEnum>
84ConversionResult<DestMask> convertBitmask(
85 SrcMask src, const std::function<ConversionResult<DestEnum>(SrcEnum)>& enumConversion,
86 const std::function<SrcEnum(int)>& srcIndexToEnum,
87 const std::function<DestMask(DestEnum)>& destEnumToMask) {
88 using UnsignedDestMask = std::make_unsigned_t<IntegralTypeOf<DestMask>>;
89 using UnsignedSrcMask = std::make_unsigned_t<IntegralTypeOf<SrcMask>>;
90
91 UnsignedDestMask dest = static_cast<UnsignedDestMask>(0);
92 UnsignedSrcMask usrc = static_cast<UnsignedSrcMask>(src);
93
94 int srcBitIndex = 0;
95 while (usrc != 0) {
96 if (usrc & 1) {
97 SrcEnum srcEnum = srcIndexToEnum(srcBitIndex);
98 DestEnum destEnum = VALUE_OR_RETURN(enumConversion(srcEnum));
99 DestMask destMask = destEnumToMask(destEnum);
100 dest |= destMask;
101 }
102 ++srcBitIndex;
103 usrc >>= 1;
104 }
105 return static_cast<DestMask>(dest);
106}
107
108template<typename Mask, typename Enum>
109bool bitmaskIsSet(Mask mask, Enum index) {
110 return (mask & enumToMask_index<Mask, Enum>(index)) != 0;
111}
112
113////////////////////////////////////////////////////////////////////////////////////////////////////
114
115template<typename To, typename From>
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700116ConversionResult<To> convertReinterpret(From from) {
117 static_assert(sizeof(From) == sizeof(To));
118 return static_cast<To>(from);
119}
120
121enum class Direction {
122 INPUT, OUTPUT
123};
124
125ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
126 switch (type) {
127 case media::AudioPortType::DEVICE:
128 switch (role) {
129 case media::AudioPortRole::SOURCE:
130 return Direction::INPUT;
131 case media::AudioPortRole::SINK:
132 return Direction::OUTPUT;
133 default:
134 break;
135 }
136 break;
137 case media::AudioPortType::MIX:
138 switch (role) {
139 case media::AudioPortRole::SOURCE:
140 return Direction::OUTPUT;
141 case media::AudioPortRole::SINK:
142 return Direction::INPUT;
143 default:
144 break;
145 }
146 break;
147 default:
148 break;
149 }
150 return unexpected(BAD_VALUE);
151}
152
153ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
154 switch (type) {
155 case AUDIO_PORT_TYPE_DEVICE:
156 switch (role) {
157 case AUDIO_PORT_ROLE_SOURCE:
158 return Direction::INPUT;
159 case AUDIO_PORT_ROLE_SINK:
160 return Direction::OUTPUT;
161 default:
162 break;
163 }
164 break;
165 case AUDIO_PORT_TYPE_MIX:
166 switch (role) {
167 case AUDIO_PORT_ROLE_SOURCE:
168 return Direction::OUTPUT;
169 case AUDIO_PORT_ROLE_SINK:
170 return Direction::INPUT;
171 default:
172 break;
173 }
174 break;
175 default:
176 break;
177 }
178 return unexpected(BAD_VALUE);
179}
180
181} // namespace
182
183////////////////////////////////////////////////////////////////////////////////////////////////////
184// Converters
185
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700186status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
187 if (aidl.size() > maxSize - 1) {
188 return BAD_VALUE;
189 }
190 aidl.copy(dest, aidl.size());
191 dest[aidl.size()] = '\0';
192 return OK;
193}
194
195ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
196 if (legacy == nullptr) {
197 return unexpected(BAD_VALUE);
198 }
199 if (strnlen(legacy, maxSize) == maxSize) {
200 // No null-terminator.
201 return unexpected(BAD_VALUE);
202 }
203 return std::string(legacy);
204}
205
206ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
207 return convertReinterpret<audio_module_handle_t>(aidl);
208}
209
210ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
211 return convertReinterpret<int32_t>(legacy);
212}
213
214ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
215 return convertReinterpret<audio_io_handle_t>(aidl);
216}
217
218ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
219 return convertReinterpret<int32_t>(legacy);
220}
221
222ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
223 return convertReinterpret<audio_port_handle_t>(aidl);
224}
225
226ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
227 return convertReinterpret<int32_t>(legacy);
228}
229
230ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
231 return convertReinterpret<audio_patch_handle_t>(aidl);
232}
233
234ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
235 return convertReinterpret<int32_t>(legacy);
236}
237
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800238ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
239 return convertReinterpret<audio_unique_id_t>(aidl);
240}
241
242ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
243 return convertReinterpret<int32_t>(legacy);
244}
245
246ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
247 return convertReinterpret<pid_t>(aidl);
248}
249
250ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
251 return convertReinterpret<int32_t>(legacy);
252}
253
254ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
255 return convertReinterpret<uid_t>(aidl);
256}
257
258ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
259 return convertReinterpret<int32_t>(legacy);
260}
261
262ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
263 return String16(aidl.data(), aidl.size());
264}
265
266ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
267 return std::string(String8(legacy).c_str());
268}
269
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700270// The legacy enum is unnamed. Thus, we use int.
271ConversionResult<int> aidl2legacy_AudioPortConfigType(media::AudioPortConfigType aidl) {
272 switch (aidl) {
273 case media::AudioPortConfigType::SAMPLE_RATE:
274 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
275 case media::AudioPortConfigType::CHANNEL_MASK:
276 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
277 case media::AudioPortConfigType::FORMAT:
278 return AUDIO_PORT_CONFIG_FORMAT;
279 case media::AudioPortConfigType::FLAGS:
280 return AUDIO_PORT_CONFIG_FLAGS;
281 default:
282 return unexpected(BAD_VALUE);
283 }
284}
285
286// The legacy enum is unnamed. Thus, we use int.
287ConversionResult<media::AudioPortConfigType> legacy2aidl_AudioPortConfigType(int legacy) {
288 switch (legacy) {
289 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
290 return media::AudioPortConfigType::SAMPLE_RATE;
291 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
292 return media::AudioPortConfigType::CHANNEL_MASK;
293 case AUDIO_PORT_CONFIG_FORMAT:
294 return media::AudioPortConfigType::FORMAT;
295 case AUDIO_PORT_CONFIG_FLAGS:
296 return media::AudioPortConfigType::FLAGS;
297 default:
298 return unexpected(BAD_VALUE);
299 }
300}
301
302ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
303 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
304 aidl, aidl2legacy_AudioPortConfigType,
305 // AudioPortConfigType enum is index-based.
306 index2enum_index<media::AudioPortConfigType>,
307 // AUDIO_PORT_CONFIG_* flags are mask-based.
308 enumToMask_bitmask<unsigned int, int>);
309}
310
311ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
312 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
313 legacy, legacy2aidl_AudioPortConfigType,
314 // AUDIO_PORT_CONFIG_* flags are mask-based.
315 index2enum_bitmask<unsigned>,
316 // AudioPortConfigType enum is index-based.
317 enumToMask_index<int32_t, media::AudioPortConfigType>);
318}
319
320ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
321 // TODO(ytai): should we convert bit-by-bit?
322 // One problem here is that the representation is both opaque and is different based on the
323 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
324 return convertReinterpret<audio_channel_mask_t>(aidl);
325}
326
327ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
328 // TODO(ytai): should we convert bit-by-bit?
329 // One problem here is that the representation is both opaque and is different based on the
330 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
331 return convertReinterpret<int32_t>(legacy);
332}
333
334ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
335 media::AudioIoConfigEvent aidl) {
336 switch (aidl) {
337 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
338 return AUDIO_OUTPUT_REGISTERED;
339 case media::AudioIoConfigEvent::OUTPUT_OPENED:
340 return AUDIO_OUTPUT_OPENED;
341 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
342 return AUDIO_OUTPUT_CLOSED;
343 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
344 return AUDIO_OUTPUT_CONFIG_CHANGED;
345 case media::AudioIoConfigEvent::INPUT_REGISTERED:
346 return AUDIO_INPUT_REGISTERED;
347 case media::AudioIoConfigEvent::INPUT_OPENED:
348 return AUDIO_INPUT_OPENED;
349 case media::AudioIoConfigEvent::INPUT_CLOSED:
350 return AUDIO_INPUT_CLOSED;
351 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
352 return AUDIO_INPUT_CONFIG_CHANGED;
353 case media::AudioIoConfigEvent::CLIENT_STARTED:
354 return AUDIO_CLIENT_STARTED;
355 default:
356 return unexpected(BAD_VALUE);
357 }
358}
359
360ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
361 audio_io_config_event legacy) {
362 switch (legacy) {
363 case AUDIO_OUTPUT_REGISTERED:
364 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
365 case AUDIO_OUTPUT_OPENED:
366 return media::AudioIoConfigEvent::OUTPUT_OPENED;
367 case AUDIO_OUTPUT_CLOSED:
368 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
369 case AUDIO_OUTPUT_CONFIG_CHANGED:
370 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
371 case AUDIO_INPUT_REGISTERED:
372 return media::AudioIoConfigEvent::INPUT_REGISTERED;
373 case AUDIO_INPUT_OPENED:
374 return media::AudioIoConfigEvent::INPUT_OPENED;
375 case AUDIO_INPUT_CLOSED:
376 return media::AudioIoConfigEvent::INPUT_CLOSED;
377 case AUDIO_INPUT_CONFIG_CHANGED:
378 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
379 case AUDIO_CLIENT_STARTED:
380 return media::AudioIoConfigEvent::CLIENT_STARTED;
381 default:
382 return unexpected(BAD_VALUE);
383 }
384}
385
386ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
387 media::AudioPortRole aidl) {
388 switch (aidl) {
389 case media::AudioPortRole::NONE:
390 return AUDIO_PORT_ROLE_NONE;
391 case media::AudioPortRole::SOURCE:
392 return AUDIO_PORT_ROLE_SOURCE;
393 case media::AudioPortRole::SINK:
394 return AUDIO_PORT_ROLE_SINK;
395 default:
396 return unexpected(BAD_VALUE);
397 }
398}
399
400ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
401 audio_port_role_t legacy) {
402 switch (legacy) {
403 case AUDIO_PORT_ROLE_NONE:
404 return media::AudioPortRole::NONE;
405 case AUDIO_PORT_ROLE_SOURCE:
406 return media::AudioPortRole::SOURCE;
407 case AUDIO_PORT_ROLE_SINK:
408 return media::AudioPortRole::SINK;
409 default:
410 return unexpected(BAD_VALUE);
411 }
412}
413
414ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
415 media::AudioPortType aidl) {
416 switch (aidl) {
417 case media::AudioPortType::NONE:
418 return AUDIO_PORT_TYPE_NONE;
419 case media::AudioPortType::DEVICE:
420 return AUDIO_PORT_TYPE_DEVICE;
421 case media::AudioPortType::MIX:
422 return AUDIO_PORT_TYPE_MIX;
423 case media::AudioPortType::SESSION:
424 return AUDIO_PORT_TYPE_SESSION;
425 default:
426 return unexpected(BAD_VALUE);
427 }
428}
429
430ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
431 audio_port_type_t legacy) {
432 switch (legacy) {
433 case AUDIO_PORT_TYPE_NONE:
434 return media::AudioPortType::NONE;
435 case AUDIO_PORT_TYPE_DEVICE:
436 return media::AudioPortType::DEVICE;
437 case AUDIO_PORT_TYPE_MIX:
438 return media::AudioPortType::MIX;
439 case AUDIO_PORT_TYPE_SESSION:
440 return media::AudioPortType::SESSION;
441 default:
442 return unexpected(BAD_VALUE);
443 }
444}
445
446ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
447 media::audio::common::AudioFormat aidl) {
448 // This relies on AudioFormat being kept in sync with audio_format_t.
449 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
450 return static_cast<audio_format_t>(aidl);
451}
452
453ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
454 audio_format_t legacy) {
455 // This relies on AudioFormat being kept in sync with audio_format_t.
456 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
457 return static_cast<media::audio::common::AudioFormat>(legacy);
458}
459
460ConversionResult<int> aidl2legacy_AudioGainMode_int(media::AudioGainMode aidl) {
461 switch (aidl) {
462 case media::AudioGainMode::JOINT:
463 return AUDIO_GAIN_MODE_JOINT;
464 case media::AudioGainMode::CHANNELS:
465 return AUDIO_GAIN_MODE_CHANNELS;
466 case media::AudioGainMode::RAMP:
467 return AUDIO_GAIN_MODE_RAMP;
468 default:
469 return unexpected(BAD_VALUE);
470 }
471}
472
473ConversionResult<media::AudioGainMode> legacy2aidl_int_AudioGainMode(int legacy) {
474 switch (legacy) {
475 case AUDIO_GAIN_MODE_JOINT:
476 return media::AudioGainMode::JOINT;
477 case AUDIO_GAIN_MODE_CHANNELS:
478 return media::AudioGainMode::CHANNELS;
479 case AUDIO_GAIN_MODE_RAMP:
480 return media::AudioGainMode::RAMP;
481 default:
482 return unexpected(BAD_VALUE);
483 }
484}
485
486ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t(int32_t aidl) {
487 return convertBitmask<audio_gain_mode_t, int32_t, int, media::AudioGainMode>(
488 aidl, aidl2legacy_AudioGainMode_int,
489 // AudioGainMode is index-based.
490 index2enum_index<media::AudioGainMode>,
491 // AUDIO_GAIN_MODE_* constants are mask-based.
492 enumToMask_bitmask<audio_gain_mode_t, int>);
493}
494
495ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t(audio_gain_mode_t legacy) {
496 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, int>(
497 legacy, legacy2aidl_int_AudioGainMode,
498 // AUDIO_GAIN_MODE_* constants are mask-based.
499 index2enum_bitmask<int>,
500 // AudioGainMode is index-based.
501 enumToMask_index<int32_t, media::AudioGainMode>);
502}
503
504ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
505 // TODO(ytai): bitfield?
506 return convertReinterpret<audio_devices_t>(aidl);
507}
508
509ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
510 // TODO(ytai): bitfield?
511 return convertReinterpret<int32_t>(legacy);
512}
513
514ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
515 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
516 audio_gain_config legacy;
517 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
518 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t(aidl.mode));
519 legacy.channel_mask =
520 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
521 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
522 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
523 size_t numValues = isJoint ? 1
524 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
525 : audio_channel_count_from_out_mask(legacy.channel_mask);
526 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
527 return unexpected(BAD_VALUE);
528 }
529 for (size_t i = 0; i < numValues; ++i) {
530 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
531 }
532 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
533 return legacy;
534}
535
536ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
537 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
538 media::AudioGainConfig aidl;
539 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
540 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t(legacy.mode));
541 aidl.channelMask =
542 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
543 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
544 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
545 size_t numValues = isJoint ? 1
546 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
547 : audio_channel_count_from_out_mask(legacy.channel_mask);
548 aidl.values.resize(numValues);
549 for (size_t i = 0; i < numValues; ++i) {
550 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
551 }
552 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
553 return aidl;
554}
555
556ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
557 media::AudioInputFlags aidl) {
558 switch (aidl) {
559 case media::AudioInputFlags::FAST:
560 return AUDIO_INPUT_FLAG_FAST;
561 case media::AudioInputFlags::HW_HOTWORD:
562 return AUDIO_INPUT_FLAG_HW_HOTWORD;
563 case media::AudioInputFlags::RAW:
564 return AUDIO_INPUT_FLAG_RAW;
565 case media::AudioInputFlags::SYNC:
566 return AUDIO_INPUT_FLAG_SYNC;
567 case media::AudioInputFlags::MMAP_NOIRQ:
568 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
569 case media::AudioInputFlags::VOIP_TX:
570 return AUDIO_INPUT_FLAG_VOIP_TX;
571 case media::AudioInputFlags::HW_AV_SYNC:
572 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
573 case media::AudioInputFlags::DIRECT:
574 return AUDIO_INPUT_FLAG_DIRECT;
575 default:
576 return unexpected(BAD_VALUE);
577 }
578}
579
580ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
581 audio_input_flags_t legacy) {
582 switch (legacy) {
583 case AUDIO_INPUT_FLAG_FAST:
584 return media::AudioInputFlags::FAST;
585 case AUDIO_INPUT_FLAG_HW_HOTWORD:
586 return media::AudioInputFlags::HW_HOTWORD;
587 case AUDIO_INPUT_FLAG_RAW:
588 return media::AudioInputFlags::RAW;
589 case AUDIO_INPUT_FLAG_SYNC:
590 return media::AudioInputFlags::SYNC;
591 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
592 return media::AudioInputFlags::MMAP_NOIRQ;
593 case AUDIO_INPUT_FLAG_VOIP_TX:
594 return media::AudioInputFlags::VOIP_TX;
595 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
596 return media::AudioInputFlags::HW_AV_SYNC;
597 case AUDIO_INPUT_FLAG_DIRECT:
598 return media::AudioInputFlags::DIRECT;
599 default:
600 return unexpected(BAD_VALUE);
601 }
602}
603
604ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
605 media::AudioOutputFlags aidl) {
606 switch (aidl) {
607 case media::AudioOutputFlags::DIRECT:
608 return AUDIO_OUTPUT_FLAG_DIRECT;
609 case media::AudioOutputFlags::PRIMARY:
610 return AUDIO_OUTPUT_FLAG_PRIMARY;
611 case media::AudioOutputFlags::FAST:
612 return AUDIO_OUTPUT_FLAG_FAST;
613 case media::AudioOutputFlags::DEEP_BUFFER:
614 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
615 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
616 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
617 case media::AudioOutputFlags::NON_BLOCKING:
618 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
619 case media::AudioOutputFlags::HW_AV_SYNC:
620 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
621 case media::AudioOutputFlags::TTS:
622 return AUDIO_OUTPUT_FLAG_TTS;
623 case media::AudioOutputFlags::RAW:
624 return AUDIO_OUTPUT_FLAG_RAW;
625 case media::AudioOutputFlags::SYNC:
626 return AUDIO_OUTPUT_FLAG_SYNC;
627 case media::AudioOutputFlags::IEC958_NONAUDIO:
628 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
629 case media::AudioOutputFlags::DIRECT_PCM:
630 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
631 case media::AudioOutputFlags::MMAP_NOIRQ:
632 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
633 case media::AudioOutputFlags::VOIP_RX:
634 return AUDIO_OUTPUT_FLAG_VOIP_RX;
635 case media::AudioOutputFlags::INCALL_MUSIC:
636 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
637 default:
638 return unexpected(BAD_VALUE);
639 }
640}
641
642ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
643 audio_output_flags_t legacy) {
644 switch (legacy) {
645 case AUDIO_OUTPUT_FLAG_DIRECT:
646 return media::AudioOutputFlags::DIRECT;
647 case AUDIO_OUTPUT_FLAG_PRIMARY:
648 return media::AudioOutputFlags::PRIMARY;
649 case AUDIO_OUTPUT_FLAG_FAST:
650 return media::AudioOutputFlags::FAST;
651 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
652 return media::AudioOutputFlags::DEEP_BUFFER;
653 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
654 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
655 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
656 return media::AudioOutputFlags::NON_BLOCKING;
657 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
658 return media::AudioOutputFlags::HW_AV_SYNC;
659 case AUDIO_OUTPUT_FLAG_TTS:
660 return media::AudioOutputFlags::TTS;
661 case AUDIO_OUTPUT_FLAG_RAW:
662 return media::AudioOutputFlags::RAW;
663 case AUDIO_OUTPUT_FLAG_SYNC:
664 return media::AudioOutputFlags::SYNC;
665 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
666 return media::AudioOutputFlags::IEC958_NONAUDIO;
667 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
668 return media::AudioOutputFlags::DIRECT_PCM;
669 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
670 return media::AudioOutputFlags::MMAP_NOIRQ;
671 case AUDIO_OUTPUT_FLAG_VOIP_RX:
672 return media::AudioOutputFlags::VOIP_RX;
673 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
674 return media::AudioOutputFlags::INCALL_MUSIC;
675 default:
676 return unexpected(BAD_VALUE);
677 }
678}
679
680ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
681 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
682
683 LegacyMask converted = VALUE_OR_RETURN(
684 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
685 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
686 index2enum_index<media::AudioInputFlags>,
687 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
688 return static_cast<audio_input_flags_t>(converted);
689}
690
691ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
692 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
693
694 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
695 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
696 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
697 index2enum_bitmask<audio_input_flags_t>,
698 enumToMask_index<int32_t, media::AudioInputFlags>);
699}
700
701ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700702 return convertBitmask<audio_output_flags_t,
703 int32_t,
704 audio_output_flags_t,
705 media::AudioOutputFlags>(
706 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
707 index2enum_index<media::AudioOutputFlags>,
708 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700709}
710
711ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
712 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
713
714 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
715 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
716 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
717 index2enum_bitmask<audio_output_flags_t>,
718 enumToMask_index<int32_t, media::AudioOutputFlags>);
719}
720
721ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
722 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
723 audio_io_flags legacy;
724 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
725 // one of the them has size 1 and the rest are empty.
726 size_t totalSize = aidl.input.size() + aidl.output.size();
727 if (totalSize > 1) {
728 return unexpected(BAD_VALUE);
729 }
730
731 Direction dir = VALUE_OR_RETURN(direction(role, type));
732 switch (dir) {
733 case Direction::INPUT:
734 if (aidl.input.empty()) {
735 return unexpected(BAD_VALUE);
736 }
737 legacy.input = VALUE_OR_RETURN(aidl2legacy_audio_input_flags_mask(aidl.input[0]));
738 break;
739
740 case Direction::OUTPUT:
741 if (aidl.output.empty()) {
742 return unexpected(BAD_VALUE);
743 }
744 legacy.output = VALUE_OR_RETURN(aidl2legacy_audio_output_flags_mask(aidl.output[0]));
745 break;
746 }
747
748 return legacy;
749}
750
751ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
752 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
753 media::AudioIoFlags aidl;
754
755 Direction dir = VALUE_OR_RETURN(direction(role, type));
756 switch (dir) {
757 case Direction::INPUT:
758 aidl.input.push_back(VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
759 break;
760 case Direction::OUTPUT:
761 aidl.output.push_back(
762 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
763 break;
764 }
765 return aidl;
766}
767
768ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
769 const media::AudioPortConfigDeviceExt& aidl) {
770 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700771 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700772 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700773 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700774 return legacy;
775}
776
777ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
778 const audio_port_config_device_ext& legacy) {
779 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700780 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700781 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700782 aidl.address = VALUE_OR_RETURN(
783 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700784 return aidl;
785}
786
787ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
788 media::AudioStreamType aidl) {
789 switch (aidl) {
790 case media::AudioStreamType::DEFAULT:
791 return AUDIO_STREAM_DEFAULT;
792 case media::AudioStreamType::VOICE_CALL:
793 return AUDIO_STREAM_VOICE_CALL;
794 case media::AudioStreamType::SYSTEM:
795 return AUDIO_STREAM_SYSTEM;
796 case media::AudioStreamType::RING:
797 return AUDIO_STREAM_RING;
798 case media::AudioStreamType::MUSIC:
799 return AUDIO_STREAM_MUSIC;
800 case media::AudioStreamType::ALARM:
801 return AUDIO_STREAM_ALARM;
802 case media::AudioStreamType::NOTIFICATION:
803 return AUDIO_STREAM_NOTIFICATION;
804 case media::AudioStreamType::BLUETOOTH_SCO:
805 return AUDIO_STREAM_BLUETOOTH_SCO;
806 case media::AudioStreamType::ENFORCED_AUDIBLE:
807 return AUDIO_STREAM_ENFORCED_AUDIBLE;
808 case media::AudioStreamType::DTMF:
809 return AUDIO_STREAM_DTMF;
810 case media::AudioStreamType::TTS:
811 return AUDIO_STREAM_TTS;
812 case media::AudioStreamType::ACCESSIBILITY:
813 return AUDIO_STREAM_ACCESSIBILITY;
814 case media::AudioStreamType::ASSISTANT:
815 return AUDIO_STREAM_ASSISTANT;
816 case media::AudioStreamType::REROUTING:
817 return AUDIO_STREAM_REROUTING;
818 case media::AudioStreamType::PATCH:
819 return AUDIO_STREAM_PATCH;
820 case media::AudioStreamType::CALL_ASSISTANT:
821 return AUDIO_STREAM_CALL_ASSISTANT;
822 default:
823 return unexpected(BAD_VALUE);
824 }
825}
826
827ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
828 audio_stream_type_t legacy) {
829 switch (legacy) {
830 case AUDIO_STREAM_DEFAULT:
831 return media::AudioStreamType::DEFAULT;
832 case AUDIO_STREAM_VOICE_CALL:
833 return media::AudioStreamType::VOICE_CALL;
834 case AUDIO_STREAM_SYSTEM:
835 return media::AudioStreamType::SYSTEM;
836 case AUDIO_STREAM_RING:
837 return media::AudioStreamType::RING;
838 case AUDIO_STREAM_MUSIC:
839 return media::AudioStreamType::MUSIC;
840 case AUDIO_STREAM_ALARM:
841 return media::AudioStreamType::ALARM;
842 case AUDIO_STREAM_NOTIFICATION:
843 return media::AudioStreamType::NOTIFICATION;
844 case AUDIO_STREAM_BLUETOOTH_SCO:
845 return media::AudioStreamType::BLUETOOTH_SCO;
846 case AUDIO_STREAM_ENFORCED_AUDIBLE:
847 return media::AudioStreamType::ENFORCED_AUDIBLE;
848 case AUDIO_STREAM_DTMF:
849 return media::AudioStreamType::DTMF;
850 case AUDIO_STREAM_TTS:
851 return media::AudioStreamType::TTS;
852 case AUDIO_STREAM_ACCESSIBILITY:
853 return media::AudioStreamType::ACCESSIBILITY;
854 case AUDIO_STREAM_ASSISTANT:
855 return media::AudioStreamType::ASSISTANT;
856 case AUDIO_STREAM_REROUTING:
857 return media::AudioStreamType::REROUTING;
858 case AUDIO_STREAM_PATCH:
859 return media::AudioStreamType::PATCH;
860 case AUDIO_STREAM_CALL_ASSISTANT:
861 return media::AudioStreamType::CALL_ASSISTANT;
862 default:
863 return unexpected(BAD_VALUE);
864 }
865}
866
867ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
868 media::AudioSourceType aidl) {
869 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800870 case media::AudioSourceType::INVALID:
871 // This value does not have an enum
872 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700873 case media::AudioSourceType::DEFAULT:
874 return AUDIO_SOURCE_DEFAULT;
875 case media::AudioSourceType::MIC:
876 return AUDIO_SOURCE_MIC;
877 case media::AudioSourceType::VOICE_UPLINK:
878 return AUDIO_SOURCE_VOICE_UPLINK;
879 case media::AudioSourceType::VOICE_DOWNLINK:
880 return AUDIO_SOURCE_VOICE_DOWNLINK;
881 case media::AudioSourceType::VOICE_CALL:
882 return AUDIO_SOURCE_VOICE_CALL;
883 case media::AudioSourceType::CAMCORDER:
884 return AUDIO_SOURCE_CAMCORDER;
885 case media::AudioSourceType::VOICE_RECOGNITION:
886 return AUDIO_SOURCE_VOICE_RECOGNITION;
887 case media::AudioSourceType::VOICE_COMMUNICATION:
888 return AUDIO_SOURCE_VOICE_COMMUNICATION;
889 case media::AudioSourceType::REMOTE_SUBMIX:
890 return AUDIO_SOURCE_REMOTE_SUBMIX;
891 case media::AudioSourceType::UNPROCESSED:
892 return AUDIO_SOURCE_UNPROCESSED;
893 case media::AudioSourceType::VOICE_PERFORMANCE:
894 return AUDIO_SOURCE_VOICE_PERFORMANCE;
895 case media::AudioSourceType::ECHO_REFERENCE:
896 return AUDIO_SOURCE_ECHO_REFERENCE;
897 case media::AudioSourceType::FM_TUNER:
898 return AUDIO_SOURCE_FM_TUNER;
899 case media::AudioSourceType::HOTWORD:
900 return AUDIO_SOURCE_HOTWORD;
901 default:
902 return unexpected(BAD_VALUE);
903 }
904}
905
906ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
907 audio_source_t legacy) {
908 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800909 case AUDIO_SOURCE_INVALID:
910 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700911 case AUDIO_SOURCE_DEFAULT:
912 return media::AudioSourceType::DEFAULT;
913 case AUDIO_SOURCE_MIC:
914 return media::AudioSourceType::MIC;
915 case AUDIO_SOURCE_VOICE_UPLINK:
916 return media::AudioSourceType::VOICE_UPLINK;
917 case AUDIO_SOURCE_VOICE_DOWNLINK:
918 return media::AudioSourceType::VOICE_DOWNLINK;
919 case AUDIO_SOURCE_VOICE_CALL:
920 return media::AudioSourceType::VOICE_CALL;
921 case AUDIO_SOURCE_CAMCORDER:
922 return media::AudioSourceType::CAMCORDER;
923 case AUDIO_SOURCE_VOICE_RECOGNITION:
924 return media::AudioSourceType::VOICE_RECOGNITION;
925 case AUDIO_SOURCE_VOICE_COMMUNICATION:
926 return media::AudioSourceType::VOICE_COMMUNICATION;
927 case AUDIO_SOURCE_REMOTE_SUBMIX:
928 return media::AudioSourceType::REMOTE_SUBMIX;
929 case AUDIO_SOURCE_UNPROCESSED:
930 return media::AudioSourceType::UNPROCESSED;
931 case AUDIO_SOURCE_VOICE_PERFORMANCE:
932 return media::AudioSourceType::VOICE_PERFORMANCE;
933 case AUDIO_SOURCE_ECHO_REFERENCE:
934 return media::AudioSourceType::ECHO_REFERENCE;
935 case AUDIO_SOURCE_FM_TUNER:
936 return media::AudioSourceType::FM_TUNER;
937 case AUDIO_SOURCE_HOTWORD:
938 return media::AudioSourceType::HOTWORD;
939 default:
940 return unexpected(BAD_VALUE);
941 }
942}
943
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800944ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
945 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700946}
947
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800948ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
949 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700950}
951
952// This type is unnamed in the original definition, thus we name it here.
953using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
954
955ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
956 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
957 audio_port_config_mix_ext_usecase legacy;
958
959 // Our way of representing a union in AIDL is to have multiple vectors and require that exactly
960 // one of the them has size 1 and the rest are empty.
961 size_t totalSize = aidl.stream.size() + aidl.source.size();
962 if (totalSize > 1) {
963 return unexpected(BAD_VALUE);
964 }
965
966 switch (role) {
967 case media::AudioPortRole::NONE:
968 if (totalSize != 0) {
969 return unexpected(BAD_VALUE);
970 }
971 break;
972
973 case media::AudioPortRole::SOURCE:
974 // This is not a bug. A SOURCE role corresponds to the stream field.
975 if (aidl.stream.empty()) {
976 return unexpected(BAD_VALUE);
977 }
978 legacy.stream = VALUE_OR_RETURN(
979 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.stream[0]));
980 break;
981
982 case media::AudioPortRole::SINK:
983 // This is not a bug. A SINK role corresponds to the source field.
984 if (aidl.source.empty()) {
985 return unexpected(BAD_VALUE);
986 }
987 legacy.source =
988 VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source[0]));
989 break;
990
991 default:
992 LOG_ALWAYS_FATAL("Shouldn't get here");
993 }
994 return legacy;
995}
996
997ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
998 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
999 media::AudioPortConfigMixExtUseCase aidl;
1000
1001 switch (role) {
1002 case AUDIO_PORT_ROLE_NONE:
1003 break;
1004 case AUDIO_PORT_ROLE_SOURCE:
1005 // This is not a bug. A SOURCE role corresponds to the stream field.
1006 aidl.stream.push_back(VALUE_OR_RETURN(
1007 legacy2aidl_audio_stream_type_t_AudioStreamType(
1008 legacy.stream)));
1009 break;
1010 case AUDIO_PORT_ROLE_SINK:
1011 // This is not a bug. A SINK role corresponds to the source field.
1012 aidl.source.push_back(
1013 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
1014 break;
1015 default:
1016 LOG_ALWAYS_FATAL("Shouldn't get here");
1017 }
1018 return aidl;
1019}
1020
1021ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1022 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1023 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001024 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1025 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001026 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1027 return legacy;
1028}
1029
1030ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1031 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1032 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001033 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1034 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001035 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1036 return aidl;
1037}
1038
1039ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1040 const media::AudioPortConfigSessionExt& aidl) {
1041 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001042 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001043 return legacy;
1044}
1045
1046ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1047 const audio_port_config_session_ext& legacy) {
1048 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001049 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001050 return aidl;
1051}
1052
1053// This type is unnamed in the original definition, thus we name it here.
1054using audio_port_config_ext = decltype(audio_port_config::ext);
1055
1056ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1057 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1058 media::AudioPortRole role) {
1059 audio_port_config_ext legacy;
1060 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
1061 // one of the them has size 1 and the rest are empty.
1062 size_t totalSize = aidl.device.size() + aidl.mix.size() + aidl.session.size();
1063 if (totalSize > 1) {
1064 return unexpected(BAD_VALUE);
1065 }
1066 switch (type) {
1067 case media::AudioPortType::NONE:
1068 if (totalSize != 0) {
1069 return unexpected(BAD_VALUE);
1070 }
1071 break;
1072 case media::AudioPortType::DEVICE:
1073 if (aidl.device.empty()) {
1074 return unexpected(BAD_VALUE);
1075 }
1076 legacy.device = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigDeviceExt(aidl.device[0]));
1077 break;
1078 case media::AudioPortType::MIX:
1079 if (aidl.mix.empty()) {
1080 return unexpected(BAD_VALUE);
1081 }
1082 legacy.mix = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExt(aidl.mix[0], role));
1083 break;
1084 case media::AudioPortType::SESSION:
1085 if (aidl.session.empty()) {
1086 return unexpected(BAD_VALUE);
1087 }
1088 legacy.session =
1089 VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(aidl.session[0]));
1090 break;
1091 default:
1092 LOG_ALWAYS_FATAL("Shouldn't get here");
1093 }
1094 return legacy;
1095}
1096
1097ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1098 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1099 media::AudioPortConfigExt aidl;
1100
1101 switch (type) {
1102 case AUDIO_PORT_TYPE_NONE:
1103 break;
1104 case AUDIO_PORT_TYPE_DEVICE:
1105 aidl.device.push_back(
1106 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
1107 break;
1108 case AUDIO_PORT_TYPE_MIX:
1109 aidl.mix.push_back(
1110 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
1111 break;
1112 case AUDIO_PORT_TYPE_SESSION:
1113 aidl.session.push_back(
1114 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
1115 break;
1116 default:
1117 LOG_ALWAYS_FATAL("Shouldn't get here");
1118 }
1119 return aidl;
1120}
1121
1122ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1123 const media::AudioPortConfig& aidl) {
1124 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001125 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001126 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1127 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1128 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1129 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1130 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1131 }
1132 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1133 legacy.channel_mask =
1134 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1135 }
1136 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1137 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1138 }
1139 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1140 legacy.gain = VALUE_OR_RETURN(
1141 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1142 }
1143 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1144 legacy.flags = VALUE_OR_RETURN(
1145 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1146 }
1147 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1148 return legacy;
1149}
1150
1151ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1152 const audio_port_config& legacy) {
1153 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001154 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001155 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1156 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1157 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1158 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1159 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1160 }
1161 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1162 aidl.channelMask =
1163 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1164 }
1165 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1166 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1167 }
1168 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1169 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1170 legacy.gain, legacy.role, legacy.type));
1171 }
1172 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1173 aidl.flags = VALUE_OR_RETURN(
1174 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1175 }
1176 aidl.ext =
1177 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1178 return aidl;
1179}
1180
1181ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1182 const media::AudioPatch& aidl) {
1183 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001184 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001185 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1186 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1187 return unexpected(BAD_VALUE);
1188 }
1189 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1190 legacy.sinks[i] =
1191 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1192 }
1193 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1194 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1195 return unexpected(BAD_VALUE);
1196 }
1197 for (size_t i = 0; i < legacy.num_sources; ++i) {
1198 legacy.sources[i] =
1199 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1200 }
1201 return legacy;
1202}
1203
1204ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1205 const struct audio_patch& legacy) {
1206 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001207 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001208
1209 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1210 return unexpected(BAD_VALUE);
1211 }
1212 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1213 aidl.sinks.push_back(
1214 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1215 }
1216 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1217 return unexpected(BAD_VALUE);
1218 }
1219 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1220 aidl.sources.push_back(
1221 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1222 }
1223 return aidl;
1224}
1225
1226ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1227 const media::AudioIoDescriptor& aidl) {
1228 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001229 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001230 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1231 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1232 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1233 legacy->mChannelMask =
1234 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1235 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1236 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1237 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001238 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001239 return legacy;
1240}
1241
1242ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1243 const sp<AudioIoDescriptor>& legacy) {
1244 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001245 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001246 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1247 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1248 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001249 aidl.channelMask = VALUE_OR_RETURN(
1250 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001251 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1252 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1253 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001254 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001255 return aidl;
1256}
1257
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001258ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1259 AudioClient legacy;
1260 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1261 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1262 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1263 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1264 return legacy;
1265}
1266
1267ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1268 media::AudioClient aidl;
1269 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1270 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1271 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1272 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1273 return aidl;
1274}
1275
1276ConversionResult<audio_content_type_t>
1277aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1278 switch (aidl) {
1279 case media::AudioContentType::UNKNOWN:
1280 return AUDIO_CONTENT_TYPE_UNKNOWN;
1281 case media::AudioContentType::SPEECH:
1282 return AUDIO_CONTENT_TYPE_SPEECH;
1283 case media::AudioContentType::MUSIC:
1284 return AUDIO_CONTENT_TYPE_MUSIC;
1285 case media::AudioContentType::MOVIE:
1286 return AUDIO_CONTENT_TYPE_MOVIE;
1287 case media::AudioContentType::SONIFICATION:
1288 return AUDIO_CONTENT_TYPE_SONIFICATION;
1289 }
1290 return unexpected(BAD_VALUE);
1291}
1292
1293ConversionResult<media::AudioContentType>
1294legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1295 switch (legacy) {
1296 case AUDIO_CONTENT_TYPE_UNKNOWN:
1297 return media::AudioContentType::UNKNOWN;
1298 case AUDIO_CONTENT_TYPE_SPEECH:
1299 return media::AudioContentType::SPEECH;
1300 case AUDIO_CONTENT_TYPE_MUSIC:
1301 return media::AudioContentType::MUSIC;
1302 case AUDIO_CONTENT_TYPE_MOVIE:
1303 return media::AudioContentType::MOVIE;
1304 case AUDIO_CONTENT_TYPE_SONIFICATION:
1305 return media::AudioContentType::SONIFICATION;
1306 }
1307 return unexpected(BAD_VALUE);
1308}
1309
1310ConversionResult<audio_usage_t>
1311aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1312 switch (aidl) {
1313 case media::AudioUsage::UNKNOWN:
1314 return AUDIO_USAGE_UNKNOWN;
1315 case media::AudioUsage::MEDIA:
1316 return AUDIO_USAGE_MEDIA;
1317 case media::AudioUsage::VOICE_COMMUNICATION:
1318 return AUDIO_USAGE_VOICE_COMMUNICATION;
1319 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1320 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1321 case media::AudioUsage::ALARM:
1322 return AUDIO_USAGE_ALARM;
1323 case media::AudioUsage::NOTIFICATION:
1324 return AUDIO_USAGE_NOTIFICATION;
1325 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1326 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1327 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1328 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1329 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1330 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1331 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1332 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1333 case media::AudioUsage::NOTIFICATION_EVENT:
1334 return AUDIO_USAGE_NOTIFICATION_EVENT;
1335 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1336 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1337 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1338 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1339 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1340 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1341 case media::AudioUsage::GAME:
1342 return AUDIO_USAGE_GAME;
1343 case media::AudioUsage::VIRTUAL_SOURCE:
1344 return AUDIO_USAGE_VIRTUAL_SOURCE;
1345 case media::AudioUsage::ASSISTANT:
1346 return AUDIO_USAGE_ASSISTANT;
1347 case media::AudioUsage::CALL_ASSISTANT:
1348 return AUDIO_USAGE_CALL_ASSISTANT;
1349 case media::AudioUsage::EMERGENCY:
1350 return AUDIO_USAGE_EMERGENCY;
1351 case media::AudioUsage::SAFETY:
1352 return AUDIO_USAGE_SAFETY;
1353 case media::AudioUsage::VEHICLE_STATUS:
1354 return AUDIO_USAGE_VEHICLE_STATUS;
1355 case media::AudioUsage::ANNOUNCEMENT:
1356 return AUDIO_USAGE_ANNOUNCEMENT;
1357 }
1358 return unexpected(BAD_VALUE);
1359}
1360
1361ConversionResult<media::AudioUsage>
1362legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1363 switch (legacy) {
1364 case AUDIO_USAGE_UNKNOWN:
1365 return media::AudioUsage::UNKNOWN;
1366 case AUDIO_USAGE_MEDIA:
1367 return media::AudioUsage::MEDIA;
1368 case AUDIO_USAGE_VOICE_COMMUNICATION:
1369 return media::AudioUsage::VOICE_COMMUNICATION;
1370 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1371 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1372 case AUDIO_USAGE_ALARM:
1373 return media::AudioUsage::ALARM;
1374 case AUDIO_USAGE_NOTIFICATION:
1375 return media::AudioUsage::NOTIFICATION;
1376 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1377 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1378 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1379 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1380 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1381 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1382 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1383 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1384 case AUDIO_USAGE_NOTIFICATION_EVENT:
1385 return media::AudioUsage::NOTIFICATION_EVENT;
1386 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1387 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1388 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1389 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1390 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1391 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1392 case AUDIO_USAGE_GAME:
1393 return media::AudioUsage::GAME;
1394 case AUDIO_USAGE_VIRTUAL_SOURCE:
1395 return media::AudioUsage::VIRTUAL_SOURCE;
1396 case AUDIO_USAGE_ASSISTANT:
1397 return media::AudioUsage::ASSISTANT;
1398 case AUDIO_USAGE_CALL_ASSISTANT:
1399 return media::AudioUsage::CALL_ASSISTANT;
1400 case AUDIO_USAGE_EMERGENCY:
1401 return media::AudioUsage::EMERGENCY;
1402 case AUDIO_USAGE_SAFETY:
1403 return media::AudioUsage::SAFETY;
1404 case AUDIO_USAGE_VEHICLE_STATUS:
1405 return media::AudioUsage::VEHICLE_STATUS;
1406 case AUDIO_USAGE_ANNOUNCEMENT:
1407 return media::AudioUsage::ANNOUNCEMENT;
1408 }
1409 return unexpected(BAD_VALUE);
1410}
1411
1412ConversionResult<audio_flags_mask_t>
1413aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1414 switch (aidl) {
1415 case media::AudioFlag::AUDIBILITY_ENFORCED:
1416 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1417 case media::AudioFlag::SECURE:
1418 return AUDIO_FLAG_SECURE;
1419 case media::AudioFlag::SCO:
1420 return AUDIO_FLAG_SCO;
1421 case media::AudioFlag::BEACON:
1422 return AUDIO_FLAG_BEACON;
1423 case media::AudioFlag::HW_AV_SYNC:
1424 return AUDIO_FLAG_HW_AV_SYNC;
1425 case media::AudioFlag::HW_HOTWORD:
1426 return AUDIO_FLAG_HW_HOTWORD;
1427 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1428 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1429 case media::AudioFlag::BYPASS_MUTE:
1430 return AUDIO_FLAG_BYPASS_MUTE;
1431 case media::AudioFlag::LOW_LATENCY:
1432 return AUDIO_FLAG_LOW_LATENCY;
1433 case media::AudioFlag::DEEP_BUFFER:
1434 return AUDIO_FLAG_DEEP_BUFFER;
1435 case media::AudioFlag::NO_MEDIA_PROJECTION:
1436 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1437 case media::AudioFlag::MUTE_HAPTIC:
1438 return AUDIO_FLAG_MUTE_HAPTIC;
1439 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1440 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1441 case media::AudioFlag::CAPTURE_PRIVATE:
1442 return AUDIO_FLAG_CAPTURE_PRIVATE;
1443 }
1444 return unexpected(BAD_VALUE);
1445}
1446
1447ConversionResult<media::AudioFlag>
1448legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1449 switch (legacy) {
1450 case AUDIO_FLAG_NONE:
1451 return unexpected(BAD_VALUE);
1452 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1453 return media::AudioFlag::AUDIBILITY_ENFORCED;
1454 case AUDIO_FLAG_SECURE:
1455 return media::AudioFlag::SECURE;
1456 case AUDIO_FLAG_SCO:
1457 return media::AudioFlag::SCO;
1458 case AUDIO_FLAG_BEACON:
1459 return media::AudioFlag::BEACON;
1460 case AUDIO_FLAG_HW_AV_SYNC:
1461 return media::AudioFlag::HW_AV_SYNC;
1462 case AUDIO_FLAG_HW_HOTWORD:
1463 return media::AudioFlag::HW_HOTWORD;
1464 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1465 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1466 case AUDIO_FLAG_BYPASS_MUTE:
1467 return media::AudioFlag::BYPASS_MUTE;
1468 case AUDIO_FLAG_LOW_LATENCY:
1469 return media::AudioFlag::LOW_LATENCY;
1470 case AUDIO_FLAG_DEEP_BUFFER:
1471 return media::AudioFlag::DEEP_BUFFER;
1472 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1473 return media::AudioFlag::NO_MEDIA_PROJECTION;
1474 case AUDIO_FLAG_MUTE_HAPTIC:
1475 return media::AudioFlag::MUTE_HAPTIC;
1476 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1477 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1478 case AUDIO_FLAG_CAPTURE_PRIVATE:
1479 return media::AudioFlag::CAPTURE_PRIVATE;
1480 }
1481 return unexpected(BAD_VALUE);
1482}
1483
1484ConversionResult<audio_flags_mask_t>
1485aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1486 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1487 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1488 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1489}
1490
1491ConversionResult<int32_t>
1492legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1493 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
1494 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag, index2enum_bitmask<audio_flags_mask_t>,
1495 enumToMask_index<int32_t, media::AudioFlag>);
1496}
1497
1498ConversionResult<audio_attributes_t>
1499aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1500 audio_attributes_t legacy;
1501 legacy.content_type = VALUE_OR_RETURN(
1502 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1503 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1504 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1505 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1506 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1507 return legacy;
1508}
1509
1510ConversionResult<media::AudioAttributesInternal>
1511legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1512 media::AudioAttributesInternal aidl;
1513 aidl.contentType = VALUE_OR_RETURN(
1514 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1515 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1516 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1517 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1518 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1519 return aidl;
1520}
1521
1522ConversionResult<audio_encapsulation_mode_t>
1523aidl2legacy_audio_encapsulation_mode_t_AudioEncapsulationMode(media::AudioEncapsulationMode aidl) {
1524 switch (aidl) {
1525 case media::AudioEncapsulationMode::NONE:
1526 return AUDIO_ENCAPSULATION_MODE_NONE;
1527 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1528 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1529 case media::AudioEncapsulationMode::HANDLE:
1530 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1531 }
1532 return unexpected(BAD_VALUE);
1533}
1534
1535ConversionResult<media::AudioEncapsulationMode>
1536legacy2aidl_AudioEncapsulationMode_audio_encapsulation_mode_t(audio_encapsulation_mode_t legacy) {
1537 switch (legacy) {
1538 case AUDIO_ENCAPSULATION_MODE_NONE:
1539 return media::AudioEncapsulationMode::NONE;
1540 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1541 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1542 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1543 return media::AudioEncapsulationMode::HANDLE;
1544 }
1545 return unexpected(BAD_VALUE);
1546}
1547
1548ConversionResult<audio_offload_info_t>
1549aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1550 audio_offload_info_t legacy;
1551 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1552 legacy.size = sizeof(audio_offload_info_t);
1553 audio_config_base_t config = VALUE_OR_RETURN(
1554 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1555 legacy.sample_rate = config.sample_rate;
1556 legacy.channel_mask = config.channel_mask;
1557 legacy.format = config.format;
1558 legacy.stream_type = VALUE_OR_RETURN(
1559 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1560 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1561 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1562 legacy.has_video = aidl.hasVideo;
1563 legacy.is_streaming = aidl.isStreaming;
1564 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1565 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1566 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1567 legacy.encapsulation_mode = VALUE_OR_RETURN(
1568 aidl2legacy_audio_encapsulation_mode_t_AudioEncapsulationMode(aidl.encapsulationMode));
1569 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1570 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1571 return legacy;
1572}
1573
1574ConversionResult<media::AudioOffloadInfo>
1575legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1576 media::AudioOffloadInfo aidl;
1577 // Version 0.1 fields.
1578 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1579 return unexpected(BAD_VALUE);
1580 }
1581 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1582 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1583 aidl.config.channelMask = VALUE_OR_RETURN(
1584 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1585 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1586 aidl.streamType = VALUE_OR_RETURN(
1587 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1588 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1589 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1590 aidl.hasVideo = legacy.has_video;
1591 aidl.isStreaming = legacy.is_streaming;
1592 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1593 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1594 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1595
1596 // Version 0.2 fields.
1597 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1598 if (legacy.size <
1599 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1600 return unexpected(BAD_VALUE);
1601 }
1602 aidl.encapsulationMode = VALUE_OR_RETURN(
1603 legacy2aidl_AudioEncapsulationMode_audio_encapsulation_mode_t(
1604 legacy.encapsulation_mode));
1605 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1606 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1607 }
1608 return aidl;
1609}
1610
1611ConversionResult<audio_config_t>
1612aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1613 audio_config_t legacy;
1614 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
1615 legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1616 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1617 legacy.offload_info = VALUE_OR_RETURN(aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
1618 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1619 return legacy;
1620}
1621
1622ConversionResult<media::AudioConfig>
1623legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1624 media::AudioConfig aidl;
1625 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1626 aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1627 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1628 aidl.offloadInfo = VALUE_OR_RETURN(legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
1629 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1630 return aidl;
1631}
1632
1633ConversionResult<audio_config_base_t>
1634aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1635 audio_config_base_t legacy;
1636 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
1637 legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1638 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1639 return legacy;
1640}
1641
1642ConversionResult<media::AudioConfigBase>
1643legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1644 media::AudioConfigBase aidl;
1645 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1646 aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1647 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1648 return aidl;
1649}
1650
1651ConversionResult<sp<IMemory>>
1652aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1653 sp<IMemory> legacy;
1654 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1655 return unexpected(BAD_VALUE);
1656 }
1657 return legacy;
1658}
1659
1660ConversionResult<media::SharedFileRegion>
1661legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1662 media::SharedFileRegion aidl;
1663 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1664 return unexpected(BAD_VALUE);
1665 }
1666 return aidl;
1667}
1668
1669ConversionResult<sp<IMemory>>
1670aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1671 sp<IMemory> legacy;
1672 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1673 return unexpected(BAD_VALUE);
1674 }
1675 return legacy;
1676}
1677
1678ConversionResult<std::optional<media::SharedFileRegion>>
1679legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1680 std::optional<media::SharedFileRegion> aidl;
1681 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1682 return unexpected(BAD_VALUE);
1683 }
1684 return aidl;
1685}
1686
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001687} // namespace android