blob: fad861a138cc23081db82308b5cfa1f2c31e5ad1 [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
Mikhail Naganove128b8e2021-06-04 17:31:03 -070017#include <algorithm>
18#include <unordered_map>
19#include <utility>
20#include <vector>
21
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070022#define LOG_TAG "AidlConversion"
23//#define LOG_NDEBUG 0
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070024#include <utils/Log.h>
25
26#include "media/AidlConversion.h"
27
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -080028#include <media/ShmemCompat.h>
Mikhail Naganove128b8e2021-06-04 17:31:03 -070029#include <media/stagefright/foundation/MediaDefs.h>
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -070030
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070031////////////////////////////////////////////////////////////////////////////////////////////////////
32// Utilities
33
34namespace android {
35
36using base::unexpected;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070037using media::audio::common::AudioChannelLayout;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070038using media::audio::common::AudioConfig;
39using media::audio::common::AudioConfigBase;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070040using media::audio::common::AudioContentType;
Mikhail Naganov932cb962021-09-16 01:05:27 +000041using media::audio::common::AudioDevice;
42using media::audio::common::AudioDeviceAddress;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000043using media::audio::common::AudioDeviceDescription;
44using media::audio::common::AudioDeviceType;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070045using media::audio::common::AudioEncapsulationMetadataType;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070046using media::audio::common::AudioEncapsulationMode;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070047using media::audio::common::AudioEncapsulationType;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070048using media::audio::common::AudioFormatDescription;
49using media::audio::common::AudioFormatType;
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +000050using media::audio::common::AudioGain;
51using media::audio::common::AudioGainConfig;
52using media::audio::common::AudioGainMode;
Mikhail Naganov10506122021-10-19 10:14:23 -070053using media::audio::common::AudioInputFlags;
54using media::audio::common::AudioIoFlags;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070055using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070056using media::audio::common::AudioOffloadInfo;
Mikhail Naganov10506122021-10-19 10:14:23 -070057using media::audio::common::AudioOutputFlags;
58using media::audio::common::AudioPortDeviceExt;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000059using media::audio::common::AudioPortExt;
60using media::audio::common::AudioPortMixExt;
61using media::audio::common::AudioPortMixExtUseCase;
Mikhail Naganov89818ba2021-09-21 20:37:13 +000062using media::audio::common::AudioProfile;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070063using media::audio::common::AudioSource;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000064using media::audio::common::AudioStandard;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070065using media::audio::common::AudioStreamType;
66using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070067using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000068using media::audio::common::ExtraAudioDescriptor;
69using media::audio::common::Int;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070070using media::audio::common::PcmType;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070071
72namespace {
73
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070074enum class Direction {
75 INPUT, OUTPUT
76};
77
78ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
79 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -080080 case media::AudioPortType::NONE:
81 case media::AudioPortType::SESSION:
82 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070083 case media::AudioPortType::DEVICE:
84 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080085 case media::AudioPortRole::NONE:
86 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070087 case media::AudioPortRole::SOURCE:
88 return Direction::INPUT;
89 case media::AudioPortRole::SINK:
90 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070091 }
92 break;
93 case media::AudioPortType::MIX:
94 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080095 case media::AudioPortRole::NONE:
96 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070097 case media::AudioPortRole::SOURCE:
98 return Direction::OUTPUT;
99 case media::AudioPortRole::SINK:
100 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700101 }
102 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700103 }
104 return unexpected(BAD_VALUE);
105}
106
107ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
108 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -0800109 case AUDIO_PORT_TYPE_NONE:
110 case AUDIO_PORT_TYPE_SESSION:
111 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700112 case AUDIO_PORT_TYPE_DEVICE:
113 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800114 case AUDIO_PORT_ROLE_NONE:
115 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700116 case AUDIO_PORT_ROLE_SOURCE:
117 return Direction::INPUT;
118 case AUDIO_PORT_ROLE_SINK:
119 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700120 }
121 break;
122 case AUDIO_PORT_TYPE_MIX:
123 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800124 case AUDIO_PORT_ROLE_NONE:
125 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700126 case AUDIO_PORT_ROLE_SOURCE:
127 return Direction::OUTPUT;
128 case AUDIO_PORT_ROLE_SINK:
129 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700130 }
131 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700132 }
133 return unexpected(BAD_VALUE);
134}
135
136} // namespace
137
138////////////////////////////////////////////////////////////////////////////////////////////////////
139// Converters
140
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700141status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
142 if (aidl.size() > maxSize - 1) {
143 return BAD_VALUE;
144 }
145 aidl.copy(dest, aidl.size());
146 dest[aidl.size()] = '\0';
147 return OK;
148}
149
150ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
151 if (legacy == nullptr) {
152 return unexpected(BAD_VALUE);
153 }
154 if (strnlen(legacy, maxSize) == maxSize) {
155 // No null-terminator.
156 return unexpected(BAD_VALUE);
157 }
158 return std::string(legacy);
159}
160
161ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
162 return convertReinterpret<audio_module_handle_t>(aidl);
163}
164
165ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
166 return convertReinterpret<int32_t>(legacy);
167}
168
169ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
170 return convertReinterpret<audio_io_handle_t>(aidl);
171}
172
173ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
174 return convertReinterpret<int32_t>(legacy);
175}
176
177ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
178 return convertReinterpret<audio_port_handle_t>(aidl);
179}
180
181ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
182 return convertReinterpret<int32_t>(legacy);
183}
184
185ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
186 return convertReinterpret<audio_patch_handle_t>(aidl);
187}
188
189ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
190 return convertReinterpret<int32_t>(legacy);
191}
192
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800193ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
194 return convertReinterpret<audio_unique_id_t>(aidl);
195}
196
197ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
198 return convertReinterpret<int32_t>(legacy);
199}
200
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -0800201ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
202 return convertReinterpret<audio_hw_sync_t>(aidl);
203}
204
205ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
206 return convertReinterpret<int32_t>(legacy);
207}
208
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800209ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
210 return convertReinterpret<pid_t>(aidl);
211}
212
213ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
214 return convertReinterpret<int32_t>(legacy);
215}
216
217ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
218 return convertReinterpret<uid_t>(aidl);
219}
220
221ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
222 return convertReinterpret<int32_t>(legacy);
223}
224
225ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
226 return String16(aidl.data(), aidl.size());
227}
228
229ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
230 return std::string(String8(legacy).c_str());
231}
232
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700233// TODO b/182392769: create an optional -> optional util
234ConversionResult<std::optional<String16>>
235aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl) {
236 if (!aidl.has_value()) {
237 return std::nullopt;
238 }
239 ConversionResult<String16> conversion =
240 VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.value()));
241 return conversion.value();
242}
243
244ConversionResult<std::optional<std::string_view>>
245legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy) {
246 if (!legacy.has_value()) {
247 return std::nullopt;
248 }
249 ConversionResult<std::string> conversion =
250 VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.value()));
251 return conversion.value();
252}
253
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800254ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
255 return String8(aidl.data(), aidl.size());
256}
257
258ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
259 return std::string(legacy.c_str());
260}
261
Mikhail Naganov88536df2021-07-26 17:30:29 -0700262ConversionResult<audio_io_config_event_t> aidl2legacy_AudioIoConfigEvent_audio_io_config_event_t(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700263 media::AudioIoConfigEvent aidl) {
264 switch (aidl) {
265 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
266 return AUDIO_OUTPUT_REGISTERED;
267 case media::AudioIoConfigEvent::OUTPUT_OPENED:
268 return AUDIO_OUTPUT_OPENED;
269 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
270 return AUDIO_OUTPUT_CLOSED;
271 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
272 return AUDIO_OUTPUT_CONFIG_CHANGED;
273 case media::AudioIoConfigEvent::INPUT_REGISTERED:
274 return AUDIO_INPUT_REGISTERED;
275 case media::AudioIoConfigEvent::INPUT_OPENED:
276 return AUDIO_INPUT_OPENED;
277 case media::AudioIoConfigEvent::INPUT_CLOSED:
278 return AUDIO_INPUT_CLOSED;
279 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
280 return AUDIO_INPUT_CONFIG_CHANGED;
281 case media::AudioIoConfigEvent::CLIENT_STARTED:
282 return AUDIO_CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700283 }
Andy Hung3f69c162020-12-09 12:08:48 -0800284 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700285}
286
Mikhail Naganov88536df2021-07-26 17:30:29 -0700287ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_t_AudioIoConfigEvent(
288 audio_io_config_event_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700289 switch (legacy) {
290 case AUDIO_OUTPUT_REGISTERED:
291 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
292 case AUDIO_OUTPUT_OPENED:
293 return media::AudioIoConfigEvent::OUTPUT_OPENED;
294 case AUDIO_OUTPUT_CLOSED:
295 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
296 case AUDIO_OUTPUT_CONFIG_CHANGED:
297 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
298 case AUDIO_INPUT_REGISTERED:
299 return media::AudioIoConfigEvent::INPUT_REGISTERED;
300 case AUDIO_INPUT_OPENED:
301 return media::AudioIoConfigEvent::INPUT_OPENED;
302 case AUDIO_INPUT_CLOSED:
303 return media::AudioIoConfigEvent::INPUT_CLOSED;
304 case AUDIO_INPUT_CONFIG_CHANGED:
305 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
306 case AUDIO_CLIENT_STARTED:
307 return media::AudioIoConfigEvent::CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700308 }
Andy Hung3f69c162020-12-09 12:08:48 -0800309 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700310}
311
312ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
313 media::AudioPortRole aidl) {
314 switch (aidl) {
315 case media::AudioPortRole::NONE:
316 return AUDIO_PORT_ROLE_NONE;
317 case media::AudioPortRole::SOURCE:
318 return AUDIO_PORT_ROLE_SOURCE;
319 case media::AudioPortRole::SINK:
320 return AUDIO_PORT_ROLE_SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700321 }
Andy Hung3f69c162020-12-09 12:08:48 -0800322 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700323}
324
325ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
326 audio_port_role_t legacy) {
327 switch (legacy) {
328 case AUDIO_PORT_ROLE_NONE:
329 return media::AudioPortRole::NONE;
330 case AUDIO_PORT_ROLE_SOURCE:
331 return media::AudioPortRole::SOURCE;
332 case AUDIO_PORT_ROLE_SINK:
333 return media::AudioPortRole::SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700334 }
Andy Hung3f69c162020-12-09 12:08:48 -0800335 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700336}
337
338ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
339 media::AudioPortType aidl) {
340 switch (aidl) {
341 case media::AudioPortType::NONE:
342 return AUDIO_PORT_TYPE_NONE;
343 case media::AudioPortType::DEVICE:
344 return AUDIO_PORT_TYPE_DEVICE;
345 case media::AudioPortType::MIX:
346 return AUDIO_PORT_TYPE_MIX;
347 case media::AudioPortType::SESSION:
348 return AUDIO_PORT_TYPE_SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700349 }
Andy Hung3f69c162020-12-09 12:08:48 -0800350 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700351}
352
353ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
354 audio_port_type_t legacy) {
355 switch (legacy) {
356 case AUDIO_PORT_TYPE_NONE:
357 return media::AudioPortType::NONE;
358 case AUDIO_PORT_TYPE_DEVICE:
359 return media::AudioPortType::DEVICE;
360 case AUDIO_PORT_TYPE_MIX:
361 return media::AudioPortType::MIX;
362 case AUDIO_PORT_TYPE_SESSION:
363 return media::AudioPortType::SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700364 }
Andy Hung3f69c162020-12-09 12:08:48 -0800365 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700366}
367
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700368namespace {
369
370namespace detail {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700371using AudioChannelPair = std::pair<audio_channel_mask_t, AudioChannelLayout>;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700372using AudioChannelPairs = std::vector<AudioChannelPair>;
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000373using AudioDevicePair = std::pair<audio_devices_t, AudioDeviceDescription>;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700374using AudioDevicePairs = std::vector<AudioDevicePair>;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700375using AudioFormatPair = std::pair<audio_format_t, AudioFormatDescription>;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700376using AudioFormatPairs = std::vector<AudioFormatPair>;
377}
378
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700379const detail::AudioChannelPairs& getInAudioChannelPairs() {
380 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700381#define DEFINE_INPUT_LAYOUT(n) \
382 { \
383 AUDIO_CHANNEL_IN_##n, \
384 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
385 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700386 }
387
388 DEFINE_INPUT_LAYOUT(MONO),
389 DEFINE_INPUT_LAYOUT(STEREO),
390 DEFINE_INPUT_LAYOUT(FRONT_BACK),
391 // AUDIO_CHANNEL_IN_6 not supported
392 DEFINE_INPUT_LAYOUT(2POINT0POINT2),
393 DEFINE_INPUT_LAYOUT(2POINT1POINT2),
394 DEFINE_INPUT_LAYOUT(3POINT0POINT2),
395 DEFINE_INPUT_LAYOUT(3POINT1POINT2),
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700396 DEFINE_INPUT_LAYOUT(5POINT1)
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700397#undef DEFINE_INPUT_LAYOUT
398 };
399 return pairs;
400}
401
402const detail::AudioChannelPairs& getOutAudioChannelPairs() {
403 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700404#define DEFINE_OUTPUT_LAYOUT(n) \
405 { \
406 AUDIO_CHANNEL_OUT_##n, \
407 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
408 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700409 }
410
411 DEFINE_OUTPUT_LAYOUT(MONO),
412 DEFINE_OUTPUT_LAYOUT(STEREO),
413 DEFINE_OUTPUT_LAYOUT(2POINT1),
414 DEFINE_OUTPUT_LAYOUT(TRI),
415 DEFINE_OUTPUT_LAYOUT(TRI_BACK),
416 DEFINE_OUTPUT_LAYOUT(3POINT1),
417 DEFINE_OUTPUT_LAYOUT(2POINT0POINT2),
418 DEFINE_OUTPUT_LAYOUT(2POINT1POINT2),
419 DEFINE_OUTPUT_LAYOUT(3POINT0POINT2),
420 DEFINE_OUTPUT_LAYOUT(3POINT1POINT2),
421 DEFINE_OUTPUT_LAYOUT(QUAD),
422 DEFINE_OUTPUT_LAYOUT(QUAD_SIDE),
423 DEFINE_OUTPUT_LAYOUT(SURROUND),
424 DEFINE_OUTPUT_LAYOUT(PENTA),
425 DEFINE_OUTPUT_LAYOUT(5POINT1),
426 DEFINE_OUTPUT_LAYOUT(5POINT1_SIDE),
427 DEFINE_OUTPUT_LAYOUT(5POINT1POINT2),
428 DEFINE_OUTPUT_LAYOUT(5POINT1POINT4),
429 DEFINE_OUTPUT_LAYOUT(6POINT1),
430 DEFINE_OUTPUT_LAYOUT(7POINT1),
431 DEFINE_OUTPUT_LAYOUT(7POINT1POINT2),
432 DEFINE_OUTPUT_LAYOUT(7POINT1POINT4),
433 DEFINE_OUTPUT_LAYOUT(13POINT_360RA),
434 DEFINE_OUTPUT_LAYOUT(22POINT2),
435 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_A),
436 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_A),
437 DEFINE_OUTPUT_LAYOUT(HAPTIC_AB),
438 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_AB),
439 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_AB)
440#undef DEFINE_OUTPUT_LAYOUT
441 };
442 return pairs;
443}
444
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700445const detail::AudioChannelPairs& getVoiceAudioChannelPairs() {
446 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700447#define DEFINE_VOICE_LAYOUT(n) \
448 { \
449 AUDIO_CHANNEL_IN_VOICE_##n, \
450 AudioChannelLayout::make<AudioChannelLayout::Tag::voiceMask>( \
451 AudioChannelLayout::VOICE_##n) \
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700452 }
453 DEFINE_VOICE_LAYOUT(UPLINK_MONO),
454 DEFINE_VOICE_LAYOUT(DNLINK_MONO),
455 DEFINE_VOICE_LAYOUT(CALL_MONO)
456#undef DEFINE_VOICE_LAYOUT
457 };
458 return pairs;
459}
460
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000461AudioDeviceDescription make_AudioDeviceDescription(AudioDeviceType type,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700462 const std::string& connection = "") {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000463 AudioDeviceDescription result;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700464 result.type = type;
465 result.connection = connection;
466 return result;
467}
468
469void append_AudioDeviceDescription(detail::AudioDevicePairs& pairs,
470 audio_devices_t inputType, audio_devices_t outputType,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000471 AudioDeviceType inType, AudioDeviceType outType,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700472 const std::string& connection = "") {
473 pairs.push_back(std::make_pair(inputType, make_AudioDeviceDescription(inType, connection)));
474 pairs.push_back(std::make_pair(outputType, make_AudioDeviceDescription(outType, connection)));
475}
476
477const detail::AudioDevicePairs& getAudioDevicePairs() {
478 static const detail::AudioDevicePairs pairs = []() {
479 detail::AudioDevicePairs pairs = {{
480 {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000481 AUDIO_DEVICE_NONE, AudioDeviceDescription{}
Mikhail Naganov09a73812021-06-17 18:00:55 -0700482 },
483 {
484 AUDIO_DEVICE_OUT_EARPIECE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000485 AudioDeviceType::OUT_SPEAKER_EARPIECE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700486 },
487 {
488 AUDIO_DEVICE_OUT_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000489 AudioDeviceType::OUT_SPEAKER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700490 },
491 {
492 AUDIO_DEVICE_OUT_WIRED_HEADPHONE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000493 AudioDeviceType::OUT_HEADPHONE,
494 AudioDeviceDescription::CONNECTION_ANALOG())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700495 },
496 {
497 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000498 AudioDeviceType::OUT_DEVICE,
499 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700500 },
501 {
502 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000503 AudioDeviceType::OUT_CARKIT,
504 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700505 },
506 {
507 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000508 AudioDeviceType::OUT_HEADPHONE,
509 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700510 },
511 {
512 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000513 AudioDeviceType::OUT_SPEAKER,
514 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700515 },
516 {
517 AUDIO_DEVICE_OUT_TELEPHONY_TX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000518 AudioDeviceType::OUT_TELEPHONY_TX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700519 },
520 {
521 AUDIO_DEVICE_OUT_AUX_LINE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000522 AudioDeviceType::OUT_LINE_AUX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700523 },
524 {
525 AUDIO_DEVICE_OUT_SPEAKER_SAFE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000526 AudioDeviceType::OUT_SPEAKER_SAFE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700527 },
528 {
529 AUDIO_DEVICE_OUT_HEARING_AID, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000530 AudioDeviceType::OUT_HEARING_AID,
531 AudioDeviceDescription::CONNECTION_WIRELESS())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700532 },
533 {
534 AUDIO_DEVICE_OUT_ECHO_CANCELLER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000535 AudioDeviceType::OUT_ECHO_CANCELLER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700536 },
537 {
538 AUDIO_DEVICE_OUT_BLE_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000539 AudioDeviceType::OUT_SPEAKER,
540 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700541 },
542 // AUDIO_DEVICE_IN_AMBIENT and IN_COMMUNICATION are removed since they were deprecated.
543 {
544 AUDIO_DEVICE_IN_BUILTIN_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000545 AudioDeviceType::IN_MICROPHONE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700546 },
547 {
548 AUDIO_DEVICE_IN_BACK_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000549 AudioDeviceType::IN_MICROPHONE_BACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700550 },
551 {
552 AUDIO_DEVICE_IN_TELEPHONY_RX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000553 AudioDeviceType::IN_TELEPHONY_RX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700554 },
555 {
556 AUDIO_DEVICE_IN_TV_TUNER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000557 AudioDeviceType::IN_TV_TUNER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700558 },
559 {
560 AUDIO_DEVICE_IN_LOOPBACK, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000561 AudioDeviceType::IN_LOOPBACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700562 },
563 {
564 AUDIO_DEVICE_IN_BLUETOOTH_BLE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000565 AudioDeviceType::IN_DEVICE,
566 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700567 },
568 {
569 AUDIO_DEVICE_IN_ECHO_REFERENCE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000570 AudioDeviceType::IN_ECHO_REFERENCE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700571 }
572 }};
573 append_AudioDeviceDescription(pairs,
574 AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_OUT_DEFAULT,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000575 AudioDeviceType::IN_DEFAULT, AudioDeviceType::OUT_DEFAULT);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700576 append_AudioDeviceDescription(pairs,
577 AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_OUT_WIRED_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000578 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
579 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700580 append_AudioDeviceDescription(pairs,
581 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000582 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
583 AudioDeviceDescription::CONNECTION_BT_SCO());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700584 append_AudioDeviceDescription(pairs,
585 AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_OUT_HDMI,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000586 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
587 AudioDeviceDescription::CONNECTION_HDMI());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700588 append_AudioDeviceDescription(pairs,
589 AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000590 AudioDeviceType::IN_SUBMIX, AudioDeviceType::OUT_SUBMIX);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700591 append_AudioDeviceDescription(pairs,
592 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700593 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
594 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700595 append_AudioDeviceDescription(pairs,
596 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700597 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
598 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700599 append_AudioDeviceDescription(pairs,
600 AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_OUT_USB_ACCESSORY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000601 AudioDeviceType::IN_ACCESSORY, AudioDeviceType::OUT_ACCESSORY,
602 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700603 append_AudioDeviceDescription(pairs,
604 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_OUT_USB_DEVICE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000605 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
606 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700607 append_AudioDeviceDescription(pairs,
608 AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_OUT_FM,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000609 AudioDeviceType::IN_FM_TUNER, AudioDeviceType::OUT_FM);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700610 append_AudioDeviceDescription(pairs,
611 AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_OUT_LINE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000612 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
613 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700614 append_AudioDeviceDescription(pairs,
615 AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_OUT_SPDIF,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000616 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
617 AudioDeviceDescription::CONNECTION_SPDIF());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700618 append_AudioDeviceDescription(pairs,
619 AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000620 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
621 AudioDeviceDescription::CONNECTION_BT_A2DP());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700622 append_AudioDeviceDescription(pairs,
623 AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_OUT_IP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000624 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
625 AudioDeviceDescription::CONNECTION_IP_V4());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700626 append_AudioDeviceDescription(pairs,
627 AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_OUT_BUS,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000628 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
629 AudioDeviceDescription::CONNECTION_BUS());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700630 append_AudioDeviceDescription(pairs,
631 AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_OUT_PROXY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000632 AudioDeviceType::IN_AFE_PROXY, AudioDeviceType::OUT_AFE_PROXY);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700633 append_AudioDeviceDescription(pairs,
634 AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_OUT_USB_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000635 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
636 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700637 append_AudioDeviceDescription(pairs,
638 AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_OUT_HDMI_ARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000639 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
640 AudioDeviceDescription::CONNECTION_HDMI_ARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700641 append_AudioDeviceDescription(pairs,
642 AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_OUT_HDMI_EARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000643 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
644 AudioDeviceDescription::CONNECTION_HDMI_EARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700645 append_AudioDeviceDescription(pairs,
646 AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_OUT_BLE_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000647 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
648 AudioDeviceDescription::CONNECTION_BT_LE());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700649 return pairs;
650 }();
651 return pairs;
652}
653
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700654AudioFormatDescription make_AudioFormatDescription(AudioFormatType type) {
655 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700656 result.type = type;
657 return result;
658}
659
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700660AudioFormatDescription make_AudioFormatDescription(PcmType pcm) {
661 auto result = make_AudioFormatDescription(AudioFormatType::PCM);
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700662 result.pcm = pcm;
663 return result;
664}
665
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700666AudioFormatDescription make_AudioFormatDescription(const std::string& encoding) {
667 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700668 result.encoding = encoding;
669 return result;
670}
671
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700672AudioFormatDescription make_AudioFormatDescription(PcmType transport,
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700673 const std::string& encoding) {
674 auto result = make_AudioFormatDescription(encoding);
675 result.pcm = transport;
676 return result;
677}
678
679const detail::AudioFormatPairs& getAudioFormatPairs() {
680 static const detail::AudioFormatPairs pairs = {{
681 {
682 AUDIO_FORMAT_INVALID,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700683 make_AudioFormatDescription(AudioFormatType::SYS_RESERVED_INVALID)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700684 },
685 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700686 AUDIO_FORMAT_DEFAULT, AudioFormatDescription{}
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700687 },
688 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700689 AUDIO_FORMAT_PCM_16_BIT, make_AudioFormatDescription(PcmType::INT_16_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700690 },
691 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700692 AUDIO_FORMAT_PCM_8_BIT, make_AudioFormatDescription(PcmType::UINT_8_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700693 },
694 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700695 AUDIO_FORMAT_PCM_32_BIT, make_AudioFormatDescription(PcmType::INT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700696 },
697 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700698 AUDIO_FORMAT_PCM_8_24_BIT, make_AudioFormatDescription(PcmType::FIXED_Q_8_24)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700699 },
700 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700701 AUDIO_FORMAT_PCM_FLOAT, make_AudioFormatDescription(PcmType::FLOAT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700702 },
703 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700704 AUDIO_FORMAT_PCM_24_BIT_PACKED, make_AudioFormatDescription(PcmType::INT_24_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700705 },
706 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700707 AUDIO_FORMAT_MP3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG)
708 },
709 {
710 AUDIO_FORMAT_AMR_NB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_NB)
711 },
712 {
713 AUDIO_FORMAT_AMR_WB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB)
714 },
715 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700716 AUDIO_FORMAT_AAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MP4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700717 },
718 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700719 AUDIO_FORMAT_AAC_MAIN, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700720 },
721 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700722 AUDIO_FORMAT_AAC_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700723 },
724 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700725 AUDIO_FORMAT_AAC_SSR, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700726 },
727 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700728 AUDIO_FORMAT_AAC_LTP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700729 },
730 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700731 AUDIO_FORMAT_AAC_HE_V1, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700732 },
733 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700734 AUDIO_FORMAT_AAC_SCALABLE,
735 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700736 },
737 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700738 AUDIO_FORMAT_AAC_ERLC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700739 },
740 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700741 AUDIO_FORMAT_AAC_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700742 },
743 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700744 AUDIO_FORMAT_AAC_HE_V2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700745 },
746 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700747 AUDIO_FORMAT_AAC_ELD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700748 },
749 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700750 AUDIO_FORMAT_AAC_XHE, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700751 },
752 // AUDIO_FORMAT_HE_AAC_V1 and HE_AAC_V2 are removed since they were deprecated long time
753 // ago.
754 {
755 AUDIO_FORMAT_VORBIS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_VORBIS)
756 },
757 {
758 AUDIO_FORMAT_OPUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_OPUS)
759 },
760 {
761 AUDIO_FORMAT_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC3)
762 },
763 {
764 AUDIO_FORMAT_E_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3)
765 },
766 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700767 AUDIO_FORMAT_E_AC3_JOC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3_JOC)
768 },
769 {
770 AUDIO_FORMAT_DTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS)
771 },
772 {
773 AUDIO_FORMAT_DTS_HD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_HD)
774 },
775 // In the future, we would like to represent encapsulated bitstreams as
776 // nested AudioFormatDescriptions. The legacy 'AUDIO_FORMAT_IEC61937' type doesn't
777 // specify the format of the encapsulated bitstream.
778 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700779 AUDIO_FORMAT_IEC61937,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700780 make_AudioFormatDescription(PcmType::INT_16_BIT, MEDIA_MIMETYPE_AUDIO_IEC61937)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700781 },
782 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700783 AUDIO_FORMAT_DOLBY_TRUEHD,
784 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_TRUEHD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700785 },
786 {
787 AUDIO_FORMAT_EVRC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRC)
788 },
789 {
790 AUDIO_FORMAT_EVRCB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCB)
791 },
792 {
793 AUDIO_FORMAT_EVRCWB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCWB)
794 },
795 {
796 AUDIO_FORMAT_EVRCNW, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCNW)
797 },
798 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700799 AUDIO_FORMAT_AAC_ADIF, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADIF)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700800 },
801 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700802 AUDIO_FORMAT_WMA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_WMA)
803 },
804 {
805 // Note: not in the IANA registry.
806 AUDIO_FORMAT_WMA_PRO, make_AudioFormatDescription("audio/x-ms-wma.pro")
807 },
808 {
809 AUDIO_FORMAT_AMR_WB_PLUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS)
810 },
811 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700812 AUDIO_FORMAT_MP2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II)
813 },
814 {
815 AUDIO_FORMAT_QCELP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_QCELP)
816 },
817 {
818 // Note: not in the IANA registry.
819 AUDIO_FORMAT_DSD, make_AudioFormatDescription("audio/vnd.sony.dsd")
820 },
821 {
822 AUDIO_FORMAT_FLAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_FLAC)
823 },
824 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700825 AUDIO_FORMAT_ALAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_ALAC)
826 },
827 {
828 // Note: not in the IANA registry.
829 AUDIO_FORMAT_APE, make_AudioFormatDescription("audio/x-ape")
830 },
831 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700832 AUDIO_FORMAT_AAC_ADTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS)
833 },
834 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700835 AUDIO_FORMAT_AAC_ADTS_MAIN,
836 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700837 },
838 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700839 AUDIO_FORMAT_AAC_ADTS_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700840 },
841 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700842 AUDIO_FORMAT_AAC_ADTS_SSR,
843 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700844 },
845 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700846 AUDIO_FORMAT_AAC_ADTS_LTP,
847 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700848 },
849 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700850 AUDIO_FORMAT_AAC_ADTS_HE_V1,
851 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700852 },
853 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700854 AUDIO_FORMAT_AAC_ADTS_SCALABLE,
855 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700856 },
857 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700858 AUDIO_FORMAT_AAC_ADTS_ERLC,
859 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700860 },
861 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700862 AUDIO_FORMAT_AAC_ADTS_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700863 },
864 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700865 AUDIO_FORMAT_AAC_ADTS_HE_V2,
866 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700867 },
868 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700869 AUDIO_FORMAT_AAC_ADTS_ELD,
870 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700871 },
872 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700873 AUDIO_FORMAT_AAC_ADTS_XHE,
874 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700875 },
876 {
877 // Note: not in the IANA registry. "vnd.octel.sbc" is not BT SBC.
878 AUDIO_FORMAT_SBC, make_AudioFormatDescription("audio/x-sbc")
879 },
880 {
881 AUDIO_FORMAT_APTX, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_APTX)
882 },
883 {
884 // Note: not in the IANA registry.
885 AUDIO_FORMAT_APTX_HD, make_AudioFormatDescription("audio/vnd.qcom.aptx.hd")
886 },
887 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700888 AUDIO_FORMAT_AC4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC4)
889 },
890 {
891 // Note: not in the IANA registry.
892 AUDIO_FORMAT_LDAC, make_AudioFormatDescription("audio/vnd.sony.ldac")
893 },
894 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700895 AUDIO_FORMAT_MAT, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700896 },
897 {
898 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700899 AUDIO_FORMAT_MAT_1_0,
900 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".1.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700901 },
902 {
903 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700904 AUDIO_FORMAT_MAT_2_0,
905 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700906 },
907 {
908 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700909 AUDIO_FORMAT_MAT_2_1,
910 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.1"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700911 },
912 {
913 AUDIO_FORMAT_AAC_LATM, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC)
914 },
915 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700916 AUDIO_FORMAT_AAC_LATM_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700917 },
918 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700919 AUDIO_FORMAT_AAC_LATM_HE_V1,
920 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700921 },
922 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700923 AUDIO_FORMAT_AAC_LATM_HE_V2,
924 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700925 },
926 {
927 // Note: not in the IANA registry.
928 AUDIO_FORMAT_CELT, make_AudioFormatDescription("audio/x-celt")
929 },
930 {
931 // Note: not in the IANA registry.
932 AUDIO_FORMAT_APTX_ADAPTIVE, make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive")
933 },
934 {
935 // Note: not in the IANA registry.
936 AUDIO_FORMAT_LHDC, make_AudioFormatDescription("audio/vnd.savitech.lhdc")
937 },
938 {
939 // Note: not in the IANA registry.
940 AUDIO_FORMAT_LHDC_LL, make_AudioFormatDescription("audio/vnd.savitech.lhdc.ll")
941 },
942 {
943 // Note: not in the IANA registry.
944 AUDIO_FORMAT_APTX_TWSP, make_AudioFormatDescription("audio/vnd.qcom.aptx.twsp")
945 },
946 {
947 // Note: not in the IANA registry.
948 AUDIO_FORMAT_LC3, make_AudioFormatDescription("audio/x-lc3")
949 },
950 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700951 AUDIO_FORMAT_MPEGH, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_MHM1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700952 },
953 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700954 AUDIO_FORMAT_MPEGH_BL_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700955 },
956 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700957 AUDIO_FORMAT_MPEGH_BL_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700958 },
959 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700960 AUDIO_FORMAT_MPEGH_LC_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700961 },
962 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700963 AUDIO_FORMAT_MPEGH_LC_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700964 },
965 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700966 AUDIO_FORMAT_IEC60958,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700967 make_AudioFormatDescription(PcmType::INT_24_BIT, MEDIA_MIMETYPE_AUDIO_IEC60958)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700968 },
969 {
970 AUDIO_FORMAT_DTS_UHD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_UHD)
971 },
972 {
973 AUDIO_FORMAT_DRA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DRA)
974 },
975 }};
976 return pairs;
977}
978
Mikhail Naganov09a73812021-06-17 18:00:55 -0700979template<typename S, typename T>
980std::unordered_map<S, T> make_DirectMap(const std::vector<std::pair<S, T>>& v) {
981 std::unordered_map<S, T> result(v.begin(), v.end());
982 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
983 return result;
984}
985
986template<typename S, typename T>
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700987std::unordered_map<S, T> make_DirectMap(
988 const std::vector<std::pair<S, T>>& v1, const std::vector<std::pair<S, T>>& v2) {
989 std::unordered_map<S, T> result(v1.begin(), v1.end());
990 LOG_ALWAYS_FATAL_IF(result.size() != v1.size(), "Duplicate key elements detected in v1");
991 result.insert(v2.begin(), v2.end());
992 LOG_ALWAYS_FATAL_IF(result.size() != v1.size() + v2.size(),
993 "Duplicate key elements detected in v1+v2");
994 return result;
995}
996
997template<typename S, typename T>
Mikhail Naganov09a73812021-06-17 18:00:55 -0700998std::unordered_map<T, S> make_ReverseMap(const std::vector<std::pair<S, T>>& v) {
999 std::unordered_map<T, S> result;
1000 std::transform(v.begin(), v.end(), std::inserter(result, result.begin()),
1001 [](const std::pair<S, T>& p) {
1002 return std::make_pair(p.second, p.first);
1003 });
1004 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
1005 return result;
1006}
1007
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001008} // namespace
1009
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001010ConversionResult<audio_channel_mask_t> aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001011 const AudioChannelLayout& aidl, bool isInput) {
1012 using ReverseMap = std::unordered_map<AudioChannelLayout, audio_channel_mask_t>;
1013 using Tag = AudioChannelLayout::Tag;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001014 static const ReverseMap mIn = make_ReverseMap(getInAudioChannelPairs());
1015 static const ReverseMap mOut = make_ReverseMap(getOutAudioChannelPairs());
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001016 static const ReverseMap mVoice = make_ReverseMap(getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001017
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001018 auto convert = [](const AudioChannelLayout& aidl, const ReverseMap& m,
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001019 const char* func, const char* type) -> ConversionResult<audio_channel_mask_t> {
1020 if (auto it = m.find(aidl); it != m.end()) {
1021 return it->second;
1022 } else {
1023 ALOGE("%s: no legacy %s audio_channel_mask_t found for %s", func, type,
1024 aidl.toString().c_str());
1025 return unexpected(BAD_VALUE);
1026 }
1027 };
1028
1029 switch (aidl.getTag()) {
1030 case Tag::none:
1031 return AUDIO_CHANNEL_NONE;
1032 case Tag::invalid:
1033 return AUDIO_CHANNEL_INVALID;
Mikhail Naganov81020002021-08-03 14:16:15 -07001034 case Tag::indexMask: {
1035 // Index masks do not have pre-defined values.
1036 const int bits = aidl.get<Tag::indexMask>();
1037 if (__builtin_popcount(bits) != 0 &&
1038 __builtin_popcount(bits) <= AUDIO_CHANNEL_COUNT_MAX) {
1039 return audio_channel_mask_from_representation_and_bits(
1040 AUDIO_CHANNEL_REPRESENTATION_INDEX, bits);
1041 } else {
1042 ALOGE("%s: invalid indexMask value 0x%x in %s",
1043 __func__, bits, aidl.toString().c_str());
1044 return unexpected(BAD_VALUE);
1045 }
1046 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001047 case Tag::layoutMask:
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001048 return convert(aidl, isInput ? mIn : mOut, __func__, isInput ? "input" : "output");
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001049 case Tag::voiceMask:
1050 return convert(aidl, mVoice, __func__, "voice");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001051 }
1052 ALOGE("%s: unexpected tag value %d", __func__, aidl.getTag());
1053 return unexpected(BAD_VALUE);
1054}
1055
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001056ConversionResult<AudioChannelLayout> legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001057 audio_channel_mask_t legacy, bool isInput) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001058 using DirectMap = std::unordered_map<audio_channel_mask_t, AudioChannelLayout>;
1059 using Tag = AudioChannelLayout::Tag;
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001060 static const DirectMap mInAndVoice = make_DirectMap(
1061 getInAudioChannelPairs(), getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001062 static const DirectMap mOut = make_DirectMap(getOutAudioChannelPairs());
1063
1064 auto convert = [](const audio_channel_mask_t legacy, const DirectMap& m,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001065 const char* func, const char* type) -> ConversionResult<AudioChannelLayout> {
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001066 if (auto it = m.find(legacy); it != m.end()) {
1067 return it->second;
1068 } else {
1069 ALOGE("%s: no AudioChannelLayout found for legacy %s audio_channel_mask_t value 0x%x",
1070 func, type, legacy);
1071 return unexpected(BAD_VALUE);
1072 }
1073 };
1074
1075 if (legacy == AUDIO_CHANNEL_NONE) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001076 return AudioChannelLayout{};
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001077 } else if (legacy == AUDIO_CHANNEL_INVALID) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001078 return AudioChannelLayout::make<Tag::invalid>(0);
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001079 }
1080
1081 const audio_channel_representation_t repr = audio_channel_mask_get_representation(legacy);
1082 if (repr == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
Mikhail Naganov81020002021-08-03 14:16:15 -07001083 if (audio_channel_mask_is_valid(legacy)) {
1084 const int indexMask = VALUE_OR_RETURN(
1085 convertIntegral<int>(audio_channel_mask_get_bits(legacy)));
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001086 return AudioChannelLayout::make<Tag::indexMask>(indexMask);
Mikhail Naganov81020002021-08-03 14:16:15 -07001087 } else {
1088 ALOGE("%s: legacy audio_channel_mask_t value 0x%x is invalid", __func__, legacy);
1089 return unexpected(BAD_VALUE);
1090 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001091 } else if (repr == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001092 return convert(legacy, isInput ? mInAndVoice : mOut, __func__,
1093 isInput ? "input / voice" : "output");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001094 }
1095
1096 ALOGE("%s: unknown representation %d in audio_channel_mask_t value 0x%x",
1097 __func__, repr, legacy);
1098 return unexpected(BAD_VALUE);
1099}
1100
Mikhail Naganov09a73812021-06-17 18:00:55 -07001101ConversionResult<audio_devices_t> aidl2legacy_AudioDeviceDescription_audio_devices_t(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001102 const AudioDeviceDescription& aidl) {
1103 static const std::unordered_map<AudioDeviceDescription, audio_devices_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001104 make_ReverseMap(getAudioDevicePairs());
1105 if (auto it = m.find(aidl); it != m.end()) {
1106 return it->second;
1107 } else {
1108 ALOGE("%s: no legacy audio_devices_t found for %s", __func__, aidl.toString().c_str());
1109 return unexpected(BAD_VALUE);
1110 }
1111}
1112
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001113ConversionResult<AudioDeviceDescription> legacy2aidl_audio_devices_t_AudioDeviceDescription(
Mikhail Naganov09a73812021-06-17 18:00:55 -07001114 audio_devices_t legacy) {
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001115 static const std::unordered_map<audio_devices_t, AudioDeviceDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001116 make_DirectMap(getAudioDevicePairs());
1117 if (auto it = m.find(legacy); it != m.end()) {
1118 return it->second;
1119 } else {
1120 ALOGE("%s: no AudioDeviceDescription found for legacy audio_devices_t value 0x%x",
1121 __func__, legacy);
1122 return unexpected(BAD_VALUE);
1123 }
1124}
1125
Mikhail Naganov932cb962021-09-16 01:05:27 +00001126status_t aidl2legacy_AudioDevice_audio_device(
1127 const AudioDevice& aidl,
1128 audio_devices_t* legacyType, char* legacyAddress) {
1129 *legacyType = VALUE_OR_RETURN_STATUS(
1130 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1131 return aidl2legacy_string(
1132 aidl.address.get<AudioDeviceAddress::id>(),
1133 legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN);
1134}
1135
1136status_t aidl2legacy_AudioDevice_audio_device(
1137 const AudioDevice& aidl,
1138 audio_devices_t* legacyType, String8* legacyAddress) {
1139 *legacyType = VALUE_OR_RETURN_STATUS(
1140 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1141 *legacyAddress = VALUE_OR_RETURN_STATUS(aidl2legacy_string_view_String8(
1142 aidl.address.get<AudioDeviceAddress::id>()));
1143 return OK;
1144}
1145
1146status_t aidl2legacy_AudioDevice_audio_device(
1147 const AudioDevice& aidl,
1148 audio_devices_t* legacyType, std::string* legacyAddress) {
1149 *legacyType = VALUE_OR_RETURN_STATUS(
1150 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1151 *legacyAddress = aidl.address.get<AudioDeviceAddress::id>();
1152 return OK;
1153}
1154
1155ConversionResult<AudioDevice> legacy2aidl_audio_device_AudioDevice(
1156 audio_devices_t legacyType, const char* legacyAddress) {
1157 AudioDevice aidl;
1158 aidl.type = VALUE_OR_RETURN(
1159 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1160 const std::string aidl_id = VALUE_OR_RETURN(
1161 legacy2aidl_string(legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN));
1162 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1163 return aidl;
1164}
1165
1166ConversionResult<AudioDevice>
1167legacy2aidl_audio_device_AudioDevice(
1168 audio_devices_t legacyType, const String8& legacyAddress) {
1169 AudioDevice aidl;
1170 aidl.type = VALUE_OR_RETURN(
1171 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1172 const std::string aidl_id = VALUE_OR_RETURN(
1173 legacy2aidl_String8_string(legacyAddress));
1174 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1175 return aidl;
1176}
1177
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001178ConversionResult<audio_format_t> aidl2legacy_AudioFormatDescription_audio_format_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001179 const AudioFormatDescription& aidl) {
1180 static const std::unordered_map<AudioFormatDescription, audio_format_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001181 make_ReverseMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001182 if (auto it = m.find(aidl); it != m.end()) {
1183 return it->second;
1184 } else {
1185 ALOGE("%s: no legacy audio_format_t found for %s", __func__, aidl.toString().c_str());
1186 return unexpected(BAD_VALUE);
1187 }
1188}
1189
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001190ConversionResult<AudioFormatDescription> legacy2aidl_audio_format_t_AudioFormatDescription(
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001191 audio_format_t legacy) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001192 static const std::unordered_map<audio_format_t, AudioFormatDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001193 make_DirectMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001194 if (auto it = m.find(legacy); it != m.end()) {
1195 return it->second;
1196 } else {
1197 ALOGE("%s: no AudioFormatDescription found for legacy audio_format_t value 0x%x",
1198 __func__, legacy);
1199 return unexpected(BAD_VALUE);
1200 }
1201}
1202
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001203ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(
1204 AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001205 switch (aidl) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001206 case AudioGainMode::JOINT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001207 return AUDIO_GAIN_MODE_JOINT;
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001208 case AudioGainMode::CHANNELS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001209 return AUDIO_GAIN_MODE_CHANNELS;
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001210 case AudioGainMode::RAMP:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001211 return AUDIO_GAIN_MODE_RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001212 }
Andy Hung3f69c162020-12-09 12:08:48 -08001213 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001214}
1215
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001216ConversionResult<AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(
1217 audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001218 switch (legacy) {
1219 case AUDIO_GAIN_MODE_JOINT:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001220 return AudioGainMode::JOINT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001221 case AUDIO_GAIN_MODE_CHANNELS:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001222 return AudioGainMode::CHANNELS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001223 case AUDIO_GAIN_MODE_RAMP:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001224 return AudioGainMode::RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001225 }
Andy Hung3f69c162020-12-09 12:08:48 -08001226 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001227}
1228
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001229ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001230 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, AudioGainMode>(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001231 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001232 // AudioGainMode is index-based.
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001233 indexToEnum_index<AudioGainMode>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001234 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001235 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001236}
1237
Andy Hung973638a2020-12-08 20:47:45 -08001238ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001239 return convertBitmask<int32_t, audio_gain_mode_t, AudioGainMode, audio_gain_mode_t>(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001240 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001241 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001242 indexToEnum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001243 // AudioGainMode is index-based.
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001244 enumToMask_index<int32_t, AudioGainMode>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001245}
1246
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001247ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001248 const AudioGainConfig& aidl, bool isInput) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001249 audio_gain_config legacy;
1250 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001251 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001252 legacy.channel_mask = VALUE_OR_RETURN(
1253 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001254 const bool isJoint = bitmaskIsSet(aidl.mode, AudioGainMode::JOINT);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001255 size_t numValues = isJoint ? 1
1256 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1257 : audio_channel_count_from_out_mask(legacy.channel_mask);
1258 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
1259 return unexpected(BAD_VALUE);
1260 }
1261 for (size_t i = 0; i < numValues; ++i) {
1262 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
1263 }
1264 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
1265 return legacy;
1266}
1267
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001268ConversionResult<AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001269 const audio_gain_config& legacy, bool isInput) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001270 AudioGainConfig aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001271 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
Andy Hung973638a2020-12-08 20:47:45 -08001272 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001273 aidl.channelMask = VALUE_OR_RETURN(
1274 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001275 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
1276 size_t numValues = isJoint ? 1
1277 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1278 : audio_channel_count_from_out_mask(legacy.channel_mask);
1279 aidl.values.resize(numValues);
1280 for (size_t i = 0; i < numValues; ++i) {
1281 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
1282 }
1283 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
1284 return aidl;
1285}
1286
1287ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
Mikhail Naganov10506122021-10-19 10:14:23 -07001288 AudioInputFlags aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001289 switch (aidl) {
Mikhail Naganov10506122021-10-19 10:14:23 -07001290 case AudioInputFlags::FAST:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001291 return AUDIO_INPUT_FLAG_FAST;
Mikhail Naganov10506122021-10-19 10:14:23 -07001292 case AudioInputFlags::HW_HOTWORD:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001293 return AUDIO_INPUT_FLAG_HW_HOTWORD;
Mikhail Naganov10506122021-10-19 10:14:23 -07001294 case AudioInputFlags::RAW:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001295 return AUDIO_INPUT_FLAG_RAW;
Mikhail Naganov10506122021-10-19 10:14:23 -07001296 case AudioInputFlags::SYNC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001297 return AUDIO_INPUT_FLAG_SYNC;
Mikhail Naganov10506122021-10-19 10:14:23 -07001298 case AudioInputFlags::MMAP_NOIRQ:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001299 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
Mikhail Naganov10506122021-10-19 10:14:23 -07001300 case AudioInputFlags::VOIP_TX:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001301 return AUDIO_INPUT_FLAG_VOIP_TX;
Mikhail Naganov10506122021-10-19 10:14:23 -07001302 case AudioInputFlags::HW_AV_SYNC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001303 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
Mikhail Naganov10506122021-10-19 10:14:23 -07001304 case AudioInputFlags::DIRECT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001305 return AUDIO_INPUT_FLAG_DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001306 }
Andy Hung3f69c162020-12-09 12:08:48 -08001307 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001308}
1309
Mikhail Naganov10506122021-10-19 10:14:23 -07001310ConversionResult<AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001311 audio_input_flags_t legacy) {
1312 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001313 case AUDIO_INPUT_FLAG_NONE:
1314 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001315 case AUDIO_INPUT_FLAG_FAST:
Mikhail Naganov10506122021-10-19 10:14:23 -07001316 return AudioInputFlags::FAST;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001317 case AUDIO_INPUT_FLAG_HW_HOTWORD:
Mikhail Naganov10506122021-10-19 10:14:23 -07001318 return AudioInputFlags::HW_HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001319 case AUDIO_INPUT_FLAG_RAW:
Mikhail Naganov10506122021-10-19 10:14:23 -07001320 return AudioInputFlags::RAW;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001321 case AUDIO_INPUT_FLAG_SYNC:
Mikhail Naganov10506122021-10-19 10:14:23 -07001322 return AudioInputFlags::SYNC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001323 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
Mikhail Naganov10506122021-10-19 10:14:23 -07001324 return AudioInputFlags::MMAP_NOIRQ;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001325 case AUDIO_INPUT_FLAG_VOIP_TX:
Mikhail Naganov10506122021-10-19 10:14:23 -07001326 return AudioInputFlags::VOIP_TX;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001327 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
Mikhail Naganov10506122021-10-19 10:14:23 -07001328 return AudioInputFlags::HW_AV_SYNC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001329 case AUDIO_INPUT_FLAG_DIRECT:
Mikhail Naganov10506122021-10-19 10:14:23 -07001330 return AudioInputFlags::DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001331 }
Andy Hung3f69c162020-12-09 12:08:48 -08001332 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001333}
1334
1335ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
Mikhail Naganov10506122021-10-19 10:14:23 -07001336 AudioOutputFlags aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001337 switch (aidl) {
Mikhail Naganov10506122021-10-19 10:14:23 -07001338 case AudioOutputFlags::DIRECT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001339 return AUDIO_OUTPUT_FLAG_DIRECT;
Mikhail Naganov10506122021-10-19 10:14:23 -07001340 case AudioOutputFlags::PRIMARY:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001341 return AUDIO_OUTPUT_FLAG_PRIMARY;
Mikhail Naganov10506122021-10-19 10:14:23 -07001342 case AudioOutputFlags::FAST:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001343 return AUDIO_OUTPUT_FLAG_FAST;
Mikhail Naganov10506122021-10-19 10:14:23 -07001344 case AudioOutputFlags::DEEP_BUFFER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001345 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
Mikhail Naganov10506122021-10-19 10:14:23 -07001346 case AudioOutputFlags::COMPRESS_OFFLOAD:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001347 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
Mikhail Naganov10506122021-10-19 10:14:23 -07001348 case AudioOutputFlags::NON_BLOCKING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001349 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
Mikhail Naganov10506122021-10-19 10:14:23 -07001350 case AudioOutputFlags::HW_AV_SYNC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001351 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
Mikhail Naganov10506122021-10-19 10:14:23 -07001352 case AudioOutputFlags::TTS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001353 return AUDIO_OUTPUT_FLAG_TTS;
Mikhail Naganov10506122021-10-19 10:14:23 -07001354 case AudioOutputFlags::RAW:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001355 return AUDIO_OUTPUT_FLAG_RAW;
Mikhail Naganov10506122021-10-19 10:14:23 -07001356 case AudioOutputFlags::SYNC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001357 return AUDIO_OUTPUT_FLAG_SYNC;
Mikhail Naganov10506122021-10-19 10:14:23 -07001358 case AudioOutputFlags::IEC958_NONAUDIO:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001359 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
Mikhail Naganov10506122021-10-19 10:14:23 -07001360 case AudioOutputFlags::DIRECT_PCM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001361 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
Mikhail Naganov10506122021-10-19 10:14:23 -07001362 case AudioOutputFlags::MMAP_NOIRQ:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001363 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
Mikhail Naganov10506122021-10-19 10:14:23 -07001364 case AudioOutputFlags::VOIP_RX:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001365 return AUDIO_OUTPUT_FLAG_VOIP_RX;
Mikhail Naganov10506122021-10-19 10:14:23 -07001366 case AudioOutputFlags::INCALL_MUSIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001367 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
Mikhail Naganov10506122021-10-19 10:14:23 -07001368 case AudioOutputFlags::GAPLESS_OFFLOAD:
Eric Laurent90fe31c2020-11-26 20:06:35 +01001369 return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001370 }
Andy Hung3f69c162020-12-09 12:08:48 -08001371 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001372}
1373
Mikhail Naganov10506122021-10-19 10:14:23 -07001374ConversionResult<AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001375 audio_output_flags_t legacy) {
1376 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001377 case AUDIO_OUTPUT_FLAG_NONE:
1378 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001379 case AUDIO_OUTPUT_FLAG_DIRECT:
Mikhail Naganov10506122021-10-19 10:14:23 -07001380 return AudioOutputFlags::DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001381 case AUDIO_OUTPUT_FLAG_PRIMARY:
Mikhail Naganov10506122021-10-19 10:14:23 -07001382 return AudioOutputFlags::PRIMARY;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001383 case AUDIO_OUTPUT_FLAG_FAST:
Mikhail Naganov10506122021-10-19 10:14:23 -07001384 return AudioOutputFlags::FAST;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001385 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
Mikhail Naganov10506122021-10-19 10:14:23 -07001386 return AudioOutputFlags::DEEP_BUFFER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001387 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
Mikhail Naganov10506122021-10-19 10:14:23 -07001388 return AudioOutputFlags::COMPRESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001389 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
Mikhail Naganov10506122021-10-19 10:14:23 -07001390 return AudioOutputFlags::NON_BLOCKING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001391 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
Mikhail Naganov10506122021-10-19 10:14:23 -07001392 return AudioOutputFlags::HW_AV_SYNC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001393 case AUDIO_OUTPUT_FLAG_TTS:
Mikhail Naganov10506122021-10-19 10:14:23 -07001394 return AudioOutputFlags::TTS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001395 case AUDIO_OUTPUT_FLAG_RAW:
Mikhail Naganov10506122021-10-19 10:14:23 -07001396 return AudioOutputFlags::RAW;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001397 case AUDIO_OUTPUT_FLAG_SYNC:
Mikhail Naganov10506122021-10-19 10:14:23 -07001398 return AudioOutputFlags::SYNC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001399 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
Mikhail Naganov10506122021-10-19 10:14:23 -07001400 return AudioOutputFlags::IEC958_NONAUDIO;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001401 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
Mikhail Naganov10506122021-10-19 10:14:23 -07001402 return AudioOutputFlags::DIRECT_PCM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001403 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
Mikhail Naganov10506122021-10-19 10:14:23 -07001404 return AudioOutputFlags::MMAP_NOIRQ;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001405 case AUDIO_OUTPUT_FLAG_VOIP_RX:
Mikhail Naganov10506122021-10-19 10:14:23 -07001406 return AudioOutputFlags::VOIP_RX;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001407 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
Mikhail Naganov10506122021-10-19 10:14:23 -07001408 return AudioOutputFlags::INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +01001409 case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
Mikhail Naganov10506122021-10-19 10:14:23 -07001410 return AudioOutputFlags::GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001411 }
Andy Hung3f69c162020-12-09 12:08:48 -08001412 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001413}
1414
Andy Hung973638a2020-12-08 20:47:45 -08001415ConversionResult<audio_input_flags_t> aidl2legacy_int32_t_audio_input_flags_t_mask(
1416 int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001417 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1418
1419 LegacyMask converted = VALUE_OR_RETURN(
Mikhail Naganov10506122021-10-19 10:14:23 -07001420 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, AudioInputFlags>(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001421 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
Mikhail Naganov10506122021-10-19 10:14:23 -07001422 indexToEnum_index<AudioInputFlags>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001423 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
1424 return static_cast<audio_input_flags_t>(converted);
1425}
1426
Andy Hung973638a2020-12-08 20:47:45 -08001427ConversionResult<int32_t> legacy2aidl_audio_input_flags_t_int32_t_mask(
1428 audio_input_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001429 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1430
1431 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
Mikhail Naganov10506122021-10-19 10:14:23 -07001432 return convertBitmask<int32_t, LegacyMask, AudioInputFlags, audio_input_flags_t>(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001433 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001434 indexToEnum_bitmask<audio_input_flags_t>,
Mikhail Naganov10506122021-10-19 10:14:23 -07001435 enumToMask_index<int32_t, AudioInputFlags>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001436}
1437
Andy Hung973638a2020-12-08 20:47:45 -08001438ConversionResult<audio_output_flags_t> aidl2legacy_int32_t_audio_output_flags_t_mask(
1439 int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001440 return convertBitmask<audio_output_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001441 int32_t,
1442 audio_output_flags_t,
Mikhail Naganov10506122021-10-19 10:14:23 -07001443 AudioOutputFlags>(
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001444 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
Mikhail Naganov10506122021-10-19 10:14:23 -07001445 indexToEnum_index<AudioOutputFlags>,
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001446 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001447}
1448
Andy Hung973638a2020-12-08 20:47:45 -08001449ConversionResult<int32_t> legacy2aidl_audio_output_flags_t_int32_t_mask(
1450 audio_output_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001451 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
1452
1453 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
Mikhail Naganov10506122021-10-19 10:14:23 -07001454 return convertBitmask<int32_t, LegacyMask, AudioOutputFlags, audio_output_flags_t>(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001455 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001456 indexToEnum_bitmask<audio_output_flags_t>,
Mikhail Naganov10506122021-10-19 10:14:23 -07001457 enumToMask_index<int32_t, AudioOutputFlags>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001458}
1459
1460ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
Mikhail Naganov10506122021-10-19 10:14:23 -07001461 const AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001462 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001463 Direction dir = VALUE_OR_RETURN(direction(role, type));
1464 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001465 case Direction::INPUT: {
1466 legacy.input = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001467 aidl2legacy_int32_t_audio_input_flags_t_mask(
1468 VALUE_OR_RETURN(UNION_GET(aidl, input))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001469 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001470 break;
1471
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001472 case Direction::OUTPUT: {
1473 legacy.output = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001474 aidl2legacy_int32_t_audio_output_flags_t_mask(
1475 VALUE_OR_RETURN(UNION_GET(aidl, output))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001476 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001477 break;
1478 }
1479
1480 return legacy;
1481}
1482
Mikhail Naganov10506122021-10-19 10:14:23 -07001483ConversionResult<AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001484 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
Mikhail Naganov10506122021-10-19 10:14:23 -07001485 AudioIoFlags aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001486
1487 Direction dir = VALUE_OR_RETURN(direction(role, type));
1488 switch (dir) {
1489 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001490 UNION_SET(aidl, input,
Andy Hung973638a2020-12-08 20:47:45 -08001491 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(
1492 legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001493 break;
1494 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001495 UNION_SET(aidl, output,
Andy Hung973638a2020-12-08 20:47:45 -08001496 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(
1497 legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001498 break;
1499 }
1500 return aidl;
1501}
1502
Andy Hung973638a2020-12-08 20:47:45 -08001503ConversionResult<audio_port_config_device_ext>
Mikhail Naganov10506122021-10-19 10:14:23 -07001504aidl2legacy_AudioPortDeviceExt_audio_port_config_device_ext(
1505 const AudioPortDeviceExt& aidl, const media::AudioPortDeviceExtSys& aidlDeviceExt) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001506 audio_port_config_device_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001507 legacy.hw_module = VALUE_OR_RETURN(
1508 aidl2legacy_int32_t_audio_module_handle_t(aidlDeviceExt.hwModule));
Mikhail Naganov10506122021-10-19 10:14:23 -07001509 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
1510 aidl.device, &legacy.type, legacy.address));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001511 return legacy;
1512}
1513
Mikhail Naganov10506122021-10-19 10:14:23 -07001514status_t legacy2aidl_audio_port_config_device_ext_AudioPortDeviceExt(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001515 const audio_port_config_device_ext& legacy,
Mikhail Naganov10506122021-10-19 10:14:23 -07001516 AudioPortDeviceExt* aidl, media::AudioPortDeviceExtSys* aidlDeviceExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001517 aidlDeviceExt->hwModule = VALUE_OR_RETURN_STATUS(
1518 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Mikhail Naganov10506122021-10-19 10:14:23 -07001519 aidl->device = VALUE_OR_RETURN_STATUS(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001520 legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
1521 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001522}
1523
1524ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001525 AudioStreamType aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001526 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001527 case AudioStreamType::INVALID:
1528 break; // return error
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001529 case AudioStreamType::SYS_RESERVED_DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001530 return AUDIO_STREAM_DEFAULT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001531 case AudioStreamType::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001532 return AUDIO_STREAM_VOICE_CALL;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001533 case AudioStreamType::SYSTEM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001534 return AUDIO_STREAM_SYSTEM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001535 case AudioStreamType::RING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001536 return AUDIO_STREAM_RING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001537 case AudioStreamType::MUSIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001538 return AUDIO_STREAM_MUSIC;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001539 case AudioStreamType::ALARM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001540 return AUDIO_STREAM_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001541 case AudioStreamType::NOTIFICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001542 return AUDIO_STREAM_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001543 case AudioStreamType::BLUETOOTH_SCO:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001544 return AUDIO_STREAM_BLUETOOTH_SCO;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001545 case AudioStreamType::ENFORCED_AUDIBLE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001546 return AUDIO_STREAM_ENFORCED_AUDIBLE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001547 case AudioStreamType::DTMF:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001548 return AUDIO_STREAM_DTMF;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001549 case AudioStreamType::TTS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001550 return AUDIO_STREAM_TTS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001551 case AudioStreamType::ACCESSIBILITY:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001552 return AUDIO_STREAM_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001553 case AudioStreamType::ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001554 return AUDIO_STREAM_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001555 case AudioStreamType::SYS_RESERVED_REROUTING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001556 return AUDIO_STREAM_REROUTING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001557 case AudioStreamType::SYS_RESERVED_PATCH:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001558 return AUDIO_STREAM_PATCH;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001559 case AudioStreamType::CALL_ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001560 return AUDIO_STREAM_CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001561 }
Andy Hung3f69c162020-12-09 12:08:48 -08001562 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001563}
1564
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001565ConversionResult<AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001566 audio_stream_type_t legacy) {
1567 switch (legacy) {
1568 case AUDIO_STREAM_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001569 return AudioStreamType::SYS_RESERVED_DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001570 case AUDIO_STREAM_VOICE_CALL:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001571 return AudioStreamType::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001572 case AUDIO_STREAM_SYSTEM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001573 return AudioStreamType::SYSTEM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001574 case AUDIO_STREAM_RING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001575 return AudioStreamType::RING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001576 case AUDIO_STREAM_MUSIC:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001577 return AudioStreamType::MUSIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001578 case AUDIO_STREAM_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001579 return AudioStreamType::ALARM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001580 case AUDIO_STREAM_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001581 return AudioStreamType::NOTIFICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001582 case AUDIO_STREAM_BLUETOOTH_SCO:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001583 return AudioStreamType::BLUETOOTH_SCO;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001584 case AUDIO_STREAM_ENFORCED_AUDIBLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001585 return AudioStreamType::ENFORCED_AUDIBLE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001586 case AUDIO_STREAM_DTMF:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001587 return AudioStreamType::DTMF;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001588 case AUDIO_STREAM_TTS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001589 return AudioStreamType::TTS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001590 case AUDIO_STREAM_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001591 return AudioStreamType::ACCESSIBILITY;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001592 case AUDIO_STREAM_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001593 return AudioStreamType::ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001594 case AUDIO_STREAM_REROUTING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001595 return AudioStreamType::SYS_RESERVED_REROUTING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001596 case AUDIO_STREAM_PATCH:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001597 return AudioStreamType::SYS_RESERVED_PATCH;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001598 case AUDIO_STREAM_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001599 return AudioStreamType::CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001600 }
Andy Hung3f69c162020-12-09 12:08:48 -08001601 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001602}
1603
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001604ConversionResult<audio_source_t> aidl2legacy_AudioSource_audio_source_t(
1605 AudioSource aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001606 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001607 case AudioSource::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001608 return AUDIO_SOURCE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001609 case AudioSource::DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001610 return AUDIO_SOURCE_DEFAULT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001611 case AudioSource::MIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001612 return AUDIO_SOURCE_MIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001613 case AudioSource::VOICE_UPLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001614 return AUDIO_SOURCE_VOICE_UPLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001615 case AudioSource::VOICE_DOWNLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001616 return AUDIO_SOURCE_VOICE_DOWNLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001617 case AudioSource::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001618 return AUDIO_SOURCE_VOICE_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001619 case AudioSource::CAMCORDER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001620 return AUDIO_SOURCE_CAMCORDER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001621 case AudioSource::VOICE_RECOGNITION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001622 return AUDIO_SOURCE_VOICE_RECOGNITION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001623 case AudioSource::VOICE_COMMUNICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001624 return AUDIO_SOURCE_VOICE_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001625 case AudioSource::REMOTE_SUBMIX:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001626 return AUDIO_SOURCE_REMOTE_SUBMIX;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001627 case AudioSource::UNPROCESSED:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001628 return AUDIO_SOURCE_UNPROCESSED;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001629 case AudioSource::VOICE_PERFORMANCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001630 return AUDIO_SOURCE_VOICE_PERFORMANCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001631 case AudioSource::ECHO_REFERENCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001632 return AUDIO_SOURCE_ECHO_REFERENCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001633 case AudioSource::FM_TUNER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001634 return AUDIO_SOURCE_FM_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001635 case AudioSource::HOTWORD:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001636 return AUDIO_SOURCE_HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001637 }
Andy Hung3f69c162020-12-09 12:08:48 -08001638 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001639}
1640
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001641ConversionResult<AudioSource> legacy2aidl_audio_source_t_AudioSource(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001642 audio_source_t legacy) {
1643 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001644 case AUDIO_SOURCE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001645 return AudioSource::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001646 case AUDIO_SOURCE_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001647 return AudioSource::DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001648 case AUDIO_SOURCE_MIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001649 return AudioSource::MIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001650 case AUDIO_SOURCE_VOICE_UPLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001651 return AudioSource::VOICE_UPLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001652 case AUDIO_SOURCE_VOICE_DOWNLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001653 return AudioSource::VOICE_DOWNLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001654 case AUDIO_SOURCE_VOICE_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001655 return AudioSource::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001656 case AUDIO_SOURCE_CAMCORDER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001657 return AudioSource::CAMCORDER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001658 case AUDIO_SOURCE_VOICE_RECOGNITION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001659 return AudioSource::VOICE_RECOGNITION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001660 case AUDIO_SOURCE_VOICE_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001661 return AudioSource::VOICE_COMMUNICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001662 case AUDIO_SOURCE_REMOTE_SUBMIX:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001663 return AudioSource::REMOTE_SUBMIX;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001664 case AUDIO_SOURCE_UNPROCESSED:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001665 return AudioSource::UNPROCESSED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001666 case AUDIO_SOURCE_VOICE_PERFORMANCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001667 return AudioSource::VOICE_PERFORMANCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001668 case AUDIO_SOURCE_ECHO_REFERENCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001669 return AudioSource::ECHO_REFERENCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001670 case AUDIO_SOURCE_FM_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001671 return AudioSource::FM_TUNER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001672 case AUDIO_SOURCE_HOTWORD:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001673 return AudioSource::HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001674 }
Andy Hung3f69c162020-12-09 12:08:48 -08001675 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001676}
1677
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001678ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
1679 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001680}
1681
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001682ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
1683 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001684}
1685
1686// This type is unnamed in the original definition, thus we name it here.
1687using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
1688
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001689ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortMixExtUseCase(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001690 const AudioPortMixExtUseCase& aidl, media::AudioPortRole role) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001691 audio_port_config_mix_ext_usecase legacy;
1692
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001693 switch (role) {
1694 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001695 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001696 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001697 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001698
1699 case media::AudioPortRole::SOURCE:
1700 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001701 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
1702 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Andy Hung3f69c162020-12-09 12:08:48 -08001703 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001704
1705 case media::AudioPortRole::SINK:
1706 // This is not a bug. A SINK role corresponds to the source field.
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001707 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001708 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Andy Hung3f69c162020-12-09 12:08:48 -08001709 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001710 }
Andy Hung3f69c162020-12-09 12:08:48 -08001711 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001712}
1713
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001714ConversionResult<AudioPortMixExtUseCase> legacy2aidl_AudioPortMixExtUseCase(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001715 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001716 AudioPortMixExtUseCase aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001717
1718 switch (role) {
1719 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001720 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001721 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001722 case AUDIO_PORT_ROLE_SOURCE:
1723 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001724 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1725 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Andy Hung3f69c162020-12-09 12:08:48 -08001726 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001727 case AUDIO_PORT_ROLE_SINK:
1728 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001729 UNION_SET(aidl, source,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001730 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source)));
Andy Hung3f69c162020-12-09 12:08:48 -08001731 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001732 }
Andy Hung3f69c162020-12-09 12:08:48 -08001733 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001734}
1735
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001736ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortMixExt(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001737 const AudioPortMixExt& aidl, media::AudioPortRole role,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001738 const media::AudioPortMixExtSys& aidlMixExt) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001739 audio_port_config_mix_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001740 legacy.hw_module = VALUE_OR_RETURN(
1741 aidl2legacy_int32_t_audio_module_handle_t(aidlMixExt.hwModule));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001742 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001743 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortMixExtUseCase(aidl.usecase, role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001744 return legacy;
1745}
1746
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001747status_t legacy2aidl_AudioPortMixExt(
1748 const audio_port_config_mix_ext& legacy, audio_port_role_t role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001749 AudioPortMixExt* aidl, media::AudioPortMixExtSys* aidlMixExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001750 aidlMixExt->hwModule = VALUE_OR_RETURN_STATUS(
1751 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1752 aidl->handle = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1753 aidl->usecase = VALUE_OR_RETURN_STATUS(
1754 legacy2aidl_AudioPortMixExtUseCase(legacy.usecase, role));
1755 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001756}
1757
Andy Hung973638a2020-12-08 20:47:45 -08001758ConversionResult<audio_port_config_session_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001759aidl2legacy_int32_t_audio_port_config_session_ext(int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001760 audio_port_config_session_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001761 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001762 return legacy;
1763}
1764
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001765ConversionResult<int32_t>
1766legacy2aidl_audio_port_config_session_ext_int32_t(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001767 const audio_port_config_session_ext& legacy) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001768 return legacy2aidl_audio_session_t_int32_t(legacy.session);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001769}
1770
1771// This type is unnamed in the original definition, thus we name it here.
1772using audio_port_config_ext = decltype(audio_port_config::ext);
1773
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001774ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortExt_audio_port_config_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001775 const AudioPortExt& aidl, media::AudioPortType type,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001776 media::AudioPortRole role, const media::AudioPortExtSys& aidlSys) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001777 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001778 switch (type) {
1779 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001780 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001781 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001782 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001783 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001784 legacy.device = VALUE_OR_RETURN(
Mikhail Naganov10506122021-10-19 10:14:23 -07001785 aidl2legacy_AudioPortDeviceExt_audio_port_config_device_ext(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001786 VALUE_OR_RETURN(UNION_GET(aidl, device)),
1787 VALUE_OR_RETURN(UNION_GET(aidlSys, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08001788 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001789 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001790 legacy.mix = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001791 aidl2legacy_AudioPortMixExt(
1792 VALUE_OR_RETURN(UNION_GET(aidl, mix)), role,
1793 VALUE_OR_RETURN(UNION_GET(aidlSys, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08001794 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001795 case media::AudioPortType::SESSION:
Andy Hung973638a2020-12-08 20:47:45 -08001796 legacy.session = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001797 aidl2legacy_int32_t_audio_port_config_session_ext(
Andy Hung973638a2020-12-08 20:47:45 -08001798 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08001799 return legacy;
1800
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001801 }
Andy Hung3f69c162020-12-09 12:08:48 -08001802 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001803}
1804
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001805status_t legacy2aidl_AudioPortExt(
1806 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001807 AudioPortExt* aidl, media::AudioPortExtSys* aidlSys) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001808 switch (type) {
1809 case AUDIO_PORT_TYPE_NONE:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001810 UNION_SET(*aidl, unspecified, false);
1811 UNION_SET(*aidlSys, unspecified, false);
1812 return OK;
1813 case AUDIO_PORT_TYPE_DEVICE: {
Mikhail Naganov10506122021-10-19 10:14:23 -07001814 AudioPortDeviceExt device;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001815 media::AudioPortDeviceExtSys deviceSys;
1816 RETURN_STATUS_IF_ERROR(
Mikhail Naganov10506122021-10-19 10:14:23 -07001817 legacy2aidl_audio_port_config_device_ext_AudioPortDeviceExt(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001818 legacy.device, &device, &deviceSys));
1819 UNION_SET(*aidl, device, device);
1820 UNION_SET(*aidlSys, device, deviceSys);
1821 return OK;
1822 }
1823 case AUDIO_PORT_TYPE_MIX: {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001824 AudioPortMixExt mix;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001825 media::AudioPortMixExtSys mixSys;
1826 RETURN_STATUS_IF_ERROR(legacy2aidl_AudioPortMixExt(legacy.mix, role, &mix, &mixSys));
1827 UNION_SET(*aidl, mix, mix);
1828 UNION_SET(*aidlSys, mix, mixSys);
1829 return OK;
1830 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001831 case AUDIO_PORT_TYPE_SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001832 UNION_SET(*aidl, session, VALUE_OR_RETURN_STATUS(
1833 legacy2aidl_audio_port_config_session_ext_int32_t(legacy.session)));
1834 UNION_SET(*aidlSys, unspecified, false);
1835 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001836 }
Andy Hung3f69c162020-12-09 12:08:48 -08001837 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001838}
1839
1840ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1841 const media::AudioPortConfig& aidl) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001842 audio_port_config legacy{};
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001843 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.hal.id));
1844 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.sys.role));
1845 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.sys.type));
1846 const bool isInput =
1847 VALUE_OR_RETURN(direction(aidl.sys.role, aidl.sys.type)) == Direction::INPUT;
1848 if (aidl.hal.sampleRate.has_value()) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001849 legacy.sample_rate = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001850 convertIntegral<unsigned int>(aidl.hal.sampleRate.value().value));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001851 legacy.config_mask |= AUDIO_PORT_CONFIG_SAMPLE_RATE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001852 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001853 if (aidl.hal.channelMask.has_value()) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001854 legacy.channel_mask =
Mikhail Naganov2d8df4e2021-06-03 13:59:13 -07001855 VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001856 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001857 aidl.hal.channelMask.value(), isInput));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001858 legacy.config_mask |= AUDIO_PORT_CONFIG_CHANNEL_MASK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001859 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001860 if (aidl.hal.format.has_value()) {
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001861 legacy.format = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001862 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.hal.format.value()));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001863 legacy.config_mask |= AUDIO_PORT_CONFIG_FORMAT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001864 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001865 if (aidl.hal.gain.has_value()) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001866 legacy.gain = VALUE_OR_RETURN(aidl2legacy_AudioGainConfig_audio_gain_config(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001867 aidl.hal.gain.value(), isInput));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001868 legacy.config_mask |= AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001869 }
Mikhail Naganov10506122021-10-19 10:14:23 -07001870 if (aidl.hal.flags.has_value()) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001871 legacy.flags = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001872 aidl2legacy_AudioIoFlags_audio_io_flags(
Mikhail Naganov10506122021-10-19 10:14:23 -07001873 aidl.hal.flags.value(), aidl.sys.role, aidl.sys.type));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001874 legacy.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001875 }
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001876 legacy.ext = VALUE_OR_RETURN(
1877 aidl2legacy_AudioPortExt_audio_port_config_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001878 aidl.hal.ext, aidl.sys.type, aidl.sys.role, aidl.sys.ext));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001879 return legacy;
1880}
1881
1882ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1883 const audio_port_config& legacy) {
1884 media::AudioPortConfig aidl;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001885 aidl.hal.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
1886 aidl.sys.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1887 aidl.sys.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001888 const bool isInput = VALUE_OR_RETURN(
1889 direction(legacy.role, legacy.type)) == Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001890 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001891 Int aidl_sampleRate;
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001892 aidl_sampleRate.value = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001893 aidl.hal.sampleRate = aidl_sampleRate;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001894 }
1895 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001896 aidl.hal.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001897 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001898 }
1899 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001900 aidl.hal.format = VALUE_OR_RETURN(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001901 legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001902 }
1903 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001904 aidl.hal.gain = VALUE_OR_RETURN(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001905 legacy2aidl_audio_gain_config_AudioGainConfig(legacy.gain, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001906 }
1907 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
Mikhail Naganov10506122021-10-19 10:14:23 -07001908 aidl.hal.flags = VALUE_OR_RETURN(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001909 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1910 }
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001911 RETURN_IF_ERROR(legacy2aidl_AudioPortExt(legacy.ext, legacy.type, legacy.role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001912 &aidl.hal.ext, &aidl.sys.ext));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001913 return aidl;
1914}
1915
1916ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1917 const media::AudioPatch& aidl) {
1918 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001919 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001920 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1921 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1922 return unexpected(BAD_VALUE);
1923 }
1924 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1925 legacy.sinks[i] =
1926 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1927 }
1928 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1929 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1930 return unexpected(BAD_VALUE);
1931 }
1932 for (size_t i = 0; i < legacy.num_sources; ++i) {
1933 legacy.sources[i] =
1934 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1935 }
1936 return legacy;
1937}
1938
1939ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1940 const struct audio_patch& legacy) {
1941 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001942 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001943
1944 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1945 return unexpected(BAD_VALUE);
1946 }
1947 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1948 aidl.sinks.push_back(
1949 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1950 }
1951 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1952 return unexpected(BAD_VALUE);
1953 }
1954 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1955 aidl.sources.push_back(
1956 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1957 }
1958 return aidl;
1959}
1960
1961ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1962 const media::AudioIoDescriptor& aidl) {
Mikhail Naganov88536df2021-07-26 17:30:29 -07001963 const audio_io_handle_t io_handle = VALUE_OR_RETURN(
1964 aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
1965 const struct audio_patch patch = VALUE_OR_RETURN(
1966 aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1967 const bool isInput = aidl.isInput;
1968 const uint32_t sampling_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1969 const audio_format_t format = VALUE_OR_RETURN(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001970 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001971 const audio_channel_mask_t channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001972 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001973 const size_t frame_count = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1974 const size_t frame_count_hal = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1975 const uint32_t latency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
1976 const audio_port_handle_t port_id = VALUE_OR_RETURN(
1977 aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
1978 return sp<AudioIoDescriptor>::make(io_handle, patch, isInput, sampling_rate, format,
1979 channel_mask, frame_count, frame_count_hal, latency, port_id);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001980}
1981
1982ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1983 const sp<AudioIoDescriptor>& legacy) {
1984 media::AudioIoDescriptor aidl;
Mikhail Naganov88536df2021-07-26 17:30:29 -07001985 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->getIoHandle()));
1986 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->getPatch()));
1987 aidl.isInput = legacy->getIsInput();
1988 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getSamplingRate()));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001989 aidl.format = VALUE_OR_RETURN(
Mikhail Naganov88536df2021-07-26 17:30:29 -07001990 legacy2aidl_audio_format_t_AudioFormatDescription(legacy->getFormat()));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001991 aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
1992 legacy->getChannelMask(), legacy->getIsInput()));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001993 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCount()));
1994 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCountHAL()));
1995 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getLatency()));
1996 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->getPortId()));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001997 return aidl;
1998}
1999
Andy Hung973638a2020-12-08 20:47:45 -08002000ConversionResult<AudioClient> aidl2legacy_AudioClient_AudioClient(
2001 const media::AudioClient& aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002002 AudioClient legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002003 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002004 legacy.attributionSource = aidl.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002005 return legacy;
2006}
2007
Andy Hung973638a2020-12-08 20:47:45 -08002008ConversionResult<media::AudioClient> legacy2aidl_AudioClient_AudioClient(
2009 const AudioClient& legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002010 media::AudioClient aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002011 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002012 aidl.attributionSource = legacy.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002013 return aidl;
2014}
2015
2016ConversionResult<audio_content_type_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002017aidl2legacy_AudioContentType_audio_content_type_t(AudioContentType aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002018 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002019 case AudioContentType::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002020 return AUDIO_CONTENT_TYPE_UNKNOWN;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002021 case AudioContentType::SPEECH:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002022 return AUDIO_CONTENT_TYPE_SPEECH;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002023 case AudioContentType::MUSIC:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002024 return AUDIO_CONTENT_TYPE_MUSIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002025 case AudioContentType::MOVIE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002026 return AUDIO_CONTENT_TYPE_MOVIE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002027 case AudioContentType::SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002028 return AUDIO_CONTENT_TYPE_SONIFICATION;
2029 }
2030 return unexpected(BAD_VALUE);
2031}
2032
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002033ConversionResult<AudioContentType>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002034legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
2035 switch (legacy) {
2036 case AUDIO_CONTENT_TYPE_UNKNOWN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002037 return AudioContentType::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002038 case AUDIO_CONTENT_TYPE_SPEECH:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002039 return AudioContentType::SPEECH;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002040 case AUDIO_CONTENT_TYPE_MUSIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002041 return AudioContentType::MUSIC;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002042 case AUDIO_CONTENT_TYPE_MOVIE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002043 return AudioContentType::MOVIE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002044 case AUDIO_CONTENT_TYPE_SONIFICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002045 return AudioContentType::SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002046 }
2047 return unexpected(BAD_VALUE);
2048}
2049
2050ConversionResult<audio_usage_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002051aidl2legacy_AudioUsage_audio_usage_t(AudioUsage aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002052 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002053 case AudioUsage::INVALID:
2054 break; // return error
2055 case AudioUsage::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002056 return AUDIO_USAGE_UNKNOWN;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002057 case AudioUsage::MEDIA:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002058 return AUDIO_USAGE_MEDIA;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002059 case AudioUsage::VOICE_COMMUNICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002060 return AUDIO_USAGE_VOICE_COMMUNICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002061 case AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002062 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002063 case AudioUsage::ALARM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002064 return AUDIO_USAGE_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002065 case AudioUsage::NOTIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002066 return AUDIO_USAGE_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002067 case AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002068 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002069 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002070 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002071 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002072 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002073 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002074 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002075 case AudioUsage::NOTIFICATION_EVENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002076 return AUDIO_USAGE_NOTIFICATION_EVENT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002077 case AudioUsage::ASSISTANCE_ACCESSIBILITY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002078 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002079 case AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002080 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002081 case AudioUsage::ASSISTANCE_SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002082 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002083 case AudioUsage::GAME:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002084 return AUDIO_USAGE_GAME;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002085 case AudioUsage::VIRTUAL_SOURCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002086 return AUDIO_USAGE_VIRTUAL_SOURCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002087 case AudioUsage::ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002088 return AUDIO_USAGE_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002089 case AudioUsage::CALL_ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002090 return AUDIO_USAGE_CALL_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002091 case AudioUsage::EMERGENCY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002092 return AUDIO_USAGE_EMERGENCY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002093 case AudioUsage::SAFETY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002094 return AUDIO_USAGE_SAFETY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002095 case AudioUsage::VEHICLE_STATUS:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002096 return AUDIO_USAGE_VEHICLE_STATUS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002097 case AudioUsage::ANNOUNCEMENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002098 return AUDIO_USAGE_ANNOUNCEMENT;
2099 }
2100 return unexpected(BAD_VALUE);
2101}
2102
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002103ConversionResult<AudioUsage>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002104legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
2105 switch (legacy) {
2106 case AUDIO_USAGE_UNKNOWN:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002107 return AudioUsage::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002108 case AUDIO_USAGE_MEDIA:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002109 return AudioUsage::MEDIA;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002110 case AUDIO_USAGE_VOICE_COMMUNICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002111 return AudioUsage::VOICE_COMMUNICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002112 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002113 return AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002114 case AUDIO_USAGE_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002115 return AudioUsage::ALARM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002116 case AUDIO_USAGE_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002117 return AudioUsage::NOTIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002118 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002119 return AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002120 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002121 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002122 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002123 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002124 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002125 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002126 case AUDIO_USAGE_NOTIFICATION_EVENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002127 return AudioUsage::NOTIFICATION_EVENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002128 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002129 return AudioUsage::ASSISTANCE_ACCESSIBILITY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002130 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002131 return AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002132 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002133 return AudioUsage::ASSISTANCE_SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002134 case AUDIO_USAGE_GAME:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002135 return AudioUsage::GAME;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002136 case AUDIO_USAGE_VIRTUAL_SOURCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002137 return AudioUsage::VIRTUAL_SOURCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002138 case AUDIO_USAGE_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002139 return AudioUsage::ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002140 case AUDIO_USAGE_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002141 return AudioUsage::CALL_ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002142 case AUDIO_USAGE_EMERGENCY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002143 return AudioUsage::EMERGENCY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002144 case AUDIO_USAGE_SAFETY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002145 return AudioUsage::SAFETY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002146 case AUDIO_USAGE_VEHICLE_STATUS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002147 return AudioUsage::VEHICLE_STATUS;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002148 case AUDIO_USAGE_ANNOUNCEMENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002149 return AudioUsage::ANNOUNCEMENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002150 }
2151 return unexpected(BAD_VALUE);
2152}
2153
2154ConversionResult<audio_flags_mask_t>
2155aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
2156 switch (aidl) {
2157 case media::AudioFlag::AUDIBILITY_ENFORCED:
2158 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
2159 case media::AudioFlag::SECURE:
2160 return AUDIO_FLAG_SECURE;
2161 case media::AudioFlag::SCO:
2162 return AUDIO_FLAG_SCO;
2163 case media::AudioFlag::BEACON:
2164 return AUDIO_FLAG_BEACON;
2165 case media::AudioFlag::HW_AV_SYNC:
2166 return AUDIO_FLAG_HW_AV_SYNC;
2167 case media::AudioFlag::HW_HOTWORD:
2168 return AUDIO_FLAG_HW_HOTWORD;
2169 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
2170 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
2171 case media::AudioFlag::BYPASS_MUTE:
2172 return AUDIO_FLAG_BYPASS_MUTE;
2173 case media::AudioFlag::LOW_LATENCY:
2174 return AUDIO_FLAG_LOW_LATENCY;
2175 case media::AudioFlag::DEEP_BUFFER:
2176 return AUDIO_FLAG_DEEP_BUFFER;
2177 case media::AudioFlag::NO_MEDIA_PROJECTION:
2178 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
2179 case media::AudioFlag::MUTE_HAPTIC:
2180 return AUDIO_FLAG_MUTE_HAPTIC;
2181 case media::AudioFlag::NO_SYSTEM_CAPTURE:
2182 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
2183 case media::AudioFlag::CAPTURE_PRIVATE:
2184 return AUDIO_FLAG_CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002185 case media::AudioFlag::CONTENT_SPATIALIZED:
2186 return AUDIO_FLAG_CONTENT_SPATIALIZED;
2187 case media::AudioFlag::NEVER_SPATIALIZE:
2188 return AUDIO_FLAG_NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002189 }
2190 return unexpected(BAD_VALUE);
2191}
2192
2193ConversionResult<media::AudioFlag>
2194legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
2195 switch (legacy) {
2196 case AUDIO_FLAG_NONE:
2197 return unexpected(BAD_VALUE);
2198 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
2199 return media::AudioFlag::AUDIBILITY_ENFORCED;
2200 case AUDIO_FLAG_SECURE:
2201 return media::AudioFlag::SECURE;
2202 case AUDIO_FLAG_SCO:
2203 return media::AudioFlag::SCO;
2204 case AUDIO_FLAG_BEACON:
2205 return media::AudioFlag::BEACON;
2206 case AUDIO_FLAG_HW_AV_SYNC:
2207 return media::AudioFlag::HW_AV_SYNC;
2208 case AUDIO_FLAG_HW_HOTWORD:
2209 return media::AudioFlag::HW_HOTWORD;
2210 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
2211 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
2212 case AUDIO_FLAG_BYPASS_MUTE:
2213 return media::AudioFlag::BYPASS_MUTE;
2214 case AUDIO_FLAG_LOW_LATENCY:
2215 return media::AudioFlag::LOW_LATENCY;
2216 case AUDIO_FLAG_DEEP_BUFFER:
2217 return media::AudioFlag::DEEP_BUFFER;
2218 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
2219 return media::AudioFlag::NO_MEDIA_PROJECTION;
2220 case AUDIO_FLAG_MUTE_HAPTIC:
2221 return media::AudioFlag::MUTE_HAPTIC;
2222 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
2223 return media::AudioFlag::NO_SYSTEM_CAPTURE;
2224 case AUDIO_FLAG_CAPTURE_PRIVATE:
2225 return media::AudioFlag::CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002226 case AUDIO_FLAG_CONTENT_SPATIALIZED:
2227 return media::AudioFlag::CONTENT_SPATIALIZED;
2228 case AUDIO_FLAG_NEVER_SPATIALIZE:
2229 return media::AudioFlag::NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002230 }
2231 return unexpected(BAD_VALUE);
2232}
2233
2234ConversionResult<audio_flags_mask_t>
2235aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
2236 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002237 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, indexToEnum_index<media::AudioFlag>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002238 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
2239}
2240
2241ConversionResult<int32_t>
2242legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
2243 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002244 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002245 indexToEnum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002246 enumToMask_index<int32_t, media::AudioFlag>);
2247}
2248
2249ConversionResult<audio_attributes_t>
2250aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
2251 audio_attributes_t legacy;
2252 legacy.content_type = VALUE_OR_RETURN(
2253 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
2254 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002255 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002256 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
2257 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
2258 return legacy;
2259}
2260
2261ConversionResult<media::AudioAttributesInternal>
2262legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
2263 media::AudioAttributesInternal aidl;
2264 aidl.contentType = VALUE_OR_RETURN(
2265 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
2266 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002267 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002268 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
2269 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
2270 return aidl;
2271}
2272
2273ConversionResult<audio_encapsulation_mode_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002274aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002275 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002276 case AudioEncapsulationMode::INVALID:
2277 break; // return error
2278 case AudioEncapsulationMode::NONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002279 return AUDIO_ENCAPSULATION_MODE_NONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002280 case AudioEncapsulationMode::ELEMENTARY_STREAM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002281 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002282 case AudioEncapsulationMode::HANDLE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002283 return AUDIO_ENCAPSULATION_MODE_HANDLE;
2284 }
2285 return unexpected(BAD_VALUE);
2286}
2287
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002288ConversionResult<AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002289legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002290 switch (legacy) {
2291 case AUDIO_ENCAPSULATION_MODE_NONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002292 return AudioEncapsulationMode::NONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002293 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002294 return AudioEncapsulationMode::ELEMENTARY_STREAM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002295 case AUDIO_ENCAPSULATION_MODE_HANDLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002296 return AudioEncapsulationMode::HANDLE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002297 }
2298 return unexpected(BAD_VALUE);
2299}
2300
2301ConversionResult<audio_offload_info_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002302aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const AudioOffloadInfo& aidl) {
2303 audio_offload_info_t legacy = AUDIO_INFO_INITIALIZER;
2304 audio_config_base_t base = VALUE_OR_RETURN(
2305 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, false /*isInput*/));
2306 legacy.sample_rate = base.sample_rate;
2307 legacy.channel_mask = base.channel_mask;
2308 legacy.format = base.format;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002309 legacy.stream_type = VALUE_OR_RETURN(
2310 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002311 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRatePerSecond));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002312 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
2313 legacy.has_video = aidl.hasVideo;
2314 legacy.is_streaming = aidl.isStreaming;
2315 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
2316 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
2317 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
2318 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002319 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002320 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
2321 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
2322 return legacy;
2323}
2324
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002325ConversionResult<AudioOffloadInfo>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002326legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002327 AudioOffloadInfo aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002328 // Version 0.1 fields.
2329 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
2330 return unexpected(BAD_VALUE);
2331 }
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002332 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2333 .channel_mask = legacy.channel_mask, .format = legacy.format };
2334 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(
2335 base, false /*isInput*/));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002336 aidl.streamType = VALUE_OR_RETURN(
2337 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002338 aidl.bitRatePerSecond = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002339 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
2340 aidl.hasVideo = legacy.has_video;
2341 aidl.isStreaming = legacy.is_streaming;
2342 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
2343 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
2344 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
2345
2346 // Version 0.2 fields.
2347 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
2348 if (legacy.size <
2349 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
2350 return unexpected(BAD_VALUE);
2351 }
2352 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002353 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002354 legacy.encapsulation_mode));
2355 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
2356 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
2357 }
2358 return aidl;
2359}
2360
2361ConversionResult<audio_config_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002362aidl2legacy_AudioConfig_audio_config_t(const AudioConfig& aidl, bool isInput) {
2363 const audio_config_base_t legacyBase = VALUE_OR_RETURN(
2364 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, isInput));
2365 audio_config_t legacy = AUDIO_CONFIG_INITIALIZER;
2366 legacy.sample_rate = legacyBase.sample_rate;
2367 legacy.channel_mask = legacyBase.channel_mask;
2368 legacy.format = legacyBase.format;
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002369 legacy.offload_info = VALUE_OR_RETURN(
2370 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002371 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
2372 return legacy;
2373}
2374
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002375ConversionResult<AudioConfig>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002376legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002377 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2378 .channel_mask = legacy.channel_mask, .format = legacy.format };
2379 AudioConfig aidl;
2380 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(base, isInput));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002381 aidl.offloadInfo = VALUE_OR_RETURN(
2382 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002383 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
2384 return aidl;
2385}
2386
2387ConversionResult<audio_config_base_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002388aidl2legacy_AudioConfigBase_audio_config_base_t(const AudioConfigBase& aidl, bool isInput) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002389 audio_config_base_t legacy;
2390 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002391 legacy.channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002392 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002393 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002394 return legacy;
2395}
2396
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002397ConversionResult<AudioConfigBase>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002398legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002399 AudioConfigBase aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002400 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002401 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002402 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002403 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002404 return aidl;
2405}
2406
2407ConversionResult<sp<IMemory>>
2408aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
2409 sp<IMemory> legacy;
2410 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
2411 return unexpected(BAD_VALUE);
2412 }
2413 return legacy;
2414}
2415
2416ConversionResult<media::SharedFileRegion>
2417legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2418 media::SharedFileRegion aidl;
2419 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
2420 return unexpected(BAD_VALUE);
2421 }
2422 return aidl;
2423}
2424
2425ConversionResult<sp<IMemory>>
2426aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
2427 sp<IMemory> legacy;
2428 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
2429 return unexpected(BAD_VALUE);
2430 }
2431 return legacy;
2432}
2433
2434ConversionResult<std::optional<media::SharedFileRegion>>
2435legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2436 std::optional<media::SharedFileRegion> aidl;
2437 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
2438 return unexpected(BAD_VALUE);
2439 }
2440 return aidl;
2441}
2442
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002443ConversionResult<AudioTimestamp>
Andy Hung973638a2020-12-08 20:47:45 -08002444aidl2legacy_AudioTimestampInternal_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002445 AudioTimestamp legacy;
2446 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
2447 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
2448 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
2449 return legacy;
2450}
2451
2452ConversionResult<media::AudioTimestampInternal>
Andy Hung973638a2020-12-08 20:47:45 -08002453legacy2aidl_AudioTimestamp_AudioTimestampInternal(const AudioTimestamp& legacy) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002454 media::AudioTimestampInternal aidl;
2455 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
2456 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
2457 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
2458 return aidl;
2459}
2460
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002461ConversionResult<audio_uuid_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002462aidl2legacy_AudioUuid_audio_uuid_t(const AudioUuid& aidl) {
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002463 audio_uuid_t legacy;
2464 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
2465 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
2466 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
2467 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
2468 if (aidl.node.size() != std::size(legacy.node)) {
2469 return unexpected(BAD_VALUE);
2470 }
2471 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
2472 return legacy;
2473}
2474
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002475ConversionResult<AudioUuid>
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002476legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002477 AudioUuid aidl;
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002478 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
2479 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
2480 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
2481 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
2482 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
2483 return aidl;
2484}
2485
2486ConversionResult<effect_descriptor_t>
2487aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
2488 effect_descriptor_t legacy;
2489 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
2490 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
2491 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
2492 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
2493 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
2494 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
2495 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2496 RETURN_IF_ERROR(
2497 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
2498 return legacy;
2499}
2500
2501ConversionResult<media::EffectDescriptor>
2502legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
2503 media::EffectDescriptor aidl;
2504 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
2505 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
2506 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
2507 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
2508 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
2509 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
2510 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2511 aidl.implementor = VALUE_OR_RETURN(
2512 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
2513 return aidl;
2514}
2515
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002516ConversionResult<audio_encapsulation_metadata_type_t>
2517aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002518 AudioEncapsulationMetadataType aidl) {
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002519 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002520 case AudioEncapsulationMetadataType::NONE:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002521 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002522 case AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002523 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002524 case AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002525 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
2526 }
2527 return unexpected(BAD_VALUE);
2528}
2529
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002530ConversionResult<AudioEncapsulationMetadataType>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002531legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
2532 audio_encapsulation_metadata_type_t legacy) {
2533 switch (legacy) {
2534 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002535 return AudioEncapsulationMetadataType::NONE;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002536 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002537 return AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002538 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002539 return AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002540 }
2541 return unexpected(BAD_VALUE);
2542}
2543
2544ConversionResult<uint32_t>
2545aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
2546 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002547 int32_t,
2548 audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002549 AudioEncapsulationMode>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002550 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002551 indexToEnum_index<AudioEncapsulationMode>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002552 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
2553}
2554
2555ConversionResult<int32_t>
2556legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
2557 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002558 uint32_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002559 AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002560 audio_encapsulation_mode_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002561 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002562 indexToEnum_index<audio_encapsulation_mode_t>,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002563 enumToMask_index<int32_t, AudioEncapsulationMode>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002564}
2565
2566ConversionResult<uint32_t>
2567aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
2568 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002569 int32_t,
2570 audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002571 AudioEncapsulationMetadataType>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002572 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002573 indexToEnum_index<AudioEncapsulationMetadataType>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002574 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
2575}
2576
2577ConversionResult<int32_t>
2578legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
2579 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002580 uint32_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002581 AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002582 audio_encapsulation_metadata_type_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002583 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002584 indexToEnum_index<audio_encapsulation_metadata_type_t>,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002585 enumToMask_index<int32_t, AudioEncapsulationMetadataType>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002586}
2587
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002588ConversionResult<audio_port_device_ext>
Mikhail Naganov10506122021-10-19 10:14:23 -07002589aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
2590 const AudioPortDeviceExt& aidl, const media::AudioPortDeviceExtSys& aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002591 audio_port_device_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002592 legacy.hw_module = VALUE_OR_RETURN(
2593 aidl2legacy_int32_t_audio_module_handle_t(aidlSys.hwModule));
Mikhail Naganov10506122021-10-19 10:14:23 -07002594 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
2595 aidl.device, &legacy.type, legacy.address));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002596 legacy.encapsulation_modes = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002597 aidl2legacy_AudioEncapsulationMode_mask(aidlSys.encapsulationModes));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002598 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002599 aidl2legacy_AudioEncapsulationMetadataType_mask(
2600 aidlSys.encapsulationMetadataTypes));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002601 return legacy;
2602}
2603
Mikhail Naganov10506122021-10-19 10:14:23 -07002604status_t legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002605 const audio_port_device_ext& legacy,
Mikhail Naganov10506122021-10-19 10:14:23 -07002606 AudioPortDeviceExt* aidl, media::AudioPortDeviceExtSys* aidlDeviceExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002607 aidlDeviceExt->hwModule = VALUE_OR_RETURN_STATUS(
2608 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Mikhail Naganov10506122021-10-19 10:14:23 -07002609 aidl->device = VALUE_OR_RETURN_STATUS(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002610 legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
2611 aidlDeviceExt->encapsulationModes = VALUE_OR_RETURN_STATUS(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002612 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002613 aidlDeviceExt->encapsulationMetadataTypes = VALUE_OR_RETURN_STATUS(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002614 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002615 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002616}
2617
2618ConversionResult<audio_port_mix_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002619aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002620 const AudioPortMixExt& aidl, const media::AudioPortMixExtSys& aidlSys) {
Mikhail Naganova4a926f2021-09-29 17:20:29 +00002621 audio_port_mix_ext legacy{};
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002622 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidlSys.hwModule));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002623 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002624 return legacy;
2625}
2626
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002627status_t
2628legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002629 AudioPortMixExt* aidl, media::AudioPortMixExtSys* aidlMixExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002630 aidlMixExt->hwModule = VALUE_OR_RETURN_STATUS(
2631 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
2632 aidl->handle = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
2633 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002634}
2635
2636ConversionResult<audio_port_session_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002637aidl2legacy_int32_t_audio_port_session_ext(int32_t aidl) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002638 audio_port_session_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002639 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002640 return legacy;
2641}
2642
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002643ConversionResult<int32_t>
2644legacy2aidl_audio_port_session_ext_int32_t(const audio_port_session_ext& legacy) {
2645 return legacy2aidl_audio_session_t_int32_t(legacy.session);
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002646}
2647
2648// This type is unnamed in the original definition, thus we name it here.
2649using audio_port_v7_ext = decltype(audio_port_v7::ext);
2650
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002651ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt_audio_port_v7_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002652 const AudioPortExt& aidl, media::AudioPortType type,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002653 const media::AudioPortExtSys& aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002654 audio_port_v7_ext legacy;
2655 switch (type) {
2656 case media::AudioPortType::NONE:
2657 // Just verify that the union is empty.
2658 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08002659 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002660 case media::AudioPortType::DEVICE:
2661 legacy.device = VALUE_OR_RETURN(
Mikhail Naganov10506122021-10-19 10:14:23 -07002662 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002663 VALUE_OR_RETURN(UNION_GET(aidl, device)),
2664 VALUE_OR_RETURN(UNION_GET(aidlSys, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08002665 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002666 case media::AudioPortType::MIX:
2667 legacy.mix = VALUE_OR_RETURN(
2668 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002669 VALUE_OR_RETURN(UNION_GET(aidl, mix)),
2670 VALUE_OR_RETURN(UNION_GET(aidlSys, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08002671 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002672 case media::AudioPortType::SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002673 legacy.session = VALUE_OR_RETURN(
2674 aidl2legacy_int32_t_audio_port_session_ext(
2675 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08002676 return legacy;
2677
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002678 }
Andy Hung3f69c162020-12-09 12:08:48 -08002679 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002680}
2681
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002682status_t legacy2aidl_AudioPortExt(
2683 const audio_port_v7_ext& legacy, audio_port_type_t type,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002684 AudioPortExt* aidl, media::AudioPortExtSys* aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002685 switch (type) {
2686 case AUDIO_PORT_TYPE_NONE:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002687 UNION_SET(*aidl, unspecified, false);
2688 UNION_SET(*aidlSys, unspecified, false);
2689 return OK;
2690 case AUDIO_PORT_TYPE_DEVICE: {
Mikhail Naganov10506122021-10-19 10:14:23 -07002691 AudioPortDeviceExt device;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002692 media::AudioPortDeviceExtSys deviceSys;
2693 RETURN_STATUS_IF_ERROR(
Mikhail Naganov10506122021-10-19 10:14:23 -07002694 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002695 legacy.device, &device, &deviceSys));
2696 UNION_SET(*aidl, device, device);
2697 UNION_SET(*aidlSys, device, deviceSys);
2698 return OK;
2699 }
2700 case AUDIO_PORT_TYPE_MIX: {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002701 AudioPortMixExt mix;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002702 media::AudioPortMixExtSys mixSys;
2703 RETURN_STATUS_IF_ERROR(
2704 legacy2aidl_audio_port_mix_ext_AudioPortMixExt(
2705 legacy.mix, &mix, &mixSys));
2706 UNION_SET(*aidl, mix, mix);
2707 UNION_SET(*aidlSys, mix, mixSys);
2708 return OK;
2709 }
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002710 case AUDIO_PORT_TYPE_SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002711 UNION_SET(*aidl, session, VALUE_OR_RETURN_STATUS(
2712 legacy2aidl_audio_port_session_ext_int32_t(legacy.session)));
2713 UNION_SET(*aidlSys, unspecified, false);
2714 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002715 }
Andy Hung3f69c162020-12-09 12:08:48 -08002716 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002717}
2718
2719ConversionResult<audio_profile>
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002720aidl2legacy_AudioProfile_audio_profile(const AudioProfile& aidl, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002721 audio_profile legacy;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002722 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002723
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002724 if (aidl.sampleRates.size() > std::size(legacy.sample_rates)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002725 return unexpected(BAD_VALUE);
2726 }
2727 RETURN_IF_ERROR(
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002728 convertRange(aidl.sampleRates.begin(), aidl.sampleRates.end(), legacy.sample_rates,
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002729 convertIntegral<int32_t, unsigned int>));
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002730 legacy.num_sample_rates = aidl.sampleRates.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002731
2732 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
2733 return unexpected(BAD_VALUE);
2734 }
2735 RETURN_IF_ERROR(
2736 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002737 [isInput](const AudioChannelLayout& l) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002738 return aidl2legacy_AudioChannelLayout_audio_channel_mask_t(l, isInput);
2739 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002740 legacy.num_channel_masks = aidl.channelMasks.size();
jiabin82e56932021-03-05 06:35:19 +00002741
2742 legacy.encapsulation_type = VALUE_OR_RETURN(
2743 aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(aidl.encapsulationType));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002744 return legacy;
2745}
2746
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002747ConversionResult<AudioProfile>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002748legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy, bool isInput) {
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002749 AudioProfile aidl;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002750 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002751
2752 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
2753 return unexpected(BAD_VALUE);
2754 }
2755 RETURN_IF_ERROR(
2756 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002757 std::back_inserter(aidl.sampleRates),
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002758 convertIntegral<unsigned int, int32_t>));
2759
2760 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2761 return unexpected(BAD_VALUE);
2762 }
2763 RETURN_IF_ERROR(
2764 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2765 std::back_inserter(aidl.channelMasks),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002766 [isInput](audio_channel_mask_t m) {
2767 return legacy2aidl_audio_channel_mask_t_AudioChannelLayout(m, isInput);
2768 }));
jiabin82e56932021-03-05 06:35:19 +00002769
2770 aidl.encapsulationType = VALUE_OR_RETURN(
2771 legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2772 legacy.encapsulation_type));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002773 return aidl;
2774}
2775
2776ConversionResult<audio_gain>
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002777aidl2legacy_AudioGain_audio_gain(const AudioGain& aidl, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002778 audio_gain legacy;
2779 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002780 legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002781 aidl.channelMask, isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002782 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2783 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2784 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2785 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2786 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2787 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2788 return legacy;
2789}
2790
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002791ConversionResult<AudioGain>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002792legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy, bool isInput) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002793 AudioGain aidl;
Andy Hung973638a2020-12-08 20:47:45 -08002794 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002795 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002796 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002797 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2798 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2799 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2800 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2801 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2802 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2803 return aidl;
2804}
2805
2806ConversionResult<audio_port_v7>
2807aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2808 audio_port_v7 legacy;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002809 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.hal.id));
2810 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.sys.role));
2811 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.sys.type));
2812 RETURN_IF_ERROR(aidl2legacy_string(aidl.hal.name, legacy.name, sizeof(legacy.name)));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002813
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002814 if (aidl.hal.profiles.size() > std::size(legacy.audio_profiles)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002815 return unexpected(BAD_VALUE);
2816 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002817 const bool isInput =
2818 VALUE_OR_RETURN(direction(aidl.sys.role, aidl.sys.type)) == Direction::INPUT;
2819 RETURN_IF_ERROR(convertRange(
2820 aidl.hal.profiles.begin(), aidl.hal.profiles.end(), legacy.audio_profiles,
2821 [isInput](const AudioProfile& p) {
2822 return aidl2legacy_AudioProfile_audio_profile(p, isInput);
2823 }));
2824 legacy.num_audio_profiles = aidl.hal.profiles.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002825
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002826 if (aidl.hal.extraAudioDescriptors.size() > std::size(legacy.extra_audio_descriptors)) {
jiabin82e56932021-03-05 06:35:19 +00002827 return unexpected(BAD_VALUE);
2828 }
2829 RETURN_IF_ERROR(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002830 convertRange(
2831 aidl.hal.extraAudioDescriptors.begin(), aidl.hal.extraAudioDescriptors.end(),
2832 legacy.extra_audio_descriptors,
2833 aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor));
2834 legacy.num_extra_audio_descriptors = aidl.hal.extraAudioDescriptors.size();
jiabin82e56932021-03-05 06:35:19 +00002835
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002836 if (aidl.hal.gains.size() > std::size(legacy.gains)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002837 return unexpected(BAD_VALUE);
2838 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002839 RETURN_IF_ERROR(convertRange(aidl.hal.gains.begin(), aidl.hal.gains.end(), legacy.gains,
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002840 [isInput](const AudioGain& g) {
2841 return aidl2legacy_AudioGain_audio_gain(g, isInput);
2842 }));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002843 legacy.num_gains = aidl.hal.gains.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002844
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002845 media::AudioPortConfig aidlPortConfig;
2846 aidlPortConfig.hal = aidl.hal.activeConfig;
2847 aidlPortConfig.sys = aidl.sys.activeConfig;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002848 legacy.active_config = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002849 aidl2legacy_AudioPortConfig_audio_port_config(aidlPortConfig));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002850 legacy.ext = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002851 aidl2legacy_AudioPortExt_audio_port_v7_ext(aidl.hal.ext, aidl.sys.type, aidl.sys.ext));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002852 return legacy;
2853}
2854
2855ConversionResult<media::AudioPort>
2856legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2857 media::AudioPort aidl;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002858 aidl.hal.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2859 aidl.sys.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2860 aidl.sys.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2861 aidl.hal.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002862
2863 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2864 return unexpected(BAD_VALUE);
2865 }
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002866 const bool isInput = VALUE_OR_RETURN(direction(legacy.role, legacy.type)) == Direction::INPUT;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002867 RETURN_IF_ERROR(
2868 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002869 std::back_inserter(aidl.hal.profiles),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002870 [isInput](const audio_profile& p) {
2871 return legacy2aidl_audio_profile_AudioProfile(p, isInput);
2872 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002873
jiabin82e56932021-03-05 06:35:19 +00002874 if (legacy.num_extra_audio_descriptors > std::size(legacy.extra_audio_descriptors)) {
2875 return unexpected(BAD_VALUE);
2876 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002877 aidl.sys.profiles.resize(legacy.num_audio_profiles);
jiabin82e56932021-03-05 06:35:19 +00002878 RETURN_IF_ERROR(
2879 convertRange(legacy.extra_audio_descriptors,
2880 legacy.extra_audio_descriptors + legacy.num_extra_audio_descriptors,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002881 std::back_inserter(aidl.hal.extraAudioDescriptors),
jiabin82e56932021-03-05 06:35:19 +00002882 legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor));
2883
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002884 if (legacy.num_gains > std::size(legacy.gains)) {
2885 return unexpected(BAD_VALUE);
2886 }
2887 RETURN_IF_ERROR(
2888 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002889 std::back_inserter(aidl.hal.gains),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002890 [isInput](const audio_gain& g) {
2891 return legacy2aidl_audio_gain_AudioGain(g, isInput);
2892 }));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002893 aidl.sys.gains.resize(legacy.num_gains);
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002894
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002895 media::AudioPortConfig aidlPortConfig = VALUE_OR_RETURN(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002896 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002897 aidl.hal.activeConfig = aidlPortConfig.hal;
2898 aidl.sys.activeConfig = aidlPortConfig.sys;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002899 RETURN_IF_ERROR(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002900 legacy2aidl_AudioPortExt(legacy.ext, legacy.type, &aidl.hal.ext, &aidl.sys.ext));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002901 return aidl;
2902}
2903
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002904ConversionResult<audio_mode_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002905aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl) {
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002906 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002907 case AudioMode::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002908 return AUDIO_MODE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002909 case AudioMode::SYS_RESERVED_CURRENT:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002910 return AUDIO_MODE_CURRENT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002911 case AudioMode::NORMAL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002912 return AUDIO_MODE_NORMAL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002913 case AudioMode::RINGTONE:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002914 return AUDIO_MODE_RINGTONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002915 case AudioMode::IN_CALL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002916 return AUDIO_MODE_IN_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002917 case AudioMode::IN_COMMUNICATION:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002918 return AUDIO_MODE_IN_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002919 case AudioMode::CALL_SCREEN:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002920 return AUDIO_MODE_CALL_SCREEN;
2921 }
2922 return unexpected(BAD_VALUE);
2923}
2924
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002925ConversionResult<AudioMode>
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002926legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2927 switch (legacy) {
2928 case AUDIO_MODE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002929 return AudioMode::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002930 case AUDIO_MODE_CURRENT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002931 return AudioMode::SYS_RESERVED_CURRENT;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002932 case AUDIO_MODE_NORMAL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002933 return AudioMode::NORMAL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002934 case AUDIO_MODE_RINGTONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002935 return AudioMode::RINGTONE;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002936 case AUDIO_MODE_IN_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002937 return AudioMode::IN_CALL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002938 case AUDIO_MODE_IN_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002939 return AudioMode::IN_COMMUNICATION;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002940 case AUDIO_MODE_CALL_SCREEN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002941 return AudioMode::CALL_SCREEN;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002942 case AUDIO_MODE_CNT:
2943 break;
2944 }
2945 return unexpected(BAD_VALUE);
2946}
2947
2948ConversionResult<audio_unique_id_use_t>
2949aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2950 switch (aidl) {
2951 case media::AudioUniqueIdUse::UNSPECIFIED:
2952 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2953 case media::AudioUniqueIdUse::SESSION:
2954 return AUDIO_UNIQUE_ID_USE_SESSION;
2955 case media::AudioUniqueIdUse::MODULE:
2956 return AUDIO_UNIQUE_ID_USE_MODULE;
2957 case media::AudioUniqueIdUse::EFFECT:
2958 return AUDIO_UNIQUE_ID_USE_EFFECT;
2959 case media::AudioUniqueIdUse::PATCH:
2960 return AUDIO_UNIQUE_ID_USE_PATCH;
2961 case media::AudioUniqueIdUse::OUTPUT:
2962 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2963 case media::AudioUniqueIdUse::INPUT:
2964 return AUDIO_UNIQUE_ID_USE_INPUT;
2965 case media::AudioUniqueIdUse::CLIENT:
2966 return AUDIO_UNIQUE_ID_USE_CLIENT;
2967 }
2968 return unexpected(BAD_VALUE);
2969}
2970
2971ConversionResult<media::AudioUniqueIdUse>
2972legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2973 switch (legacy) {
2974 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2975 return media::AudioUniqueIdUse::UNSPECIFIED;
2976 case AUDIO_UNIQUE_ID_USE_SESSION:
2977 return media::AudioUniqueIdUse::SESSION;
2978 case AUDIO_UNIQUE_ID_USE_MODULE:
2979 return media::AudioUniqueIdUse::MODULE;
2980 case AUDIO_UNIQUE_ID_USE_EFFECT:
2981 return media::AudioUniqueIdUse::EFFECT;
2982 case AUDIO_UNIQUE_ID_USE_PATCH:
2983 return media::AudioUniqueIdUse::PATCH;
2984 case AUDIO_UNIQUE_ID_USE_OUTPUT:
2985 return media::AudioUniqueIdUse::OUTPUT;
2986 case AUDIO_UNIQUE_ID_USE_INPUT:
2987 return media::AudioUniqueIdUse::INPUT;
2988 case AUDIO_UNIQUE_ID_USE_CLIENT:
2989 return media::AudioUniqueIdUse::CLIENT;
2990 case AUDIO_UNIQUE_ID_USE_MAX:
2991 break;
2992 }
2993 return unexpected(BAD_VALUE);
2994}
2995
Ytai Ben-Tsvi7e7a79d2020-12-15 16:48:16 -08002996ConversionResult<volume_group_t>
2997aidl2legacy_int32_t_volume_group_t(int32_t aidl) {
2998 return convertReinterpret<volume_group_t>(aidl);
2999}
3000
3001ConversionResult<int32_t>
3002legacy2aidl_volume_group_t_int32_t(volume_group_t legacy) {
3003 return convertReinterpret<int32_t>(legacy);
3004}
3005
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08003006ConversionResult<product_strategy_t>
3007aidl2legacy_int32_t_product_strategy_t(int32_t aidl) {
3008 return convertReinterpret<product_strategy_t>(aidl);
3009}
3010
3011ConversionResult<int32_t>
3012legacy2aidl_product_strategy_t_int32_t(product_strategy_t legacy) {
3013 return convertReinterpret<int32_t>(legacy);
3014}
3015
Kuowei Lid4adbdb2020-08-13 14:44:25 +08003016ConversionResult<audio_dual_mono_mode_t>
3017aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(media::AudioDualMonoMode aidl) {
3018 switch (aidl) {
3019 case media::AudioDualMonoMode::OFF:
3020 return AUDIO_DUAL_MONO_MODE_OFF;
3021 case media::AudioDualMonoMode::LR:
3022 return AUDIO_DUAL_MONO_MODE_LR;
3023 case media::AudioDualMonoMode::LL:
3024 return AUDIO_DUAL_MONO_MODE_LL;
3025 case media::AudioDualMonoMode::RR:
3026 return AUDIO_DUAL_MONO_MODE_RR;
3027 }
3028 return unexpected(BAD_VALUE);
3029}
3030
3031ConversionResult<media::AudioDualMonoMode>
3032legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(audio_dual_mono_mode_t legacy) {
3033 switch (legacy) {
3034 case AUDIO_DUAL_MONO_MODE_OFF:
3035 return media::AudioDualMonoMode::OFF;
3036 case AUDIO_DUAL_MONO_MODE_LR:
3037 return media::AudioDualMonoMode::LR;
3038 case AUDIO_DUAL_MONO_MODE_LL:
3039 return media::AudioDualMonoMode::LL;
3040 case AUDIO_DUAL_MONO_MODE_RR:
3041 return media::AudioDualMonoMode::RR;
3042 }
3043 return unexpected(BAD_VALUE);
3044}
3045
3046ConversionResult<audio_timestretch_fallback_mode_t>
3047aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(int32_t aidl) {
3048 return convertReinterpret<audio_timestretch_fallback_mode_t>(aidl);
3049}
3050
3051ConversionResult<int32_t>
3052legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(audio_timestretch_fallback_mode_t legacy) {
3053 return convertReinterpret<int32_t>(legacy);
3054}
3055
3056ConversionResult<audio_timestretch_stretch_mode_t>
3057aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(int32_t aidl) {
3058 return convertReinterpret<audio_timestretch_stretch_mode_t>(aidl);
3059}
3060
3061ConversionResult<int32_t>
3062legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(audio_timestretch_stretch_mode_t legacy) {
3063 return convertReinterpret<int32_t>(legacy);
3064}
3065
3066ConversionResult<audio_playback_rate_t>
3067aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(const media::AudioPlaybackRate& aidl) {
3068 audio_playback_rate_t legacy;
3069 legacy.mSpeed = aidl.speed;
3070 legacy.mPitch = aidl.pitch;
3071 legacy.mFallbackMode = VALUE_OR_RETURN(
3072 aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(aidl.fallbackMode));
3073 legacy.mStretchMode = VALUE_OR_RETURN(
3074 aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(aidl.stretchMode));
3075 return legacy;
3076}
3077
3078ConversionResult<media::AudioPlaybackRate>
3079legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t& legacy) {
3080 media::AudioPlaybackRate aidl;
3081 aidl.speed = legacy.mSpeed;
3082 aidl.pitch = legacy.mPitch;
3083 aidl.fallbackMode = VALUE_OR_RETURN(
3084 legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(legacy.mFallbackMode));
3085 aidl.stretchMode = VALUE_OR_RETURN(
3086 legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(legacy.mStretchMode));
3087 return aidl;
3088}
3089
jiabin82e56932021-03-05 06:35:19 +00003090ConversionResult<audio_standard_t>
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003091aidl2legacy_AudioStandard_audio_standard_t(AudioStandard aidl) {
jiabin82e56932021-03-05 06:35:19 +00003092 switch (aidl) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003093 case AudioStandard::NONE:
jiabin82e56932021-03-05 06:35:19 +00003094 return AUDIO_STANDARD_NONE;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003095 case AudioStandard::EDID:
jiabin82e56932021-03-05 06:35:19 +00003096 return AUDIO_STANDARD_EDID;
3097 }
3098 return unexpected(BAD_VALUE);
3099}
3100
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003101ConversionResult<AudioStandard>
jiabin82e56932021-03-05 06:35:19 +00003102legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy) {
3103 switch (legacy) {
3104 case AUDIO_STANDARD_NONE:
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003105 return AudioStandard::NONE;
jiabin82e56932021-03-05 06:35:19 +00003106 case AUDIO_STANDARD_EDID:
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003107 return AudioStandard::EDID;
jiabin82e56932021-03-05 06:35:19 +00003108 }
3109 return unexpected(BAD_VALUE);
3110}
3111
3112ConversionResult<audio_extra_audio_descriptor>
3113aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003114 const ExtraAudioDescriptor& aidl) {
jiabin82e56932021-03-05 06:35:19 +00003115 audio_extra_audio_descriptor legacy;
3116 legacy.standard = VALUE_OR_RETURN(aidl2legacy_AudioStandard_audio_standard_t(aidl.standard));
3117 if (aidl.audioDescriptor.size() > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3118 return unexpected(BAD_VALUE);
3119 }
3120 legacy.descriptor_length = aidl.audioDescriptor.size();
3121 std::copy(aidl.audioDescriptor.begin(), aidl.audioDescriptor.end(),
3122 std::begin(legacy.descriptor));
3123 legacy.encapsulation_type =
3124 VALUE_OR_RETURN(aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
3125 aidl.encapsulationType));
3126 return legacy;
3127}
3128
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003129ConversionResult<ExtraAudioDescriptor>
jiabin82e56932021-03-05 06:35:19 +00003130legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(
3131 const audio_extra_audio_descriptor& legacy) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003132 ExtraAudioDescriptor aidl;
jiabin82e56932021-03-05 06:35:19 +00003133 aidl.standard = VALUE_OR_RETURN(legacy2aidl_audio_standard_t_AudioStandard(legacy.standard));
3134 if (legacy.descriptor_length > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3135 return unexpected(BAD_VALUE);
3136 }
3137 aidl.audioDescriptor.resize(legacy.descriptor_length);
3138 std::copy(legacy.descriptor, legacy.descriptor + legacy.descriptor_length,
3139 aidl.audioDescriptor.begin());
3140 aidl.encapsulationType =
3141 VALUE_OR_RETURN(legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3142 legacy.encapsulation_type));
3143 return aidl;
3144}
3145
3146ConversionResult<audio_encapsulation_type_t>
3147aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003148 const AudioEncapsulationType& aidl) {
jiabin82e56932021-03-05 06:35:19 +00003149 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003150 case AudioEncapsulationType::NONE:
jiabin82e56932021-03-05 06:35:19 +00003151 return AUDIO_ENCAPSULATION_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003152 case AudioEncapsulationType::IEC61937:
jiabin82e56932021-03-05 06:35:19 +00003153 return AUDIO_ENCAPSULATION_TYPE_IEC61937;
3154 }
3155 return unexpected(BAD_VALUE);
3156}
3157
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003158ConversionResult<AudioEncapsulationType>
jiabin82e56932021-03-05 06:35:19 +00003159legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3160 const audio_encapsulation_type_t & legacy) {
3161 switch (legacy) {
3162 case AUDIO_ENCAPSULATION_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003163 return AudioEncapsulationType::NONE;
jiabin82e56932021-03-05 06:35:19 +00003164 case AUDIO_ENCAPSULATION_TYPE_IEC61937:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003165 return AudioEncapsulationType::IEC61937;
jiabin82e56932021-03-05 06:35:19 +00003166 }
3167 return unexpected(BAD_VALUE);
3168}
3169
jiabin10a03f12021-05-07 23:46:28 +00003170ConversionResult<TrackSecondaryOutputInfoPair>
3171aidl2legacy_TrackSecondaryOutputInfo_TrackSecondaryOutputInfoPair(
3172 const media::TrackSecondaryOutputInfo& aidl) {
3173 TrackSecondaryOutputInfoPair trackSecondaryOutputInfoPair;
3174 trackSecondaryOutputInfoPair.first =
3175 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
3176 trackSecondaryOutputInfoPair.second =
3177 VALUE_OR_RETURN(convertContainer<std::vector<audio_port_handle_t>>(
3178 aidl.secondaryOutputIds, aidl2legacy_int32_t_audio_io_handle_t));
3179 return trackSecondaryOutputInfoPair;
3180}
3181
3182ConversionResult<media::TrackSecondaryOutputInfo>
3183legacy2aidl_TrackSecondaryOutputInfoPair_TrackSecondaryOutputInfo(
3184 const TrackSecondaryOutputInfoPair& legacy) {
3185 media::TrackSecondaryOutputInfo trackSecondaryOutputInfo;
3186 trackSecondaryOutputInfo.portId =
3187 VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.first));
3188 trackSecondaryOutputInfo.secondaryOutputIds =
3189 VALUE_OR_RETURN(convertContainer<std::vector<int32_t>>(
3190 legacy.second, legacy2aidl_audio_io_handle_t_int32_t));
3191 return trackSecondaryOutputInfo;
3192}
3193
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07003194} // namespace android