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