blob: 5f63a6920319a0f006292696144222af6f25a22e [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 Naganovddceecc2021-09-03 13:58:56 -070053using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070054using media::audio::common::AudioOffloadInfo;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000055using media::audio::common::AudioPortExt;
56using media::audio::common::AudioPortMixExt;
57using media::audio::common::AudioPortMixExtUseCase;
Mikhail Naganov89818ba2021-09-21 20:37:13 +000058using media::audio::common::AudioProfile;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070059using media::audio::common::AudioSource;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000060using media::audio::common::AudioStandard;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070061using media::audio::common::AudioStreamType;
62using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070063using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000064using media::audio::common::ExtraAudioDescriptor;
65using media::audio::common::Int;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070066using media::audio::common::PcmType;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070067
68namespace {
69
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070070enum class Direction {
71 INPUT, OUTPUT
72};
73
74ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
75 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -080076 case media::AudioPortType::NONE:
77 case media::AudioPortType::SESSION:
78 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070079 case media::AudioPortType::DEVICE:
80 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080081 case media::AudioPortRole::NONE:
82 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070083 case media::AudioPortRole::SOURCE:
84 return Direction::INPUT;
85 case media::AudioPortRole::SINK:
86 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070087 }
88 break;
89 case media::AudioPortType::MIX:
90 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080091 case media::AudioPortRole::NONE:
92 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070093 case media::AudioPortRole::SOURCE:
94 return Direction::OUTPUT;
95 case media::AudioPortRole::SINK:
96 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070097 }
98 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070099 }
100 return unexpected(BAD_VALUE);
101}
102
103ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
104 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -0800105 case AUDIO_PORT_TYPE_NONE:
106 case AUDIO_PORT_TYPE_SESSION:
107 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700108 case AUDIO_PORT_TYPE_DEVICE:
109 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800110 case AUDIO_PORT_ROLE_NONE:
111 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700112 case AUDIO_PORT_ROLE_SOURCE:
113 return Direction::INPUT;
114 case AUDIO_PORT_ROLE_SINK:
115 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700116 }
117 break;
118 case AUDIO_PORT_TYPE_MIX:
119 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800120 case AUDIO_PORT_ROLE_NONE:
121 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700122 case AUDIO_PORT_ROLE_SOURCE:
123 return Direction::OUTPUT;
124 case AUDIO_PORT_ROLE_SINK:
125 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700126 }
127 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700128 }
129 return unexpected(BAD_VALUE);
130}
131
132} // namespace
133
134////////////////////////////////////////////////////////////////////////////////////////////////////
135// Converters
136
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700137status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
138 if (aidl.size() > maxSize - 1) {
139 return BAD_VALUE;
140 }
141 aidl.copy(dest, aidl.size());
142 dest[aidl.size()] = '\0';
143 return OK;
144}
145
146ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
147 if (legacy == nullptr) {
148 return unexpected(BAD_VALUE);
149 }
150 if (strnlen(legacy, maxSize) == maxSize) {
151 // No null-terminator.
152 return unexpected(BAD_VALUE);
153 }
154 return std::string(legacy);
155}
156
157ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
158 return convertReinterpret<audio_module_handle_t>(aidl);
159}
160
161ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
162 return convertReinterpret<int32_t>(legacy);
163}
164
165ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
166 return convertReinterpret<audio_io_handle_t>(aidl);
167}
168
169ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
170 return convertReinterpret<int32_t>(legacy);
171}
172
173ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
174 return convertReinterpret<audio_port_handle_t>(aidl);
175}
176
177ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
178 return convertReinterpret<int32_t>(legacy);
179}
180
181ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
182 return convertReinterpret<audio_patch_handle_t>(aidl);
183}
184
185ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
186 return convertReinterpret<int32_t>(legacy);
187}
188
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800189ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
190 return convertReinterpret<audio_unique_id_t>(aidl);
191}
192
193ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
194 return convertReinterpret<int32_t>(legacy);
195}
196
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -0800197ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
198 return convertReinterpret<audio_hw_sync_t>(aidl);
199}
200
201ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
202 return convertReinterpret<int32_t>(legacy);
203}
204
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800205ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
206 return convertReinterpret<pid_t>(aidl);
207}
208
209ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
210 return convertReinterpret<int32_t>(legacy);
211}
212
213ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
214 return convertReinterpret<uid_t>(aidl);
215}
216
217ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
218 return convertReinterpret<int32_t>(legacy);
219}
220
221ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
222 return String16(aidl.data(), aidl.size());
223}
224
225ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
226 return std::string(String8(legacy).c_str());
227}
228
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700229// TODO b/182392769: create an optional -> optional util
230ConversionResult<std::optional<String16>>
231aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl) {
232 if (!aidl.has_value()) {
233 return std::nullopt;
234 }
235 ConversionResult<String16> conversion =
236 VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.value()));
237 return conversion.value();
238}
239
240ConversionResult<std::optional<std::string_view>>
241legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy) {
242 if (!legacy.has_value()) {
243 return std::nullopt;
244 }
245 ConversionResult<std::string> conversion =
246 VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.value()));
247 return conversion.value();
248}
249
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800250ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
251 return String8(aidl.data(), aidl.size());
252}
253
254ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
255 return std::string(legacy.c_str());
256}
257
Mikhail Naganov88536df2021-07-26 17:30:29 -0700258ConversionResult<audio_io_config_event_t> aidl2legacy_AudioIoConfigEvent_audio_io_config_event_t(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700259 media::AudioIoConfigEvent aidl) {
260 switch (aidl) {
261 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
262 return AUDIO_OUTPUT_REGISTERED;
263 case media::AudioIoConfigEvent::OUTPUT_OPENED:
264 return AUDIO_OUTPUT_OPENED;
265 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
266 return AUDIO_OUTPUT_CLOSED;
267 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
268 return AUDIO_OUTPUT_CONFIG_CHANGED;
269 case media::AudioIoConfigEvent::INPUT_REGISTERED:
270 return AUDIO_INPUT_REGISTERED;
271 case media::AudioIoConfigEvent::INPUT_OPENED:
272 return AUDIO_INPUT_OPENED;
273 case media::AudioIoConfigEvent::INPUT_CLOSED:
274 return AUDIO_INPUT_CLOSED;
275 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
276 return AUDIO_INPUT_CONFIG_CHANGED;
277 case media::AudioIoConfigEvent::CLIENT_STARTED:
278 return AUDIO_CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700279 }
Andy Hung3f69c162020-12-09 12:08:48 -0800280 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700281}
282
Mikhail Naganov88536df2021-07-26 17:30:29 -0700283ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_t_AudioIoConfigEvent(
284 audio_io_config_event_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700285 switch (legacy) {
286 case AUDIO_OUTPUT_REGISTERED:
287 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
288 case AUDIO_OUTPUT_OPENED:
289 return media::AudioIoConfigEvent::OUTPUT_OPENED;
290 case AUDIO_OUTPUT_CLOSED:
291 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
292 case AUDIO_OUTPUT_CONFIG_CHANGED:
293 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
294 case AUDIO_INPUT_REGISTERED:
295 return media::AudioIoConfigEvent::INPUT_REGISTERED;
296 case AUDIO_INPUT_OPENED:
297 return media::AudioIoConfigEvent::INPUT_OPENED;
298 case AUDIO_INPUT_CLOSED:
299 return media::AudioIoConfigEvent::INPUT_CLOSED;
300 case AUDIO_INPUT_CONFIG_CHANGED:
301 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
302 case AUDIO_CLIENT_STARTED:
303 return media::AudioIoConfigEvent::CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700304 }
Andy Hung3f69c162020-12-09 12:08:48 -0800305 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700306}
307
308ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
309 media::AudioPortRole aidl) {
310 switch (aidl) {
311 case media::AudioPortRole::NONE:
312 return AUDIO_PORT_ROLE_NONE;
313 case media::AudioPortRole::SOURCE:
314 return AUDIO_PORT_ROLE_SOURCE;
315 case media::AudioPortRole::SINK:
316 return AUDIO_PORT_ROLE_SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700317 }
Andy Hung3f69c162020-12-09 12:08:48 -0800318 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700319}
320
321ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
322 audio_port_role_t legacy) {
323 switch (legacy) {
324 case AUDIO_PORT_ROLE_NONE:
325 return media::AudioPortRole::NONE;
326 case AUDIO_PORT_ROLE_SOURCE:
327 return media::AudioPortRole::SOURCE;
328 case AUDIO_PORT_ROLE_SINK:
329 return media::AudioPortRole::SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700330 }
Andy Hung3f69c162020-12-09 12:08:48 -0800331 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700332}
333
334ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
335 media::AudioPortType aidl) {
336 switch (aidl) {
337 case media::AudioPortType::NONE:
338 return AUDIO_PORT_TYPE_NONE;
339 case media::AudioPortType::DEVICE:
340 return AUDIO_PORT_TYPE_DEVICE;
341 case media::AudioPortType::MIX:
342 return AUDIO_PORT_TYPE_MIX;
343 case media::AudioPortType::SESSION:
344 return AUDIO_PORT_TYPE_SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700345 }
Andy Hung3f69c162020-12-09 12:08:48 -0800346 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700347}
348
349ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
350 audio_port_type_t legacy) {
351 switch (legacy) {
352 case AUDIO_PORT_TYPE_NONE:
353 return media::AudioPortType::NONE;
354 case AUDIO_PORT_TYPE_DEVICE:
355 return media::AudioPortType::DEVICE;
356 case AUDIO_PORT_TYPE_MIX:
357 return media::AudioPortType::MIX;
358 case AUDIO_PORT_TYPE_SESSION:
359 return media::AudioPortType::SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700360 }
Andy Hung3f69c162020-12-09 12:08:48 -0800361 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700362}
363
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700364namespace {
365
366namespace detail {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700367using AudioChannelPair = std::pair<audio_channel_mask_t, AudioChannelLayout>;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700368using AudioChannelPairs = std::vector<AudioChannelPair>;
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000369using AudioDevicePair = std::pair<audio_devices_t, AudioDeviceDescription>;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700370using AudioDevicePairs = std::vector<AudioDevicePair>;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700371using AudioFormatPair = std::pair<audio_format_t, AudioFormatDescription>;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700372using AudioFormatPairs = std::vector<AudioFormatPair>;
373}
374
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700375const detail::AudioChannelPairs& getInAudioChannelPairs() {
376 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700377#define DEFINE_INPUT_LAYOUT(n) \
378 { \
379 AUDIO_CHANNEL_IN_##n, \
380 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
381 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700382 }
383
384 DEFINE_INPUT_LAYOUT(MONO),
385 DEFINE_INPUT_LAYOUT(STEREO),
386 DEFINE_INPUT_LAYOUT(FRONT_BACK),
387 // AUDIO_CHANNEL_IN_6 not supported
388 DEFINE_INPUT_LAYOUT(2POINT0POINT2),
389 DEFINE_INPUT_LAYOUT(2POINT1POINT2),
390 DEFINE_INPUT_LAYOUT(3POINT0POINT2),
391 DEFINE_INPUT_LAYOUT(3POINT1POINT2),
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700392 DEFINE_INPUT_LAYOUT(5POINT1)
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700393#undef DEFINE_INPUT_LAYOUT
394 };
395 return pairs;
396}
397
398const detail::AudioChannelPairs& getOutAudioChannelPairs() {
399 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700400#define DEFINE_OUTPUT_LAYOUT(n) \
401 { \
402 AUDIO_CHANNEL_OUT_##n, \
403 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
404 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700405 }
406
407 DEFINE_OUTPUT_LAYOUT(MONO),
408 DEFINE_OUTPUT_LAYOUT(STEREO),
409 DEFINE_OUTPUT_LAYOUT(2POINT1),
410 DEFINE_OUTPUT_LAYOUT(TRI),
411 DEFINE_OUTPUT_LAYOUT(TRI_BACK),
412 DEFINE_OUTPUT_LAYOUT(3POINT1),
413 DEFINE_OUTPUT_LAYOUT(2POINT0POINT2),
414 DEFINE_OUTPUT_LAYOUT(2POINT1POINT2),
415 DEFINE_OUTPUT_LAYOUT(3POINT0POINT2),
416 DEFINE_OUTPUT_LAYOUT(3POINT1POINT2),
417 DEFINE_OUTPUT_LAYOUT(QUAD),
418 DEFINE_OUTPUT_LAYOUT(QUAD_SIDE),
419 DEFINE_OUTPUT_LAYOUT(SURROUND),
420 DEFINE_OUTPUT_LAYOUT(PENTA),
421 DEFINE_OUTPUT_LAYOUT(5POINT1),
422 DEFINE_OUTPUT_LAYOUT(5POINT1_SIDE),
423 DEFINE_OUTPUT_LAYOUT(5POINT1POINT2),
424 DEFINE_OUTPUT_LAYOUT(5POINT1POINT4),
425 DEFINE_OUTPUT_LAYOUT(6POINT1),
426 DEFINE_OUTPUT_LAYOUT(7POINT1),
427 DEFINE_OUTPUT_LAYOUT(7POINT1POINT2),
428 DEFINE_OUTPUT_LAYOUT(7POINT1POINT4),
429 DEFINE_OUTPUT_LAYOUT(13POINT_360RA),
430 DEFINE_OUTPUT_LAYOUT(22POINT2),
431 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_A),
432 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_A),
433 DEFINE_OUTPUT_LAYOUT(HAPTIC_AB),
434 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_AB),
435 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_AB)
436#undef DEFINE_OUTPUT_LAYOUT
437 };
438 return pairs;
439}
440
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700441const detail::AudioChannelPairs& getVoiceAudioChannelPairs() {
442 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700443#define DEFINE_VOICE_LAYOUT(n) \
444 { \
445 AUDIO_CHANNEL_IN_VOICE_##n, \
446 AudioChannelLayout::make<AudioChannelLayout::Tag::voiceMask>( \
447 AudioChannelLayout::VOICE_##n) \
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700448 }
449 DEFINE_VOICE_LAYOUT(UPLINK_MONO),
450 DEFINE_VOICE_LAYOUT(DNLINK_MONO),
451 DEFINE_VOICE_LAYOUT(CALL_MONO)
452#undef DEFINE_VOICE_LAYOUT
453 };
454 return pairs;
455}
456
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000457AudioDeviceDescription make_AudioDeviceDescription(AudioDeviceType type,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700458 const std::string& connection = "") {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000459 AudioDeviceDescription result;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700460 result.type = type;
461 result.connection = connection;
462 return result;
463}
464
465void append_AudioDeviceDescription(detail::AudioDevicePairs& pairs,
466 audio_devices_t inputType, audio_devices_t outputType,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000467 AudioDeviceType inType, AudioDeviceType outType,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700468 const std::string& connection = "") {
469 pairs.push_back(std::make_pair(inputType, make_AudioDeviceDescription(inType, connection)));
470 pairs.push_back(std::make_pair(outputType, make_AudioDeviceDescription(outType, connection)));
471}
472
473const detail::AudioDevicePairs& getAudioDevicePairs() {
474 static const detail::AudioDevicePairs pairs = []() {
475 detail::AudioDevicePairs pairs = {{
476 {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000477 AUDIO_DEVICE_NONE, AudioDeviceDescription{}
Mikhail Naganov09a73812021-06-17 18:00:55 -0700478 },
479 {
480 AUDIO_DEVICE_OUT_EARPIECE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000481 AudioDeviceType::OUT_SPEAKER_EARPIECE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700482 },
483 {
484 AUDIO_DEVICE_OUT_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000485 AudioDeviceType::OUT_SPEAKER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700486 },
487 {
488 AUDIO_DEVICE_OUT_WIRED_HEADPHONE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000489 AudioDeviceType::OUT_HEADPHONE,
490 AudioDeviceDescription::CONNECTION_ANALOG())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700491 },
492 {
493 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000494 AudioDeviceType::OUT_DEVICE,
495 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700496 },
497 {
498 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000499 AudioDeviceType::OUT_CARKIT,
500 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700501 },
502 {
503 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000504 AudioDeviceType::OUT_HEADPHONE,
505 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700506 },
507 {
508 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000509 AudioDeviceType::OUT_SPEAKER,
510 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700511 },
512 {
513 AUDIO_DEVICE_OUT_TELEPHONY_TX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000514 AudioDeviceType::OUT_TELEPHONY_TX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700515 },
516 {
517 AUDIO_DEVICE_OUT_AUX_LINE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000518 AudioDeviceType::OUT_LINE_AUX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700519 },
520 {
521 AUDIO_DEVICE_OUT_SPEAKER_SAFE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000522 AudioDeviceType::OUT_SPEAKER_SAFE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700523 },
524 {
525 AUDIO_DEVICE_OUT_HEARING_AID, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000526 AudioDeviceType::OUT_HEARING_AID,
527 AudioDeviceDescription::CONNECTION_WIRELESS())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700528 },
529 {
530 AUDIO_DEVICE_OUT_ECHO_CANCELLER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000531 AudioDeviceType::OUT_ECHO_CANCELLER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700532 },
533 {
534 AUDIO_DEVICE_OUT_BLE_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000535 AudioDeviceType::OUT_SPEAKER,
536 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700537 },
538 // AUDIO_DEVICE_IN_AMBIENT and IN_COMMUNICATION are removed since they were deprecated.
539 {
540 AUDIO_DEVICE_IN_BUILTIN_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000541 AudioDeviceType::IN_MICROPHONE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700542 },
543 {
544 AUDIO_DEVICE_IN_BACK_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000545 AudioDeviceType::IN_MICROPHONE_BACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700546 },
547 {
548 AUDIO_DEVICE_IN_TELEPHONY_RX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000549 AudioDeviceType::IN_TELEPHONY_RX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700550 },
551 {
552 AUDIO_DEVICE_IN_TV_TUNER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000553 AudioDeviceType::IN_TV_TUNER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700554 },
555 {
556 AUDIO_DEVICE_IN_LOOPBACK, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000557 AudioDeviceType::IN_LOOPBACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700558 },
559 {
560 AUDIO_DEVICE_IN_BLUETOOTH_BLE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000561 AudioDeviceType::IN_DEVICE,
562 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700563 },
564 {
565 AUDIO_DEVICE_IN_ECHO_REFERENCE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000566 AudioDeviceType::IN_ECHO_REFERENCE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700567 }
568 }};
569 append_AudioDeviceDescription(pairs,
570 AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_OUT_DEFAULT,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000571 AudioDeviceType::IN_DEFAULT, AudioDeviceType::OUT_DEFAULT);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700572 append_AudioDeviceDescription(pairs,
573 AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_OUT_WIRED_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000574 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
575 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700576 append_AudioDeviceDescription(pairs,
577 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000578 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
579 AudioDeviceDescription::CONNECTION_BT_SCO());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700580 append_AudioDeviceDescription(pairs,
581 AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_OUT_HDMI,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000582 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
583 AudioDeviceDescription::CONNECTION_HDMI());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700584 append_AudioDeviceDescription(pairs,
585 AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000586 AudioDeviceType::IN_SUBMIX, AudioDeviceType::OUT_SUBMIX);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700587 append_AudioDeviceDescription(pairs,
588 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700589 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
590 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700591 append_AudioDeviceDescription(pairs,
592 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700593 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
594 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700595 append_AudioDeviceDescription(pairs,
596 AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_OUT_USB_ACCESSORY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000597 AudioDeviceType::IN_ACCESSORY, AudioDeviceType::OUT_ACCESSORY,
598 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700599 append_AudioDeviceDescription(pairs,
600 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_OUT_USB_DEVICE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000601 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
602 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700603 append_AudioDeviceDescription(pairs,
604 AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_OUT_FM,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000605 AudioDeviceType::IN_FM_TUNER, AudioDeviceType::OUT_FM);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700606 append_AudioDeviceDescription(pairs,
607 AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_OUT_LINE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000608 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
609 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700610 append_AudioDeviceDescription(pairs,
611 AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_OUT_SPDIF,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000612 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
613 AudioDeviceDescription::CONNECTION_SPDIF());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700614 append_AudioDeviceDescription(pairs,
615 AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000616 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
617 AudioDeviceDescription::CONNECTION_BT_A2DP());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700618 append_AudioDeviceDescription(pairs,
619 AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_OUT_IP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000620 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
621 AudioDeviceDescription::CONNECTION_IP_V4());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700622 append_AudioDeviceDescription(pairs,
623 AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_OUT_BUS,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000624 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
625 AudioDeviceDescription::CONNECTION_BUS());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700626 append_AudioDeviceDescription(pairs,
627 AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_OUT_PROXY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000628 AudioDeviceType::IN_AFE_PROXY, AudioDeviceType::OUT_AFE_PROXY);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700629 append_AudioDeviceDescription(pairs,
630 AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_OUT_USB_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000631 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
632 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700633 append_AudioDeviceDescription(pairs,
634 AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_OUT_HDMI_ARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000635 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
636 AudioDeviceDescription::CONNECTION_HDMI_ARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700637 append_AudioDeviceDescription(pairs,
638 AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_OUT_HDMI_EARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000639 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
640 AudioDeviceDescription::CONNECTION_HDMI_EARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700641 append_AudioDeviceDescription(pairs,
642 AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_OUT_BLE_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000643 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
644 AudioDeviceDescription::CONNECTION_BT_LE());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700645 return pairs;
646 }();
647 return pairs;
648}
649
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700650AudioFormatDescription make_AudioFormatDescription(AudioFormatType type) {
651 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700652 result.type = type;
653 return result;
654}
655
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700656AudioFormatDescription make_AudioFormatDescription(PcmType pcm) {
657 auto result = make_AudioFormatDescription(AudioFormatType::PCM);
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700658 result.pcm = pcm;
659 return result;
660}
661
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700662AudioFormatDescription make_AudioFormatDescription(const std::string& encoding) {
663 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700664 result.encoding = encoding;
665 return result;
666}
667
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700668AudioFormatDescription make_AudioFormatDescription(PcmType transport,
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700669 const std::string& encoding) {
670 auto result = make_AudioFormatDescription(encoding);
671 result.pcm = transport;
672 return result;
673}
674
675const detail::AudioFormatPairs& getAudioFormatPairs() {
676 static const detail::AudioFormatPairs pairs = {{
677 {
678 AUDIO_FORMAT_INVALID,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700679 make_AudioFormatDescription(AudioFormatType::SYS_RESERVED_INVALID)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700680 },
681 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700682 AUDIO_FORMAT_DEFAULT, AudioFormatDescription{}
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700683 },
684 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700685 AUDIO_FORMAT_PCM_16_BIT, make_AudioFormatDescription(PcmType::INT_16_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700686 },
687 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700688 AUDIO_FORMAT_PCM_8_BIT, make_AudioFormatDescription(PcmType::UINT_8_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700689 },
690 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700691 AUDIO_FORMAT_PCM_32_BIT, make_AudioFormatDescription(PcmType::INT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700692 },
693 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700694 AUDIO_FORMAT_PCM_8_24_BIT, make_AudioFormatDescription(PcmType::FIXED_Q_8_24)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700695 },
696 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700697 AUDIO_FORMAT_PCM_FLOAT, make_AudioFormatDescription(PcmType::FLOAT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700698 },
699 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700700 AUDIO_FORMAT_PCM_24_BIT_PACKED, make_AudioFormatDescription(PcmType::INT_24_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700701 },
702 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700703 AUDIO_FORMAT_MP3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG)
704 },
705 {
706 AUDIO_FORMAT_AMR_NB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_NB)
707 },
708 {
709 AUDIO_FORMAT_AMR_WB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB)
710 },
711 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700712 AUDIO_FORMAT_AAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MP4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700713 },
714 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700715 AUDIO_FORMAT_AAC_MAIN, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700716 },
717 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700718 AUDIO_FORMAT_AAC_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700719 },
720 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700721 AUDIO_FORMAT_AAC_SSR, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700722 },
723 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700724 AUDIO_FORMAT_AAC_LTP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700725 },
726 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700727 AUDIO_FORMAT_AAC_HE_V1, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700728 },
729 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700730 AUDIO_FORMAT_AAC_SCALABLE,
731 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700732 },
733 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700734 AUDIO_FORMAT_AAC_ERLC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700735 },
736 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700737 AUDIO_FORMAT_AAC_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700738 },
739 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700740 AUDIO_FORMAT_AAC_HE_V2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700741 },
742 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700743 AUDIO_FORMAT_AAC_ELD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700744 },
745 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700746 AUDIO_FORMAT_AAC_XHE, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700747 },
748 // AUDIO_FORMAT_HE_AAC_V1 and HE_AAC_V2 are removed since they were deprecated long time
749 // ago.
750 {
751 AUDIO_FORMAT_VORBIS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_VORBIS)
752 },
753 {
754 AUDIO_FORMAT_OPUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_OPUS)
755 },
756 {
757 AUDIO_FORMAT_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC3)
758 },
759 {
760 AUDIO_FORMAT_E_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3)
761 },
762 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700763 AUDIO_FORMAT_E_AC3_JOC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3_JOC)
764 },
765 {
766 AUDIO_FORMAT_DTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS)
767 },
768 {
769 AUDIO_FORMAT_DTS_HD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_HD)
770 },
771 // In the future, we would like to represent encapsulated bitstreams as
772 // nested AudioFormatDescriptions. The legacy 'AUDIO_FORMAT_IEC61937' type doesn't
773 // specify the format of the encapsulated bitstream.
774 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700775 AUDIO_FORMAT_IEC61937,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700776 make_AudioFormatDescription(PcmType::INT_16_BIT, MEDIA_MIMETYPE_AUDIO_IEC61937)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700777 },
778 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700779 AUDIO_FORMAT_DOLBY_TRUEHD,
780 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_TRUEHD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700781 },
782 {
783 AUDIO_FORMAT_EVRC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRC)
784 },
785 {
786 AUDIO_FORMAT_EVRCB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCB)
787 },
788 {
789 AUDIO_FORMAT_EVRCWB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCWB)
790 },
791 {
792 AUDIO_FORMAT_EVRCNW, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCNW)
793 },
794 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700795 AUDIO_FORMAT_AAC_ADIF, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADIF)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700796 },
797 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700798 AUDIO_FORMAT_WMA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_WMA)
799 },
800 {
801 // Note: not in the IANA registry.
802 AUDIO_FORMAT_WMA_PRO, make_AudioFormatDescription("audio/x-ms-wma.pro")
803 },
804 {
805 AUDIO_FORMAT_AMR_WB_PLUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS)
806 },
807 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700808 AUDIO_FORMAT_MP2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II)
809 },
810 {
811 AUDIO_FORMAT_QCELP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_QCELP)
812 },
813 {
814 // Note: not in the IANA registry.
815 AUDIO_FORMAT_DSD, make_AudioFormatDescription("audio/vnd.sony.dsd")
816 },
817 {
818 AUDIO_FORMAT_FLAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_FLAC)
819 },
820 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700821 AUDIO_FORMAT_ALAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_ALAC)
822 },
823 {
824 // Note: not in the IANA registry.
825 AUDIO_FORMAT_APE, make_AudioFormatDescription("audio/x-ape")
826 },
827 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700828 AUDIO_FORMAT_AAC_ADTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS)
829 },
830 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700831 AUDIO_FORMAT_AAC_ADTS_MAIN,
832 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700833 },
834 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700835 AUDIO_FORMAT_AAC_ADTS_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700836 },
837 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700838 AUDIO_FORMAT_AAC_ADTS_SSR,
839 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700840 },
841 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700842 AUDIO_FORMAT_AAC_ADTS_LTP,
843 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700844 },
845 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700846 AUDIO_FORMAT_AAC_ADTS_HE_V1,
847 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700848 },
849 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700850 AUDIO_FORMAT_AAC_ADTS_SCALABLE,
851 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700852 },
853 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700854 AUDIO_FORMAT_AAC_ADTS_ERLC,
855 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700856 },
857 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700858 AUDIO_FORMAT_AAC_ADTS_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700859 },
860 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700861 AUDIO_FORMAT_AAC_ADTS_HE_V2,
862 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700863 },
864 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700865 AUDIO_FORMAT_AAC_ADTS_ELD,
866 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700867 },
868 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700869 AUDIO_FORMAT_AAC_ADTS_XHE,
870 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700871 },
872 {
873 // Note: not in the IANA registry. "vnd.octel.sbc" is not BT SBC.
874 AUDIO_FORMAT_SBC, make_AudioFormatDescription("audio/x-sbc")
875 },
876 {
877 AUDIO_FORMAT_APTX, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_APTX)
878 },
879 {
880 // Note: not in the IANA registry.
881 AUDIO_FORMAT_APTX_HD, make_AudioFormatDescription("audio/vnd.qcom.aptx.hd")
882 },
883 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700884 AUDIO_FORMAT_AC4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC4)
885 },
886 {
887 // Note: not in the IANA registry.
888 AUDIO_FORMAT_LDAC, make_AudioFormatDescription("audio/vnd.sony.ldac")
889 },
890 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700891 AUDIO_FORMAT_MAT, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700892 },
893 {
894 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700895 AUDIO_FORMAT_MAT_1_0,
896 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".1.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700897 },
898 {
899 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700900 AUDIO_FORMAT_MAT_2_0,
901 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700902 },
903 {
904 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700905 AUDIO_FORMAT_MAT_2_1,
906 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.1"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700907 },
908 {
909 AUDIO_FORMAT_AAC_LATM, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC)
910 },
911 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700912 AUDIO_FORMAT_AAC_LATM_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700913 },
914 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700915 AUDIO_FORMAT_AAC_LATM_HE_V1,
916 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700917 },
918 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700919 AUDIO_FORMAT_AAC_LATM_HE_V2,
920 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700921 },
922 {
923 // Note: not in the IANA registry.
924 AUDIO_FORMAT_CELT, make_AudioFormatDescription("audio/x-celt")
925 },
926 {
927 // Note: not in the IANA registry.
928 AUDIO_FORMAT_APTX_ADAPTIVE, make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive")
929 },
930 {
931 // Note: not in the IANA registry.
932 AUDIO_FORMAT_LHDC, make_AudioFormatDescription("audio/vnd.savitech.lhdc")
933 },
934 {
935 // Note: not in the IANA registry.
936 AUDIO_FORMAT_LHDC_LL, make_AudioFormatDescription("audio/vnd.savitech.lhdc.ll")
937 },
938 {
939 // Note: not in the IANA registry.
940 AUDIO_FORMAT_APTX_TWSP, make_AudioFormatDescription("audio/vnd.qcom.aptx.twsp")
941 },
942 {
943 // Note: not in the IANA registry.
944 AUDIO_FORMAT_LC3, make_AudioFormatDescription("audio/x-lc3")
945 },
946 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700947 AUDIO_FORMAT_MPEGH, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_MHM1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700948 },
949 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700950 AUDIO_FORMAT_MPEGH_BL_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700951 },
952 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700953 AUDIO_FORMAT_MPEGH_BL_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700954 },
955 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700956 AUDIO_FORMAT_MPEGH_LC_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700957 },
958 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700959 AUDIO_FORMAT_MPEGH_LC_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700960 },
961 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700962 AUDIO_FORMAT_IEC60958,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700963 make_AudioFormatDescription(PcmType::INT_24_BIT, MEDIA_MIMETYPE_AUDIO_IEC60958)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700964 },
965 {
966 AUDIO_FORMAT_DTS_UHD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_UHD)
967 },
968 {
969 AUDIO_FORMAT_DRA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DRA)
970 },
971 }};
972 return pairs;
973}
974
Mikhail Naganov09a73812021-06-17 18:00:55 -0700975template<typename S, typename T>
976std::unordered_map<S, T> make_DirectMap(const std::vector<std::pair<S, T>>& v) {
977 std::unordered_map<S, T> result(v.begin(), v.end());
978 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
979 return result;
980}
981
982template<typename S, typename T>
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700983std::unordered_map<S, T> make_DirectMap(
984 const std::vector<std::pair<S, T>>& v1, const std::vector<std::pair<S, T>>& v2) {
985 std::unordered_map<S, T> result(v1.begin(), v1.end());
986 LOG_ALWAYS_FATAL_IF(result.size() != v1.size(), "Duplicate key elements detected in v1");
987 result.insert(v2.begin(), v2.end());
988 LOG_ALWAYS_FATAL_IF(result.size() != v1.size() + v2.size(),
989 "Duplicate key elements detected in v1+v2");
990 return result;
991}
992
993template<typename S, typename T>
Mikhail Naganov09a73812021-06-17 18:00:55 -0700994std::unordered_map<T, S> make_ReverseMap(const std::vector<std::pair<S, T>>& v) {
995 std::unordered_map<T, S> result;
996 std::transform(v.begin(), v.end(), std::inserter(result, result.begin()),
997 [](const std::pair<S, T>& p) {
998 return std::make_pair(p.second, p.first);
999 });
1000 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
1001 return result;
1002}
1003
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001004} // namespace
1005
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001006ConversionResult<audio_channel_mask_t> aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001007 const AudioChannelLayout& aidl, bool isInput) {
1008 using ReverseMap = std::unordered_map<AudioChannelLayout, audio_channel_mask_t>;
1009 using Tag = AudioChannelLayout::Tag;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001010 static const ReverseMap mIn = make_ReverseMap(getInAudioChannelPairs());
1011 static const ReverseMap mOut = make_ReverseMap(getOutAudioChannelPairs());
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001012 static const ReverseMap mVoice = make_ReverseMap(getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001013
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001014 auto convert = [](const AudioChannelLayout& aidl, const ReverseMap& m,
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001015 const char* func, const char* type) -> ConversionResult<audio_channel_mask_t> {
1016 if (auto it = m.find(aidl); it != m.end()) {
1017 return it->second;
1018 } else {
1019 ALOGE("%s: no legacy %s audio_channel_mask_t found for %s", func, type,
1020 aidl.toString().c_str());
1021 return unexpected(BAD_VALUE);
1022 }
1023 };
1024
1025 switch (aidl.getTag()) {
1026 case Tag::none:
1027 return AUDIO_CHANNEL_NONE;
1028 case Tag::invalid:
1029 return AUDIO_CHANNEL_INVALID;
Mikhail Naganov81020002021-08-03 14:16:15 -07001030 case Tag::indexMask: {
1031 // Index masks do not have pre-defined values.
1032 const int bits = aidl.get<Tag::indexMask>();
1033 if (__builtin_popcount(bits) != 0 &&
1034 __builtin_popcount(bits) <= AUDIO_CHANNEL_COUNT_MAX) {
1035 return audio_channel_mask_from_representation_and_bits(
1036 AUDIO_CHANNEL_REPRESENTATION_INDEX, bits);
1037 } else {
1038 ALOGE("%s: invalid indexMask value 0x%x in %s",
1039 __func__, bits, aidl.toString().c_str());
1040 return unexpected(BAD_VALUE);
1041 }
1042 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001043 case Tag::layoutMask:
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001044 return convert(aidl, isInput ? mIn : mOut, __func__, isInput ? "input" : "output");
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001045 case Tag::voiceMask:
1046 return convert(aidl, mVoice, __func__, "voice");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001047 }
1048 ALOGE("%s: unexpected tag value %d", __func__, aidl.getTag());
1049 return unexpected(BAD_VALUE);
1050}
1051
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001052ConversionResult<AudioChannelLayout> legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001053 audio_channel_mask_t legacy, bool isInput) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001054 using DirectMap = std::unordered_map<audio_channel_mask_t, AudioChannelLayout>;
1055 using Tag = AudioChannelLayout::Tag;
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001056 static const DirectMap mInAndVoice = make_DirectMap(
1057 getInAudioChannelPairs(), getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001058 static const DirectMap mOut = make_DirectMap(getOutAudioChannelPairs());
1059
1060 auto convert = [](const audio_channel_mask_t legacy, const DirectMap& m,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001061 const char* func, const char* type) -> ConversionResult<AudioChannelLayout> {
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001062 if (auto it = m.find(legacy); it != m.end()) {
1063 return it->second;
1064 } else {
1065 ALOGE("%s: no AudioChannelLayout found for legacy %s audio_channel_mask_t value 0x%x",
1066 func, type, legacy);
1067 return unexpected(BAD_VALUE);
1068 }
1069 };
1070
1071 if (legacy == AUDIO_CHANNEL_NONE) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001072 return AudioChannelLayout{};
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001073 } else if (legacy == AUDIO_CHANNEL_INVALID) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001074 return AudioChannelLayout::make<Tag::invalid>(0);
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001075 }
1076
1077 const audio_channel_representation_t repr = audio_channel_mask_get_representation(legacy);
1078 if (repr == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
Mikhail Naganov81020002021-08-03 14:16:15 -07001079 if (audio_channel_mask_is_valid(legacy)) {
1080 const int indexMask = VALUE_OR_RETURN(
1081 convertIntegral<int>(audio_channel_mask_get_bits(legacy)));
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001082 return AudioChannelLayout::make<Tag::indexMask>(indexMask);
Mikhail Naganov81020002021-08-03 14:16:15 -07001083 } else {
1084 ALOGE("%s: legacy audio_channel_mask_t value 0x%x is invalid", __func__, legacy);
1085 return unexpected(BAD_VALUE);
1086 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001087 } else if (repr == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001088 return convert(legacy, isInput ? mInAndVoice : mOut, __func__,
1089 isInput ? "input / voice" : "output");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001090 }
1091
1092 ALOGE("%s: unknown representation %d in audio_channel_mask_t value 0x%x",
1093 __func__, repr, legacy);
1094 return unexpected(BAD_VALUE);
1095}
1096
Mikhail Naganov09a73812021-06-17 18:00:55 -07001097ConversionResult<audio_devices_t> aidl2legacy_AudioDeviceDescription_audio_devices_t(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001098 const AudioDeviceDescription& aidl) {
1099 static const std::unordered_map<AudioDeviceDescription, audio_devices_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001100 make_ReverseMap(getAudioDevicePairs());
1101 if (auto it = m.find(aidl); it != m.end()) {
1102 return it->second;
1103 } else {
1104 ALOGE("%s: no legacy audio_devices_t found for %s", __func__, aidl.toString().c_str());
1105 return unexpected(BAD_VALUE);
1106 }
1107}
1108
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001109ConversionResult<AudioDeviceDescription> legacy2aidl_audio_devices_t_AudioDeviceDescription(
Mikhail Naganov09a73812021-06-17 18:00:55 -07001110 audio_devices_t legacy) {
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001111 static const std::unordered_map<audio_devices_t, AudioDeviceDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001112 make_DirectMap(getAudioDevicePairs());
1113 if (auto it = m.find(legacy); it != m.end()) {
1114 return it->second;
1115 } else {
1116 ALOGE("%s: no AudioDeviceDescription found for legacy audio_devices_t value 0x%x",
1117 __func__, legacy);
1118 return unexpected(BAD_VALUE);
1119 }
1120}
1121
Mikhail Naganov932cb962021-09-16 01:05:27 +00001122status_t aidl2legacy_AudioDevice_audio_device(
1123 const AudioDevice& aidl,
1124 audio_devices_t* legacyType, char* legacyAddress) {
1125 *legacyType = VALUE_OR_RETURN_STATUS(
1126 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1127 return aidl2legacy_string(
1128 aidl.address.get<AudioDeviceAddress::id>(),
1129 legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN);
1130}
1131
1132status_t aidl2legacy_AudioDevice_audio_device(
1133 const AudioDevice& aidl,
1134 audio_devices_t* legacyType, String8* legacyAddress) {
1135 *legacyType = VALUE_OR_RETURN_STATUS(
1136 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1137 *legacyAddress = VALUE_OR_RETURN_STATUS(aidl2legacy_string_view_String8(
1138 aidl.address.get<AudioDeviceAddress::id>()));
1139 return OK;
1140}
1141
1142status_t aidl2legacy_AudioDevice_audio_device(
1143 const AudioDevice& aidl,
1144 audio_devices_t* legacyType, std::string* legacyAddress) {
1145 *legacyType = VALUE_OR_RETURN_STATUS(
1146 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1147 *legacyAddress = aidl.address.get<AudioDeviceAddress::id>();
1148 return OK;
1149}
1150
1151ConversionResult<AudioDevice> legacy2aidl_audio_device_AudioDevice(
1152 audio_devices_t legacyType, const char* legacyAddress) {
1153 AudioDevice aidl;
1154 aidl.type = VALUE_OR_RETURN(
1155 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1156 const std::string aidl_id = VALUE_OR_RETURN(
1157 legacy2aidl_string(legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN));
1158 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1159 return aidl;
1160}
1161
1162ConversionResult<AudioDevice>
1163legacy2aidl_audio_device_AudioDevice(
1164 audio_devices_t legacyType, const String8& legacyAddress) {
1165 AudioDevice aidl;
1166 aidl.type = VALUE_OR_RETURN(
1167 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1168 const std::string aidl_id = VALUE_OR_RETURN(
1169 legacy2aidl_String8_string(legacyAddress));
1170 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1171 return aidl;
1172}
1173
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001174ConversionResult<audio_format_t> aidl2legacy_AudioFormatDescription_audio_format_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001175 const AudioFormatDescription& aidl) {
1176 static const std::unordered_map<AudioFormatDescription, audio_format_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001177 make_ReverseMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001178 if (auto it = m.find(aidl); it != m.end()) {
1179 return it->second;
1180 } else {
1181 ALOGE("%s: no legacy audio_format_t found for %s", __func__, aidl.toString().c_str());
1182 return unexpected(BAD_VALUE);
1183 }
1184}
1185
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001186ConversionResult<AudioFormatDescription> legacy2aidl_audio_format_t_AudioFormatDescription(
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001187 audio_format_t legacy) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001188 static const std::unordered_map<audio_format_t, AudioFormatDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001189 make_DirectMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001190 if (auto it = m.find(legacy); it != m.end()) {
1191 return it->second;
1192 } else {
1193 ALOGE("%s: no AudioFormatDescription found for legacy audio_format_t value 0x%x",
1194 __func__, legacy);
1195 return unexpected(BAD_VALUE);
1196 }
1197}
1198
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001199ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(
1200 AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001201 switch (aidl) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001202 case AudioGainMode::JOINT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001203 return AUDIO_GAIN_MODE_JOINT;
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001204 case AudioGainMode::CHANNELS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001205 return AUDIO_GAIN_MODE_CHANNELS;
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001206 case AudioGainMode::RAMP:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001207 return AUDIO_GAIN_MODE_RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001208 }
Andy Hung3f69c162020-12-09 12:08:48 -08001209 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001210}
1211
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001212ConversionResult<AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(
1213 audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001214 switch (legacy) {
1215 case AUDIO_GAIN_MODE_JOINT:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001216 return AudioGainMode::JOINT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001217 case AUDIO_GAIN_MODE_CHANNELS:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001218 return AudioGainMode::CHANNELS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001219 case AUDIO_GAIN_MODE_RAMP:
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001220 return AudioGainMode::RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001221 }
Andy Hung3f69c162020-12-09 12:08:48 -08001222 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001223}
1224
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001225ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001226 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, AudioGainMode>(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001227 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001228 // AudioGainMode is index-based.
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001229 indexToEnum_index<AudioGainMode>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001230 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001231 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001232}
1233
Andy Hung973638a2020-12-08 20:47:45 -08001234ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001235 return convertBitmask<int32_t, audio_gain_mode_t, AudioGainMode, audio_gain_mode_t>(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001236 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001237 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001238 indexToEnum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001239 // AudioGainMode is index-based.
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001240 enumToMask_index<int32_t, AudioGainMode>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001241}
1242
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001243ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001244 const AudioGainConfig& aidl, bool isInput) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001245 audio_gain_config legacy;
1246 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001247 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001248 legacy.channel_mask = VALUE_OR_RETURN(
1249 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001250 const bool isJoint = bitmaskIsSet(aidl.mode, AudioGainMode::JOINT);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001251 size_t numValues = isJoint ? 1
1252 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1253 : audio_channel_count_from_out_mask(legacy.channel_mask);
1254 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
1255 return unexpected(BAD_VALUE);
1256 }
1257 for (size_t i = 0; i < numValues; ++i) {
1258 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
1259 }
1260 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
1261 return legacy;
1262}
1263
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001264ConversionResult<AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001265 const audio_gain_config& legacy, bool isInput) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00001266 AudioGainConfig aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001267 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
Andy Hung973638a2020-12-08 20:47:45 -08001268 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001269 aidl.channelMask = VALUE_OR_RETURN(
1270 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001271 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
1272 size_t numValues = isJoint ? 1
1273 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1274 : audio_channel_count_from_out_mask(legacy.channel_mask);
1275 aidl.values.resize(numValues);
1276 for (size_t i = 0; i < numValues; ++i) {
1277 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
1278 }
1279 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
1280 return aidl;
1281}
1282
1283ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
1284 media::AudioInputFlags aidl) {
1285 switch (aidl) {
1286 case media::AudioInputFlags::FAST:
1287 return AUDIO_INPUT_FLAG_FAST;
1288 case media::AudioInputFlags::HW_HOTWORD:
1289 return AUDIO_INPUT_FLAG_HW_HOTWORD;
1290 case media::AudioInputFlags::RAW:
1291 return AUDIO_INPUT_FLAG_RAW;
1292 case media::AudioInputFlags::SYNC:
1293 return AUDIO_INPUT_FLAG_SYNC;
1294 case media::AudioInputFlags::MMAP_NOIRQ:
1295 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
1296 case media::AudioInputFlags::VOIP_TX:
1297 return AUDIO_INPUT_FLAG_VOIP_TX;
1298 case media::AudioInputFlags::HW_AV_SYNC:
1299 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
1300 case media::AudioInputFlags::DIRECT:
1301 return AUDIO_INPUT_FLAG_DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001302 }
Andy Hung3f69c162020-12-09 12:08:48 -08001303 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001304}
1305
1306ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
1307 audio_input_flags_t legacy) {
1308 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001309 case AUDIO_INPUT_FLAG_NONE:
1310 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001311 case AUDIO_INPUT_FLAG_FAST:
1312 return media::AudioInputFlags::FAST;
1313 case AUDIO_INPUT_FLAG_HW_HOTWORD:
1314 return media::AudioInputFlags::HW_HOTWORD;
1315 case AUDIO_INPUT_FLAG_RAW:
1316 return media::AudioInputFlags::RAW;
1317 case AUDIO_INPUT_FLAG_SYNC:
1318 return media::AudioInputFlags::SYNC;
1319 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
1320 return media::AudioInputFlags::MMAP_NOIRQ;
1321 case AUDIO_INPUT_FLAG_VOIP_TX:
1322 return media::AudioInputFlags::VOIP_TX;
1323 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
1324 return media::AudioInputFlags::HW_AV_SYNC;
1325 case AUDIO_INPUT_FLAG_DIRECT:
1326 return media::AudioInputFlags::DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001327 }
Andy Hung3f69c162020-12-09 12:08:48 -08001328 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001329}
1330
1331ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
1332 media::AudioOutputFlags aidl) {
1333 switch (aidl) {
1334 case media::AudioOutputFlags::DIRECT:
1335 return AUDIO_OUTPUT_FLAG_DIRECT;
1336 case media::AudioOutputFlags::PRIMARY:
1337 return AUDIO_OUTPUT_FLAG_PRIMARY;
1338 case media::AudioOutputFlags::FAST:
1339 return AUDIO_OUTPUT_FLAG_FAST;
1340 case media::AudioOutputFlags::DEEP_BUFFER:
1341 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
1342 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
1343 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
1344 case media::AudioOutputFlags::NON_BLOCKING:
1345 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
1346 case media::AudioOutputFlags::HW_AV_SYNC:
1347 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
1348 case media::AudioOutputFlags::TTS:
1349 return AUDIO_OUTPUT_FLAG_TTS;
1350 case media::AudioOutputFlags::RAW:
1351 return AUDIO_OUTPUT_FLAG_RAW;
1352 case media::AudioOutputFlags::SYNC:
1353 return AUDIO_OUTPUT_FLAG_SYNC;
1354 case media::AudioOutputFlags::IEC958_NONAUDIO:
1355 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
1356 case media::AudioOutputFlags::DIRECT_PCM:
1357 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
1358 case media::AudioOutputFlags::MMAP_NOIRQ:
1359 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
1360 case media::AudioOutputFlags::VOIP_RX:
1361 return AUDIO_OUTPUT_FLAG_VOIP_RX;
1362 case media::AudioOutputFlags::INCALL_MUSIC:
1363 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +01001364 case media::AudioOutputFlags::GAPLESS_OFFLOAD:
1365 return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001366 }
Andy Hung3f69c162020-12-09 12:08:48 -08001367 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001368}
1369
1370ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
1371 audio_output_flags_t legacy) {
1372 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001373 case AUDIO_OUTPUT_FLAG_NONE:
1374 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001375 case AUDIO_OUTPUT_FLAG_DIRECT:
1376 return media::AudioOutputFlags::DIRECT;
1377 case AUDIO_OUTPUT_FLAG_PRIMARY:
1378 return media::AudioOutputFlags::PRIMARY;
1379 case AUDIO_OUTPUT_FLAG_FAST:
1380 return media::AudioOutputFlags::FAST;
1381 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
1382 return media::AudioOutputFlags::DEEP_BUFFER;
1383 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
1384 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
1385 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
1386 return media::AudioOutputFlags::NON_BLOCKING;
1387 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
1388 return media::AudioOutputFlags::HW_AV_SYNC;
1389 case AUDIO_OUTPUT_FLAG_TTS:
1390 return media::AudioOutputFlags::TTS;
1391 case AUDIO_OUTPUT_FLAG_RAW:
1392 return media::AudioOutputFlags::RAW;
1393 case AUDIO_OUTPUT_FLAG_SYNC:
1394 return media::AudioOutputFlags::SYNC;
1395 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
1396 return media::AudioOutputFlags::IEC958_NONAUDIO;
1397 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
1398 return media::AudioOutputFlags::DIRECT_PCM;
1399 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
1400 return media::AudioOutputFlags::MMAP_NOIRQ;
1401 case AUDIO_OUTPUT_FLAG_VOIP_RX:
1402 return media::AudioOutputFlags::VOIP_RX;
1403 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
1404 return media::AudioOutputFlags::INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +01001405 case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
1406 return media::AudioOutputFlags::GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001407 }
Andy Hung3f69c162020-12-09 12:08:48 -08001408 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001409}
1410
Andy Hung973638a2020-12-08 20:47:45 -08001411ConversionResult<audio_input_flags_t> aidl2legacy_int32_t_audio_input_flags_t_mask(
1412 int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001413 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1414
1415 LegacyMask converted = VALUE_OR_RETURN(
1416 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
1417 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001418 indexToEnum_index<media::AudioInputFlags>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001419 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
1420 return static_cast<audio_input_flags_t>(converted);
1421}
1422
Andy Hung973638a2020-12-08 20:47:45 -08001423ConversionResult<int32_t> legacy2aidl_audio_input_flags_t_int32_t_mask(
1424 audio_input_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001425 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1426
1427 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1428 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
1429 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001430 indexToEnum_bitmask<audio_input_flags_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001431 enumToMask_index<int32_t, media::AudioInputFlags>);
1432}
1433
Andy Hung973638a2020-12-08 20:47:45 -08001434ConversionResult<audio_output_flags_t> aidl2legacy_int32_t_audio_output_flags_t_mask(
1435 int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001436 return convertBitmask<audio_output_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001437 int32_t,
1438 audio_output_flags_t,
1439 media::AudioOutputFlags>(
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001440 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001441 indexToEnum_index<media::AudioOutputFlags>,
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001442 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001443}
1444
Andy Hung973638a2020-12-08 20:47:45 -08001445ConversionResult<int32_t> legacy2aidl_audio_output_flags_t_int32_t_mask(
1446 audio_output_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001447 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
1448
1449 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1450 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
1451 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001452 indexToEnum_bitmask<audio_output_flags_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001453 enumToMask_index<int32_t, media::AudioOutputFlags>);
1454}
1455
1456ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
1457 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
1458 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001459 Direction dir = VALUE_OR_RETURN(direction(role, type));
1460 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001461 case Direction::INPUT: {
1462 legacy.input = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001463 aidl2legacy_int32_t_audio_input_flags_t_mask(
1464 VALUE_OR_RETURN(UNION_GET(aidl, input))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001465 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001466 break;
1467
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001468 case Direction::OUTPUT: {
1469 legacy.output = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001470 aidl2legacy_int32_t_audio_output_flags_t_mask(
1471 VALUE_OR_RETURN(UNION_GET(aidl, output))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001472 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001473 break;
1474 }
1475
1476 return legacy;
1477}
1478
1479ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
1480 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
1481 media::AudioIoFlags aidl;
1482
1483 Direction dir = VALUE_OR_RETURN(direction(role, type));
1484 switch (dir) {
1485 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001486 UNION_SET(aidl, input,
Andy Hung973638a2020-12-08 20:47:45 -08001487 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(
1488 legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001489 break;
1490 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001491 UNION_SET(aidl, output,
Andy Hung973638a2020-12-08 20:47:45 -08001492 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(
1493 legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001494 break;
1495 }
1496 return aidl;
1497}
1498
Andy Hung973638a2020-12-08 20:47:45 -08001499ConversionResult<audio_port_config_device_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001500aidl2legacy_AudioDevice_audio_port_config_device_ext(
1501 const AudioDevice& aidl, const media::AudioPortDeviceExtSys& aidlDeviceExt) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001502 audio_port_config_device_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001503 legacy.hw_module = VALUE_OR_RETURN(
1504 aidl2legacy_int32_t_audio_module_handle_t(aidlDeviceExt.hwModule));
1505 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(aidl, &legacy.type, legacy.address));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001506 return legacy;
1507}
1508
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001509status_t legacy2aidl_audio_port_config_device_ext_AudioDevice(
1510 const audio_port_config_device_ext& legacy,
1511 AudioDevice* aidl, media::AudioPortDeviceExtSys* aidlDeviceExt) {
1512 aidlDeviceExt->hwModule = VALUE_OR_RETURN_STATUS(
1513 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1514 *aidl = VALUE_OR_RETURN_STATUS(
1515 legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
1516 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001517}
1518
1519ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001520 AudioStreamType aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001521 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001522 case AudioStreamType::INVALID:
1523 break; // return error
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001524 case AudioStreamType::SYS_RESERVED_DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001525 return AUDIO_STREAM_DEFAULT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001526 case AudioStreamType::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001527 return AUDIO_STREAM_VOICE_CALL;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001528 case AudioStreamType::SYSTEM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001529 return AUDIO_STREAM_SYSTEM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001530 case AudioStreamType::RING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001531 return AUDIO_STREAM_RING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001532 case AudioStreamType::MUSIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001533 return AUDIO_STREAM_MUSIC;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001534 case AudioStreamType::ALARM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001535 return AUDIO_STREAM_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001536 case AudioStreamType::NOTIFICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001537 return AUDIO_STREAM_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001538 case AudioStreamType::BLUETOOTH_SCO:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001539 return AUDIO_STREAM_BLUETOOTH_SCO;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001540 case AudioStreamType::ENFORCED_AUDIBLE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001541 return AUDIO_STREAM_ENFORCED_AUDIBLE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001542 case AudioStreamType::DTMF:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001543 return AUDIO_STREAM_DTMF;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001544 case AudioStreamType::TTS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001545 return AUDIO_STREAM_TTS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001546 case AudioStreamType::ACCESSIBILITY:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001547 return AUDIO_STREAM_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001548 case AudioStreamType::ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001549 return AUDIO_STREAM_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001550 case AudioStreamType::SYS_RESERVED_REROUTING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001551 return AUDIO_STREAM_REROUTING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001552 case AudioStreamType::SYS_RESERVED_PATCH:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001553 return AUDIO_STREAM_PATCH;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001554 case AudioStreamType::CALL_ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001555 return AUDIO_STREAM_CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001556 }
Andy Hung3f69c162020-12-09 12:08:48 -08001557 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001558}
1559
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001560ConversionResult<AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001561 audio_stream_type_t legacy) {
1562 switch (legacy) {
1563 case AUDIO_STREAM_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001564 return AudioStreamType::SYS_RESERVED_DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001565 case AUDIO_STREAM_VOICE_CALL:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001566 return AudioStreamType::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001567 case AUDIO_STREAM_SYSTEM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001568 return AudioStreamType::SYSTEM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001569 case AUDIO_STREAM_RING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001570 return AudioStreamType::RING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001571 case AUDIO_STREAM_MUSIC:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001572 return AudioStreamType::MUSIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001573 case AUDIO_STREAM_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001574 return AudioStreamType::ALARM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001575 case AUDIO_STREAM_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001576 return AudioStreamType::NOTIFICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001577 case AUDIO_STREAM_BLUETOOTH_SCO:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001578 return AudioStreamType::BLUETOOTH_SCO;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001579 case AUDIO_STREAM_ENFORCED_AUDIBLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001580 return AudioStreamType::ENFORCED_AUDIBLE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001581 case AUDIO_STREAM_DTMF:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001582 return AudioStreamType::DTMF;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001583 case AUDIO_STREAM_TTS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001584 return AudioStreamType::TTS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001585 case AUDIO_STREAM_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001586 return AudioStreamType::ACCESSIBILITY;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001587 case AUDIO_STREAM_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001588 return AudioStreamType::ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001589 case AUDIO_STREAM_REROUTING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001590 return AudioStreamType::SYS_RESERVED_REROUTING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001591 case AUDIO_STREAM_PATCH:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001592 return AudioStreamType::SYS_RESERVED_PATCH;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001593 case AUDIO_STREAM_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001594 return AudioStreamType::CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001595 }
Andy Hung3f69c162020-12-09 12:08:48 -08001596 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001597}
1598
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001599ConversionResult<audio_source_t> aidl2legacy_AudioSource_audio_source_t(
1600 AudioSource aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001601 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001602 case AudioSource::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001603 return AUDIO_SOURCE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001604 case AudioSource::DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001605 return AUDIO_SOURCE_DEFAULT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001606 case AudioSource::MIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001607 return AUDIO_SOURCE_MIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001608 case AudioSource::VOICE_UPLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001609 return AUDIO_SOURCE_VOICE_UPLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001610 case AudioSource::VOICE_DOWNLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001611 return AUDIO_SOURCE_VOICE_DOWNLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001612 case AudioSource::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001613 return AUDIO_SOURCE_VOICE_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001614 case AudioSource::CAMCORDER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001615 return AUDIO_SOURCE_CAMCORDER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001616 case AudioSource::VOICE_RECOGNITION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001617 return AUDIO_SOURCE_VOICE_RECOGNITION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001618 case AudioSource::VOICE_COMMUNICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001619 return AUDIO_SOURCE_VOICE_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001620 case AudioSource::REMOTE_SUBMIX:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001621 return AUDIO_SOURCE_REMOTE_SUBMIX;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001622 case AudioSource::UNPROCESSED:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001623 return AUDIO_SOURCE_UNPROCESSED;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001624 case AudioSource::VOICE_PERFORMANCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001625 return AUDIO_SOURCE_VOICE_PERFORMANCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001626 case AudioSource::ECHO_REFERENCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001627 return AUDIO_SOURCE_ECHO_REFERENCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001628 case AudioSource::FM_TUNER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001629 return AUDIO_SOURCE_FM_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001630 case AudioSource::HOTWORD:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001631 return AUDIO_SOURCE_HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001632 }
Andy Hung3f69c162020-12-09 12:08:48 -08001633 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001634}
1635
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001636ConversionResult<AudioSource> legacy2aidl_audio_source_t_AudioSource(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001637 audio_source_t legacy) {
1638 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001639 case AUDIO_SOURCE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001640 return AudioSource::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001641 case AUDIO_SOURCE_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001642 return AudioSource::DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001643 case AUDIO_SOURCE_MIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001644 return AudioSource::MIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001645 case AUDIO_SOURCE_VOICE_UPLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001646 return AudioSource::VOICE_UPLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001647 case AUDIO_SOURCE_VOICE_DOWNLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001648 return AudioSource::VOICE_DOWNLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001649 case AUDIO_SOURCE_VOICE_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001650 return AudioSource::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001651 case AUDIO_SOURCE_CAMCORDER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001652 return AudioSource::CAMCORDER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001653 case AUDIO_SOURCE_VOICE_RECOGNITION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001654 return AudioSource::VOICE_RECOGNITION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001655 case AUDIO_SOURCE_VOICE_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001656 return AudioSource::VOICE_COMMUNICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001657 case AUDIO_SOURCE_REMOTE_SUBMIX:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001658 return AudioSource::REMOTE_SUBMIX;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001659 case AUDIO_SOURCE_UNPROCESSED:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001660 return AudioSource::UNPROCESSED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001661 case AUDIO_SOURCE_VOICE_PERFORMANCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001662 return AudioSource::VOICE_PERFORMANCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001663 case AUDIO_SOURCE_ECHO_REFERENCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001664 return AudioSource::ECHO_REFERENCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001665 case AUDIO_SOURCE_FM_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001666 return AudioSource::FM_TUNER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001667 case AUDIO_SOURCE_HOTWORD:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001668 return AudioSource::HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001669 }
Andy Hung3f69c162020-12-09 12:08:48 -08001670 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001671}
1672
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001673ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
1674 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001675}
1676
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001677ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
1678 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001679}
1680
1681// This type is unnamed in the original definition, thus we name it here.
1682using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
1683
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001684ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortMixExtUseCase(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001685 const AudioPortMixExtUseCase& aidl, media::AudioPortRole role) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001686 audio_port_config_mix_ext_usecase legacy;
1687
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001688 switch (role) {
1689 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001690 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001691 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001692 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001693
1694 case media::AudioPortRole::SOURCE:
1695 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001696 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
1697 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Andy Hung3f69c162020-12-09 12:08:48 -08001698 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001699
1700 case media::AudioPortRole::SINK:
1701 // This is not a bug. A SINK role corresponds to the source field.
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001702 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001703 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Andy Hung3f69c162020-12-09 12:08:48 -08001704 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001705 }
Andy Hung3f69c162020-12-09 12:08:48 -08001706 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001707}
1708
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001709ConversionResult<AudioPortMixExtUseCase> legacy2aidl_AudioPortMixExtUseCase(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001710 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001711 AudioPortMixExtUseCase aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001712
1713 switch (role) {
1714 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001715 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001716 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001717 case AUDIO_PORT_ROLE_SOURCE:
1718 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001719 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1720 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Andy Hung3f69c162020-12-09 12:08:48 -08001721 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001722 case AUDIO_PORT_ROLE_SINK:
1723 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001724 UNION_SET(aidl, source,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001725 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source)));
Andy Hung3f69c162020-12-09 12:08:48 -08001726 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001727 }
Andy Hung3f69c162020-12-09 12:08:48 -08001728 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001729}
1730
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001731ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortMixExt(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001732 const AudioPortMixExt& aidl, media::AudioPortRole role,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001733 const media::AudioPortMixExtSys& aidlMixExt) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001734 audio_port_config_mix_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001735 legacy.hw_module = VALUE_OR_RETURN(
1736 aidl2legacy_int32_t_audio_module_handle_t(aidlMixExt.hwModule));
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001737 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001738 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortMixExtUseCase(aidl.usecase, role));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001739 return legacy;
1740}
1741
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001742status_t legacy2aidl_AudioPortMixExt(
1743 const audio_port_config_mix_ext& legacy, audio_port_role_t role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001744 AudioPortMixExt* aidl, media::AudioPortMixExtSys* aidlMixExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001745 aidlMixExt->hwModule = VALUE_OR_RETURN_STATUS(
1746 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1747 aidl->handle = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
1748 aidl->usecase = VALUE_OR_RETURN_STATUS(
1749 legacy2aidl_AudioPortMixExtUseCase(legacy.usecase, role));
1750 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001751}
1752
Andy Hung973638a2020-12-08 20:47:45 -08001753ConversionResult<audio_port_config_session_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001754aidl2legacy_int32_t_audio_port_config_session_ext(int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001755 audio_port_config_session_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001756 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001757 return legacy;
1758}
1759
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001760ConversionResult<int32_t>
1761legacy2aidl_audio_port_config_session_ext_int32_t(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001762 const audio_port_config_session_ext& legacy) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001763 return legacy2aidl_audio_session_t_int32_t(legacy.session);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001764}
1765
1766// This type is unnamed in the original definition, thus we name it here.
1767using audio_port_config_ext = decltype(audio_port_config::ext);
1768
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001769ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortExt_audio_port_config_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001770 const AudioPortExt& aidl, media::AudioPortType type,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001771 media::AudioPortRole role, const media::AudioPortExtSys& aidlSys) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001772 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001773 switch (type) {
1774 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001775 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001776 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001777 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001778 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001779 legacy.device = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001780 aidl2legacy_AudioDevice_audio_port_config_device_ext(
1781 VALUE_OR_RETURN(UNION_GET(aidl, device)),
1782 VALUE_OR_RETURN(UNION_GET(aidlSys, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08001783 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001784 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001785 legacy.mix = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001786 aidl2legacy_AudioPortMixExt(
1787 VALUE_OR_RETURN(UNION_GET(aidl, mix)), role,
1788 VALUE_OR_RETURN(UNION_GET(aidlSys, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08001789 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001790 case media::AudioPortType::SESSION:
Andy Hung973638a2020-12-08 20:47:45 -08001791 legacy.session = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001792 aidl2legacy_int32_t_audio_port_config_session_ext(
Andy Hung973638a2020-12-08 20:47:45 -08001793 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08001794 return legacy;
1795
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001796 }
Andy Hung3f69c162020-12-09 12:08:48 -08001797 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001798}
1799
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001800status_t legacy2aidl_AudioPortExt(
1801 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001802 AudioPortExt* aidl, media::AudioPortExtSys* aidlSys) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001803 switch (type) {
1804 case AUDIO_PORT_TYPE_NONE:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001805 UNION_SET(*aidl, unspecified, false);
1806 UNION_SET(*aidlSys, unspecified, false);
1807 return OK;
1808 case AUDIO_PORT_TYPE_DEVICE: {
1809 AudioDevice device;
1810 media::AudioPortDeviceExtSys deviceSys;
1811 RETURN_STATUS_IF_ERROR(
1812 legacy2aidl_audio_port_config_device_ext_AudioDevice(
1813 legacy.device, &device, &deviceSys));
1814 UNION_SET(*aidl, device, device);
1815 UNION_SET(*aidlSys, device, deviceSys);
1816 return OK;
1817 }
1818 case AUDIO_PORT_TYPE_MIX: {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001819 AudioPortMixExt mix;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001820 media::AudioPortMixExtSys mixSys;
1821 RETURN_STATUS_IF_ERROR(legacy2aidl_AudioPortMixExt(legacy.mix, role, &mix, &mixSys));
1822 UNION_SET(*aidl, mix, mix);
1823 UNION_SET(*aidlSys, mix, mixSys);
1824 return OK;
1825 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001826 case AUDIO_PORT_TYPE_SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001827 UNION_SET(*aidl, session, VALUE_OR_RETURN_STATUS(
1828 legacy2aidl_audio_port_config_session_ext_int32_t(legacy.session)));
1829 UNION_SET(*aidlSys, unspecified, false);
1830 return OK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001831 }
Andy Hung3f69c162020-12-09 12:08:48 -08001832 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001833}
1834
1835ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1836 const media::AudioPortConfig& aidl) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001837 audio_port_config legacy{};
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001838 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.hal.id));
1839 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.sys.role));
1840 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.sys.type));
1841 const bool isInput =
1842 VALUE_OR_RETURN(direction(aidl.sys.role, aidl.sys.type)) == Direction::INPUT;
1843 if (aidl.hal.sampleRate.has_value()) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001844 legacy.sample_rate = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001845 convertIntegral<unsigned int>(aidl.hal.sampleRate.value().value));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001846 legacy.config_mask |= AUDIO_PORT_CONFIG_SAMPLE_RATE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001847 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001848 if (aidl.hal.channelMask.has_value()) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001849 legacy.channel_mask =
Mikhail Naganov2d8df4e2021-06-03 13:59:13 -07001850 VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001851 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001852 aidl.hal.channelMask.value(), isInput));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001853 legacy.config_mask |= AUDIO_PORT_CONFIG_CHANNEL_MASK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001854 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001855 if (aidl.hal.format.has_value()) {
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001856 legacy.format = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001857 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.hal.format.value()));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001858 legacy.config_mask |= AUDIO_PORT_CONFIG_FORMAT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001859 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001860 if (aidl.hal.gain.has_value()) {
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001861 legacy.gain = VALUE_OR_RETURN(aidl2legacy_AudioGainConfig_audio_gain_config(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001862 aidl.hal.gain.value(), isInput));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001863 legacy.config_mask |= AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001864 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001865 if (aidl.sys.flags.has_value()) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001866 legacy.flags = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001867 aidl2legacy_AudioIoFlags_audio_io_flags(
1868 aidl.sys.flags.value(), aidl.sys.role, aidl.sys.type));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001869 legacy.config_mask |= AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001870 }
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001871 legacy.ext = VALUE_OR_RETURN(
1872 aidl2legacy_AudioPortExt_audio_port_config_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001873 aidl.hal.ext, aidl.sys.type, aidl.sys.role, aidl.sys.ext));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001874 return legacy;
1875}
1876
1877ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1878 const audio_port_config& legacy) {
1879 media::AudioPortConfig aidl;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001880 aidl.hal.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
1881 aidl.sys.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1882 aidl.sys.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001883 const bool isInput = VALUE_OR_RETURN(
1884 direction(legacy.role, legacy.type)) == Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001885 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001886 Int aidl_sampleRate;
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001887 aidl_sampleRate.value = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001888 aidl.hal.sampleRate = aidl_sampleRate;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001889 }
1890 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001891 aidl.hal.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001892 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001893 }
1894 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001895 aidl.hal.format = VALUE_OR_RETURN(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001896 legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001897 }
1898 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001899 aidl.hal.gain = VALUE_OR_RETURN(
Mikhail Naganov9255d4d2021-09-23 18:39:38 +00001900 legacy2aidl_audio_gain_config_AudioGainConfig(legacy.gain, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001901 }
1902 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001903 aidl.sys.flags = VALUE_OR_RETURN(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001904 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1905 }
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00001906 RETURN_IF_ERROR(legacy2aidl_AudioPortExt(legacy.ext, legacy.type, legacy.role,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001907 &aidl.hal.ext, &aidl.sys.ext));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001908 return aidl;
1909}
1910
1911ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1912 const media::AudioPatch& aidl) {
1913 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001914 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001915 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1916 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1917 return unexpected(BAD_VALUE);
1918 }
1919 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1920 legacy.sinks[i] =
1921 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1922 }
1923 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1924 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1925 return unexpected(BAD_VALUE);
1926 }
1927 for (size_t i = 0; i < legacy.num_sources; ++i) {
1928 legacy.sources[i] =
1929 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1930 }
1931 return legacy;
1932}
1933
1934ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1935 const struct audio_patch& legacy) {
1936 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001937 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001938
1939 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1940 return unexpected(BAD_VALUE);
1941 }
1942 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1943 aidl.sinks.push_back(
1944 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1945 }
1946 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1947 return unexpected(BAD_VALUE);
1948 }
1949 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1950 aidl.sources.push_back(
1951 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1952 }
1953 return aidl;
1954}
1955
1956ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1957 const media::AudioIoDescriptor& aidl) {
Mikhail Naganov88536df2021-07-26 17:30:29 -07001958 const audio_io_handle_t io_handle = VALUE_OR_RETURN(
1959 aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
1960 const struct audio_patch patch = VALUE_OR_RETURN(
1961 aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1962 const bool isInput = aidl.isInput;
1963 const uint32_t sampling_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1964 const audio_format_t format = VALUE_OR_RETURN(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001965 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001966 const audio_channel_mask_t channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001967 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001968 const size_t frame_count = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1969 const size_t frame_count_hal = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1970 const uint32_t latency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
1971 const audio_port_handle_t port_id = VALUE_OR_RETURN(
1972 aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
1973 return sp<AudioIoDescriptor>::make(io_handle, patch, isInput, sampling_rate, format,
1974 channel_mask, frame_count, frame_count_hal, latency, port_id);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001975}
1976
1977ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
1978 const sp<AudioIoDescriptor>& legacy) {
1979 media::AudioIoDescriptor aidl;
Mikhail Naganov88536df2021-07-26 17:30:29 -07001980 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->getIoHandle()));
1981 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->getPatch()));
1982 aidl.isInput = legacy->getIsInput();
1983 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getSamplingRate()));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001984 aidl.format = VALUE_OR_RETURN(
Mikhail Naganov88536df2021-07-26 17:30:29 -07001985 legacy2aidl_audio_format_t_AudioFormatDescription(legacy->getFormat()));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001986 aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
1987 legacy->getChannelMask(), legacy->getIsInput()));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001988 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCount()));
1989 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCountHAL()));
1990 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getLatency()));
1991 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->getPortId()));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001992 return aidl;
1993}
1994
Andy Hung973638a2020-12-08 20:47:45 -08001995ConversionResult<AudioClient> aidl2legacy_AudioClient_AudioClient(
1996 const media::AudioClient& aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001997 AudioClient legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001998 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001999 legacy.attributionSource = aidl.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002000 return legacy;
2001}
2002
Andy Hung973638a2020-12-08 20:47:45 -08002003ConversionResult<media::AudioClient> legacy2aidl_AudioClient_AudioClient(
2004 const AudioClient& legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002005 media::AudioClient aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002006 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002007 aidl.attributionSource = legacy.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002008 return aidl;
2009}
2010
2011ConversionResult<audio_content_type_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002012aidl2legacy_AudioContentType_audio_content_type_t(AudioContentType aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002013 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002014 case AudioContentType::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002015 return AUDIO_CONTENT_TYPE_UNKNOWN;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002016 case AudioContentType::SPEECH:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002017 return AUDIO_CONTENT_TYPE_SPEECH;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002018 case AudioContentType::MUSIC:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002019 return AUDIO_CONTENT_TYPE_MUSIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002020 case AudioContentType::MOVIE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002021 return AUDIO_CONTENT_TYPE_MOVIE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002022 case AudioContentType::SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002023 return AUDIO_CONTENT_TYPE_SONIFICATION;
2024 }
2025 return unexpected(BAD_VALUE);
2026}
2027
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002028ConversionResult<AudioContentType>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002029legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
2030 switch (legacy) {
2031 case AUDIO_CONTENT_TYPE_UNKNOWN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002032 return AudioContentType::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002033 case AUDIO_CONTENT_TYPE_SPEECH:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002034 return AudioContentType::SPEECH;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002035 case AUDIO_CONTENT_TYPE_MUSIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002036 return AudioContentType::MUSIC;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002037 case AUDIO_CONTENT_TYPE_MOVIE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002038 return AudioContentType::MOVIE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002039 case AUDIO_CONTENT_TYPE_SONIFICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002040 return AudioContentType::SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002041 }
2042 return unexpected(BAD_VALUE);
2043}
2044
2045ConversionResult<audio_usage_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002046aidl2legacy_AudioUsage_audio_usage_t(AudioUsage aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002047 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002048 case AudioUsage::INVALID:
2049 break; // return error
2050 case AudioUsage::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002051 return AUDIO_USAGE_UNKNOWN;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002052 case AudioUsage::MEDIA:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002053 return AUDIO_USAGE_MEDIA;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002054 case AudioUsage::VOICE_COMMUNICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002055 return AUDIO_USAGE_VOICE_COMMUNICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002056 case AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002057 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002058 case AudioUsage::ALARM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002059 return AUDIO_USAGE_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002060 case AudioUsage::NOTIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002061 return AUDIO_USAGE_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002062 case AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002063 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002064 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002065 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002066 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002067 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002068 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002069 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002070 case AudioUsage::NOTIFICATION_EVENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002071 return AUDIO_USAGE_NOTIFICATION_EVENT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002072 case AudioUsage::ASSISTANCE_ACCESSIBILITY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002073 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002074 case AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002075 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002076 case AudioUsage::ASSISTANCE_SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002077 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002078 case AudioUsage::GAME:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002079 return AUDIO_USAGE_GAME;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002080 case AudioUsage::VIRTUAL_SOURCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002081 return AUDIO_USAGE_VIRTUAL_SOURCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002082 case AudioUsage::ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002083 return AUDIO_USAGE_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002084 case AudioUsage::CALL_ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002085 return AUDIO_USAGE_CALL_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002086 case AudioUsage::EMERGENCY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002087 return AUDIO_USAGE_EMERGENCY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002088 case AudioUsage::SAFETY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002089 return AUDIO_USAGE_SAFETY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002090 case AudioUsage::VEHICLE_STATUS:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002091 return AUDIO_USAGE_VEHICLE_STATUS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002092 case AudioUsage::ANNOUNCEMENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002093 return AUDIO_USAGE_ANNOUNCEMENT;
2094 }
2095 return unexpected(BAD_VALUE);
2096}
2097
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002098ConversionResult<AudioUsage>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002099legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
2100 switch (legacy) {
2101 case AUDIO_USAGE_UNKNOWN:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002102 return AudioUsage::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002103 case AUDIO_USAGE_MEDIA:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002104 return AudioUsage::MEDIA;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002105 case AUDIO_USAGE_VOICE_COMMUNICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002106 return AudioUsage::VOICE_COMMUNICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002107 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002108 return AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002109 case AUDIO_USAGE_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002110 return AudioUsage::ALARM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002111 case AUDIO_USAGE_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002112 return AudioUsage::NOTIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002113 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002114 return AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002115 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002116 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002117 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002118 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002119 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002120 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002121 case AUDIO_USAGE_NOTIFICATION_EVENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002122 return AudioUsage::NOTIFICATION_EVENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002123 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002124 return AudioUsage::ASSISTANCE_ACCESSIBILITY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002125 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002126 return AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002127 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002128 return AudioUsage::ASSISTANCE_SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002129 case AUDIO_USAGE_GAME:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002130 return AudioUsage::GAME;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002131 case AUDIO_USAGE_VIRTUAL_SOURCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002132 return AudioUsage::VIRTUAL_SOURCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002133 case AUDIO_USAGE_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002134 return AudioUsage::ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002135 case AUDIO_USAGE_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002136 return AudioUsage::CALL_ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002137 case AUDIO_USAGE_EMERGENCY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002138 return AudioUsage::EMERGENCY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002139 case AUDIO_USAGE_SAFETY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002140 return AudioUsage::SAFETY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002141 case AUDIO_USAGE_VEHICLE_STATUS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002142 return AudioUsage::VEHICLE_STATUS;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002143 case AUDIO_USAGE_ANNOUNCEMENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002144 return AudioUsage::ANNOUNCEMENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002145 }
2146 return unexpected(BAD_VALUE);
2147}
2148
2149ConversionResult<audio_flags_mask_t>
2150aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
2151 switch (aidl) {
2152 case media::AudioFlag::AUDIBILITY_ENFORCED:
2153 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
2154 case media::AudioFlag::SECURE:
2155 return AUDIO_FLAG_SECURE;
2156 case media::AudioFlag::SCO:
2157 return AUDIO_FLAG_SCO;
2158 case media::AudioFlag::BEACON:
2159 return AUDIO_FLAG_BEACON;
2160 case media::AudioFlag::HW_AV_SYNC:
2161 return AUDIO_FLAG_HW_AV_SYNC;
2162 case media::AudioFlag::HW_HOTWORD:
2163 return AUDIO_FLAG_HW_HOTWORD;
2164 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
2165 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
2166 case media::AudioFlag::BYPASS_MUTE:
2167 return AUDIO_FLAG_BYPASS_MUTE;
2168 case media::AudioFlag::LOW_LATENCY:
2169 return AUDIO_FLAG_LOW_LATENCY;
2170 case media::AudioFlag::DEEP_BUFFER:
2171 return AUDIO_FLAG_DEEP_BUFFER;
2172 case media::AudioFlag::NO_MEDIA_PROJECTION:
2173 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
2174 case media::AudioFlag::MUTE_HAPTIC:
2175 return AUDIO_FLAG_MUTE_HAPTIC;
2176 case media::AudioFlag::NO_SYSTEM_CAPTURE:
2177 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
2178 case media::AudioFlag::CAPTURE_PRIVATE:
2179 return AUDIO_FLAG_CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002180 case media::AudioFlag::CONTENT_SPATIALIZED:
2181 return AUDIO_FLAG_CONTENT_SPATIALIZED;
2182 case media::AudioFlag::NEVER_SPATIALIZE:
2183 return AUDIO_FLAG_NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002184 }
2185 return unexpected(BAD_VALUE);
2186}
2187
2188ConversionResult<media::AudioFlag>
2189legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
2190 switch (legacy) {
2191 case AUDIO_FLAG_NONE:
2192 return unexpected(BAD_VALUE);
2193 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
2194 return media::AudioFlag::AUDIBILITY_ENFORCED;
2195 case AUDIO_FLAG_SECURE:
2196 return media::AudioFlag::SECURE;
2197 case AUDIO_FLAG_SCO:
2198 return media::AudioFlag::SCO;
2199 case AUDIO_FLAG_BEACON:
2200 return media::AudioFlag::BEACON;
2201 case AUDIO_FLAG_HW_AV_SYNC:
2202 return media::AudioFlag::HW_AV_SYNC;
2203 case AUDIO_FLAG_HW_HOTWORD:
2204 return media::AudioFlag::HW_HOTWORD;
2205 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
2206 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
2207 case AUDIO_FLAG_BYPASS_MUTE:
2208 return media::AudioFlag::BYPASS_MUTE;
2209 case AUDIO_FLAG_LOW_LATENCY:
2210 return media::AudioFlag::LOW_LATENCY;
2211 case AUDIO_FLAG_DEEP_BUFFER:
2212 return media::AudioFlag::DEEP_BUFFER;
2213 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
2214 return media::AudioFlag::NO_MEDIA_PROJECTION;
2215 case AUDIO_FLAG_MUTE_HAPTIC:
2216 return media::AudioFlag::MUTE_HAPTIC;
2217 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
2218 return media::AudioFlag::NO_SYSTEM_CAPTURE;
2219 case AUDIO_FLAG_CAPTURE_PRIVATE:
2220 return media::AudioFlag::CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002221 case AUDIO_FLAG_CONTENT_SPATIALIZED:
2222 return media::AudioFlag::CONTENT_SPATIALIZED;
2223 case AUDIO_FLAG_NEVER_SPATIALIZE:
2224 return media::AudioFlag::NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002225 }
2226 return unexpected(BAD_VALUE);
2227}
2228
2229ConversionResult<audio_flags_mask_t>
2230aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
2231 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002232 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, indexToEnum_index<media::AudioFlag>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002233 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
2234}
2235
2236ConversionResult<int32_t>
2237legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
2238 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002239 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002240 indexToEnum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002241 enumToMask_index<int32_t, media::AudioFlag>);
2242}
2243
2244ConversionResult<audio_attributes_t>
2245aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
2246 audio_attributes_t legacy;
2247 legacy.content_type = VALUE_OR_RETURN(
2248 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
2249 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002250 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002251 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
2252 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
2253 return legacy;
2254}
2255
2256ConversionResult<media::AudioAttributesInternal>
2257legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
2258 media::AudioAttributesInternal aidl;
2259 aidl.contentType = VALUE_OR_RETURN(
2260 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
2261 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002262 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002263 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
2264 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
2265 return aidl;
2266}
2267
2268ConversionResult<audio_encapsulation_mode_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002269aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002270 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002271 case AudioEncapsulationMode::INVALID:
2272 break; // return error
2273 case AudioEncapsulationMode::NONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002274 return AUDIO_ENCAPSULATION_MODE_NONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002275 case AudioEncapsulationMode::ELEMENTARY_STREAM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002276 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002277 case AudioEncapsulationMode::HANDLE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002278 return AUDIO_ENCAPSULATION_MODE_HANDLE;
2279 }
2280 return unexpected(BAD_VALUE);
2281}
2282
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002283ConversionResult<AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002284legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002285 switch (legacy) {
2286 case AUDIO_ENCAPSULATION_MODE_NONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002287 return AudioEncapsulationMode::NONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002288 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002289 return AudioEncapsulationMode::ELEMENTARY_STREAM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002290 case AUDIO_ENCAPSULATION_MODE_HANDLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002291 return AudioEncapsulationMode::HANDLE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002292 }
2293 return unexpected(BAD_VALUE);
2294}
2295
2296ConversionResult<audio_offload_info_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002297aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const AudioOffloadInfo& aidl) {
2298 audio_offload_info_t legacy = AUDIO_INFO_INITIALIZER;
2299 audio_config_base_t base = VALUE_OR_RETURN(
2300 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, false /*isInput*/));
2301 legacy.sample_rate = base.sample_rate;
2302 legacy.channel_mask = base.channel_mask;
2303 legacy.format = base.format;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002304 legacy.stream_type = VALUE_OR_RETURN(
2305 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002306 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRatePerSecond));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002307 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
2308 legacy.has_video = aidl.hasVideo;
2309 legacy.is_streaming = aidl.isStreaming;
2310 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
2311 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
2312 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
2313 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002314 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002315 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
2316 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
2317 return legacy;
2318}
2319
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002320ConversionResult<AudioOffloadInfo>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002321legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002322 AudioOffloadInfo aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002323 // Version 0.1 fields.
2324 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
2325 return unexpected(BAD_VALUE);
2326 }
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002327 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2328 .channel_mask = legacy.channel_mask, .format = legacy.format };
2329 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(
2330 base, false /*isInput*/));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002331 aidl.streamType = VALUE_OR_RETURN(
2332 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002333 aidl.bitRatePerSecond = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002334 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
2335 aidl.hasVideo = legacy.has_video;
2336 aidl.isStreaming = legacy.is_streaming;
2337 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
2338 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
2339 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
2340
2341 // Version 0.2 fields.
2342 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
2343 if (legacy.size <
2344 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
2345 return unexpected(BAD_VALUE);
2346 }
2347 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002348 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002349 legacy.encapsulation_mode));
2350 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
2351 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
2352 }
2353 return aidl;
2354}
2355
2356ConversionResult<audio_config_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002357aidl2legacy_AudioConfig_audio_config_t(const AudioConfig& aidl, bool isInput) {
2358 const audio_config_base_t legacyBase = VALUE_OR_RETURN(
2359 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, isInput));
2360 audio_config_t legacy = AUDIO_CONFIG_INITIALIZER;
2361 legacy.sample_rate = legacyBase.sample_rate;
2362 legacy.channel_mask = legacyBase.channel_mask;
2363 legacy.format = legacyBase.format;
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002364 legacy.offload_info = VALUE_OR_RETURN(
2365 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002366 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
2367 return legacy;
2368}
2369
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002370ConversionResult<AudioConfig>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002371legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002372 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2373 .channel_mask = legacy.channel_mask, .format = legacy.format };
2374 AudioConfig aidl;
2375 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(base, isInput));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002376 aidl.offloadInfo = VALUE_OR_RETURN(
2377 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002378 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
2379 return aidl;
2380}
2381
2382ConversionResult<audio_config_base_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002383aidl2legacy_AudioConfigBase_audio_config_base_t(const AudioConfigBase& aidl, bool isInput) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002384 audio_config_base_t legacy;
2385 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002386 legacy.channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002387 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002388 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002389 return legacy;
2390}
2391
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002392ConversionResult<AudioConfigBase>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002393legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002394 AudioConfigBase aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002395 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002396 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002397 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002398 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002399 return aidl;
2400}
2401
2402ConversionResult<sp<IMemory>>
2403aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
2404 sp<IMemory> legacy;
2405 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
2406 return unexpected(BAD_VALUE);
2407 }
2408 return legacy;
2409}
2410
2411ConversionResult<media::SharedFileRegion>
2412legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2413 media::SharedFileRegion aidl;
2414 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
2415 return unexpected(BAD_VALUE);
2416 }
2417 return aidl;
2418}
2419
2420ConversionResult<sp<IMemory>>
2421aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
2422 sp<IMemory> legacy;
2423 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
2424 return unexpected(BAD_VALUE);
2425 }
2426 return legacy;
2427}
2428
2429ConversionResult<std::optional<media::SharedFileRegion>>
2430legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2431 std::optional<media::SharedFileRegion> aidl;
2432 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
2433 return unexpected(BAD_VALUE);
2434 }
2435 return aidl;
2436}
2437
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002438ConversionResult<AudioTimestamp>
Andy Hung973638a2020-12-08 20:47:45 -08002439aidl2legacy_AudioTimestampInternal_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002440 AudioTimestamp legacy;
2441 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
2442 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
2443 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
2444 return legacy;
2445}
2446
2447ConversionResult<media::AudioTimestampInternal>
Andy Hung973638a2020-12-08 20:47:45 -08002448legacy2aidl_AudioTimestamp_AudioTimestampInternal(const AudioTimestamp& legacy) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002449 media::AudioTimestampInternal aidl;
2450 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
2451 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
2452 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
2453 return aidl;
2454}
2455
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002456ConversionResult<audio_uuid_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002457aidl2legacy_AudioUuid_audio_uuid_t(const AudioUuid& aidl) {
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002458 audio_uuid_t legacy;
2459 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
2460 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
2461 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
2462 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
2463 if (aidl.node.size() != std::size(legacy.node)) {
2464 return unexpected(BAD_VALUE);
2465 }
2466 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
2467 return legacy;
2468}
2469
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002470ConversionResult<AudioUuid>
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002471legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002472 AudioUuid aidl;
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002473 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
2474 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
2475 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
2476 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
2477 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
2478 return aidl;
2479}
2480
2481ConversionResult<effect_descriptor_t>
2482aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
2483 effect_descriptor_t legacy;
2484 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
2485 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
2486 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
2487 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
2488 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
2489 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
2490 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2491 RETURN_IF_ERROR(
2492 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
2493 return legacy;
2494}
2495
2496ConversionResult<media::EffectDescriptor>
2497legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
2498 media::EffectDescriptor aidl;
2499 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
2500 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
2501 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
2502 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
2503 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
2504 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
2505 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2506 aidl.implementor = VALUE_OR_RETURN(
2507 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
2508 return aidl;
2509}
2510
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002511ConversionResult<audio_encapsulation_metadata_type_t>
2512aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002513 AudioEncapsulationMetadataType aidl) {
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002514 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002515 case AudioEncapsulationMetadataType::NONE:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002516 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002517 case AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002518 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002519 case AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002520 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
2521 }
2522 return unexpected(BAD_VALUE);
2523}
2524
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002525ConversionResult<AudioEncapsulationMetadataType>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002526legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
2527 audio_encapsulation_metadata_type_t legacy) {
2528 switch (legacy) {
2529 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002530 return AudioEncapsulationMetadataType::NONE;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002531 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002532 return AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002533 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002534 return AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002535 }
2536 return unexpected(BAD_VALUE);
2537}
2538
2539ConversionResult<uint32_t>
2540aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
2541 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002542 int32_t,
2543 audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002544 AudioEncapsulationMode>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002545 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002546 indexToEnum_index<AudioEncapsulationMode>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002547 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
2548}
2549
2550ConversionResult<int32_t>
2551legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
2552 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002553 uint32_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002554 AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002555 audio_encapsulation_mode_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002556 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002557 indexToEnum_index<audio_encapsulation_mode_t>,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002558 enumToMask_index<int32_t, AudioEncapsulationMode>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002559}
2560
2561ConversionResult<uint32_t>
2562aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
2563 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002564 int32_t,
2565 audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002566 AudioEncapsulationMetadataType>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002567 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002568 indexToEnum_index<AudioEncapsulationMetadataType>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002569 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
2570}
2571
2572ConversionResult<int32_t>
2573legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
2574 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002575 uint32_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002576 AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002577 audio_encapsulation_metadata_type_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002578 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002579 indexToEnum_index<audio_encapsulation_metadata_type_t>,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002580 enumToMask_index<int32_t, AudioEncapsulationMetadataType>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002581}
2582
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002583ConversionResult<audio_port_device_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002584aidl2legacy_AudioDevice_audio_port_device_ext(
2585 const AudioDevice& aidl, const media::AudioPortDeviceExtSys& aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002586 audio_port_device_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002587 legacy.hw_module = VALUE_OR_RETURN(
2588 aidl2legacy_int32_t_audio_module_handle_t(aidlSys.hwModule));
2589 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(aidl, &legacy.type, legacy.address));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002590 legacy.encapsulation_modes = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002591 aidl2legacy_AudioEncapsulationMode_mask(aidlSys.encapsulationModes));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002592 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002593 aidl2legacy_AudioEncapsulationMetadataType_mask(
2594 aidlSys.encapsulationMetadataTypes));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002595 return legacy;
2596}
2597
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002598status_t legacy2aidl_audio_port_device_ext_AudioDevice(
2599 const audio_port_device_ext& legacy,
2600 AudioDevice* aidl, media::AudioPortDeviceExtSys* aidlDeviceExt) {
2601 aidlDeviceExt->hwModule = VALUE_OR_RETURN_STATUS(
2602 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
2603 *aidl = VALUE_OR_RETURN_STATUS(
2604 legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
2605 aidlDeviceExt->encapsulationModes = VALUE_OR_RETURN_STATUS(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002606 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002607 aidlDeviceExt->encapsulationMetadataTypes = VALUE_OR_RETURN_STATUS(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002608 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002609 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002610}
2611
2612ConversionResult<audio_port_mix_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002613aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002614 const AudioPortMixExt& aidl, const media::AudioPortMixExtSys& aidlSys) {
Mikhail Naganova4a926f2021-09-29 17:20:29 +00002615 audio_port_mix_ext legacy{};
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002616 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidlSys.hwModule));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002617 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002618 return legacy;
2619}
2620
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002621status_t
2622legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002623 AudioPortMixExt* aidl, media::AudioPortMixExtSys* aidlMixExt) {
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002624 aidlMixExt->hwModule = VALUE_OR_RETURN_STATUS(
2625 legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
2626 aidl->handle = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
2627 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002628}
2629
2630ConversionResult<audio_port_session_ext>
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002631aidl2legacy_int32_t_audio_port_session_ext(int32_t aidl) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002632 audio_port_session_ext legacy;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002633 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002634 return legacy;
2635}
2636
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002637ConversionResult<int32_t>
2638legacy2aidl_audio_port_session_ext_int32_t(const audio_port_session_ext& legacy) {
2639 return legacy2aidl_audio_session_t_int32_t(legacy.session);
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002640}
2641
2642// This type is unnamed in the original definition, thus we name it here.
2643using audio_port_v7_ext = decltype(audio_port_v7::ext);
2644
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002645ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt_audio_port_v7_ext(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002646 const AudioPortExt& aidl, media::AudioPortType type,
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002647 const media::AudioPortExtSys& aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002648 audio_port_v7_ext legacy;
2649 switch (type) {
2650 case media::AudioPortType::NONE:
2651 // Just verify that the union is empty.
2652 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08002653 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002654 case media::AudioPortType::DEVICE:
2655 legacy.device = VALUE_OR_RETURN(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002656 aidl2legacy_AudioDevice_audio_port_device_ext(
2657 VALUE_OR_RETURN(UNION_GET(aidl, device)),
2658 VALUE_OR_RETURN(UNION_GET(aidlSys, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08002659 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002660 case media::AudioPortType::MIX:
2661 legacy.mix = VALUE_OR_RETURN(
2662 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002663 VALUE_OR_RETURN(UNION_GET(aidl, mix)),
2664 VALUE_OR_RETURN(UNION_GET(aidlSys, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08002665 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002666 case media::AudioPortType::SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002667 legacy.session = VALUE_OR_RETURN(
2668 aidl2legacy_int32_t_audio_port_session_ext(
2669 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08002670 return legacy;
2671
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002672 }
Andy Hung3f69c162020-12-09 12:08:48 -08002673 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002674}
2675
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002676status_t legacy2aidl_AudioPortExt(
2677 const audio_port_v7_ext& legacy, audio_port_type_t type,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002678 AudioPortExt* aidl, media::AudioPortExtSys* aidlSys) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002679 switch (type) {
2680 case AUDIO_PORT_TYPE_NONE:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002681 UNION_SET(*aidl, unspecified, false);
2682 UNION_SET(*aidlSys, unspecified, false);
2683 return OK;
2684 case AUDIO_PORT_TYPE_DEVICE: {
2685 AudioDevice device;
2686 media::AudioPortDeviceExtSys deviceSys;
2687 RETURN_STATUS_IF_ERROR(
2688 legacy2aidl_audio_port_device_ext_AudioDevice(
2689 legacy.device, &device, &deviceSys));
2690 UNION_SET(*aidl, device, device);
2691 UNION_SET(*aidlSys, device, deviceSys);
2692 return OK;
2693 }
2694 case AUDIO_PORT_TYPE_MIX: {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002695 AudioPortMixExt mix;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002696 media::AudioPortMixExtSys mixSys;
2697 RETURN_STATUS_IF_ERROR(
2698 legacy2aidl_audio_port_mix_ext_AudioPortMixExt(
2699 legacy.mix, &mix, &mixSys));
2700 UNION_SET(*aidl, mix, mix);
2701 UNION_SET(*aidlSys, mix, mixSys);
2702 return OK;
2703 }
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002704 case AUDIO_PORT_TYPE_SESSION:
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002705 UNION_SET(*aidl, session, VALUE_OR_RETURN_STATUS(
2706 legacy2aidl_audio_port_session_ext_int32_t(legacy.session)));
2707 UNION_SET(*aidlSys, unspecified, false);
2708 return OK;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002709 }
Andy Hung3f69c162020-12-09 12:08:48 -08002710 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002711}
2712
2713ConversionResult<audio_profile>
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002714aidl2legacy_AudioProfile_audio_profile(const AudioProfile& aidl, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002715 audio_profile legacy;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002716 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002717
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002718 if (aidl.sampleRates.size() > std::size(legacy.sample_rates)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002719 return unexpected(BAD_VALUE);
2720 }
2721 RETURN_IF_ERROR(
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002722 convertRange(aidl.sampleRates.begin(), aidl.sampleRates.end(), legacy.sample_rates,
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002723 convertIntegral<int32_t, unsigned int>));
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002724 legacy.num_sample_rates = aidl.sampleRates.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002725
2726 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
2727 return unexpected(BAD_VALUE);
2728 }
2729 RETURN_IF_ERROR(
2730 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002731 [isInput](const AudioChannelLayout& l) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002732 return aidl2legacy_AudioChannelLayout_audio_channel_mask_t(l, isInput);
2733 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002734 legacy.num_channel_masks = aidl.channelMasks.size();
jiabin82e56932021-03-05 06:35:19 +00002735
2736 legacy.encapsulation_type = VALUE_OR_RETURN(
2737 aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(aidl.encapsulationType));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002738 return legacy;
2739}
2740
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002741ConversionResult<AudioProfile>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002742legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy, bool isInput) {
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002743 AudioProfile aidl;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002744 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002745
2746 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
2747 return unexpected(BAD_VALUE);
2748 }
2749 RETURN_IF_ERROR(
2750 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002751 std::back_inserter(aidl.sampleRates),
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002752 convertIntegral<unsigned int, int32_t>));
2753
2754 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2755 return unexpected(BAD_VALUE);
2756 }
2757 RETURN_IF_ERROR(
2758 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2759 std::back_inserter(aidl.channelMasks),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002760 [isInput](audio_channel_mask_t m) {
2761 return legacy2aidl_audio_channel_mask_t_AudioChannelLayout(m, isInput);
2762 }));
jiabin82e56932021-03-05 06:35:19 +00002763
2764 aidl.encapsulationType = VALUE_OR_RETURN(
2765 legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2766 legacy.encapsulation_type));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002767 return aidl;
2768}
2769
2770ConversionResult<audio_gain>
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002771aidl2legacy_AudioGain_audio_gain(const AudioGain& aidl, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002772 audio_gain legacy;
2773 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002774 legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002775 aidl.channelMask, isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002776 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2777 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2778 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2779 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2780 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2781 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2782 return legacy;
2783}
2784
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002785ConversionResult<AudioGain>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002786legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy, bool isInput) {
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002787 AudioGain aidl;
Andy Hung973638a2020-12-08 20:47:45 -08002788 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002789 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002790 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002791 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2792 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2793 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2794 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2795 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2796 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2797 return aidl;
2798}
2799
2800ConversionResult<audio_port_v7>
2801aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2802 audio_port_v7 legacy;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002803 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.hal.id));
2804 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.sys.role));
2805 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.sys.type));
2806 RETURN_IF_ERROR(aidl2legacy_string(aidl.hal.name, legacy.name, sizeof(legacy.name)));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002807
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002808 if (aidl.hal.profiles.size() > std::size(legacy.audio_profiles)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002809 return unexpected(BAD_VALUE);
2810 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002811 const bool isInput =
2812 VALUE_OR_RETURN(direction(aidl.sys.role, aidl.sys.type)) == Direction::INPUT;
2813 RETURN_IF_ERROR(convertRange(
2814 aidl.hal.profiles.begin(), aidl.hal.profiles.end(), legacy.audio_profiles,
2815 [isInput](const AudioProfile& p) {
2816 return aidl2legacy_AudioProfile_audio_profile(p, isInput);
2817 }));
2818 legacy.num_audio_profiles = aidl.hal.profiles.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002819
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002820 if (aidl.hal.extraAudioDescriptors.size() > std::size(legacy.extra_audio_descriptors)) {
jiabin82e56932021-03-05 06:35:19 +00002821 return unexpected(BAD_VALUE);
2822 }
2823 RETURN_IF_ERROR(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002824 convertRange(
2825 aidl.hal.extraAudioDescriptors.begin(), aidl.hal.extraAudioDescriptors.end(),
2826 legacy.extra_audio_descriptors,
2827 aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor));
2828 legacy.num_extra_audio_descriptors = aidl.hal.extraAudioDescriptors.size();
jiabin82e56932021-03-05 06:35:19 +00002829
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002830 if (aidl.hal.gains.size() > std::size(legacy.gains)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002831 return unexpected(BAD_VALUE);
2832 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002833 RETURN_IF_ERROR(convertRange(aidl.hal.gains.begin(), aidl.hal.gains.end(), legacy.gains,
Mikhail Naganov7d0b36b2021-09-22 23:58:41 +00002834 [isInput](const AudioGain& g) {
2835 return aidl2legacy_AudioGain_audio_gain(g, isInput);
2836 }));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002837 legacy.num_gains = aidl.hal.gains.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002838
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002839 media::AudioPortConfig aidlPortConfig;
2840 aidlPortConfig.hal = aidl.hal.activeConfig;
2841 aidlPortConfig.sys = aidl.sys.activeConfig;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002842 legacy.active_config = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002843 aidl2legacy_AudioPortConfig_audio_port_config(aidlPortConfig));
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002844 legacy.ext = VALUE_OR_RETURN(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002845 aidl2legacy_AudioPortExt_audio_port_v7_ext(aidl.hal.ext, aidl.sys.type, aidl.sys.ext));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002846 return legacy;
2847}
2848
2849ConversionResult<media::AudioPort>
2850legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2851 media::AudioPort aidl;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002852 aidl.hal.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2853 aidl.sys.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2854 aidl.sys.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2855 aidl.hal.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002856
2857 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2858 return unexpected(BAD_VALUE);
2859 }
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002860 const bool isInput = VALUE_OR_RETURN(direction(legacy.role, legacy.type)) == Direction::INPUT;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002861 RETURN_IF_ERROR(
2862 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002863 std::back_inserter(aidl.hal.profiles),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002864 [isInput](const audio_profile& p) {
2865 return legacy2aidl_audio_profile_AudioProfile(p, isInput);
2866 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002867
jiabin82e56932021-03-05 06:35:19 +00002868 if (legacy.num_extra_audio_descriptors > std::size(legacy.extra_audio_descriptors)) {
2869 return unexpected(BAD_VALUE);
2870 }
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002871 aidl.sys.profiles.resize(legacy.num_audio_profiles);
jiabin82e56932021-03-05 06:35:19 +00002872 RETURN_IF_ERROR(
2873 convertRange(legacy.extra_audio_descriptors,
2874 legacy.extra_audio_descriptors + legacy.num_extra_audio_descriptors,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002875 std::back_inserter(aidl.hal.extraAudioDescriptors),
jiabin82e56932021-03-05 06:35:19 +00002876 legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor));
2877
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002878 if (legacy.num_gains > std::size(legacy.gains)) {
2879 return unexpected(BAD_VALUE);
2880 }
2881 RETURN_IF_ERROR(
2882 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002883 std::back_inserter(aidl.hal.gains),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002884 [isInput](const audio_gain& g) {
2885 return legacy2aidl_audio_gain_AudioGain(g, isInput);
2886 }));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002887 aidl.sys.gains.resize(legacy.num_gains);
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002888
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002889 media::AudioPortConfig aidlPortConfig = VALUE_OR_RETURN(
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002890 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002891 aidl.hal.activeConfig = aidlPortConfig.hal;
2892 aidl.sys.activeConfig = aidlPortConfig.sys;
Mikhail Naganovceb8bf92021-09-23 21:29:39 +00002893 RETURN_IF_ERROR(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002894 legacy2aidl_AudioPortExt(legacy.ext, legacy.type, &aidl.hal.ext, &aidl.sys.ext));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002895 return aidl;
2896}
2897
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002898ConversionResult<audio_mode_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002899aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl) {
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002900 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002901 case AudioMode::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002902 return AUDIO_MODE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002903 case AudioMode::SYS_RESERVED_CURRENT:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002904 return AUDIO_MODE_CURRENT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002905 case AudioMode::NORMAL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002906 return AUDIO_MODE_NORMAL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002907 case AudioMode::RINGTONE:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002908 return AUDIO_MODE_RINGTONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002909 case AudioMode::IN_CALL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002910 return AUDIO_MODE_IN_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002911 case AudioMode::IN_COMMUNICATION:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002912 return AUDIO_MODE_IN_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002913 case AudioMode::CALL_SCREEN:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002914 return AUDIO_MODE_CALL_SCREEN;
2915 }
2916 return unexpected(BAD_VALUE);
2917}
2918
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002919ConversionResult<AudioMode>
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002920legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2921 switch (legacy) {
2922 case AUDIO_MODE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002923 return AudioMode::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002924 case AUDIO_MODE_CURRENT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002925 return AudioMode::SYS_RESERVED_CURRENT;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002926 case AUDIO_MODE_NORMAL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002927 return AudioMode::NORMAL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002928 case AUDIO_MODE_RINGTONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002929 return AudioMode::RINGTONE;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002930 case AUDIO_MODE_IN_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002931 return AudioMode::IN_CALL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002932 case AUDIO_MODE_IN_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002933 return AudioMode::IN_COMMUNICATION;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002934 case AUDIO_MODE_CALL_SCREEN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002935 return AudioMode::CALL_SCREEN;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002936 case AUDIO_MODE_CNT:
2937 break;
2938 }
2939 return unexpected(BAD_VALUE);
2940}
2941
2942ConversionResult<audio_unique_id_use_t>
2943aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2944 switch (aidl) {
2945 case media::AudioUniqueIdUse::UNSPECIFIED:
2946 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2947 case media::AudioUniqueIdUse::SESSION:
2948 return AUDIO_UNIQUE_ID_USE_SESSION;
2949 case media::AudioUniqueIdUse::MODULE:
2950 return AUDIO_UNIQUE_ID_USE_MODULE;
2951 case media::AudioUniqueIdUse::EFFECT:
2952 return AUDIO_UNIQUE_ID_USE_EFFECT;
2953 case media::AudioUniqueIdUse::PATCH:
2954 return AUDIO_UNIQUE_ID_USE_PATCH;
2955 case media::AudioUniqueIdUse::OUTPUT:
2956 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2957 case media::AudioUniqueIdUse::INPUT:
2958 return AUDIO_UNIQUE_ID_USE_INPUT;
2959 case media::AudioUniqueIdUse::CLIENT:
2960 return AUDIO_UNIQUE_ID_USE_CLIENT;
2961 }
2962 return unexpected(BAD_VALUE);
2963}
2964
2965ConversionResult<media::AudioUniqueIdUse>
2966legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2967 switch (legacy) {
2968 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2969 return media::AudioUniqueIdUse::UNSPECIFIED;
2970 case AUDIO_UNIQUE_ID_USE_SESSION:
2971 return media::AudioUniqueIdUse::SESSION;
2972 case AUDIO_UNIQUE_ID_USE_MODULE:
2973 return media::AudioUniqueIdUse::MODULE;
2974 case AUDIO_UNIQUE_ID_USE_EFFECT:
2975 return media::AudioUniqueIdUse::EFFECT;
2976 case AUDIO_UNIQUE_ID_USE_PATCH:
2977 return media::AudioUniqueIdUse::PATCH;
2978 case AUDIO_UNIQUE_ID_USE_OUTPUT:
2979 return media::AudioUniqueIdUse::OUTPUT;
2980 case AUDIO_UNIQUE_ID_USE_INPUT:
2981 return media::AudioUniqueIdUse::INPUT;
2982 case AUDIO_UNIQUE_ID_USE_CLIENT:
2983 return media::AudioUniqueIdUse::CLIENT;
2984 case AUDIO_UNIQUE_ID_USE_MAX:
2985 break;
2986 }
2987 return unexpected(BAD_VALUE);
2988}
2989
Ytai Ben-Tsvi7e7a79d2020-12-15 16:48:16 -08002990ConversionResult<volume_group_t>
2991aidl2legacy_int32_t_volume_group_t(int32_t aidl) {
2992 return convertReinterpret<volume_group_t>(aidl);
2993}
2994
2995ConversionResult<int32_t>
2996legacy2aidl_volume_group_t_int32_t(volume_group_t legacy) {
2997 return convertReinterpret<int32_t>(legacy);
2998}
2999
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08003000ConversionResult<product_strategy_t>
3001aidl2legacy_int32_t_product_strategy_t(int32_t aidl) {
3002 return convertReinterpret<product_strategy_t>(aidl);
3003}
3004
3005ConversionResult<int32_t>
3006legacy2aidl_product_strategy_t_int32_t(product_strategy_t legacy) {
3007 return convertReinterpret<int32_t>(legacy);
3008}
3009
Kuowei Lid4adbdb2020-08-13 14:44:25 +08003010ConversionResult<audio_dual_mono_mode_t>
3011aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(media::AudioDualMonoMode aidl) {
3012 switch (aidl) {
3013 case media::AudioDualMonoMode::OFF:
3014 return AUDIO_DUAL_MONO_MODE_OFF;
3015 case media::AudioDualMonoMode::LR:
3016 return AUDIO_DUAL_MONO_MODE_LR;
3017 case media::AudioDualMonoMode::LL:
3018 return AUDIO_DUAL_MONO_MODE_LL;
3019 case media::AudioDualMonoMode::RR:
3020 return AUDIO_DUAL_MONO_MODE_RR;
3021 }
3022 return unexpected(BAD_VALUE);
3023}
3024
3025ConversionResult<media::AudioDualMonoMode>
3026legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(audio_dual_mono_mode_t legacy) {
3027 switch (legacy) {
3028 case AUDIO_DUAL_MONO_MODE_OFF:
3029 return media::AudioDualMonoMode::OFF;
3030 case AUDIO_DUAL_MONO_MODE_LR:
3031 return media::AudioDualMonoMode::LR;
3032 case AUDIO_DUAL_MONO_MODE_LL:
3033 return media::AudioDualMonoMode::LL;
3034 case AUDIO_DUAL_MONO_MODE_RR:
3035 return media::AudioDualMonoMode::RR;
3036 }
3037 return unexpected(BAD_VALUE);
3038}
3039
3040ConversionResult<audio_timestretch_fallback_mode_t>
3041aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(int32_t aidl) {
3042 return convertReinterpret<audio_timestretch_fallback_mode_t>(aidl);
3043}
3044
3045ConversionResult<int32_t>
3046legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(audio_timestretch_fallback_mode_t legacy) {
3047 return convertReinterpret<int32_t>(legacy);
3048}
3049
3050ConversionResult<audio_timestretch_stretch_mode_t>
3051aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(int32_t aidl) {
3052 return convertReinterpret<audio_timestretch_stretch_mode_t>(aidl);
3053}
3054
3055ConversionResult<int32_t>
3056legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(audio_timestretch_stretch_mode_t legacy) {
3057 return convertReinterpret<int32_t>(legacy);
3058}
3059
3060ConversionResult<audio_playback_rate_t>
3061aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(const media::AudioPlaybackRate& aidl) {
3062 audio_playback_rate_t legacy;
3063 legacy.mSpeed = aidl.speed;
3064 legacy.mPitch = aidl.pitch;
3065 legacy.mFallbackMode = VALUE_OR_RETURN(
3066 aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(aidl.fallbackMode));
3067 legacy.mStretchMode = VALUE_OR_RETURN(
3068 aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(aidl.stretchMode));
3069 return legacy;
3070}
3071
3072ConversionResult<media::AudioPlaybackRate>
3073legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t& legacy) {
3074 media::AudioPlaybackRate aidl;
3075 aidl.speed = legacy.mSpeed;
3076 aidl.pitch = legacy.mPitch;
3077 aidl.fallbackMode = VALUE_OR_RETURN(
3078 legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(legacy.mFallbackMode));
3079 aidl.stretchMode = VALUE_OR_RETURN(
3080 legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(legacy.mStretchMode));
3081 return aidl;
3082}
3083
jiabin82e56932021-03-05 06:35:19 +00003084ConversionResult<audio_standard_t>
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003085aidl2legacy_AudioStandard_audio_standard_t(AudioStandard aidl) {
jiabin82e56932021-03-05 06:35:19 +00003086 switch (aidl) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003087 case AudioStandard::NONE:
jiabin82e56932021-03-05 06:35:19 +00003088 return AUDIO_STANDARD_NONE;
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003089 case AudioStandard::EDID:
jiabin82e56932021-03-05 06:35:19 +00003090 return AUDIO_STANDARD_EDID;
3091 }
3092 return unexpected(BAD_VALUE);
3093}
3094
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003095ConversionResult<AudioStandard>
jiabin82e56932021-03-05 06:35:19 +00003096legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy) {
3097 switch (legacy) {
3098 case AUDIO_STANDARD_NONE:
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003099 return AudioStandard::NONE;
jiabin82e56932021-03-05 06:35:19 +00003100 case AUDIO_STANDARD_EDID:
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003101 return AudioStandard::EDID;
jiabin82e56932021-03-05 06:35:19 +00003102 }
3103 return unexpected(BAD_VALUE);
3104}
3105
3106ConversionResult<audio_extra_audio_descriptor>
3107aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003108 const ExtraAudioDescriptor& aidl) {
jiabin82e56932021-03-05 06:35:19 +00003109 audio_extra_audio_descriptor legacy;
3110 legacy.standard = VALUE_OR_RETURN(aidl2legacy_AudioStandard_audio_standard_t(aidl.standard));
3111 if (aidl.audioDescriptor.size() > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3112 return unexpected(BAD_VALUE);
3113 }
3114 legacy.descriptor_length = aidl.audioDescriptor.size();
3115 std::copy(aidl.audioDescriptor.begin(), aidl.audioDescriptor.end(),
3116 std::begin(legacy.descriptor));
3117 legacy.encapsulation_type =
3118 VALUE_OR_RETURN(aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
3119 aidl.encapsulationType));
3120 return legacy;
3121}
3122
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003123ConversionResult<ExtraAudioDescriptor>
jiabin82e56932021-03-05 06:35:19 +00003124legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(
3125 const audio_extra_audio_descriptor& legacy) {
Mikhail Naganov0078ee52021-09-30 23:06:20 +00003126 ExtraAudioDescriptor aidl;
jiabin82e56932021-03-05 06:35:19 +00003127 aidl.standard = VALUE_OR_RETURN(legacy2aidl_audio_standard_t_AudioStandard(legacy.standard));
3128 if (legacy.descriptor_length > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3129 return unexpected(BAD_VALUE);
3130 }
3131 aidl.audioDescriptor.resize(legacy.descriptor_length);
3132 std::copy(legacy.descriptor, legacy.descriptor + legacy.descriptor_length,
3133 aidl.audioDescriptor.begin());
3134 aidl.encapsulationType =
3135 VALUE_OR_RETURN(legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3136 legacy.encapsulation_type));
3137 return aidl;
3138}
3139
3140ConversionResult<audio_encapsulation_type_t>
3141aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003142 const AudioEncapsulationType& aidl) {
jiabin82e56932021-03-05 06:35:19 +00003143 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003144 case AudioEncapsulationType::NONE:
jiabin82e56932021-03-05 06:35:19 +00003145 return AUDIO_ENCAPSULATION_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003146 case AudioEncapsulationType::IEC61937:
jiabin82e56932021-03-05 06:35:19 +00003147 return AUDIO_ENCAPSULATION_TYPE_IEC61937;
3148 }
3149 return unexpected(BAD_VALUE);
3150}
3151
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003152ConversionResult<AudioEncapsulationType>
jiabin82e56932021-03-05 06:35:19 +00003153legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3154 const audio_encapsulation_type_t & legacy) {
3155 switch (legacy) {
3156 case AUDIO_ENCAPSULATION_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003157 return AudioEncapsulationType::NONE;
jiabin82e56932021-03-05 06:35:19 +00003158 case AUDIO_ENCAPSULATION_TYPE_IEC61937:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003159 return AudioEncapsulationType::IEC61937;
jiabin82e56932021-03-05 06:35:19 +00003160 }
3161 return unexpected(BAD_VALUE);
3162}
3163
jiabin10a03f12021-05-07 23:46:28 +00003164ConversionResult<TrackSecondaryOutputInfoPair>
3165aidl2legacy_TrackSecondaryOutputInfo_TrackSecondaryOutputInfoPair(
3166 const media::TrackSecondaryOutputInfo& aidl) {
3167 TrackSecondaryOutputInfoPair trackSecondaryOutputInfoPair;
3168 trackSecondaryOutputInfoPair.first =
3169 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
3170 trackSecondaryOutputInfoPair.second =
3171 VALUE_OR_RETURN(convertContainer<std::vector<audio_port_handle_t>>(
3172 aidl.secondaryOutputIds, aidl2legacy_int32_t_audio_io_handle_t));
3173 return trackSecondaryOutputInfoPair;
3174}
3175
3176ConversionResult<media::TrackSecondaryOutputInfo>
3177legacy2aidl_TrackSecondaryOutputInfoPair_TrackSecondaryOutputInfo(
3178 const TrackSecondaryOutputInfoPair& legacy) {
3179 media::TrackSecondaryOutputInfo trackSecondaryOutputInfo;
3180 trackSecondaryOutputInfo.portId =
3181 VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.first));
3182 trackSecondaryOutputInfo.secondaryOutputIds =
3183 VALUE_OR_RETURN(convertContainer<std::vector<int32_t>>(
3184 legacy.second, legacy2aidl_audio_io_handle_t_int32_t));
3185 return trackSecondaryOutputInfo;
3186}
3187
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07003188} // namespace android