blob: 8fb836d184adc6cde554963c4a3e3c25d54b80ed [file] [log] [blame]
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070017#define LOG_TAG "AidlConversion"
18//#define LOG_NDEBUG 0
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070019#include <utils/Log.h>
20
21#include "media/AidlConversion.h"
22
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -080023#include <media/ShmemCompat.h>
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -070024
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070025////////////////////////////////////////////////////////////////////////////////////////////////////
26// Utilities
27
28namespace android {
29
30using base::unexpected;
31
32namespace {
33
34////////////////////////////////////////////////////////////////////////////////////////////////////
35// The code below establishes:
36// IntegralTypeOf<T>, which works for either integral types (in which case it evaluates to T), or
37// enum types (in which case it evaluates to std::underlying_type_T<T>).
38
39template<typename T, typename = std::enable_if_t<std::is_integral_v<T> || std::is_enum_v<T>>>
40struct IntegralTypeOfStruct {
41 using Type = T;
42};
43
44template<typename T>
45struct IntegralTypeOfStruct<T, std::enable_if_t<std::is_enum_v<T>>> {
46 using Type = std::underlying_type_t<T>;
47};
48
49template<typename T>
50using IntegralTypeOf = typename IntegralTypeOfStruct<T>::Type;
51
52////////////////////////////////////////////////////////////////////////////////////////////////////
53// Utilities for handling bitmasks.
54
55template<typename Enum>
56Enum index2enum_index(int index) {
57 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
58 return static_cast<Enum>(index);
59}
60
61template<typename Enum>
62Enum index2enum_bitmask(int index) {
63 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
64 return static_cast<Enum>(1 << index);
65}
66
67template<typename Mask, typename Enum>
68Mask enumToMask_bitmask(Enum e) {
69 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
70 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
71 return static_cast<Mask>(e);
72}
73
74template<typename Mask, typename Enum>
75Mask enumToMask_index(Enum e) {
76 static_assert(std::is_enum_v<Enum> || std::is_integral_v<Enum>);
77 static_assert(std::is_enum_v<Mask> || std::is_integral_v<Mask>);
78 return static_cast<Mask>(static_cast<std::make_unsigned_t<IntegralTypeOf<Mask>>>(1)
79 << static_cast<int>(e));
80}
81
82template<typename DestMask, typename SrcMask, typename DestEnum, typename SrcEnum>
83ConversionResult<DestMask> convertBitmask(
84 SrcMask src, const std::function<ConversionResult<DestEnum>(SrcEnum)>& enumConversion,
85 const std::function<SrcEnum(int)>& srcIndexToEnum,
86 const std::function<DestMask(DestEnum)>& destEnumToMask) {
87 using UnsignedDestMask = std::make_unsigned_t<IntegralTypeOf<DestMask>>;
88 using UnsignedSrcMask = std::make_unsigned_t<IntegralTypeOf<SrcMask>>;
89
90 UnsignedDestMask dest = static_cast<UnsignedDestMask>(0);
91 UnsignedSrcMask usrc = static_cast<UnsignedSrcMask>(src);
92
93 int srcBitIndex = 0;
94 while (usrc != 0) {
95 if (usrc & 1) {
96 SrcEnum srcEnum = srcIndexToEnum(srcBitIndex);
97 DestEnum destEnum = VALUE_OR_RETURN(enumConversion(srcEnum));
98 DestMask destMask = destEnumToMask(destEnum);
99 dest |= destMask;
100 }
101 ++srcBitIndex;
102 usrc >>= 1;
103 }
104 return static_cast<DestMask>(dest);
105}
106
107template<typename Mask, typename Enum>
108bool bitmaskIsSet(Mask mask, Enum index) {
109 return (mask & enumToMask_index<Mask, Enum>(index)) != 0;
110}
111
112////////////////////////////////////////////////////////////////////////////////////////////////////
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700113// Utilities for working with AIDL unions.
114// UNION_GET(obj, fieldname) returns a ConversionResult<T> containing either the strongly-typed
115// value of the respective field, or BAD_VALUE if the union is not set to the requested field.
116// UNION_SET(obj, fieldname, value) sets the requested field to the given value.
117
118template<typename T, typename T::Tag tag>
119using UnionFieldType = std::decay_t<decltype(std::declval<T>().template get<tag>())>;
120
121template<typename T, typename T::Tag tag>
122ConversionResult<UnionFieldType<T, tag>> unionGetField(const T& u) {
123 if (u.getTag() != tag) {
124 return unexpected(BAD_VALUE);
125 }
126 return u.template get<tag>();
127}
128
129#define UNION_GET(u, field) \
130 unionGetField<std::decay_t<decltype(u)>, std::decay_t<decltype(u)>::Tag::field>(u)
131
132#define UNION_SET(u, field, value) \
133 (u).set<std::decay_t<decltype(u)>::Tag::field>(value)
134
135////////////////////////////////////////////////////////////////////////////////////////////////////
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700136
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700137enum class Direction {
138 INPUT, OUTPUT
139};
140
141ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
142 switch (type) {
143 case media::AudioPortType::DEVICE:
144 switch (role) {
145 case media::AudioPortRole::SOURCE:
146 return Direction::INPUT;
147 case media::AudioPortRole::SINK:
148 return Direction::OUTPUT;
149 default:
150 break;
151 }
152 break;
153 case media::AudioPortType::MIX:
154 switch (role) {
155 case media::AudioPortRole::SOURCE:
156 return Direction::OUTPUT;
157 case media::AudioPortRole::SINK:
158 return Direction::INPUT;
159 default:
160 break;
161 }
162 break;
163 default:
164 break;
165 }
166 return unexpected(BAD_VALUE);
167}
168
169ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
170 switch (type) {
171 case AUDIO_PORT_TYPE_DEVICE:
172 switch (role) {
173 case AUDIO_PORT_ROLE_SOURCE:
174 return Direction::INPUT;
175 case AUDIO_PORT_ROLE_SINK:
176 return Direction::OUTPUT;
177 default:
178 break;
179 }
180 break;
181 case AUDIO_PORT_TYPE_MIX:
182 switch (role) {
183 case AUDIO_PORT_ROLE_SOURCE:
184 return Direction::OUTPUT;
185 case AUDIO_PORT_ROLE_SINK:
186 return Direction::INPUT;
187 default:
188 break;
189 }
190 break;
191 default:
192 break;
193 }
194 return unexpected(BAD_VALUE);
195}
196
197} // namespace
198
199////////////////////////////////////////////////////////////////////////////////////////////////////
200// Converters
201
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700202status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
203 if (aidl.size() > maxSize - 1) {
204 return BAD_VALUE;
205 }
206 aidl.copy(dest, aidl.size());
207 dest[aidl.size()] = '\0';
208 return OK;
209}
210
211ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
212 if (legacy == nullptr) {
213 return unexpected(BAD_VALUE);
214 }
215 if (strnlen(legacy, maxSize) == maxSize) {
216 // No null-terminator.
217 return unexpected(BAD_VALUE);
218 }
219 return std::string(legacy);
220}
221
222ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
223 return convertReinterpret<audio_module_handle_t>(aidl);
224}
225
226ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
227 return convertReinterpret<int32_t>(legacy);
228}
229
230ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
231 return convertReinterpret<audio_io_handle_t>(aidl);
232}
233
234ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
235 return convertReinterpret<int32_t>(legacy);
236}
237
238ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
239 return convertReinterpret<audio_port_handle_t>(aidl);
240}
241
242ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
243 return convertReinterpret<int32_t>(legacy);
244}
245
246ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
247 return convertReinterpret<audio_patch_handle_t>(aidl);
248}
249
250ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
251 return convertReinterpret<int32_t>(legacy);
252}
253
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800254ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
255 return convertReinterpret<audio_unique_id_t>(aidl);
256}
257
258ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
259 return convertReinterpret<int32_t>(legacy);
260}
261
262ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
263 return convertReinterpret<pid_t>(aidl);
264}
265
266ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
267 return convertReinterpret<int32_t>(legacy);
268}
269
270ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
271 return convertReinterpret<uid_t>(aidl);
272}
273
274ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
275 return convertReinterpret<int32_t>(legacy);
276}
277
278ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
279 return String16(aidl.data(), aidl.size());
280}
281
282ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
283 return std::string(String8(legacy).c_str());
284}
285
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800286ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
287 return String8(aidl.data(), aidl.size());
288}
289
290ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
291 return std::string(legacy.c_str());
292}
293
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700294// The legacy enum is unnamed. Thus, we use int.
295ConversionResult<int> aidl2legacy_AudioPortConfigType(media::AudioPortConfigType aidl) {
296 switch (aidl) {
297 case media::AudioPortConfigType::SAMPLE_RATE:
298 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
299 case media::AudioPortConfigType::CHANNEL_MASK:
300 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
301 case media::AudioPortConfigType::FORMAT:
302 return AUDIO_PORT_CONFIG_FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800303 case media::AudioPortConfigType::GAIN:
304 return AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700305 case media::AudioPortConfigType::FLAGS:
306 return AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700307 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800308 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700309}
310
311// The legacy enum is unnamed. Thus, we use int.
312ConversionResult<media::AudioPortConfigType> legacy2aidl_AudioPortConfigType(int legacy) {
313 switch (legacy) {
314 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
315 return media::AudioPortConfigType::SAMPLE_RATE;
316 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
317 return media::AudioPortConfigType::CHANNEL_MASK;
318 case AUDIO_PORT_CONFIG_FORMAT:
319 return media::AudioPortConfigType::FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800320 case AUDIO_PORT_CONFIG_GAIN:
321 return media::AudioPortConfigType::GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700322 case AUDIO_PORT_CONFIG_FLAGS:
323 return media::AudioPortConfigType::FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700324 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800325 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700326}
327
328ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
329 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
330 aidl, aidl2legacy_AudioPortConfigType,
331 // AudioPortConfigType enum is index-based.
332 index2enum_index<media::AudioPortConfigType>,
333 // AUDIO_PORT_CONFIG_* flags are mask-based.
334 enumToMask_bitmask<unsigned int, int>);
335}
336
337ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
338 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
339 legacy, legacy2aidl_AudioPortConfigType,
340 // AUDIO_PORT_CONFIG_* flags are mask-based.
341 index2enum_bitmask<unsigned>,
342 // AudioPortConfigType enum is index-based.
343 enumToMask_index<int32_t, media::AudioPortConfigType>);
344}
345
346ConversionResult<audio_channel_mask_t> aidl2legacy_int32_t_audio_channel_mask_t(int32_t aidl) {
347 // TODO(ytai): should we convert bit-by-bit?
348 // One problem here is that the representation is both opaque and is different based on the
349 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
350 return convertReinterpret<audio_channel_mask_t>(aidl);
351}
352
353ConversionResult<int32_t> legacy2aidl_audio_channel_mask_t_int32_t(audio_channel_mask_t legacy) {
354 // TODO(ytai): should we convert bit-by-bit?
355 // One problem here is that the representation is both opaque and is different based on the
356 // context (input vs. output). Can determine based on type and role, as per useInChannelMask().
357 return convertReinterpret<int32_t>(legacy);
358}
359
360ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
361 media::AudioIoConfigEvent aidl) {
362 switch (aidl) {
363 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
364 return AUDIO_OUTPUT_REGISTERED;
365 case media::AudioIoConfigEvent::OUTPUT_OPENED:
366 return AUDIO_OUTPUT_OPENED;
367 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
368 return AUDIO_OUTPUT_CLOSED;
369 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
370 return AUDIO_OUTPUT_CONFIG_CHANGED;
371 case media::AudioIoConfigEvent::INPUT_REGISTERED:
372 return AUDIO_INPUT_REGISTERED;
373 case media::AudioIoConfigEvent::INPUT_OPENED:
374 return AUDIO_INPUT_OPENED;
375 case media::AudioIoConfigEvent::INPUT_CLOSED:
376 return AUDIO_INPUT_CLOSED;
377 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
378 return AUDIO_INPUT_CONFIG_CHANGED;
379 case media::AudioIoConfigEvent::CLIENT_STARTED:
380 return AUDIO_CLIENT_STARTED;
381 default:
382 return unexpected(BAD_VALUE);
383 }
384}
385
386ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
387 audio_io_config_event legacy) {
388 switch (legacy) {
389 case AUDIO_OUTPUT_REGISTERED:
390 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
391 case AUDIO_OUTPUT_OPENED:
392 return media::AudioIoConfigEvent::OUTPUT_OPENED;
393 case AUDIO_OUTPUT_CLOSED:
394 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
395 case AUDIO_OUTPUT_CONFIG_CHANGED:
396 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
397 case AUDIO_INPUT_REGISTERED:
398 return media::AudioIoConfigEvent::INPUT_REGISTERED;
399 case AUDIO_INPUT_OPENED:
400 return media::AudioIoConfigEvent::INPUT_OPENED;
401 case AUDIO_INPUT_CLOSED:
402 return media::AudioIoConfigEvent::INPUT_CLOSED;
403 case AUDIO_INPUT_CONFIG_CHANGED:
404 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
405 case AUDIO_CLIENT_STARTED:
406 return media::AudioIoConfigEvent::CLIENT_STARTED;
407 default:
408 return unexpected(BAD_VALUE);
409 }
410}
411
412ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
413 media::AudioPortRole aidl) {
414 switch (aidl) {
415 case media::AudioPortRole::NONE:
416 return AUDIO_PORT_ROLE_NONE;
417 case media::AudioPortRole::SOURCE:
418 return AUDIO_PORT_ROLE_SOURCE;
419 case media::AudioPortRole::SINK:
420 return AUDIO_PORT_ROLE_SINK;
421 default:
422 return unexpected(BAD_VALUE);
423 }
424}
425
426ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
427 audio_port_role_t legacy) {
428 switch (legacy) {
429 case AUDIO_PORT_ROLE_NONE:
430 return media::AudioPortRole::NONE;
431 case AUDIO_PORT_ROLE_SOURCE:
432 return media::AudioPortRole::SOURCE;
433 case AUDIO_PORT_ROLE_SINK:
434 return media::AudioPortRole::SINK;
435 default:
436 return unexpected(BAD_VALUE);
437 }
438}
439
440ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
441 media::AudioPortType aidl) {
442 switch (aidl) {
443 case media::AudioPortType::NONE:
444 return AUDIO_PORT_TYPE_NONE;
445 case media::AudioPortType::DEVICE:
446 return AUDIO_PORT_TYPE_DEVICE;
447 case media::AudioPortType::MIX:
448 return AUDIO_PORT_TYPE_MIX;
449 case media::AudioPortType::SESSION:
450 return AUDIO_PORT_TYPE_SESSION;
451 default:
452 return unexpected(BAD_VALUE);
453 }
454}
455
456ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
457 audio_port_type_t legacy) {
458 switch (legacy) {
459 case AUDIO_PORT_TYPE_NONE:
460 return media::AudioPortType::NONE;
461 case AUDIO_PORT_TYPE_DEVICE:
462 return media::AudioPortType::DEVICE;
463 case AUDIO_PORT_TYPE_MIX:
464 return media::AudioPortType::MIX;
465 case AUDIO_PORT_TYPE_SESSION:
466 return media::AudioPortType::SESSION;
467 default:
468 return unexpected(BAD_VALUE);
469 }
470}
471
472ConversionResult<audio_format_t> aidl2legacy_AudioFormat_audio_format_t(
473 media::audio::common::AudioFormat aidl) {
474 // This relies on AudioFormat being kept in sync with audio_format_t.
475 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
476 return static_cast<audio_format_t>(aidl);
477}
478
479ConversionResult<media::audio::common::AudioFormat> legacy2aidl_audio_format_t_AudioFormat(
480 audio_format_t legacy) {
481 // This relies on AudioFormat being kept in sync with audio_format_t.
482 static_assert(sizeof(media::audio::common::AudioFormat) == sizeof(audio_format_t));
483 return static_cast<media::audio::common::AudioFormat>(legacy);
484}
485
486ConversionResult<int> aidl2legacy_AudioGainMode_int(media::AudioGainMode aidl) {
487 switch (aidl) {
488 case media::AudioGainMode::JOINT:
489 return AUDIO_GAIN_MODE_JOINT;
490 case media::AudioGainMode::CHANNELS:
491 return AUDIO_GAIN_MODE_CHANNELS;
492 case media::AudioGainMode::RAMP:
493 return AUDIO_GAIN_MODE_RAMP;
494 default:
495 return unexpected(BAD_VALUE);
496 }
497}
498
499ConversionResult<media::AudioGainMode> legacy2aidl_int_AudioGainMode(int legacy) {
500 switch (legacy) {
501 case AUDIO_GAIN_MODE_JOINT:
502 return media::AudioGainMode::JOINT;
503 case AUDIO_GAIN_MODE_CHANNELS:
504 return media::AudioGainMode::CHANNELS;
505 case AUDIO_GAIN_MODE_RAMP:
506 return media::AudioGainMode::RAMP;
507 default:
508 return unexpected(BAD_VALUE);
509 }
510}
511
512ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t(int32_t aidl) {
513 return convertBitmask<audio_gain_mode_t, int32_t, int, media::AudioGainMode>(
514 aidl, aidl2legacy_AudioGainMode_int,
515 // AudioGainMode is index-based.
516 index2enum_index<media::AudioGainMode>,
517 // AUDIO_GAIN_MODE_* constants are mask-based.
518 enumToMask_bitmask<audio_gain_mode_t, int>);
519}
520
521ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t(audio_gain_mode_t legacy) {
522 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, int>(
523 legacy, legacy2aidl_int_AudioGainMode,
524 // AUDIO_GAIN_MODE_* constants are mask-based.
525 index2enum_bitmask<int>,
526 // AudioGainMode is index-based.
527 enumToMask_index<int32_t, media::AudioGainMode>);
528}
529
530ConversionResult<audio_devices_t> aidl2legacy_int32_t_audio_devices_t(int32_t aidl) {
531 // TODO(ytai): bitfield?
532 return convertReinterpret<audio_devices_t>(aidl);
533}
534
535ConversionResult<int32_t> legacy2aidl_audio_devices_t_int32_t(audio_devices_t legacy) {
536 // TODO(ytai): bitfield?
537 return convertReinterpret<int32_t>(legacy);
538}
539
540ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
541 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
542 audio_gain_config legacy;
543 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
544 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t(aidl.mode));
545 legacy.channel_mask =
546 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
547 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
548 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
549 size_t numValues = isJoint ? 1
550 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
551 : audio_channel_count_from_out_mask(legacy.channel_mask);
552 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
553 return unexpected(BAD_VALUE);
554 }
555 for (size_t i = 0; i < numValues; ++i) {
556 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
557 }
558 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
559 return legacy;
560}
561
562ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
563 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
564 media::AudioGainConfig aidl;
565 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
566 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t(legacy.mode));
567 aidl.channelMask =
568 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
569 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
570 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
571 size_t numValues = isJoint ? 1
572 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
573 : audio_channel_count_from_out_mask(legacy.channel_mask);
574 aidl.values.resize(numValues);
575 for (size_t i = 0; i < numValues; ++i) {
576 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
577 }
578 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
579 return aidl;
580}
581
582ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
583 media::AudioInputFlags aidl) {
584 switch (aidl) {
585 case media::AudioInputFlags::FAST:
586 return AUDIO_INPUT_FLAG_FAST;
587 case media::AudioInputFlags::HW_HOTWORD:
588 return AUDIO_INPUT_FLAG_HW_HOTWORD;
589 case media::AudioInputFlags::RAW:
590 return AUDIO_INPUT_FLAG_RAW;
591 case media::AudioInputFlags::SYNC:
592 return AUDIO_INPUT_FLAG_SYNC;
593 case media::AudioInputFlags::MMAP_NOIRQ:
594 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
595 case media::AudioInputFlags::VOIP_TX:
596 return AUDIO_INPUT_FLAG_VOIP_TX;
597 case media::AudioInputFlags::HW_AV_SYNC:
598 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
599 case media::AudioInputFlags::DIRECT:
600 return AUDIO_INPUT_FLAG_DIRECT;
601 default:
602 return unexpected(BAD_VALUE);
603 }
604}
605
606ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
607 audio_input_flags_t legacy) {
608 switch (legacy) {
609 case AUDIO_INPUT_FLAG_FAST:
610 return media::AudioInputFlags::FAST;
611 case AUDIO_INPUT_FLAG_HW_HOTWORD:
612 return media::AudioInputFlags::HW_HOTWORD;
613 case AUDIO_INPUT_FLAG_RAW:
614 return media::AudioInputFlags::RAW;
615 case AUDIO_INPUT_FLAG_SYNC:
616 return media::AudioInputFlags::SYNC;
617 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
618 return media::AudioInputFlags::MMAP_NOIRQ;
619 case AUDIO_INPUT_FLAG_VOIP_TX:
620 return media::AudioInputFlags::VOIP_TX;
621 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
622 return media::AudioInputFlags::HW_AV_SYNC;
623 case AUDIO_INPUT_FLAG_DIRECT:
624 return media::AudioInputFlags::DIRECT;
625 default:
626 return unexpected(BAD_VALUE);
627 }
628}
629
630ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
631 media::AudioOutputFlags aidl) {
632 switch (aidl) {
633 case media::AudioOutputFlags::DIRECT:
634 return AUDIO_OUTPUT_FLAG_DIRECT;
635 case media::AudioOutputFlags::PRIMARY:
636 return AUDIO_OUTPUT_FLAG_PRIMARY;
637 case media::AudioOutputFlags::FAST:
638 return AUDIO_OUTPUT_FLAG_FAST;
639 case media::AudioOutputFlags::DEEP_BUFFER:
640 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
641 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
642 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
643 case media::AudioOutputFlags::NON_BLOCKING:
644 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
645 case media::AudioOutputFlags::HW_AV_SYNC:
646 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
647 case media::AudioOutputFlags::TTS:
648 return AUDIO_OUTPUT_FLAG_TTS;
649 case media::AudioOutputFlags::RAW:
650 return AUDIO_OUTPUT_FLAG_RAW;
651 case media::AudioOutputFlags::SYNC:
652 return AUDIO_OUTPUT_FLAG_SYNC;
653 case media::AudioOutputFlags::IEC958_NONAUDIO:
654 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
655 case media::AudioOutputFlags::DIRECT_PCM:
656 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
657 case media::AudioOutputFlags::MMAP_NOIRQ:
658 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
659 case media::AudioOutputFlags::VOIP_RX:
660 return AUDIO_OUTPUT_FLAG_VOIP_RX;
661 case media::AudioOutputFlags::INCALL_MUSIC:
662 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
663 default:
664 return unexpected(BAD_VALUE);
665 }
666}
667
668ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
669 audio_output_flags_t legacy) {
670 switch (legacy) {
671 case AUDIO_OUTPUT_FLAG_DIRECT:
672 return media::AudioOutputFlags::DIRECT;
673 case AUDIO_OUTPUT_FLAG_PRIMARY:
674 return media::AudioOutputFlags::PRIMARY;
675 case AUDIO_OUTPUT_FLAG_FAST:
676 return media::AudioOutputFlags::FAST;
677 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
678 return media::AudioOutputFlags::DEEP_BUFFER;
679 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
680 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
681 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
682 return media::AudioOutputFlags::NON_BLOCKING;
683 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
684 return media::AudioOutputFlags::HW_AV_SYNC;
685 case AUDIO_OUTPUT_FLAG_TTS:
686 return media::AudioOutputFlags::TTS;
687 case AUDIO_OUTPUT_FLAG_RAW:
688 return media::AudioOutputFlags::RAW;
689 case AUDIO_OUTPUT_FLAG_SYNC:
690 return media::AudioOutputFlags::SYNC;
691 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
692 return media::AudioOutputFlags::IEC958_NONAUDIO;
693 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
694 return media::AudioOutputFlags::DIRECT_PCM;
695 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
696 return media::AudioOutputFlags::MMAP_NOIRQ;
697 case AUDIO_OUTPUT_FLAG_VOIP_RX:
698 return media::AudioOutputFlags::VOIP_RX;
699 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
700 return media::AudioOutputFlags::INCALL_MUSIC;
701 default:
702 return unexpected(BAD_VALUE);
703 }
704}
705
706ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
707 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
708
709 LegacyMask converted = VALUE_OR_RETURN(
710 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
711 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
712 index2enum_index<media::AudioInputFlags>,
713 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
714 return static_cast<audio_input_flags_t>(converted);
715}
716
717ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
718 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
719
720 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
721 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
722 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
723 index2enum_bitmask<audio_input_flags_t>,
724 enumToMask_index<int32_t, media::AudioInputFlags>);
725}
726
727ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700728 return convertBitmask<audio_output_flags_t,
729 int32_t,
730 audio_output_flags_t,
731 media::AudioOutputFlags>(
732 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
733 index2enum_index<media::AudioOutputFlags>,
734 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700735}
736
737ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
738 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
739
740 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
741 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
742 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
743 index2enum_bitmask<audio_output_flags_t>,
744 enumToMask_index<int32_t, media::AudioOutputFlags>);
745}
746
747ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
748 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
749 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700750 Direction dir = VALUE_OR_RETURN(direction(role, type));
751 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700752 case Direction::INPUT: {
753 legacy.input = VALUE_OR_RETURN(
754 aidl2legacy_audio_input_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, input))));
755 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700756 break;
757
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700758 case Direction::OUTPUT: {
759 legacy.output = VALUE_OR_RETURN(
760 aidl2legacy_audio_output_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, output))));
761 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700762 break;
763 }
764
765 return legacy;
766}
767
768ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
769 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
770 media::AudioIoFlags aidl;
771
772 Direction dir = VALUE_OR_RETURN(direction(role, type));
773 switch (dir) {
774 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700775 UNION_SET(aidl, input,
776 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700777 break;
778 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700779 UNION_SET(aidl, output,
780 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700781 break;
782 }
783 return aidl;
784}
785
786ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
787 const media::AudioPortConfigDeviceExt& aidl) {
788 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700789 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700790 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700791 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700792 return legacy;
793}
794
795ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
796 const audio_port_config_device_ext& legacy) {
797 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700798 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700799 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700800 aidl.address = VALUE_OR_RETURN(
801 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700802 return aidl;
803}
804
805ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
806 media::AudioStreamType aidl) {
807 switch (aidl) {
808 case media::AudioStreamType::DEFAULT:
809 return AUDIO_STREAM_DEFAULT;
810 case media::AudioStreamType::VOICE_CALL:
811 return AUDIO_STREAM_VOICE_CALL;
812 case media::AudioStreamType::SYSTEM:
813 return AUDIO_STREAM_SYSTEM;
814 case media::AudioStreamType::RING:
815 return AUDIO_STREAM_RING;
816 case media::AudioStreamType::MUSIC:
817 return AUDIO_STREAM_MUSIC;
818 case media::AudioStreamType::ALARM:
819 return AUDIO_STREAM_ALARM;
820 case media::AudioStreamType::NOTIFICATION:
821 return AUDIO_STREAM_NOTIFICATION;
822 case media::AudioStreamType::BLUETOOTH_SCO:
823 return AUDIO_STREAM_BLUETOOTH_SCO;
824 case media::AudioStreamType::ENFORCED_AUDIBLE:
825 return AUDIO_STREAM_ENFORCED_AUDIBLE;
826 case media::AudioStreamType::DTMF:
827 return AUDIO_STREAM_DTMF;
828 case media::AudioStreamType::TTS:
829 return AUDIO_STREAM_TTS;
830 case media::AudioStreamType::ACCESSIBILITY:
831 return AUDIO_STREAM_ACCESSIBILITY;
832 case media::AudioStreamType::ASSISTANT:
833 return AUDIO_STREAM_ASSISTANT;
834 case media::AudioStreamType::REROUTING:
835 return AUDIO_STREAM_REROUTING;
836 case media::AudioStreamType::PATCH:
837 return AUDIO_STREAM_PATCH;
838 case media::AudioStreamType::CALL_ASSISTANT:
839 return AUDIO_STREAM_CALL_ASSISTANT;
840 default:
841 return unexpected(BAD_VALUE);
842 }
843}
844
845ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
846 audio_stream_type_t legacy) {
847 switch (legacy) {
848 case AUDIO_STREAM_DEFAULT:
849 return media::AudioStreamType::DEFAULT;
850 case AUDIO_STREAM_VOICE_CALL:
851 return media::AudioStreamType::VOICE_CALL;
852 case AUDIO_STREAM_SYSTEM:
853 return media::AudioStreamType::SYSTEM;
854 case AUDIO_STREAM_RING:
855 return media::AudioStreamType::RING;
856 case AUDIO_STREAM_MUSIC:
857 return media::AudioStreamType::MUSIC;
858 case AUDIO_STREAM_ALARM:
859 return media::AudioStreamType::ALARM;
860 case AUDIO_STREAM_NOTIFICATION:
861 return media::AudioStreamType::NOTIFICATION;
862 case AUDIO_STREAM_BLUETOOTH_SCO:
863 return media::AudioStreamType::BLUETOOTH_SCO;
864 case AUDIO_STREAM_ENFORCED_AUDIBLE:
865 return media::AudioStreamType::ENFORCED_AUDIBLE;
866 case AUDIO_STREAM_DTMF:
867 return media::AudioStreamType::DTMF;
868 case AUDIO_STREAM_TTS:
869 return media::AudioStreamType::TTS;
870 case AUDIO_STREAM_ACCESSIBILITY:
871 return media::AudioStreamType::ACCESSIBILITY;
872 case AUDIO_STREAM_ASSISTANT:
873 return media::AudioStreamType::ASSISTANT;
874 case AUDIO_STREAM_REROUTING:
875 return media::AudioStreamType::REROUTING;
876 case AUDIO_STREAM_PATCH:
877 return media::AudioStreamType::PATCH;
878 case AUDIO_STREAM_CALL_ASSISTANT:
879 return media::AudioStreamType::CALL_ASSISTANT;
880 default:
881 return unexpected(BAD_VALUE);
882 }
883}
884
885ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
886 media::AudioSourceType aidl) {
887 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800888 case media::AudioSourceType::INVALID:
889 // This value does not have an enum
890 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700891 case media::AudioSourceType::DEFAULT:
892 return AUDIO_SOURCE_DEFAULT;
893 case media::AudioSourceType::MIC:
894 return AUDIO_SOURCE_MIC;
895 case media::AudioSourceType::VOICE_UPLINK:
896 return AUDIO_SOURCE_VOICE_UPLINK;
897 case media::AudioSourceType::VOICE_DOWNLINK:
898 return AUDIO_SOURCE_VOICE_DOWNLINK;
899 case media::AudioSourceType::VOICE_CALL:
900 return AUDIO_SOURCE_VOICE_CALL;
901 case media::AudioSourceType::CAMCORDER:
902 return AUDIO_SOURCE_CAMCORDER;
903 case media::AudioSourceType::VOICE_RECOGNITION:
904 return AUDIO_SOURCE_VOICE_RECOGNITION;
905 case media::AudioSourceType::VOICE_COMMUNICATION:
906 return AUDIO_SOURCE_VOICE_COMMUNICATION;
907 case media::AudioSourceType::REMOTE_SUBMIX:
908 return AUDIO_SOURCE_REMOTE_SUBMIX;
909 case media::AudioSourceType::UNPROCESSED:
910 return AUDIO_SOURCE_UNPROCESSED;
911 case media::AudioSourceType::VOICE_PERFORMANCE:
912 return AUDIO_SOURCE_VOICE_PERFORMANCE;
913 case media::AudioSourceType::ECHO_REFERENCE:
914 return AUDIO_SOURCE_ECHO_REFERENCE;
915 case media::AudioSourceType::FM_TUNER:
916 return AUDIO_SOURCE_FM_TUNER;
917 case media::AudioSourceType::HOTWORD:
918 return AUDIO_SOURCE_HOTWORD;
919 default:
920 return unexpected(BAD_VALUE);
921 }
922}
923
924ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
925 audio_source_t legacy) {
926 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800927 case AUDIO_SOURCE_INVALID:
928 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700929 case AUDIO_SOURCE_DEFAULT:
930 return media::AudioSourceType::DEFAULT;
931 case AUDIO_SOURCE_MIC:
932 return media::AudioSourceType::MIC;
933 case AUDIO_SOURCE_VOICE_UPLINK:
934 return media::AudioSourceType::VOICE_UPLINK;
935 case AUDIO_SOURCE_VOICE_DOWNLINK:
936 return media::AudioSourceType::VOICE_DOWNLINK;
937 case AUDIO_SOURCE_VOICE_CALL:
938 return media::AudioSourceType::VOICE_CALL;
939 case AUDIO_SOURCE_CAMCORDER:
940 return media::AudioSourceType::CAMCORDER;
941 case AUDIO_SOURCE_VOICE_RECOGNITION:
942 return media::AudioSourceType::VOICE_RECOGNITION;
943 case AUDIO_SOURCE_VOICE_COMMUNICATION:
944 return media::AudioSourceType::VOICE_COMMUNICATION;
945 case AUDIO_SOURCE_REMOTE_SUBMIX:
946 return media::AudioSourceType::REMOTE_SUBMIX;
947 case AUDIO_SOURCE_UNPROCESSED:
948 return media::AudioSourceType::UNPROCESSED;
949 case AUDIO_SOURCE_VOICE_PERFORMANCE:
950 return media::AudioSourceType::VOICE_PERFORMANCE;
951 case AUDIO_SOURCE_ECHO_REFERENCE:
952 return media::AudioSourceType::ECHO_REFERENCE;
953 case AUDIO_SOURCE_FM_TUNER:
954 return media::AudioSourceType::FM_TUNER;
955 case AUDIO_SOURCE_HOTWORD:
956 return media::AudioSourceType::HOTWORD;
957 default:
958 return unexpected(BAD_VALUE);
959 }
960}
961
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800962ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
963 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700964}
965
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800966ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
967 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700968}
969
970// This type is unnamed in the original definition, thus we name it here.
971using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
972
973ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
974 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
975 audio_port_config_mix_ext_usecase legacy;
976
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700977 switch (role) {
978 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700979 // Just verify that the union is empty.
980 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700981 break;
982
983 case media::AudioPortRole::SOURCE:
984 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700985 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
986 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700987 break;
988
989 case media::AudioPortRole::SINK:
990 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700991 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
992 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700993 break;
994
995 default:
996 LOG_ALWAYS_FATAL("Shouldn't get here");
997 }
998 return legacy;
999}
1000
1001ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
1002 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
1003 media::AudioPortConfigMixExtUseCase aidl;
1004
1005 switch (role) {
1006 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001007 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001008 break;
1009 case AUDIO_PORT_ROLE_SOURCE:
1010 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001011 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1012 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001013 break;
1014 case AUDIO_PORT_ROLE_SINK:
1015 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001016 UNION_SET(aidl, source,
1017 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001018 break;
1019 default:
1020 LOG_ALWAYS_FATAL("Shouldn't get here");
1021 }
1022 return aidl;
1023}
1024
1025ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1026 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1027 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001028 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1029 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001030 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1031 return legacy;
1032}
1033
1034ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1035 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1036 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001037 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1038 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001039 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1040 return aidl;
1041}
1042
1043ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1044 const media::AudioPortConfigSessionExt& aidl) {
1045 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001046 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001047 return legacy;
1048}
1049
1050ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1051 const audio_port_config_session_ext& legacy) {
1052 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001053 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001054 return aidl;
1055}
1056
1057// This type is unnamed in the original definition, thus we name it here.
1058using audio_port_config_ext = decltype(audio_port_config::ext);
1059
1060ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1061 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1062 media::AudioPortRole role) {
1063 audio_port_config_ext legacy;
1064 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
1065 // one of the them has size 1 and the rest are empty.
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001066 switch (type) {
1067 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001068 // Just verify that the union is empty.
1069 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001070 break;
1071 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001072 legacy.device = VALUE_OR_RETURN(
1073 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001074 break;
1075 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001076 legacy.mix = VALUE_OR_RETURN(
1077 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001078 break;
1079 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001080 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1081 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001082 break;
1083 default:
1084 LOG_ALWAYS_FATAL("Shouldn't get here");
1085 }
1086 return legacy;
1087}
1088
1089ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1090 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1091 media::AudioPortConfigExt aidl;
1092
1093 switch (type) {
1094 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001095 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001096 break;
1097 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001098 UNION_SET(aidl, device,
1099 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001100 break;
1101 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001102 UNION_SET(aidl, mix,
1103 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001104 break;
1105 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001106 UNION_SET(aidl, session,
1107 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001108 break;
1109 default:
1110 LOG_ALWAYS_FATAL("Shouldn't get here");
1111 }
1112 return aidl;
1113}
1114
1115ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1116 const media::AudioPortConfig& aidl) {
1117 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001118 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001119 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1120 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1121 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1122 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1123 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1124 }
1125 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1126 legacy.channel_mask =
1127 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1128 }
1129 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1130 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1131 }
1132 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1133 legacy.gain = VALUE_OR_RETURN(
1134 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1135 }
1136 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1137 legacy.flags = VALUE_OR_RETURN(
1138 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1139 }
1140 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1141 return legacy;
1142}
1143
1144ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1145 const audio_port_config& legacy) {
1146 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001147 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001148 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1149 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1150 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1151 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1152 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1153 }
1154 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1155 aidl.channelMask =
1156 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1157 }
1158 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1159 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1160 }
1161 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1162 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1163 legacy.gain, legacy.role, legacy.type));
1164 }
1165 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1166 aidl.flags = VALUE_OR_RETURN(
1167 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1168 }
1169 aidl.ext =
1170 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1171 return aidl;
1172}
1173
1174ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1175 const media::AudioPatch& aidl) {
1176 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001177 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001178 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1179 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1180 return unexpected(BAD_VALUE);
1181 }
1182 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1183 legacy.sinks[i] =
1184 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1185 }
1186 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1187 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1188 return unexpected(BAD_VALUE);
1189 }
1190 for (size_t i = 0; i < legacy.num_sources; ++i) {
1191 legacy.sources[i] =
1192 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1193 }
1194 return legacy;
1195}
1196
1197ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1198 const struct audio_patch& legacy) {
1199 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001200 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001201
1202 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1203 return unexpected(BAD_VALUE);
1204 }
1205 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1206 aidl.sinks.push_back(
1207 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1208 }
1209 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1210 return unexpected(BAD_VALUE);
1211 }
1212 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1213 aidl.sources.push_back(
1214 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1215 }
1216 return aidl;
1217}
1218
1219ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1220 const media::AudioIoDescriptor& aidl) {
1221 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001222 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001223 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1224 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1225 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1226 legacy->mChannelMask =
1227 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1228 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1229 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1230 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001231 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001232 return legacy;
1233}
1234
1235ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1236 const sp<AudioIoDescriptor>& legacy) {
1237 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001238 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001239 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1240 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1241 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001242 aidl.channelMask = VALUE_OR_RETURN(
1243 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001244 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1245 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1246 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001247 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001248 return aidl;
1249}
1250
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001251ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1252 AudioClient legacy;
1253 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1254 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1255 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1256 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1257 return legacy;
1258}
1259
1260ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1261 media::AudioClient aidl;
1262 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1263 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1264 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1265 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1266 return aidl;
1267}
1268
1269ConversionResult<audio_content_type_t>
1270aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1271 switch (aidl) {
1272 case media::AudioContentType::UNKNOWN:
1273 return AUDIO_CONTENT_TYPE_UNKNOWN;
1274 case media::AudioContentType::SPEECH:
1275 return AUDIO_CONTENT_TYPE_SPEECH;
1276 case media::AudioContentType::MUSIC:
1277 return AUDIO_CONTENT_TYPE_MUSIC;
1278 case media::AudioContentType::MOVIE:
1279 return AUDIO_CONTENT_TYPE_MOVIE;
1280 case media::AudioContentType::SONIFICATION:
1281 return AUDIO_CONTENT_TYPE_SONIFICATION;
1282 }
1283 return unexpected(BAD_VALUE);
1284}
1285
1286ConversionResult<media::AudioContentType>
1287legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1288 switch (legacy) {
1289 case AUDIO_CONTENT_TYPE_UNKNOWN:
1290 return media::AudioContentType::UNKNOWN;
1291 case AUDIO_CONTENT_TYPE_SPEECH:
1292 return media::AudioContentType::SPEECH;
1293 case AUDIO_CONTENT_TYPE_MUSIC:
1294 return media::AudioContentType::MUSIC;
1295 case AUDIO_CONTENT_TYPE_MOVIE:
1296 return media::AudioContentType::MOVIE;
1297 case AUDIO_CONTENT_TYPE_SONIFICATION:
1298 return media::AudioContentType::SONIFICATION;
1299 }
1300 return unexpected(BAD_VALUE);
1301}
1302
1303ConversionResult<audio_usage_t>
1304aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1305 switch (aidl) {
1306 case media::AudioUsage::UNKNOWN:
1307 return AUDIO_USAGE_UNKNOWN;
1308 case media::AudioUsage::MEDIA:
1309 return AUDIO_USAGE_MEDIA;
1310 case media::AudioUsage::VOICE_COMMUNICATION:
1311 return AUDIO_USAGE_VOICE_COMMUNICATION;
1312 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1313 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1314 case media::AudioUsage::ALARM:
1315 return AUDIO_USAGE_ALARM;
1316 case media::AudioUsage::NOTIFICATION:
1317 return AUDIO_USAGE_NOTIFICATION;
1318 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1319 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1320 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1321 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1322 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1323 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1324 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1325 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1326 case media::AudioUsage::NOTIFICATION_EVENT:
1327 return AUDIO_USAGE_NOTIFICATION_EVENT;
1328 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1329 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1330 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1331 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1332 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1333 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1334 case media::AudioUsage::GAME:
1335 return AUDIO_USAGE_GAME;
1336 case media::AudioUsage::VIRTUAL_SOURCE:
1337 return AUDIO_USAGE_VIRTUAL_SOURCE;
1338 case media::AudioUsage::ASSISTANT:
1339 return AUDIO_USAGE_ASSISTANT;
1340 case media::AudioUsage::CALL_ASSISTANT:
1341 return AUDIO_USAGE_CALL_ASSISTANT;
1342 case media::AudioUsage::EMERGENCY:
1343 return AUDIO_USAGE_EMERGENCY;
1344 case media::AudioUsage::SAFETY:
1345 return AUDIO_USAGE_SAFETY;
1346 case media::AudioUsage::VEHICLE_STATUS:
1347 return AUDIO_USAGE_VEHICLE_STATUS;
1348 case media::AudioUsage::ANNOUNCEMENT:
1349 return AUDIO_USAGE_ANNOUNCEMENT;
1350 }
1351 return unexpected(BAD_VALUE);
1352}
1353
1354ConversionResult<media::AudioUsage>
1355legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1356 switch (legacy) {
1357 case AUDIO_USAGE_UNKNOWN:
1358 return media::AudioUsage::UNKNOWN;
1359 case AUDIO_USAGE_MEDIA:
1360 return media::AudioUsage::MEDIA;
1361 case AUDIO_USAGE_VOICE_COMMUNICATION:
1362 return media::AudioUsage::VOICE_COMMUNICATION;
1363 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1364 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1365 case AUDIO_USAGE_ALARM:
1366 return media::AudioUsage::ALARM;
1367 case AUDIO_USAGE_NOTIFICATION:
1368 return media::AudioUsage::NOTIFICATION;
1369 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1370 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1371 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1372 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1373 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1374 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1375 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1376 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1377 case AUDIO_USAGE_NOTIFICATION_EVENT:
1378 return media::AudioUsage::NOTIFICATION_EVENT;
1379 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1380 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1381 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1382 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1383 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1384 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1385 case AUDIO_USAGE_GAME:
1386 return media::AudioUsage::GAME;
1387 case AUDIO_USAGE_VIRTUAL_SOURCE:
1388 return media::AudioUsage::VIRTUAL_SOURCE;
1389 case AUDIO_USAGE_ASSISTANT:
1390 return media::AudioUsage::ASSISTANT;
1391 case AUDIO_USAGE_CALL_ASSISTANT:
1392 return media::AudioUsage::CALL_ASSISTANT;
1393 case AUDIO_USAGE_EMERGENCY:
1394 return media::AudioUsage::EMERGENCY;
1395 case AUDIO_USAGE_SAFETY:
1396 return media::AudioUsage::SAFETY;
1397 case AUDIO_USAGE_VEHICLE_STATUS:
1398 return media::AudioUsage::VEHICLE_STATUS;
1399 case AUDIO_USAGE_ANNOUNCEMENT:
1400 return media::AudioUsage::ANNOUNCEMENT;
1401 }
1402 return unexpected(BAD_VALUE);
1403}
1404
1405ConversionResult<audio_flags_mask_t>
1406aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1407 switch (aidl) {
1408 case media::AudioFlag::AUDIBILITY_ENFORCED:
1409 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1410 case media::AudioFlag::SECURE:
1411 return AUDIO_FLAG_SECURE;
1412 case media::AudioFlag::SCO:
1413 return AUDIO_FLAG_SCO;
1414 case media::AudioFlag::BEACON:
1415 return AUDIO_FLAG_BEACON;
1416 case media::AudioFlag::HW_AV_SYNC:
1417 return AUDIO_FLAG_HW_AV_SYNC;
1418 case media::AudioFlag::HW_HOTWORD:
1419 return AUDIO_FLAG_HW_HOTWORD;
1420 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1421 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1422 case media::AudioFlag::BYPASS_MUTE:
1423 return AUDIO_FLAG_BYPASS_MUTE;
1424 case media::AudioFlag::LOW_LATENCY:
1425 return AUDIO_FLAG_LOW_LATENCY;
1426 case media::AudioFlag::DEEP_BUFFER:
1427 return AUDIO_FLAG_DEEP_BUFFER;
1428 case media::AudioFlag::NO_MEDIA_PROJECTION:
1429 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1430 case media::AudioFlag::MUTE_HAPTIC:
1431 return AUDIO_FLAG_MUTE_HAPTIC;
1432 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1433 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1434 case media::AudioFlag::CAPTURE_PRIVATE:
1435 return AUDIO_FLAG_CAPTURE_PRIVATE;
1436 }
1437 return unexpected(BAD_VALUE);
1438}
1439
1440ConversionResult<media::AudioFlag>
1441legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1442 switch (legacy) {
1443 case AUDIO_FLAG_NONE:
1444 return unexpected(BAD_VALUE);
1445 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1446 return media::AudioFlag::AUDIBILITY_ENFORCED;
1447 case AUDIO_FLAG_SECURE:
1448 return media::AudioFlag::SECURE;
1449 case AUDIO_FLAG_SCO:
1450 return media::AudioFlag::SCO;
1451 case AUDIO_FLAG_BEACON:
1452 return media::AudioFlag::BEACON;
1453 case AUDIO_FLAG_HW_AV_SYNC:
1454 return media::AudioFlag::HW_AV_SYNC;
1455 case AUDIO_FLAG_HW_HOTWORD:
1456 return media::AudioFlag::HW_HOTWORD;
1457 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1458 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1459 case AUDIO_FLAG_BYPASS_MUTE:
1460 return media::AudioFlag::BYPASS_MUTE;
1461 case AUDIO_FLAG_LOW_LATENCY:
1462 return media::AudioFlag::LOW_LATENCY;
1463 case AUDIO_FLAG_DEEP_BUFFER:
1464 return media::AudioFlag::DEEP_BUFFER;
1465 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1466 return media::AudioFlag::NO_MEDIA_PROJECTION;
1467 case AUDIO_FLAG_MUTE_HAPTIC:
1468 return media::AudioFlag::MUTE_HAPTIC;
1469 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1470 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1471 case AUDIO_FLAG_CAPTURE_PRIVATE:
1472 return media::AudioFlag::CAPTURE_PRIVATE;
1473 }
1474 return unexpected(BAD_VALUE);
1475}
1476
1477ConversionResult<audio_flags_mask_t>
1478aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1479 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1480 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1481 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1482}
1483
1484ConversionResult<int32_t>
1485legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1486 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001487 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1488 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001489 enumToMask_index<int32_t, media::AudioFlag>);
1490}
1491
1492ConversionResult<audio_attributes_t>
1493aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1494 audio_attributes_t legacy;
1495 legacy.content_type = VALUE_OR_RETURN(
1496 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1497 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1498 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1499 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1500 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1501 return legacy;
1502}
1503
1504ConversionResult<media::AudioAttributesInternal>
1505legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1506 media::AudioAttributesInternal aidl;
1507 aidl.contentType = VALUE_OR_RETURN(
1508 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1509 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1510 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1511 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1512 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1513 return aidl;
1514}
1515
1516ConversionResult<audio_encapsulation_mode_t>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001517aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(media::AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001518 switch (aidl) {
1519 case media::AudioEncapsulationMode::NONE:
1520 return AUDIO_ENCAPSULATION_MODE_NONE;
1521 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1522 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1523 case media::AudioEncapsulationMode::HANDLE:
1524 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1525 }
1526 return unexpected(BAD_VALUE);
1527}
1528
1529ConversionResult<media::AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001530legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001531 switch (legacy) {
1532 case AUDIO_ENCAPSULATION_MODE_NONE:
1533 return media::AudioEncapsulationMode::NONE;
1534 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1535 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1536 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1537 return media::AudioEncapsulationMode::HANDLE;
1538 }
1539 return unexpected(BAD_VALUE);
1540}
1541
1542ConversionResult<audio_offload_info_t>
1543aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1544 audio_offload_info_t legacy;
1545 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1546 legacy.size = sizeof(audio_offload_info_t);
1547 audio_config_base_t config = VALUE_OR_RETURN(
1548 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1549 legacy.sample_rate = config.sample_rate;
1550 legacy.channel_mask = config.channel_mask;
1551 legacy.format = config.format;
1552 legacy.stream_type = VALUE_OR_RETURN(
1553 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1554 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1555 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1556 legacy.has_video = aidl.hasVideo;
1557 legacy.is_streaming = aidl.isStreaming;
1558 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1559 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1560 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1561 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001562 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001563 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1564 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1565 return legacy;
1566}
1567
1568ConversionResult<media::AudioOffloadInfo>
1569legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1570 media::AudioOffloadInfo aidl;
1571 // Version 0.1 fields.
1572 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1573 return unexpected(BAD_VALUE);
1574 }
1575 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1576 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1577 aidl.config.channelMask = VALUE_OR_RETURN(
1578 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1579 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1580 aidl.streamType = VALUE_OR_RETURN(
1581 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1582 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1583 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1584 aidl.hasVideo = legacy.has_video;
1585 aidl.isStreaming = legacy.is_streaming;
1586 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1587 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1588 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1589
1590 // Version 0.2 fields.
1591 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1592 if (legacy.size <
1593 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1594 return unexpected(BAD_VALUE);
1595 }
1596 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001597 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001598 legacy.encapsulation_mode));
1599 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1600 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1601 }
1602 return aidl;
1603}
1604
1605ConversionResult<audio_config_t>
1606aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1607 audio_config_t legacy;
1608 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001609 legacy.channel_mask = VALUE_OR_RETURN(
1610 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001611 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001612 legacy.offload_info = VALUE_OR_RETURN(
1613 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001614 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1615 return legacy;
1616}
1617
1618ConversionResult<media::AudioConfig>
1619legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1620 media::AudioConfig aidl;
1621 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001622 aidl.channelMask = VALUE_OR_RETURN(
1623 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001624 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001625 aidl.offloadInfo = VALUE_OR_RETURN(
1626 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001627 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1628 return aidl;
1629}
1630
1631ConversionResult<audio_config_base_t>
1632aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1633 audio_config_base_t legacy;
1634 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001635 legacy.channel_mask = VALUE_OR_RETURN(
1636 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001637 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1638 return legacy;
1639}
1640
1641ConversionResult<media::AudioConfigBase>
1642legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1643 media::AudioConfigBase aidl;
1644 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001645 aidl.channelMask = VALUE_OR_RETURN(
1646 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001647 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-Tsvibdc293a2020-11-02 17:01:38 -08001687ConversionResult<AudioTimestamp>
1688aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1689 AudioTimestamp legacy;
1690 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1691 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1692 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1693 return legacy;
1694}
1695
1696ConversionResult<media::AudioTimestampInternal>
1697legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1698 media::AudioTimestampInternal aidl;
1699 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1700 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1701 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1702 return aidl;
1703}
1704
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08001705ConversionResult<audio_uuid_t>
1706aidl2legacy_AudioUuid_audio_uuid_t(const media::AudioUuid& aidl) {
1707 audio_uuid_t legacy;
1708 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
1709 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
1710 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
1711 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
1712 if (aidl.node.size() != std::size(legacy.node)) {
1713 return unexpected(BAD_VALUE);
1714 }
1715 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
1716 return legacy;
1717}
1718
1719ConversionResult<media::AudioUuid>
1720legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
1721 media::AudioUuid aidl;
1722 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
1723 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
1724 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
1725 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
1726 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
1727 return aidl;
1728}
1729
1730ConversionResult<effect_descriptor_t>
1731aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
1732 effect_descriptor_t legacy;
1733 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
1734 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
1735 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
1736 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
1737 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
1738 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
1739 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
1740 RETURN_IF_ERROR(
1741 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
1742 return legacy;
1743}
1744
1745ConversionResult<media::EffectDescriptor>
1746legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
1747 media::EffectDescriptor aidl;
1748 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
1749 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
1750 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
1751 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
1752 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
1753 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
1754 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
1755 aidl.implementor = VALUE_OR_RETURN(
1756 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
1757 return aidl;
1758}
1759
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08001760ConversionResult<audio_encapsulation_metadata_type_t>
1761aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
1762 media::AudioEncapsulationMetadataType aidl) {
1763 switch (aidl) {
1764 case media::AudioEncapsulationMetadataType::NONE:
1765 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
1766 case media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
1767 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
1768 case media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
1769 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
1770 }
1771 return unexpected(BAD_VALUE);
1772}
1773
1774ConversionResult<media::AudioEncapsulationMetadataType>
1775legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
1776 audio_encapsulation_metadata_type_t legacy) {
1777 switch (legacy) {
1778 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
1779 return media::AudioEncapsulationMetadataType::NONE;
1780 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
1781 return media::AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
1782 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
1783 return media::AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
1784 }
1785 return unexpected(BAD_VALUE);
1786}
1787
1788ConversionResult<uint32_t>
1789aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
1790 return convertBitmask<uint32_t,
1791 int32_t,
1792 audio_encapsulation_mode_t,
1793 media::AudioEncapsulationMode>(
1794 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
1795 index2enum_index<media::AudioEncapsulationMode>,
1796 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
1797}
1798
1799ConversionResult<int32_t>
1800legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
1801 return convertBitmask<int32_t,
1802 uint32_t,
1803 media::AudioEncapsulationMode,
1804 audio_encapsulation_mode_t>(
1805 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
1806 index2enum_index<audio_encapsulation_mode_t>,
1807 enumToMask_index<int32_t, media::AudioEncapsulationMode>);
1808}
1809
1810ConversionResult<uint32_t>
1811aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
1812 return convertBitmask<uint32_t,
1813 int32_t,
1814 audio_encapsulation_metadata_type_t,
1815 media::AudioEncapsulationMetadataType>(
1816 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
1817 index2enum_index<media::AudioEncapsulationMetadataType>,
1818 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
1819}
1820
1821ConversionResult<int32_t>
1822legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
1823 return convertBitmask<int32_t,
1824 uint32_t,
1825 media::AudioEncapsulationMetadataType,
1826 audio_encapsulation_metadata_type_t>(
1827 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
1828 index2enum_index<audio_encapsulation_metadata_type_t>,
1829 enumToMask_index<int32_t, media::AudioEncapsulationMetadataType>);
1830}
1831
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001832} // namespace android