blob: e844a6ee3c0a538b33bc58f3e0e88fcae0ab9cdc [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;
662 default:
663 return unexpected(BAD_VALUE);
664 }
665}
666
667ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
668 audio_output_flags_t legacy) {
669 switch (legacy) {
670 case AUDIO_OUTPUT_FLAG_DIRECT:
671 return media::AudioOutputFlags::DIRECT;
672 case AUDIO_OUTPUT_FLAG_PRIMARY:
673 return media::AudioOutputFlags::PRIMARY;
674 case AUDIO_OUTPUT_FLAG_FAST:
675 return media::AudioOutputFlags::FAST;
676 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
677 return media::AudioOutputFlags::DEEP_BUFFER;
678 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
679 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
680 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
681 return media::AudioOutputFlags::NON_BLOCKING;
682 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
683 return media::AudioOutputFlags::HW_AV_SYNC;
684 case AUDIO_OUTPUT_FLAG_TTS:
685 return media::AudioOutputFlags::TTS;
686 case AUDIO_OUTPUT_FLAG_RAW:
687 return media::AudioOutputFlags::RAW;
688 case AUDIO_OUTPUT_FLAG_SYNC:
689 return media::AudioOutputFlags::SYNC;
690 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
691 return media::AudioOutputFlags::IEC958_NONAUDIO;
692 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
693 return media::AudioOutputFlags::DIRECT_PCM;
694 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
695 return media::AudioOutputFlags::MMAP_NOIRQ;
696 case AUDIO_OUTPUT_FLAG_VOIP_RX:
697 return media::AudioOutputFlags::VOIP_RX;
698 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
699 return media::AudioOutputFlags::INCALL_MUSIC;
700 default:
701 return unexpected(BAD_VALUE);
702 }
703}
704
705ConversionResult<audio_input_flags_t> aidl2legacy_audio_input_flags_mask(int32_t aidl) {
706 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
707
708 LegacyMask converted = VALUE_OR_RETURN(
709 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
710 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
711 index2enum_index<media::AudioInputFlags>,
712 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
713 return static_cast<audio_input_flags_t>(converted);
714}
715
716ConversionResult<int32_t> legacy2aidl_audio_input_flags_mask(audio_input_flags_t legacy) {
717 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
718
719 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
720 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
721 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
722 index2enum_bitmask<audio_input_flags_t>,
723 enumToMask_index<int32_t, media::AudioInputFlags>);
724}
725
726ConversionResult<audio_output_flags_t> aidl2legacy_audio_output_flags_mask(int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700727 return convertBitmask<audio_output_flags_t,
728 int32_t,
729 audio_output_flags_t,
730 media::AudioOutputFlags>(
731 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
732 index2enum_index<media::AudioOutputFlags>,
733 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700734}
735
736ConversionResult<int32_t> legacy2aidl_audio_output_flags_mask(audio_output_flags_t legacy) {
737 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
738
739 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
740 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
741 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
742 index2enum_bitmask<audio_output_flags_t>,
743 enumToMask_index<int32_t, media::AudioOutputFlags>);
744}
745
746ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
747 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
748 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700749 Direction dir = VALUE_OR_RETURN(direction(role, type));
750 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700751 case Direction::INPUT: {
752 legacy.input = VALUE_OR_RETURN(
753 aidl2legacy_audio_input_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, input))));
754 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700755 break;
756
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700757 case Direction::OUTPUT: {
758 legacy.output = VALUE_OR_RETURN(
759 aidl2legacy_audio_output_flags_mask(VALUE_OR_RETURN(UNION_GET(aidl, output))));
760 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700761 break;
762 }
763
764 return legacy;
765}
766
767ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
768 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
769 media::AudioIoFlags aidl;
770
771 Direction dir = VALUE_OR_RETURN(direction(role, type));
772 switch (dir) {
773 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700774 UNION_SET(aidl, input,
775 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_mask(legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700776 break;
777 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700778 UNION_SET(aidl, output,
779 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_mask(legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700780 break;
781 }
782 return aidl;
783}
784
785ConversionResult<audio_port_config_device_ext> aidl2legacy_AudioPortConfigDeviceExt(
786 const media::AudioPortConfigDeviceExt& aidl) {
787 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700788 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700789 legacy.type = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_devices_t(aidl.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700790 RETURN_IF_ERROR(aidl2legacy_string(aidl.address, legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700791 return legacy;
792}
793
794ConversionResult<media::AudioPortConfigDeviceExt> legacy2aidl_AudioPortConfigDeviceExt(
795 const audio_port_config_device_ext& legacy) {
796 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700797 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700798 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_devices_t_int32_t(legacy.type));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700799 aidl.address = VALUE_OR_RETURN(
800 legacy2aidl_string(legacy.address, AUDIO_DEVICE_MAX_ADDRESS_LEN));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700801 return aidl;
802}
803
804ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
805 media::AudioStreamType aidl) {
806 switch (aidl) {
807 case media::AudioStreamType::DEFAULT:
808 return AUDIO_STREAM_DEFAULT;
809 case media::AudioStreamType::VOICE_CALL:
810 return AUDIO_STREAM_VOICE_CALL;
811 case media::AudioStreamType::SYSTEM:
812 return AUDIO_STREAM_SYSTEM;
813 case media::AudioStreamType::RING:
814 return AUDIO_STREAM_RING;
815 case media::AudioStreamType::MUSIC:
816 return AUDIO_STREAM_MUSIC;
817 case media::AudioStreamType::ALARM:
818 return AUDIO_STREAM_ALARM;
819 case media::AudioStreamType::NOTIFICATION:
820 return AUDIO_STREAM_NOTIFICATION;
821 case media::AudioStreamType::BLUETOOTH_SCO:
822 return AUDIO_STREAM_BLUETOOTH_SCO;
823 case media::AudioStreamType::ENFORCED_AUDIBLE:
824 return AUDIO_STREAM_ENFORCED_AUDIBLE;
825 case media::AudioStreamType::DTMF:
826 return AUDIO_STREAM_DTMF;
827 case media::AudioStreamType::TTS:
828 return AUDIO_STREAM_TTS;
829 case media::AudioStreamType::ACCESSIBILITY:
830 return AUDIO_STREAM_ACCESSIBILITY;
831 case media::AudioStreamType::ASSISTANT:
832 return AUDIO_STREAM_ASSISTANT;
833 case media::AudioStreamType::REROUTING:
834 return AUDIO_STREAM_REROUTING;
835 case media::AudioStreamType::PATCH:
836 return AUDIO_STREAM_PATCH;
837 case media::AudioStreamType::CALL_ASSISTANT:
838 return AUDIO_STREAM_CALL_ASSISTANT;
839 default:
840 return unexpected(BAD_VALUE);
841 }
842}
843
844ConversionResult<media::AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
845 audio_stream_type_t legacy) {
846 switch (legacy) {
847 case AUDIO_STREAM_DEFAULT:
848 return media::AudioStreamType::DEFAULT;
849 case AUDIO_STREAM_VOICE_CALL:
850 return media::AudioStreamType::VOICE_CALL;
851 case AUDIO_STREAM_SYSTEM:
852 return media::AudioStreamType::SYSTEM;
853 case AUDIO_STREAM_RING:
854 return media::AudioStreamType::RING;
855 case AUDIO_STREAM_MUSIC:
856 return media::AudioStreamType::MUSIC;
857 case AUDIO_STREAM_ALARM:
858 return media::AudioStreamType::ALARM;
859 case AUDIO_STREAM_NOTIFICATION:
860 return media::AudioStreamType::NOTIFICATION;
861 case AUDIO_STREAM_BLUETOOTH_SCO:
862 return media::AudioStreamType::BLUETOOTH_SCO;
863 case AUDIO_STREAM_ENFORCED_AUDIBLE:
864 return media::AudioStreamType::ENFORCED_AUDIBLE;
865 case AUDIO_STREAM_DTMF:
866 return media::AudioStreamType::DTMF;
867 case AUDIO_STREAM_TTS:
868 return media::AudioStreamType::TTS;
869 case AUDIO_STREAM_ACCESSIBILITY:
870 return media::AudioStreamType::ACCESSIBILITY;
871 case AUDIO_STREAM_ASSISTANT:
872 return media::AudioStreamType::ASSISTANT;
873 case AUDIO_STREAM_REROUTING:
874 return media::AudioStreamType::REROUTING;
875 case AUDIO_STREAM_PATCH:
876 return media::AudioStreamType::PATCH;
877 case AUDIO_STREAM_CALL_ASSISTANT:
878 return media::AudioStreamType::CALL_ASSISTANT;
879 default:
880 return unexpected(BAD_VALUE);
881 }
882}
883
884ConversionResult<audio_source_t> aidl2legacy_AudioSourceType_audio_source_t(
885 media::AudioSourceType aidl) {
886 switch (aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800887 case media::AudioSourceType::INVALID:
888 // This value does not have an enum
889 return AUDIO_SOURCE_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700890 case media::AudioSourceType::DEFAULT:
891 return AUDIO_SOURCE_DEFAULT;
892 case media::AudioSourceType::MIC:
893 return AUDIO_SOURCE_MIC;
894 case media::AudioSourceType::VOICE_UPLINK:
895 return AUDIO_SOURCE_VOICE_UPLINK;
896 case media::AudioSourceType::VOICE_DOWNLINK:
897 return AUDIO_SOURCE_VOICE_DOWNLINK;
898 case media::AudioSourceType::VOICE_CALL:
899 return AUDIO_SOURCE_VOICE_CALL;
900 case media::AudioSourceType::CAMCORDER:
901 return AUDIO_SOURCE_CAMCORDER;
902 case media::AudioSourceType::VOICE_RECOGNITION:
903 return AUDIO_SOURCE_VOICE_RECOGNITION;
904 case media::AudioSourceType::VOICE_COMMUNICATION:
905 return AUDIO_SOURCE_VOICE_COMMUNICATION;
906 case media::AudioSourceType::REMOTE_SUBMIX:
907 return AUDIO_SOURCE_REMOTE_SUBMIX;
908 case media::AudioSourceType::UNPROCESSED:
909 return AUDIO_SOURCE_UNPROCESSED;
910 case media::AudioSourceType::VOICE_PERFORMANCE:
911 return AUDIO_SOURCE_VOICE_PERFORMANCE;
912 case media::AudioSourceType::ECHO_REFERENCE:
913 return AUDIO_SOURCE_ECHO_REFERENCE;
914 case media::AudioSourceType::FM_TUNER:
915 return AUDIO_SOURCE_FM_TUNER;
916 case media::AudioSourceType::HOTWORD:
917 return AUDIO_SOURCE_HOTWORD;
918 default:
919 return unexpected(BAD_VALUE);
920 }
921}
922
923ConversionResult<media::AudioSourceType> legacy2aidl_audio_source_t_AudioSourceType(
924 audio_source_t legacy) {
925 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800926 case AUDIO_SOURCE_INVALID:
927 return media::AudioSourceType::INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700928 case AUDIO_SOURCE_DEFAULT:
929 return media::AudioSourceType::DEFAULT;
930 case AUDIO_SOURCE_MIC:
931 return media::AudioSourceType::MIC;
932 case AUDIO_SOURCE_VOICE_UPLINK:
933 return media::AudioSourceType::VOICE_UPLINK;
934 case AUDIO_SOURCE_VOICE_DOWNLINK:
935 return media::AudioSourceType::VOICE_DOWNLINK;
936 case AUDIO_SOURCE_VOICE_CALL:
937 return media::AudioSourceType::VOICE_CALL;
938 case AUDIO_SOURCE_CAMCORDER:
939 return media::AudioSourceType::CAMCORDER;
940 case AUDIO_SOURCE_VOICE_RECOGNITION:
941 return media::AudioSourceType::VOICE_RECOGNITION;
942 case AUDIO_SOURCE_VOICE_COMMUNICATION:
943 return media::AudioSourceType::VOICE_COMMUNICATION;
944 case AUDIO_SOURCE_REMOTE_SUBMIX:
945 return media::AudioSourceType::REMOTE_SUBMIX;
946 case AUDIO_SOURCE_UNPROCESSED:
947 return media::AudioSourceType::UNPROCESSED;
948 case AUDIO_SOURCE_VOICE_PERFORMANCE:
949 return media::AudioSourceType::VOICE_PERFORMANCE;
950 case AUDIO_SOURCE_ECHO_REFERENCE:
951 return media::AudioSourceType::ECHO_REFERENCE;
952 case AUDIO_SOURCE_FM_TUNER:
953 return media::AudioSourceType::FM_TUNER;
954 case AUDIO_SOURCE_HOTWORD:
955 return media::AudioSourceType::HOTWORD;
956 default:
957 return unexpected(BAD_VALUE);
958 }
959}
960
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800961ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
962 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700963}
964
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800965ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
966 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700967}
968
969// This type is unnamed in the original definition, thus we name it here.
970using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
971
972ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
973 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
974 audio_port_config_mix_ext_usecase legacy;
975
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700976 switch (role) {
977 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700978 // Just verify that the union is empty.
979 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700980 break;
981
982 case media::AudioPortRole::SOURCE:
983 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700984 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
985 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700986 break;
987
988 case media::AudioPortRole::SINK:
989 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -0700990 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(
991 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700992 break;
993
994 default:
995 LOG_ALWAYS_FATAL("Shouldn't get here");
996 }
997 return legacy;
998}
999
1000ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
1001 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
1002 media::AudioPortConfigMixExtUseCase aidl;
1003
1004 switch (role) {
1005 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001006 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001007 break;
1008 case AUDIO_PORT_ROLE_SOURCE:
1009 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001010 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1011 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001012 break;
1013 case AUDIO_PORT_ROLE_SINK:
1014 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001015 UNION_SET(aidl, source,
1016 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001017 break;
1018 default:
1019 LOG_ALWAYS_FATAL("Shouldn't get here");
1020 }
1021 return aidl;
1022}
1023
1024ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1025 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1026 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001027 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1028 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001029 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1030 return legacy;
1031}
1032
1033ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1034 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1035 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001036 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1037 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001038 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1039 return aidl;
1040}
1041
1042ConversionResult<audio_port_config_session_ext> aidl2legacy_AudioPortConfigSessionExt(
1043 const media::AudioPortConfigSessionExt& aidl) {
1044 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001045 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001046 return legacy;
1047}
1048
1049ConversionResult<media::AudioPortConfigSessionExt> legacy2aidl_AudioPortConfigSessionExt(
1050 const audio_port_config_session_ext& legacy) {
1051 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001052 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001053 return aidl;
1054}
1055
1056// This type is unnamed in the original definition, thus we name it here.
1057using audio_port_config_ext = decltype(audio_port_config::ext);
1058
1059ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1060 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1061 media::AudioPortRole role) {
1062 audio_port_config_ext legacy;
1063 // Our way of representing a union in AIDL is to have multiple vectors and require that at most
1064 // one of the them has size 1 and the rest are empty.
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001065 switch (type) {
1066 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001067 // Just verify that the union is empty.
1068 VALUE_OR_RETURN(UNION_GET(aidl, nothing));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001069 break;
1070 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001071 legacy.device = VALUE_OR_RETURN(
1072 aidl2legacy_AudioPortConfigDeviceExt(VALUE_OR_RETURN(UNION_GET(aidl, device))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001073 break;
1074 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001075 legacy.mix = VALUE_OR_RETURN(
1076 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001077 break;
1078 case media::AudioPortType::SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001079 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigSessionExt(
1080 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001081 break;
1082 default:
1083 LOG_ALWAYS_FATAL("Shouldn't get here");
1084 }
1085 return legacy;
1086}
1087
1088ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1089 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1090 media::AudioPortConfigExt aidl;
1091
1092 switch (type) {
1093 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001094 UNION_SET(aidl, nothing, false);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001095 break;
1096 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001097 UNION_SET(aidl, device,
1098 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigDeviceExt(legacy.device)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001099 break;
1100 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001101 UNION_SET(aidl, mix,
1102 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001103 break;
1104 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001105 UNION_SET(aidl, session,
1106 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigSessionExt(legacy.session)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001107 break;
1108 default:
1109 LOG_ALWAYS_FATAL("Shouldn't get here");
1110 }
1111 return aidl;
1112}
1113
1114ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1115 const media::AudioPortConfig& aidl) {
1116 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001117 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001118 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1119 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1120 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1121 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1122 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1123 }
1124 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
1125 legacy.channel_mask =
1126 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1127 }
1128 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
1129 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1130 }
1131 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1132 legacy.gain = VALUE_OR_RETURN(
1133 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1134 }
1135 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1136 legacy.flags = VALUE_OR_RETURN(
1137 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1138 }
1139 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1140 return legacy;
1141}
1142
1143ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1144 const audio_port_config& legacy) {
1145 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001146 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001147 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1148 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1149 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1150 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1151 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1152 }
1153 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
1154 aidl.channelMask =
1155 VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1156 }
1157 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
1158 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1159 }
1160 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1161 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1162 legacy.gain, legacy.role, legacy.type));
1163 }
1164 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1165 aidl.flags = VALUE_OR_RETURN(
1166 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1167 }
1168 aidl.ext =
1169 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1170 return aidl;
1171}
1172
1173ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1174 const media::AudioPatch& aidl) {
1175 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001176 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001177 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1178 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1179 return unexpected(BAD_VALUE);
1180 }
1181 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1182 legacy.sinks[i] =
1183 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1184 }
1185 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1186 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1187 return unexpected(BAD_VALUE);
1188 }
1189 for (size_t i = 0; i < legacy.num_sources; ++i) {
1190 legacy.sources[i] =
1191 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1192 }
1193 return legacy;
1194}
1195
1196ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1197 const struct audio_patch& legacy) {
1198 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001199 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001200
1201 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1202 return unexpected(BAD_VALUE);
1203 }
1204 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1205 aidl.sinks.push_back(
1206 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1207 }
1208 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1209 return unexpected(BAD_VALUE);
1210 }
1211 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1212 aidl.sources.push_back(
1213 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1214 }
1215 return aidl;
1216}
1217
1218ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1219 const media::AudioIoDescriptor& aidl) {
1220 sp<AudioIoDescriptor> legacy(new AudioIoDescriptor());
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001221 legacy->mIoHandle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001222 legacy->mPatch = VALUE_OR_RETURN(aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1223 legacy->mSamplingRate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1224 legacy->mFormat = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1225 legacy->mChannelMask =
1226 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
1227 legacy->mFrameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1228 legacy->mFrameCountHAL = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1229 legacy->mLatency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001230 legacy->mPortId = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001231 return legacy;
1232}
1233
1234ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1235 const sp<AudioIoDescriptor>& legacy) {
1236 media::AudioIoDescriptor aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001237 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->mIoHandle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001238 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->mPatch));
1239 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mSamplingRate));
1240 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy->mFormat));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001241 aidl.channelMask = VALUE_OR_RETURN(
1242 legacy2aidl_audio_channel_mask_t_int32_t(legacy->mChannelMask));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001243 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCount));
1244 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->mFrameCountHAL));
1245 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->mLatency));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001246 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->mPortId));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001247 return aidl;
1248}
1249
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001250ConversionResult<AudioClient> aidl2legacy_AudioClient(const media::AudioClient& aidl) {
1251 AudioClient legacy;
1252 legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
1253 legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
1254 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
1255 legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
1256 return legacy;
1257}
1258
1259ConversionResult<media::AudioClient> legacy2aidl_AudioClient(const AudioClient& legacy) {
1260 media::AudioClient aidl;
1261 aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
1262 aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
1263 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
1264 aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
1265 return aidl;
1266}
1267
1268ConversionResult<audio_content_type_t>
1269aidl2legacy_AudioContentType_audio_content_type_t(media::AudioContentType aidl) {
1270 switch (aidl) {
1271 case media::AudioContentType::UNKNOWN:
1272 return AUDIO_CONTENT_TYPE_UNKNOWN;
1273 case media::AudioContentType::SPEECH:
1274 return AUDIO_CONTENT_TYPE_SPEECH;
1275 case media::AudioContentType::MUSIC:
1276 return AUDIO_CONTENT_TYPE_MUSIC;
1277 case media::AudioContentType::MOVIE:
1278 return AUDIO_CONTENT_TYPE_MOVIE;
1279 case media::AudioContentType::SONIFICATION:
1280 return AUDIO_CONTENT_TYPE_SONIFICATION;
1281 }
1282 return unexpected(BAD_VALUE);
1283}
1284
1285ConversionResult<media::AudioContentType>
1286legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1287 switch (legacy) {
1288 case AUDIO_CONTENT_TYPE_UNKNOWN:
1289 return media::AudioContentType::UNKNOWN;
1290 case AUDIO_CONTENT_TYPE_SPEECH:
1291 return media::AudioContentType::SPEECH;
1292 case AUDIO_CONTENT_TYPE_MUSIC:
1293 return media::AudioContentType::MUSIC;
1294 case AUDIO_CONTENT_TYPE_MOVIE:
1295 return media::AudioContentType::MOVIE;
1296 case AUDIO_CONTENT_TYPE_SONIFICATION:
1297 return media::AudioContentType::SONIFICATION;
1298 }
1299 return unexpected(BAD_VALUE);
1300}
1301
1302ConversionResult<audio_usage_t>
1303aidl2legacy_AudioUsage_audio_usage_t(media::AudioUsage aidl) {
1304 switch (aidl) {
1305 case media::AudioUsage::UNKNOWN:
1306 return AUDIO_USAGE_UNKNOWN;
1307 case media::AudioUsage::MEDIA:
1308 return AUDIO_USAGE_MEDIA;
1309 case media::AudioUsage::VOICE_COMMUNICATION:
1310 return AUDIO_USAGE_VOICE_COMMUNICATION;
1311 case media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1312 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1313 case media::AudioUsage::ALARM:
1314 return AUDIO_USAGE_ALARM;
1315 case media::AudioUsage::NOTIFICATION:
1316 return AUDIO_USAGE_NOTIFICATION;
1317 case media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1318 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1319 case media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST:
1320 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1321 case media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT:
1322 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1323 case media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED:
1324 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1325 case media::AudioUsage::NOTIFICATION_EVENT:
1326 return AUDIO_USAGE_NOTIFICATION_EVENT;
1327 case media::AudioUsage::ASSISTANCE_ACCESSIBILITY:
1328 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1329 case media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1330 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1331 case media::AudioUsage::ASSISTANCE_SONIFICATION:
1332 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1333 case media::AudioUsage::GAME:
1334 return AUDIO_USAGE_GAME;
1335 case media::AudioUsage::VIRTUAL_SOURCE:
1336 return AUDIO_USAGE_VIRTUAL_SOURCE;
1337 case media::AudioUsage::ASSISTANT:
1338 return AUDIO_USAGE_ASSISTANT;
1339 case media::AudioUsage::CALL_ASSISTANT:
1340 return AUDIO_USAGE_CALL_ASSISTANT;
1341 case media::AudioUsage::EMERGENCY:
1342 return AUDIO_USAGE_EMERGENCY;
1343 case media::AudioUsage::SAFETY:
1344 return AUDIO_USAGE_SAFETY;
1345 case media::AudioUsage::VEHICLE_STATUS:
1346 return AUDIO_USAGE_VEHICLE_STATUS;
1347 case media::AudioUsage::ANNOUNCEMENT:
1348 return AUDIO_USAGE_ANNOUNCEMENT;
1349 }
1350 return unexpected(BAD_VALUE);
1351}
1352
1353ConversionResult<media::AudioUsage>
1354legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1355 switch (legacy) {
1356 case AUDIO_USAGE_UNKNOWN:
1357 return media::AudioUsage::UNKNOWN;
1358 case AUDIO_USAGE_MEDIA:
1359 return media::AudioUsage::MEDIA;
1360 case AUDIO_USAGE_VOICE_COMMUNICATION:
1361 return media::AudioUsage::VOICE_COMMUNICATION;
1362 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1363 return media::AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1364 case AUDIO_USAGE_ALARM:
1365 return media::AudioUsage::ALARM;
1366 case AUDIO_USAGE_NOTIFICATION:
1367 return media::AudioUsage::NOTIFICATION;
1368 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1369 return media::AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1370 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1371 return media::AudioUsage::NOTIFICATION_COMMUNICATION_REQUEST;
1372 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1373 return media::AudioUsage::NOTIFICATION_COMMUNICATION_INSTANT;
1374 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1375 return media::AudioUsage::NOTIFICATION_COMMUNICATION_DELAYED;
1376 case AUDIO_USAGE_NOTIFICATION_EVENT:
1377 return media::AudioUsage::NOTIFICATION_EVENT;
1378 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1379 return media::AudioUsage::ASSISTANCE_ACCESSIBILITY;
1380 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1381 return media::AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1382 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1383 return media::AudioUsage::ASSISTANCE_SONIFICATION;
1384 case AUDIO_USAGE_GAME:
1385 return media::AudioUsage::GAME;
1386 case AUDIO_USAGE_VIRTUAL_SOURCE:
1387 return media::AudioUsage::VIRTUAL_SOURCE;
1388 case AUDIO_USAGE_ASSISTANT:
1389 return media::AudioUsage::ASSISTANT;
1390 case AUDIO_USAGE_CALL_ASSISTANT:
1391 return media::AudioUsage::CALL_ASSISTANT;
1392 case AUDIO_USAGE_EMERGENCY:
1393 return media::AudioUsage::EMERGENCY;
1394 case AUDIO_USAGE_SAFETY:
1395 return media::AudioUsage::SAFETY;
1396 case AUDIO_USAGE_VEHICLE_STATUS:
1397 return media::AudioUsage::VEHICLE_STATUS;
1398 case AUDIO_USAGE_ANNOUNCEMENT:
1399 return media::AudioUsage::ANNOUNCEMENT;
1400 }
1401 return unexpected(BAD_VALUE);
1402}
1403
1404ConversionResult<audio_flags_mask_t>
1405aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
1406 switch (aidl) {
1407 case media::AudioFlag::AUDIBILITY_ENFORCED:
1408 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1409 case media::AudioFlag::SECURE:
1410 return AUDIO_FLAG_SECURE;
1411 case media::AudioFlag::SCO:
1412 return AUDIO_FLAG_SCO;
1413 case media::AudioFlag::BEACON:
1414 return AUDIO_FLAG_BEACON;
1415 case media::AudioFlag::HW_AV_SYNC:
1416 return AUDIO_FLAG_HW_AV_SYNC;
1417 case media::AudioFlag::HW_HOTWORD:
1418 return AUDIO_FLAG_HW_HOTWORD;
1419 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
1420 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1421 case media::AudioFlag::BYPASS_MUTE:
1422 return AUDIO_FLAG_BYPASS_MUTE;
1423 case media::AudioFlag::LOW_LATENCY:
1424 return AUDIO_FLAG_LOW_LATENCY;
1425 case media::AudioFlag::DEEP_BUFFER:
1426 return AUDIO_FLAG_DEEP_BUFFER;
1427 case media::AudioFlag::NO_MEDIA_PROJECTION:
1428 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1429 case media::AudioFlag::MUTE_HAPTIC:
1430 return AUDIO_FLAG_MUTE_HAPTIC;
1431 case media::AudioFlag::NO_SYSTEM_CAPTURE:
1432 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1433 case media::AudioFlag::CAPTURE_PRIVATE:
1434 return AUDIO_FLAG_CAPTURE_PRIVATE;
1435 }
1436 return unexpected(BAD_VALUE);
1437}
1438
1439ConversionResult<media::AudioFlag>
1440legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1441 switch (legacy) {
1442 case AUDIO_FLAG_NONE:
1443 return unexpected(BAD_VALUE);
1444 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1445 return media::AudioFlag::AUDIBILITY_ENFORCED;
1446 case AUDIO_FLAG_SECURE:
1447 return media::AudioFlag::SECURE;
1448 case AUDIO_FLAG_SCO:
1449 return media::AudioFlag::SCO;
1450 case AUDIO_FLAG_BEACON:
1451 return media::AudioFlag::BEACON;
1452 case AUDIO_FLAG_HW_AV_SYNC:
1453 return media::AudioFlag::HW_AV_SYNC;
1454 case AUDIO_FLAG_HW_HOTWORD:
1455 return media::AudioFlag::HW_HOTWORD;
1456 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1457 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
1458 case AUDIO_FLAG_BYPASS_MUTE:
1459 return media::AudioFlag::BYPASS_MUTE;
1460 case AUDIO_FLAG_LOW_LATENCY:
1461 return media::AudioFlag::LOW_LATENCY;
1462 case AUDIO_FLAG_DEEP_BUFFER:
1463 return media::AudioFlag::DEEP_BUFFER;
1464 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1465 return media::AudioFlag::NO_MEDIA_PROJECTION;
1466 case AUDIO_FLAG_MUTE_HAPTIC:
1467 return media::AudioFlag::MUTE_HAPTIC;
1468 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1469 return media::AudioFlag::NO_SYSTEM_CAPTURE;
1470 case AUDIO_FLAG_CAPTURE_PRIVATE:
1471 return media::AudioFlag::CAPTURE_PRIVATE;
1472 }
1473 return unexpected(BAD_VALUE);
1474}
1475
1476ConversionResult<audio_flags_mask_t>
1477aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1478 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
1479 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, index2enum_index<media::AudioFlag>,
1480 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1481}
1482
1483ConversionResult<int32_t>
1484legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1485 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001486 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1487 index2enum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001488 enumToMask_index<int32_t, media::AudioFlag>);
1489}
1490
1491ConversionResult<audio_attributes_t>
1492aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
1493 audio_attributes_t legacy;
1494 legacy.content_type = VALUE_OR_RETURN(
1495 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
1496 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1497 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSourceType_audio_source_t(aidl.source));
1498 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
1499 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
1500 return legacy;
1501}
1502
1503ConversionResult<media::AudioAttributesInternal>
1504legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
1505 media::AudioAttributesInternal aidl;
1506 aidl.contentType = VALUE_OR_RETURN(
1507 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
1508 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1509 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSourceType(legacy.source));
1510 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
1511 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
1512 return aidl;
1513}
1514
1515ConversionResult<audio_encapsulation_mode_t>
1516aidl2legacy_audio_encapsulation_mode_t_AudioEncapsulationMode(media::AudioEncapsulationMode aidl) {
1517 switch (aidl) {
1518 case media::AudioEncapsulationMode::NONE:
1519 return AUDIO_ENCAPSULATION_MODE_NONE;
1520 case media::AudioEncapsulationMode::ELEMENTARY_STREAM:
1521 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
1522 case media::AudioEncapsulationMode::HANDLE:
1523 return AUDIO_ENCAPSULATION_MODE_HANDLE;
1524 }
1525 return unexpected(BAD_VALUE);
1526}
1527
1528ConversionResult<media::AudioEncapsulationMode>
1529legacy2aidl_AudioEncapsulationMode_audio_encapsulation_mode_t(audio_encapsulation_mode_t legacy) {
1530 switch (legacy) {
1531 case AUDIO_ENCAPSULATION_MODE_NONE:
1532 return media::AudioEncapsulationMode::NONE;
1533 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
1534 return media::AudioEncapsulationMode::ELEMENTARY_STREAM;
1535 case AUDIO_ENCAPSULATION_MODE_HANDLE:
1536 return media::AudioEncapsulationMode::HANDLE;
1537 }
1538 return unexpected(BAD_VALUE);
1539}
1540
1541ConversionResult<audio_offload_info_t>
1542aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const media::AudioOffloadInfo& aidl) {
1543 audio_offload_info_t legacy;
1544 legacy.version = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.version));
1545 legacy.size = sizeof(audio_offload_info_t);
1546 audio_config_base_t config = VALUE_OR_RETURN(
1547 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
1548 legacy.sample_rate = config.sample_rate;
1549 legacy.channel_mask = config.channel_mask;
1550 legacy.format = config.format;
1551 legacy.stream_type = VALUE_OR_RETURN(
1552 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
1553 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRate));
1554 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
1555 legacy.has_video = aidl.hasVideo;
1556 legacy.is_streaming = aidl.isStreaming;
1557 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
1558 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
1559 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
1560 legacy.encapsulation_mode = VALUE_OR_RETURN(
1561 aidl2legacy_audio_encapsulation_mode_t_AudioEncapsulationMode(aidl.encapsulationMode));
1562 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
1563 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
1564 return legacy;
1565}
1566
1567ConversionResult<media::AudioOffloadInfo>
1568legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
1569 media::AudioOffloadInfo aidl;
1570 // Version 0.1 fields.
1571 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
1572 return unexpected(BAD_VALUE);
1573 }
1574 aidl.version = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.version));
1575 aidl.config.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1576 aidl.config.channelMask = VALUE_OR_RETURN(
1577 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
1578 aidl.config.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1579 aidl.streamType = VALUE_OR_RETURN(
1580 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
1581 aidl.bitRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
1582 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
1583 aidl.hasVideo = legacy.has_video;
1584 aidl.isStreaming = legacy.is_streaming;
1585 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
1586 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
1587 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
1588
1589 // Version 0.2 fields.
1590 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
1591 if (legacy.size <
1592 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
1593 return unexpected(BAD_VALUE);
1594 }
1595 aidl.encapsulationMode = VALUE_OR_RETURN(
1596 legacy2aidl_AudioEncapsulationMode_audio_encapsulation_mode_t(
1597 legacy.encapsulation_mode));
1598 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
1599 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
1600 }
1601 return aidl;
1602}
1603
1604ConversionResult<audio_config_t>
1605aidl2legacy_AudioConfig_audio_config_t(const media::AudioConfig& aidl) {
1606 audio_config_t legacy;
1607 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001608 legacy.channel_mask = VALUE_OR_RETURN(
1609 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001610 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001611 legacy.offload_info = VALUE_OR_RETURN(
1612 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001613 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
1614 return legacy;
1615}
1616
1617ConversionResult<media::AudioConfig>
1618legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy) {
1619 media::AudioConfig aidl;
1620 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001621 aidl.channelMask = VALUE_OR_RETURN(
1622 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001623 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001624 aidl.offloadInfo = VALUE_OR_RETURN(
1625 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001626 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
1627 return aidl;
1628}
1629
1630ConversionResult<audio_config_base_t>
1631aidl2legacy_AudioConfigBase_audio_config_base_t(const media::AudioConfigBase& aidl) {
1632 audio_config_base_t legacy;
1633 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001634 legacy.channel_mask = VALUE_OR_RETURN(
1635 aidl2legacy_int32_t_audio_channel_mask_t(aidl.channelMask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001636 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormat_audio_format_t(aidl.format));
1637 return legacy;
1638}
1639
1640ConversionResult<media::AudioConfigBase>
1641legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy) {
1642 media::AudioConfigBase aidl;
1643 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001644 aidl.channelMask = VALUE_OR_RETURN(
1645 legacy2aidl_audio_channel_mask_t_int32_t(legacy.channel_mask));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001646 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormat(legacy.format));
1647 return aidl;
1648}
1649
1650ConversionResult<sp<IMemory>>
1651aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
1652 sp<IMemory> legacy;
1653 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
1654 return unexpected(BAD_VALUE);
1655 }
1656 return legacy;
1657}
1658
1659ConversionResult<media::SharedFileRegion>
1660legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1661 media::SharedFileRegion aidl;
1662 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
1663 return unexpected(BAD_VALUE);
1664 }
1665 return aidl;
1666}
1667
1668ConversionResult<sp<IMemory>>
1669aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
1670 sp<IMemory> legacy;
1671 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
1672 return unexpected(BAD_VALUE);
1673 }
1674 return legacy;
1675}
1676
1677ConversionResult<std::optional<media::SharedFileRegion>>
1678legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
1679 std::optional<media::SharedFileRegion> aidl;
1680 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
1681 return unexpected(BAD_VALUE);
1682 }
1683 return aidl;
1684}
1685
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08001686ConversionResult<AudioTimestamp>
1687aidl2legacy_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
1688 AudioTimestamp legacy;
1689 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
1690 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
1691 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
1692 return legacy;
1693}
1694
1695ConversionResult<media::AudioTimestampInternal>
1696legacy2aidl_AudioTimestamp(const AudioTimestamp& legacy) {
1697 media::AudioTimestampInternal aidl;
1698 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
1699 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
1700 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
1701 return aidl;
1702}
1703
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001704} // namespace android