blob: ed9268113a1df1017bfbc9c9c4079c15c5c24b0a [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 Naganovddceecc2021-09-03 13:58:56 -070050using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070051using media::audio::common::AudioOffloadInfo;
Mikhail Naganov89818ba2021-09-21 20:37:13 +000052using media::audio::common::AudioProfile;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070053using media::audio::common::AudioSource;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070054using media::audio::common::AudioStreamType;
55using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070056using media::audio::common::AudioUuid;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070057using media::audio::common::PcmType;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070058
59namespace {
60
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070061enum class Direction {
62 INPUT, OUTPUT
63};
64
65ConversionResult<Direction> direction(media::AudioPortRole role, media::AudioPortType type) {
66 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -080067 case media::AudioPortType::NONE:
68 case media::AudioPortType::SESSION:
69 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070070 case media::AudioPortType::DEVICE:
71 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080072 case media::AudioPortRole::NONE:
73 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070074 case media::AudioPortRole::SOURCE:
75 return Direction::INPUT;
76 case media::AudioPortRole::SINK:
77 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070078 }
79 break;
80 case media::AudioPortType::MIX:
81 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -080082 case media::AudioPortRole::NONE:
83 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070084 case media::AudioPortRole::SOURCE:
85 return Direction::OUTPUT;
86 case media::AudioPortRole::SINK:
87 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070088 }
89 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070090 }
91 return unexpected(BAD_VALUE);
92}
93
94ConversionResult<Direction> direction(audio_port_role_t role, audio_port_type_t type) {
95 switch (type) {
Andy Hung3f69c162020-12-09 12:08:48 -080096 case AUDIO_PORT_TYPE_NONE:
97 case AUDIO_PORT_TYPE_SESSION:
98 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -070099 case AUDIO_PORT_TYPE_DEVICE:
100 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800101 case AUDIO_PORT_ROLE_NONE:
102 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700103 case AUDIO_PORT_ROLE_SOURCE:
104 return Direction::INPUT;
105 case AUDIO_PORT_ROLE_SINK:
106 return Direction::OUTPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700107 }
108 break;
109 case AUDIO_PORT_TYPE_MIX:
110 switch (role) {
Andy Hung3f69c162020-12-09 12:08:48 -0800111 case AUDIO_PORT_ROLE_NONE:
112 break; // must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700113 case AUDIO_PORT_ROLE_SOURCE:
114 return Direction::OUTPUT;
115 case AUDIO_PORT_ROLE_SINK:
116 return Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700117 }
118 break;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700119 }
120 return unexpected(BAD_VALUE);
121}
122
123} // namespace
124
125////////////////////////////////////////////////////////////////////////////////////////////////////
126// Converters
127
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -0700128status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
129 if (aidl.size() > maxSize - 1) {
130 return BAD_VALUE;
131 }
132 aidl.copy(dest, aidl.size());
133 dest[aidl.size()] = '\0';
134 return OK;
135}
136
137ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
138 if (legacy == nullptr) {
139 return unexpected(BAD_VALUE);
140 }
141 if (strnlen(legacy, maxSize) == maxSize) {
142 // No null-terminator.
143 return unexpected(BAD_VALUE);
144 }
145 return std::string(legacy);
146}
147
148ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
149 return convertReinterpret<audio_module_handle_t>(aidl);
150}
151
152ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
153 return convertReinterpret<int32_t>(legacy);
154}
155
156ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
157 return convertReinterpret<audio_io_handle_t>(aidl);
158}
159
160ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
161 return convertReinterpret<int32_t>(legacy);
162}
163
164ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
165 return convertReinterpret<audio_port_handle_t>(aidl);
166}
167
168ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
169 return convertReinterpret<int32_t>(legacy);
170}
171
172ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
173 return convertReinterpret<audio_patch_handle_t>(aidl);
174}
175
176ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
177 return convertReinterpret<int32_t>(legacy);
178}
179
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800180ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
181 return convertReinterpret<audio_unique_id_t>(aidl);
182}
183
184ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
185 return convertReinterpret<int32_t>(legacy);
186}
187
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -0800188ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
189 return convertReinterpret<audio_hw_sync_t>(aidl);
190}
191
192ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
193 return convertReinterpret<int32_t>(legacy);
194}
195
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -0800196ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
197 return convertReinterpret<pid_t>(aidl);
198}
199
200ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
201 return convertReinterpret<int32_t>(legacy);
202}
203
204ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
205 return convertReinterpret<uid_t>(aidl);
206}
207
208ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
209 return convertReinterpret<int32_t>(legacy);
210}
211
212ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
213 return String16(aidl.data(), aidl.size());
214}
215
216ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
217 return std::string(String8(legacy).c_str());
218}
219
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700220// TODO b/182392769: create an optional -> optional util
221ConversionResult<std::optional<String16>>
222aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl) {
223 if (!aidl.has_value()) {
224 return std::nullopt;
225 }
226 ConversionResult<String16> conversion =
227 VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.value()));
228 return conversion.value();
229}
230
231ConversionResult<std::optional<std::string_view>>
232legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy) {
233 if (!legacy.has_value()) {
234 return std::nullopt;
235 }
236 ConversionResult<std::string> conversion =
237 VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.value()));
238 return conversion.value();
239}
240
Ytai Ben-Tsvice182942020-11-04 14:48:01 -0800241ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
242 return String8(aidl.data(), aidl.size());
243}
244
245ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
246 return std::string(legacy.c_str());
247}
248
Andy Hung973638a2020-12-08 20:47:45 -0800249// The legacy enum is unnamed. Thus, we use int32_t.
250ConversionResult<int32_t> aidl2legacy_AudioPortConfigType_int32_t(
251 media::AudioPortConfigType aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700252 switch (aidl) {
253 case media::AudioPortConfigType::SAMPLE_RATE:
254 return AUDIO_PORT_CONFIG_SAMPLE_RATE;
255 case media::AudioPortConfigType::CHANNEL_MASK:
256 return AUDIO_PORT_CONFIG_CHANNEL_MASK;
257 case media::AudioPortConfigType::FORMAT:
258 return AUDIO_PORT_CONFIG_FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800259 case media::AudioPortConfigType::GAIN:
260 return AUDIO_PORT_CONFIG_GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700261 case media::AudioPortConfigType::FLAGS:
262 return AUDIO_PORT_CONFIG_FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700263 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800264 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700265}
266
Andy Hung973638a2020-12-08 20:47:45 -0800267// The legacy enum is unnamed. Thus, we use int32_t.
268ConversionResult<media::AudioPortConfigType> legacy2aidl_int32_t_AudioPortConfigType(
269 int32_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700270 switch (legacy) {
271 case AUDIO_PORT_CONFIG_SAMPLE_RATE:
272 return media::AudioPortConfigType::SAMPLE_RATE;
273 case AUDIO_PORT_CONFIG_CHANNEL_MASK:
274 return media::AudioPortConfigType::CHANNEL_MASK;
275 case AUDIO_PORT_CONFIG_FORMAT:
276 return media::AudioPortConfigType::FORMAT;
Hayden Gomes1117ea22020-11-20 11:06:37 -0800277 case AUDIO_PORT_CONFIG_GAIN:
278 return media::AudioPortConfigType::GAIN;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700279 case AUDIO_PORT_CONFIG_FLAGS:
280 return media::AudioPortConfigType::FLAGS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700281 }
Hayden Gomes1117ea22020-11-20 11:06:37 -0800282 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700283}
284
285ConversionResult<unsigned int> aidl2legacy_int32_t_config_mask(int32_t aidl) {
286 return convertBitmask<unsigned int, int32_t, int, media::AudioPortConfigType>(
Andy Hung973638a2020-12-08 20:47:45 -0800287 aidl, aidl2legacy_AudioPortConfigType_int32_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700288 // AudioPortConfigType enum is index-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -0800289 indexToEnum_index<media::AudioPortConfigType>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700290 // AUDIO_PORT_CONFIG_* flags are mask-based.
291 enumToMask_bitmask<unsigned int, int>);
292}
293
294ConversionResult<int32_t> legacy2aidl_config_mask_int32_t(unsigned int legacy) {
295 return convertBitmask<int32_t, unsigned int, media::AudioPortConfigType, int>(
Andy Hung973638a2020-12-08 20:47:45 -0800296 legacy, legacy2aidl_int32_t_AudioPortConfigType,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700297 // AUDIO_PORT_CONFIG_* flags are mask-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -0800298 indexToEnum_bitmask<unsigned>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700299 // AudioPortConfigType enum is index-based.
300 enumToMask_index<int32_t, media::AudioPortConfigType>);
301}
302
Mikhail Naganov88536df2021-07-26 17:30:29 -0700303ConversionResult<audio_io_config_event_t> aidl2legacy_AudioIoConfigEvent_audio_io_config_event_t(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700304 media::AudioIoConfigEvent aidl) {
305 switch (aidl) {
306 case media::AudioIoConfigEvent::OUTPUT_REGISTERED:
307 return AUDIO_OUTPUT_REGISTERED;
308 case media::AudioIoConfigEvent::OUTPUT_OPENED:
309 return AUDIO_OUTPUT_OPENED;
310 case media::AudioIoConfigEvent::OUTPUT_CLOSED:
311 return AUDIO_OUTPUT_CLOSED;
312 case media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED:
313 return AUDIO_OUTPUT_CONFIG_CHANGED;
314 case media::AudioIoConfigEvent::INPUT_REGISTERED:
315 return AUDIO_INPUT_REGISTERED;
316 case media::AudioIoConfigEvent::INPUT_OPENED:
317 return AUDIO_INPUT_OPENED;
318 case media::AudioIoConfigEvent::INPUT_CLOSED:
319 return AUDIO_INPUT_CLOSED;
320 case media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED:
321 return AUDIO_INPUT_CONFIG_CHANGED;
322 case media::AudioIoConfigEvent::CLIENT_STARTED:
323 return AUDIO_CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700324 }
Andy Hung3f69c162020-12-09 12:08:48 -0800325 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700326}
327
Mikhail Naganov88536df2021-07-26 17:30:29 -0700328ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_t_AudioIoConfigEvent(
329 audio_io_config_event_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700330 switch (legacy) {
331 case AUDIO_OUTPUT_REGISTERED:
332 return media::AudioIoConfigEvent::OUTPUT_REGISTERED;
333 case AUDIO_OUTPUT_OPENED:
334 return media::AudioIoConfigEvent::OUTPUT_OPENED;
335 case AUDIO_OUTPUT_CLOSED:
336 return media::AudioIoConfigEvent::OUTPUT_CLOSED;
337 case AUDIO_OUTPUT_CONFIG_CHANGED:
338 return media::AudioIoConfigEvent::OUTPUT_CONFIG_CHANGED;
339 case AUDIO_INPUT_REGISTERED:
340 return media::AudioIoConfigEvent::INPUT_REGISTERED;
341 case AUDIO_INPUT_OPENED:
342 return media::AudioIoConfigEvent::INPUT_OPENED;
343 case AUDIO_INPUT_CLOSED:
344 return media::AudioIoConfigEvent::INPUT_CLOSED;
345 case AUDIO_INPUT_CONFIG_CHANGED:
346 return media::AudioIoConfigEvent::INPUT_CONFIG_CHANGED;
347 case AUDIO_CLIENT_STARTED:
348 return media::AudioIoConfigEvent::CLIENT_STARTED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700349 }
Andy Hung3f69c162020-12-09 12:08:48 -0800350 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700351}
352
353ConversionResult<audio_port_role_t> aidl2legacy_AudioPortRole_audio_port_role_t(
354 media::AudioPortRole aidl) {
355 switch (aidl) {
356 case media::AudioPortRole::NONE:
357 return AUDIO_PORT_ROLE_NONE;
358 case media::AudioPortRole::SOURCE:
359 return AUDIO_PORT_ROLE_SOURCE;
360 case media::AudioPortRole::SINK:
361 return AUDIO_PORT_ROLE_SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700362 }
Andy Hung3f69c162020-12-09 12:08:48 -0800363 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700364}
365
366ConversionResult<media::AudioPortRole> legacy2aidl_audio_port_role_t_AudioPortRole(
367 audio_port_role_t legacy) {
368 switch (legacy) {
369 case AUDIO_PORT_ROLE_NONE:
370 return media::AudioPortRole::NONE;
371 case AUDIO_PORT_ROLE_SOURCE:
372 return media::AudioPortRole::SOURCE;
373 case AUDIO_PORT_ROLE_SINK:
374 return media::AudioPortRole::SINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700375 }
Andy Hung3f69c162020-12-09 12:08:48 -0800376 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700377}
378
379ConversionResult<audio_port_type_t> aidl2legacy_AudioPortType_audio_port_type_t(
380 media::AudioPortType aidl) {
381 switch (aidl) {
382 case media::AudioPortType::NONE:
383 return AUDIO_PORT_TYPE_NONE;
384 case media::AudioPortType::DEVICE:
385 return AUDIO_PORT_TYPE_DEVICE;
386 case media::AudioPortType::MIX:
387 return AUDIO_PORT_TYPE_MIX;
388 case media::AudioPortType::SESSION:
389 return AUDIO_PORT_TYPE_SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700390 }
Andy Hung3f69c162020-12-09 12:08:48 -0800391 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700392}
393
394ConversionResult<media::AudioPortType> legacy2aidl_audio_port_type_t_AudioPortType(
395 audio_port_type_t legacy) {
396 switch (legacy) {
397 case AUDIO_PORT_TYPE_NONE:
398 return media::AudioPortType::NONE;
399 case AUDIO_PORT_TYPE_DEVICE:
400 return media::AudioPortType::DEVICE;
401 case AUDIO_PORT_TYPE_MIX:
402 return media::AudioPortType::MIX;
403 case AUDIO_PORT_TYPE_SESSION:
404 return media::AudioPortType::SESSION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700405 }
Andy Hung3f69c162020-12-09 12:08:48 -0800406 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -0700407}
408
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700409namespace {
410
411namespace detail {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700412using AudioChannelPair = std::pair<audio_channel_mask_t, AudioChannelLayout>;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700413using AudioChannelPairs = std::vector<AudioChannelPair>;
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000414using AudioDevicePair = std::pair<audio_devices_t, AudioDeviceDescription>;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700415using AudioDevicePairs = std::vector<AudioDevicePair>;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700416using AudioFormatPair = std::pair<audio_format_t, AudioFormatDescription>;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700417using AudioFormatPairs = std::vector<AudioFormatPair>;
418}
419
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700420const detail::AudioChannelPairs& getInAudioChannelPairs() {
421 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700422#define DEFINE_INPUT_LAYOUT(n) \
423 { \
424 AUDIO_CHANNEL_IN_##n, \
425 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
426 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700427 }
428
429 DEFINE_INPUT_LAYOUT(MONO),
430 DEFINE_INPUT_LAYOUT(STEREO),
431 DEFINE_INPUT_LAYOUT(FRONT_BACK),
432 // AUDIO_CHANNEL_IN_6 not supported
433 DEFINE_INPUT_LAYOUT(2POINT0POINT2),
434 DEFINE_INPUT_LAYOUT(2POINT1POINT2),
435 DEFINE_INPUT_LAYOUT(3POINT0POINT2),
436 DEFINE_INPUT_LAYOUT(3POINT1POINT2),
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700437 DEFINE_INPUT_LAYOUT(5POINT1)
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700438#undef DEFINE_INPUT_LAYOUT
439 };
440 return pairs;
441}
442
443const detail::AudioChannelPairs& getOutAudioChannelPairs() {
444 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700445#define DEFINE_OUTPUT_LAYOUT(n) \
446 { \
447 AUDIO_CHANNEL_OUT_##n, \
448 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
449 AudioChannelLayout::LAYOUT_##n) \
Mikhail Naganovcf2fa812021-06-25 09:03:37 -0700450 }
451
452 DEFINE_OUTPUT_LAYOUT(MONO),
453 DEFINE_OUTPUT_LAYOUT(STEREO),
454 DEFINE_OUTPUT_LAYOUT(2POINT1),
455 DEFINE_OUTPUT_LAYOUT(TRI),
456 DEFINE_OUTPUT_LAYOUT(TRI_BACK),
457 DEFINE_OUTPUT_LAYOUT(3POINT1),
458 DEFINE_OUTPUT_LAYOUT(2POINT0POINT2),
459 DEFINE_OUTPUT_LAYOUT(2POINT1POINT2),
460 DEFINE_OUTPUT_LAYOUT(3POINT0POINT2),
461 DEFINE_OUTPUT_LAYOUT(3POINT1POINT2),
462 DEFINE_OUTPUT_LAYOUT(QUAD),
463 DEFINE_OUTPUT_LAYOUT(QUAD_SIDE),
464 DEFINE_OUTPUT_LAYOUT(SURROUND),
465 DEFINE_OUTPUT_LAYOUT(PENTA),
466 DEFINE_OUTPUT_LAYOUT(5POINT1),
467 DEFINE_OUTPUT_LAYOUT(5POINT1_SIDE),
468 DEFINE_OUTPUT_LAYOUT(5POINT1POINT2),
469 DEFINE_OUTPUT_LAYOUT(5POINT1POINT4),
470 DEFINE_OUTPUT_LAYOUT(6POINT1),
471 DEFINE_OUTPUT_LAYOUT(7POINT1),
472 DEFINE_OUTPUT_LAYOUT(7POINT1POINT2),
473 DEFINE_OUTPUT_LAYOUT(7POINT1POINT4),
474 DEFINE_OUTPUT_LAYOUT(13POINT_360RA),
475 DEFINE_OUTPUT_LAYOUT(22POINT2),
476 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_A),
477 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_A),
478 DEFINE_OUTPUT_LAYOUT(HAPTIC_AB),
479 DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_AB),
480 DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_AB)
481#undef DEFINE_OUTPUT_LAYOUT
482 };
483 return pairs;
484}
485
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700486const detail::AudioChannelPairs& getVoiceAudioChannelPairs() {
487 static const detail::AudioChannelPairs pairs = {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700488#define DEFINE_VOICE_LAYOUT(n) \
489 { \
490 AUDIO_CHANNEL_IN_VOICE_##n, \
491 AudioChannelLayout::make<AudioChannelLayout::Tag::voiceMask>( \
492 AudioChannelLayout::VOICE_##n) \
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -0700493 }
494 DEFINE_VOICE_LAYOUT(UPLINK_MONO),
495 DEFINE_VOICE_LAYOUT(DNLINK_MONO),
496 DEFINE_VOICE_LAYOUT(CALL_MONO)
497#undef DEFINE_VOICE_LAYOUT
498 };
499 return pairs;
500}
501
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000502AudioDeviceDescription make_AudioDeviceDescription(AudioDeviceType type,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700503 const std::string& connection = "") {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000504 AudioDeviceDescription result;
Mikhail Naganov09a73812021-06-17 18:00:55 -0700505 result.type = type;
506 result.connection = connection;
507 return result;
508}
509
510void append_AudioDeviceDescription(detail::AudioDevicePairs& pairs,
511 audio_devices_t inputType, audio_devices_t outputType,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000512 AudioDeviceType inType, AudioDeviceType outType,
Mikhail Naganov09a73812021-06-17 18:00:55 -0700513 const std::string& connection = "") {
514 pairs.push_back(std::make_pair(inputType, make_AudioDeviceDescription(inType, connection)));
515 pairs.push_back(std::make_pair(outputType, make_AudioDeviceDescription(outType, connection)));
516}
517
518const detail::AudioDevicePairs& getAudioDevicePairs() {
519 static const detail::AudioDevicePairs pairs = []() {
520 detail::AudioDevicePairs pairs = {{
521 {
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000522 AUDIO_DEVICE_NONE, AudioDeviceDescription{}
Mikhail Naganov09a73812021-06-17 18:00:55 -0700523 },
524 {
525 AUDIO_DEVICE_OUT_EARPIECE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000526 AudioDeviceType::OUT_SPEAKER_EARPIECE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700527 },
528 {
529 AUDIO_DEVICE_OUT_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000530 AudioDeviceType::OUT_SPEAKER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700531 },
532 {
533 AUDIO_DEVICE_OUT_WIRED_HEADPHONE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000534 AudioDeviceType::OUT_HEADPHONE,
535 AudioDeviceDescription::CONNECTION_ANALOG())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700536 },
537 {
538 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000539 AudioDeviceType::OUT_DEVICE,
540 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700541 },
542 {
543 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000544 AudioDeviceType::OUT_CARKIT,
545 AudioDeviceDescription::CONNECTION_BT_SCO())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700546 },
547 {
548 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000549 AudioDeviceType::OUT_HEADPHONE,
550 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700551 },
552 {
553 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000554 AudioDeviceType::OUT_SPEAKER,
555 AudioDeviceDescription::CONNECTION_BT_A2DP())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700556 },
557 {
558 AUDIO_DEVICE_OUT_TELEPHONY_TX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000559 AudioDeviceType::OUT_TELEPHONY_TX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700560 },
561 {
562 AUDIO_DEVICE_OUT_AUX_LINE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000563 AudioDeviceType::OUT_LINE_AUX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700564 },
565 {
566 AUDIO_DEVICE_OUT_SPEAKER_SAFE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000567 AudioDeviceType::OUT_SPEAKER_SAFE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700568 },
569 {
570 AUDIO_DEVICE_OUT_HEARING_AID, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000571 AudioDeviceType::OUT_HEARING_AID,
572 AudioDeviceDescription::CONNECTION_WIRELESS())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700573 },
574 {
575 AUDIO_DEVICE_OUT_ECHO_CANCELLER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000576 AudioDeviceType::OUT_ECHO_CANCELLER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700577 },
578 {
579 AUDIO_DEVICE_OUT_BLE_SPEAKER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000580 AudioDeviceType::OUT_SPEAKER,
581 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700582 },
583 // AUDIO_DEVICE_IN_AMBIENT and IN_COMMUNICATION are removed since they were deprecated.
584 {
585 AUDIO_DEVICE_IN_BUILTIN_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000586 AudioDeviceType::IN_MICROPHONE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700587 },
588 {
589 AUDIO_DEVICE_IN_BACK_MIC, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000590 AudioDeviceType::IN_MICROPHONE_BACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700591 },
592 {
593 AUDIO_DEVICE_IN_TELEPHONY_RX, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000594 AudioDeviceType::IN_TELEPHONY_RX)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700595 },
596 {
597 AUDIO_DEVICE_IN_TV_TUNER, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000598 AudioDeviceType::IN_TV_TUNER)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700599 },
600 {
601 AUDIO_DEVICE_IN_LOOPBACK, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000602 AudioDeviceType::IN_LOOPBACK)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700603 },
604 {
605 AUDIO_DEVICE_IN_BLUETOOTH_BLE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000606 AudioDeviceType::IN_DEVICE,
607 AudioDeviceDescription::CONNECTION_BT_LE())
Mikhail Naganov09a73812021-06-17 18:00:55 -0700608 },
609 {
610 AUDIO_DEVICE_IN_ECHO_REFERENCE, make_AudioDeviceDescription(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000611 AudioDeviceType::IN_ECHO_REFERENCE)
Mikhail Naganov09a73812021-06-17 18:00:55 -0700612 }
613 }};
614 append_AudioDeviceDescription(pairs,
615 AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_OUT_DEFAULT,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000616 AudioDeviceType::IN_DEFAULT, AudioDeviceType::OUT_DEFAULT);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700617 append_AudioDeviceDescription(pairs,
618 AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_OUT_WIRED_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000619 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
620 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700621 append_AudioDeviceDescription(pairs,
622 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000623 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
624 AudioDeviceDescription::CONNECTION_BT_SCO());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700625 append_AudioDeviceDescription(pairs,
626 AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_OUT_HDMI,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000627 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
628 AudioDeviceDescription::CONNECTION_HDMI());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700629 append_AudioDeviceDescription(pairs,
630 AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000631 AudioDeviceType::IN_SUBMIX, AudioDeviceType::OUT_SUBMIX);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700632 append_AudioDeviceDescription(pairs,
633 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700634 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
635 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700636 append_AudioDeviceDescription(pairs,
637 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET,
Mikhail Naganovd3bb86e2021-09-20 12:10:14 -0700638 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
639 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700640 append_AudioDeviceDescription(pairs,
641 AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_OUT_USB_ACCESSORY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000642 AudioDeviceType::IN_ACCESSORY, AudioDeviceType::OUT_ACCESSORY,
643 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700644 append_AudioDeviceDescription(pairs,
645 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_OUT_USB_DEVICE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000646 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
647 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700648 append_AudioDeviceDescription(pairs,
649 AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_OUT_FM,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000650 AudioDeviceType::IN_FM_TUNER, AudioDeviceType::OUT_FM);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700651 append_AudioDeviceDescription(pairs,
652 AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_OUT_LINE,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000653 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
654 AudioDeviceDescription::CONNECTION_ANALOG());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700655 append_AudioDeviceDescription(pairs,
656 AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_OUT_SPDIF,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000657 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
658 AudioDeviceDescription::CONNECTION_SPDIF());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700659 append_AudioDeviceDescription(pairs,
660 AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000661 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
662 AudioDeviceDescription::CONNECTION_BT_A2DP());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700663 append_AudioDeviceDescription(pairs,
664 AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_OUT_IP,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000665 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
666 AudioDeviceDescription::CONNECTION_IP_V4());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700667 append_AudioDeviceDescription(pairs,
668 AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_OUT_BUS,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000669 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
670 AudioDeviceDescription::CONNECTION_BUS());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700671 append_AudioDeviceDescription(pairs,
672 AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_OUT_PROXY,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000673 AudioDeviceType::IN_AFE_PROXY, AudioDeviceType::OUT_AFE_PROXY);
Mikhail Naganov09a73812021-06-17 18:00:55 -0700674 append_AudioDeviceDescription(pairs,
675 AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_OUT_USB_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000676 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
677 AudioDeviceDescription::CONNECTION_USB());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700678 append_AudioDeviceDescription(pairs,
679 AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_OUT_HDMI_ARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000680 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
681 AudioDeviceDescription::CONNECTION_HDMI_ARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700682 append_AudioDeviceDescription(pairs,
683 AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_OUT_HDMI_EARC,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000684 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
685 AudioDeviceDescription::CONNECTION_HDMI_EARC());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700686 append_AudioDeviceDescription(pairs,
687 AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_OUT_BLE_HEADSET,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000688 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
689 AudioDeviceDescription::CONNECTION_BT_LE());
Mikhail Naganov09a73812021-06-17 18:00:55 -0700690 return pairs;
691 }();
692 return pairs;
693}
694
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700695AudioFormatDescription make_AudioFormatDescription(AudioFormatType type) {
696 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700697 result.type = type;
698 return result;
699}
700
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700701AudioFormatDescription make_AudioFormatDescription(PcmType pcm) {
702 auto result = make_AudioFormatDescription(AudioFormatType::PCM);
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700703 result.pcm = pcm;
704 return result;
705}
706
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700707AudioFormatDescription make_AudioFormatDescription(const std::string& encoding) {
708 AudioFormatDescription result;
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700709 result.encoding = encoding;
710 return result;
711}
712
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700713AudioFormatDescription make_AudioFormatDescription(PcmType transport,
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700714 const std::string& encoding) {
715 auto result = make_AudioFormatDescription(encoding);
716 result.pcm = transport;
717 return result;
718}
719
720const detail::AudioFormatPairs& getAudioFormatPairs() {
721 static const detail::AudioFormatPairs pairs = {{
722 {
723 AUDIO_FORMAT_INVALID,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700724 make_AudioFormatDescription(AudioFormatType::SYS_RESERVED_INVALID)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700725 },
726 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700727 AUDIO_FORMAT_DEFAULT, AudioFormatDescription{}
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700728 },
729 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700730 AUDIO_FORMAT_PCM_16_BIT, make_AudioFormatDescription(PcmType::INT_16_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700731 },
732 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700733 AUDIO_FORMAT_PCM_8_BIT, make_AudioFormatDescription(PcmType::UINT_8_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700734 },
735 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700736 AUDIO_FORMAT_PCM_32_BIT, make_AudioFormatDescription(PcmType::INT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700737 },
738 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700739 AUDIO_FORMAT_PCM_8_24_BIT, make_AudioFormatDescription(PcmType::FIXED_Q_8_24)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700740 },
741 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700742 AUDIO_FORMAT_PCM_FLOAT, make_AudioFormatDescription(PcmType::FLOAT_32_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700743 },
744 {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700745 AUDIO_FORMAT_PCM_24_BIT_PACKED, make_AudioFormatDescription(PcmType::INT_24_BIT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700746 },
747 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700748 AUDIO_FORMAT_MP3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG)
749 },
750 {
751 AUDIO_FORMAT_AMR_NB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_NB)
752 },
753 {
754 AUDIO_FORMAT_AMR_WB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB)
755 },
756 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700757 AUDIO_FORMAT_AAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MP4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700758 },
759 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700760 AUDIO_FORMAT_AAC_MAIN, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700761 },
762 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700763 AUDIO_FORMAT_AAC_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700764 },
765 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700766 AUDIO_FORMAT_AAC_SSR, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700767 },
768 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700769 AUDIO_FORMAT_AAC_LTP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700770 },
771 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700772 AUDIO_FORMAT_AAC_HE_V1, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700773 },
774 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700775 AUDIO_FORMAT_AAC_SCALABLE,
776 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700777 },
778 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700779 AUDIO_FORMAT_AAC_ERLC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700780 },
781 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700782 AUDIO_FORMAT_AAC_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700783 },
784 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700785 AUDIO_FORMAT_AAC_HE_V2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700786 },
787 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700788 AUDIO_FORMAT_AAC_ELD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700789 },
790 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700791 AUDIO_FORMAT_AAC_XHE, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700792 },
793 // AUDIO_FORMAT_HE_AAC_V1 and HE_AAC_V2 are removed since they were deprecated long time
794 // ago.
795 {
796 AUDIO_FORMAT_VORBIS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_VORBIS)
797 },
798 {
799 AUDIO_FORMAT_OPUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_OPUS)
800 },
801 {
802 AUDIO_FORMAT_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC3)
803 },
804 {
805 AUDIO_FORMAT_E_AC3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3)
806 },
807 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700808 AUDIO_FORMAT_E_AC3_JOC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EAC3_JOC)
809 },
810 {
811 AUDIO_FORMAT_DTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS)
812 },
813 {
814 AUDIO_FORMAT_DTS_HD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_HD)
815 },
816 // In the future, we would like to represent encapsulated bitstreams as
817 // nested AudioFormatDescriptions. The legacy 'AUDIO_FORMAT_IEC61937' type doesn't
818 // specify the format of the encapsulated bitstream.
819 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700820 AUDIO_FORMAT_IEC61937,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700821 make_AudioFormatDescription(PcmType::INT_16_BIT, MEDIA_MIMETYPE_AUDIO_IEC61937)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700822 },
823 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700824 AUDIO_FORMAT_DOLBY_TRUEHD,
825 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_TRUEHD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700826 },
827 {
828 AUDIO_FORMAT_EVRC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRC)
829 },
830 {
831 AUDIO_FORMAT_EVRCB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCB)
832 },
833 {
834 AUDIO_FORMAT_EVRCWB, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCWB)
835 },
836 {
837 AUDIO_FORMAT_EVRCNW, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_EVRCNW)
838 },
839 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700840 AUDIO_FORMAT_AAC_ADIF, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADIF)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700841 },
842 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700843 AUDIO_FORMAT_WMA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_WMA)
844 },
845 {
846 // Note: not in the IANA registry.
847 AUDIO_FORMAT_WMA_PRO, make_AudioFormatDescription("audio/x-ms-wma.pro")
848 },
849 {
850 AUDIO_FORMAT_AMR_WB_PLUS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS)
851 },
852 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700853 AUDIO_FORMAT_MP2, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II)
854 },
855 {
856 AUDIO_FORMAT_QCELP, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_QCELP)
857 },
858 {
859 // Note: not in the IANA registry.
860 AUDIO_FORMAT_DSD, make_AudioFormatDescription("audio/vnd.sony.dsd")
861 },
862 {
863 AUDIO_FORMAT_FLAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_FLAC)
864 },
865 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700866 AUDIO_FORMAT_ALAC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_ALAC)
867 },
868 {
869 // Note: not in the IANA registry.
870 AUDIO_FORMAT_APE, make_AudioFormatDescription("audio/x-ape")
871 },
872 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700873 AUDIO_FORMAT_AAC_ADTS, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS)
874 },
875 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700876 AUDIO_FORMAT_AAC_ADTS_MAIN,
877 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_MAIN)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700878 },
879 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700880 AUDIO_FORMAT_AAC_ADTS_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700881 },
882 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700883 AUDIO_FORMAT_AAC_ADTS_SSR,
884 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SSR)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700885 },
886 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700887 AUDIO_FORMAT_AAC_ADTS_LTP,
888 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LTP)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700889 },
890 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700891 AUDIO_FORMAT_AAC_ADTS_HE_V1,
892 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700893 },
894 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700895 AUDIO_FORMAT_AAC_ADTS_SCALABLE,
896 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SCALABLE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700897 },
898 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700899 AUDIO_FORMAT_AAC_ADTS_ERLC,
900 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ERLC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700901 },
902 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700903 AUDIO_FORMAT_AAC_ADTS_LD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700904 },
905 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700906 AUDIO_FORMAT_AAC_ADTS_HE_V2,
907 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700908 },
909 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700910 AUDIO_FORMAT_AAC_ADTS_ELD,
911 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ELD)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700912 },
913 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700914 AUDIO_FORMAT_AAC_ADTS_XHE,
915 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_ADTS_XHE)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700916 },
917 {
918 // Note: not in the IANA registry. "vnd.octel.sbc" is not BT SBC.
919 AUDIO_FORMAT_SBC, make_AudioFormatDescription("audio/x-sbc")
920 },
921 {
922 AUDIO_FORMAT_APTX, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_APTX)
923 },
924 {
925 // Note: not in the IANA registry.
926 AUDIO_FORMAT_APTX_HD, make_AudioFormatDescription("audio/vnd.qcom.aptx.hd")
927 },
928 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700929 AUDIO_FORMAT_AC4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AC4)
930 },
931 {
932 // Note: not in the IANA registry.
933 AUDIO_FORMAT_LDAC, make_AudioFormatDescription("audio/vnd.sony.ldac")
934 },
935 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700936 AUDIO_FORMAT_MAT, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700937 },
938 {
939 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700940 AUDIO_FORMAT_MAT_1_0,
941 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".1.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700942 },
943 {
944 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700945 AUDIO_FORMAT_MAT_2_0,
946 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.0"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700947 },
948 {
949 // Note: not in the IANA registry.
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700950 AUDIO_FORMAT_MAT_2_1,
951 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DOLBY_MAT + std::string(".2.1"))
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700952 },
953 {
954 AUDIO_FORMAT_AAC_LATM, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC)
955 },
956 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700957 AUDIO_FORMAT_AAC_LATM_LC, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_LC)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700958 },
959 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700960 AUDIO_FORMAT_AAC_LATM_HE_V1,
961 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700962 },
963 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700964 AUDIO_FORMAT_AAC_LATM_HE_V2,
965 make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V2)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700966 },
967 {
968 // Note: not in the IANA registry.
969 AUDIO_FORMAT_CELT, make_AudioFormatDescription("audio/x-celt")
970 },
971 {
972 // Note: not in the IANA registry.
973 AUDIO_FORMAT_APTX_ADAPTIVE, make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive")
974 },
975 {
976 // Note: not in the IANA registry.
977 AUDIO_FORMAT_LHDC, make_AudioFormatDescription("audio/vnd.savitech.lhdc")
978 },
979 {
980 // Note: not in the IANA registry.
981 AUDIO_FORMAT_LHDC_LL, make_AudioFormatDescription("audio/vnd.savitech.lhdc.ll")
982 },
983 {
984 // Note: not in the IANA registry.
985 AUDIO_FORMAT_APTX_TWSP, make_AudioFormatDescription("audio/vnd.qcom.aptx.twsp")
986 },
987 {
988 // Note: not in the IANA registry.
989 AUDIO_FORMAT_LC3, make_AudioFormatDescription("audio/x-lc3")
990 },
991 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700992 AUDIO_FORMAT_MPEGH, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_MHM1)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700993 },
994 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700995 AUDIO_FORMAT_MPEGH_BL_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700996 },
997 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -0700998 AUDIO_FORMAT_MPEGH_BL_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -0700999 },
1000 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -07001001 AUDIO_FORMAT_MPEGH_LC_L3, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L3)
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001002 },
1003 {
Mikhail Naganov9ec08d02021-08-06 17:28:33 -07001004 AUDIO_FORMAT_MPEGH_LC_L4, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L4)
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001005 },
1006 {
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001007 AUDIO_FORMAT_IEC60958,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001008 make_AudioFormatDescription(PcmType::INT_24_BIT, MEDIA_MIMETYPE_AUDIO_IEC60958)
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001009 },
1010 {
1011 AUDIO_FORMAT_DTS_UHD, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DTS_UHD)
1012 },
1013 {
1014 AUDIO_FORMAT_DRA, make_AudioFormatDescription(MEDIA_MIMETYPE_AUDIO_DRA)
1015 },
1016 }};
1017 return pairs;
1018}
1019
Mikhail Naganov09a73812021-06-17 18:00:55 -07001020template<typename S, typename T>
1021std::unordered_map<S, T> make_DirectMap(const std::vector<std::pair<S, T>>& v) {
1022 std::unordered_map<S, T> result(v.begin(), v.end());
1023 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
1024 return result;
1025}
1026
1027template<typename S, typename T>
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001028std::unordered_map<S, T> make_DirectMap(
1029 const std::vector<std::pair<S, T>>& v1, const std::vector<std::pair<S, T>>& v2) {
1030 std::unordered_map<S, T> result(v1.begin(), v1.end());
1031 LOG_ALWAYS_FATAL_IF(result.size() != v1.size(), "Duplicate key elements detected in v1");
1032 result.insert(v2.begin(), v2.end());
1033 LOG_ALWAYS_FATAL_IF(result.size() != v1.size() + v2.size(),
1034 "Duplicate key elements detected in v1+v2");
1035 return result;
1036}
1037
1038template<typename S, typename T>
Mikhail Naganov09a73812021-06-17 18:00:55 -07001039std::unordered_map<T, S> make_ReverseMap(const std::vector<std::pair<S, T>>& v) {
1040 std::unordered_map<T, S> result;
1041 std::transform(v.begin(), v.end(), std::inserter(result, result.begin()),
1042 [](const std::pair<S, T>& p) {
1043 return std::make_pair(p.second, p.first);
1044 });
1045 LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
1046 return result;
1047}
1048
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001049} // namespace
1050
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001051ConversionResult<audio_channel_mask_t> aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001052 const AudioChannelLayout& aidl, bool isInput) {
1053 using ReverseMap = std::unordered_map<AudioChannelLayout, audio_channel_mask_t>;
1054 using Tag = AudioChannelLayout::Tag;
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001055 static const ReverseMap mIn = make_ReverseMap(getInAudioChannelPairs());
1056 static const ReverseMap mOut = make_ReverseMap(getOutAudioChannelPairs());
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001057 static const ReverseMap mVoice = make_ReverseMap(getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001058
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001059 auto convert = [](const AudioChannelLayout& aidl, const ReverseMap& m,
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001060 const char* func, const char* type) -> ConversionResult<audio_channel_mask_t> {
1061 if (auto it = m.find(aidl); it != m.end()) {
1062 return it->second;
1063 } else {
1064 ALOGE("%s: no legacy %s audio_channel_mask_t found for %s", func, type,
1065 aidl.toString().c_str());
1066 return unexpected(BAD_VALUE);
1067 }
1068 };
1069
1070 switch (aidl.getTag()) {
1071 case Tag::none:
1072 return AUDIO_CHANNEL_NONE;
1073 case Tag::invalid:
1074 return AUDIO_CHANNEL_INVALID;
Mikhail Naganov81020002021-08-03 14:16:15 -07001075 case Tag::indexMask: {
1076 // Index masks do not have pre-defined values.
1077 const int bits = aidl.get<Tag::indexMask>();
1078 if (__builtin_popcount(bits) != 0 &&
1079 __builtin_popcount(bits) <= AUDIO_CHANNEL_COUNT_MAX) {
1080 return audio_channel_mask_from_representation_and_bits(
1081 AUDIO_CHANNEL_REPRESENTATION_INDEX, bits);
1082 } else {
1083 ALOGE("%s: invalid indexMask value 0x%x in %s",
1084 __func__, bits, aidl.toString().c_str());
1085 return unexpected(BAD_VALUE);
1086 }
1087 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001088 case Tag::layoutMask:
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001089 return convert(aidl, isInput ? mIn : mOut, __func__, isInput ? "input" : "output");
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001090 case Tag::voiceMask:
1091 return convert(aidl, mVoice, __func__, "voice");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001092 }
1093 ALOGE("%s: unexpected tag value %d", __func__, aidl.getTag());
1094 return unexpected(BAD_VALUE);
1095}
1096
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001097ConversionResult<AudioChannelLayout> legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001098 audio_channel_mask_t legacy, bool isInput) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001099 using DirectMap = std::unordered_map<audio_channel_mask_t, AudioChannelLayout>;
1100 using Tag = AudioChannelLayout::Tag;
Mikhail Naganov2d4b14d2021-07-13 15:36:31 -07001101 static const DirectMap mInAndVoice = make_DirectMap(
1102 getInAudioChannelPairs(), getVoiceAudioChannelPairs());
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001103 static const DirectMap mOut = make_DirectMap(getOutAudioChannelPairs());
1104
1105 auto convert = [](const audio_channel_mask_t legacy, const DirectMap& m,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001106 const char* func, const char* type) -> ConversionResult<AudioChannelLayout> {
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001107 if (auto it = m.find(legacy); it != m.end()) {
1108 return it->second;
1109 } else {
1110 ALOGE("%s: no AudioChannelLayout found for legacy %s audio_channel_mask_t value 0x%x",
1111 func, type, legacy);
1112 return unexpected(BAD_VALUE);
1113 }
1114 };
1115
1116 if (legacy == AUDIO_CHANNEL_NONE) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001117 return AudioChannelLayout{};
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001118 } else if (legacy == AUDIO_CHANNEL_INVALID) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001119 return AudioChannelLayout::make<Tag::invalid>(0);
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001120 }
1121
1122 const audio_channel_representation_t repr = audio_channel_mask_get_representation(legacy);
1123 if (repr == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
Mikhail Naganov81020002021-08-03 14:16:15 -07001124 if (audio_channel_mask_is_valid(legacy)) {
1125 const int indexMask = VALUE_OR_RETURN(
1126 convertIntegral<int>(audio_channel_mask_get_bits(legacy)));
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001127 return AudioChannelLayout::make<Tag::indexMask>(indexMask);
Mikhail Naganov81020002021-08-03 14:16:15 -07001128 } else {
1129 ALOGE("%s: legacy audio_channel_mask_t value 0x%x is invalid", __func__, legacy);
1130 return unexpected(BAD_VALUE);
1131 }
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001132 } else if (repr == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001133 return convert(legacy, isInput ? mInAndVoice : mOut, __func__,
1134 isInput ? "input / voice" : "output");
Mikhail Naganovcf2fa812021-06-25 09:03:37 -07001135 }
1136
1137 ALOGE("%s: unknown representation %d in audio_channel_mask_t value 0x%x",
1138 __func__, repr, legacy);
1139 return unexpected(BAD_VALUE);
1140}
1141
Mikhail Naganov09a73812021-06-17 18:00:55 -07001142ConversionResult<audio_devices_t> aidl2legacy_AudioDeviceDescription_audio_devices_t(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001143 const AudioDeviceDescription& aidl) {
1144 static const std::unordered_map<AudioDeviceDescription, audio_devices_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001145 make_ReverseMap(getAudioDevicePairs());
1146 if (auto it = m.find(aidl); it != m.end()) {
1147 return it->second;
1148 } else {
1149 ALOGE("%s: no legacy audio_devices_t found for %s", __func__, aidl.toString().c_str());
1150 return unexpected(BAD_VALUE);
1151 }
1152}
1153
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001154ConversionResult<AudioDeviceDescription> legacy2aidl_audio_devices_t_AudioDeviceDescription(
Mikhail Naganov09a73812021-06-17 18:00:55 -07001155 audio_devices_t legacy) {
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001156 static const std::unordered_map<audio_devices_t, AudioDeviceDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001157 make_DirectMap(getAudioDevicePairs());
1158 if (auto it = m.find(legacy); it != m.end()) {
1159 return it->second;
1160 } else {
1161 ALOGE("%s: no AudioDeviceDescription found for legacy audio_devices_t value 0x%x",
1162 __func__, legacy);
1163 return unexpected(BAD_VALUE);
1164 }
1165}
1166
Mikhail Naganov932cb962021-09-16 01:05:27 +00001167status_t aidl2legacy_AudioDevice_audio_device(
1168 const AudioDevice& aidl,
1169 audio_devices_t* legacyType, char* legacyAddress) {
1170 *legacyType = VALUE_OR_RETURN_STATUS(
1171 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1172 return aidl2legacy_string(
1173 aidl.address.get<AudioDeviceAddress::id>(),
1174 legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN);
1175}
1176
1177status_t aidl2legacy_AudioDevice_audio_device(
1178 const AudioDevice& aidl,
1179 audio_devices_t* legacyType, String8* legacyAddress) {
1180 *legacyType = VALUE_OR_RETURN_STATUS(
1181 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1182 *legacyAddress = VALUE_OR_RETURN_STATUS(aidl2legacy_string_view_String8(
1183 aidl.address.get<AudioDeviceAddress::id>()));
1184 return OK;
1185}
1186
1187status_t aidl2legacy_AudioDevice_audio_device(
1188 const AudioDevice& aidl,
1189 audio_devices_t* legacyType, std::string* legacyAddress) {
1190 *legacyType = VALUE_OR_RETURN_STATUS(
1191 aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1192 *legacyAddress = aidl.address.get<AudioDeviceAddress::id>();
1193 return OK;
1194}
1195
1196ConversionResult<AudioDevice> legacy2aidl_audio_device_AudioDevice(
1197 audio_devices_t legacyType, const char* legacyAddress) {
1198 AudioDevice aidl;
1199 aidl.type = VALUE_OR_RETURN(
1200 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1201 const std::string aidl_id = VALUE_OR_RETURN(
1202 legacy2aidl_string(legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN));
1203 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1204 return aidl;
1205}
1206
1207ConversionResult<AudioDevice>
1208legacy2aidl_audio_device_AudioDevice(
1209 audio_devices_t legacyType, const String8& legacyAddress) {
1210 AudioDevice aidl;
1211 aidl.type = VALUE_OR_RETURN(
1212 legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1213 const std::string aidl_id = VALUE_OR_RETURN(
1214 legacy2aidl_String8_string(legacyAddress));
1215 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(aidl_id);
1216 return aidl;
1217}
1218
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001219ConversionResult<audio_format_t> aidl2legacy_AudioFormatDescription_audio_format_t(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001220 const AudioFormatDescription& aidl) {
1221 static const std::unordered_map<AudioFormatDescription, audio_format_t> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001222 make_ReverseMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001223 if (auto it = m.find(aidl); it != m.end()) {
1224 return it->second;
1225 } else {
1226 ALOGE("%s: no legacy audio_format_t found for %s", __func__, aidl.toString().c_str());
1227 return unexpected(BAD_VALUE);
1228 }
1229}
1230
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001231ConversionResult<AudioFormatDescription> legacy2aidl_audio_format_t_AudioFormatDescription(
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001232 audio_format_t legacy) {
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001233 static const std::unordered_map<audio_format_t, AudioFormatDescription> m =
Mikhail Naganov09a73812021-06-17 18:00:55 -07001234 make_DirectMap(getAudioFormatPairs());
Mikhail Naganove128b8e2021-06-04 17:31:03 -07001235 if (auto it = m.find(legacy); it != m.end()) {
1236 return it->second;
1237 } else {
1238 ALOGE("%s: no AudioFormatDescription found for legacy audio_format_t value 0x%x",
1239 __func__, legacy);
1240 return unexpected(BAD_VALUE);
1241 }
1242}
1243
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001244ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(media::AudioGainMode aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001245 switch (aidl) {
1246 case media::AudioGainMode::JOINT:
1247 return AUDIO_GAIN_MODE_JOINT;
1248 case media::AudioGainMode::CHANNELS:
1249 return AUDIO_GAIN_MODE_CHANNELS;
1250 case media::AudioGainMode::RAMP:
1251 return AUDIO_GAIN_MODE_RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001252 }
Andy Hung3f69c162020-12-09 12:08:48 -08001253 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001254}
1255
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001256ConversionResult<media::AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001257 switch (legacy) {
1258 case AUDIO_GAIN_MODE_JOINT:
1259 return media::AudioGainMode::JOINT;
1260 case AUDIO_GAIN_MODE_CHANNELS:
1261 return media::AudioGainMode::CHANNELS;
1262 case AUDIO_GAIN_MODE_RAMP:
1263 return media::AudioGainMode::RAMP;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001264 }
Andy Hung3f69c162020-12-09 12:08:48 -08001265 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001266}
1267
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001268ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
1269 return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, media::AudioGainMode>(
1270 aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001271 // AudioGainMode is index-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001272 indexToEnum_index<media::AudioGainMode>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001273 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001274 enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001275}
1276
Andy Hung973638a2020-12-08 20:47:45 -08001277ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001278 return convertBitmask<int32_t, audio_gain_mode_t, media::AudioGainMode, audio_gain_mode_t>(
1279 legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001280 // AUDIO_GAIN_MODE_* constants are mask-based.
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001281 indexToEnum_bitmask<audio_gain_mode_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001282 // AudioGainMode is index-based.
1283 enumToMask_index<int32_t, media::AudioGainMode>);
1284}
1285
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001286ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
1287 const media::AudioGainConfig& aidl, media::AudioPortRole role, media::AudioPortType type) {
1288 audio_gain_config legacy;
1289 legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001290 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001291 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001292 legacy.channel_mask = VALUE_OR_RETURN(
1293 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001294 const bool isJoint = bitmaskIsSet(aidl.mode, media::AudioGainMode::JOINT);
1295 size_t numValues = isJoint ? 1
1296 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1297 : audio_channel_count_from_out_mask(legacy.channel_mask);
1298 if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
1299 return unexpected(BAD_VALUE);
1300 }
1301 for (size_t i = 0; i < numValues; ++i) {
1302 legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
1303 }
1304 legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.rampDurationMs));
1305 return legacy;
1306}
1307
1308ConversionResult<media::AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
1309 const audio_gain_config& legacy, audio_port_role_t role, audio_port_type_t type) {
1310 media::AudioGainConfig aidl;
1311 aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
Andy Hung973638a2020-12-08 20:47:45 -08001312 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001313 const bool isInput = VALUE_OR_RETURN(direction(role, type)) == Direction::INPUT;
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001314 aidl.channelMask = VALUE_OR_RETURN(
1315 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001316 const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
1317 size_t numValues = isJoint ? 1
1318 : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1319 : audio_channel_count_from_out_mask(legacy.channel_mask);
1320 aidl.values.resize(numValues);
1321 for (size_t i = 0; i < numValues; ++i) {
1322 aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
1323 }
1324 aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
1325 return aidl;
1326}
1327
1328ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
1329 media::AudioInputFlags aidl) {
1330 switch (aidl) {
1331 case media::AudioInputFlags::FAST:
1332 return AUDIO_INPUT_FLAG_FAST;
1333 case media::AudioInputFlags::HW_HOTWORD:
1334 return AUDIO_INPUT_FLAG_HW_HOTWORD;
1335 case media::AudioInputFlags::RAW:
1336 return AUDIO_INPUT_FLAG_RAW;
1337 case media::AudioInputFlags::SYNC:
1338 return AUDIO_INPUT_FLAG_SYNC;
1339 case media::AudioInputFlags::MMAP_NOIRQ:
1340 return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
1341 case media::AudioInputFlags::VOIP_TX:
1342 return AUDIO_INPUT_FLAG_VOIP_TX;
1343 case media::AudioInputFlags::HW_AV_SYNC:
1344 return AUDIO_INPUT_FLAG_HW_AV_SYNC;
1345 case media::AudioInputFlags::DIRECT:
1346 return AUDIO_INPUT_FLAG_DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001347 }
Andy Hung3f69c162020-12-09 12:08:48 -08001348 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001349}
1350
1351ConversionResult<media::AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
1352 audio_input_flags_t legacy) {
1353 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001354 case AUDIO_INPUT_FLAG_NONE:
1355 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001356 case AUDIO_INPUT_FLAG_FAST:
1357 return media::AudioInputFlags::FAST;
1358 case AUDIO_INPUT_FLAG_HW_HOTWORD:
1359 return media::AudioInputFlags::HW_HOTWORD;
1360 case AUDIO_INPUT_FLAG_RAW:
1361 return media::AudioInputFlags::RAW;
1362 case AUDIO_INPUT_FLAG_SYNC:
1363 return media::AudioInputFlags::SYNC;
1364 case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
1365 return media::AudioInputFlags::MMAP_NOIRQ;
1366 case AUDIO_INPUT_FLAG_VOIP_TX:
1367 return media::AudioInputFlags::VOIP_TX;
1368 case AUDIO_INPUT_FLAG_HW_AV_SYNC:
1369 return media::AudioInputFlags::HW_AV_SYNC;
1370 case AUDIO_INPUT_FLAG_DIRECT:
1371 return media::AudioInputFlags::DIRECT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001372 }
Andy Hung3f69c162020-12-09 12:08:48 -08001373 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001374}
1375
1376ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
1377 media::AudioOutputFlags aidl) {
1378 switch (aidl) {
1379 case media::AudioOutputFlags::DIRECT:
1380 return AUDIO_OUTPUT_FLAG_DIRECT;
1381 case media::AudioOutputFlags::PRIMARY:
1382 return AUDIO_OUTPUT_FLAG_PRIMARY;
1383 case media::AudioOutputFlags::FAST:
1384 return AUDIO_OUTPUT_FLAG_FAST;
1385 case media::AudioOutputFlags::DEEP_BUFFER:
1386 return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
1387 case media::AudioOutputFlags::COMPRESS_OFFLOAD:
1388 return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
1389 case media::AudioOutputFlags::NON_BLOCKING:
1390 return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
1391 case media::AudioOutputFlags::HW_AV_SYNC:
1392 return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
1393 case media::AudioOutputFlags::TTS:
1394 return AUDIO_OUTPUT_FLAG_TTS;
1395 case media::AudioOutputFlags::RAW:
1396 return AUDIO_OUTPUT_FLAG_RAW;
1397 case media::AudioOutputFlags::SYNC:
1398 return AUDIO_OUTPUT_FLAG_SYNC;
1399 case media::AudioOutputFlags::IEC958_NONAUDIO:
1400 return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
1401 case media::AudioOutputFlags::DIRECT_PCM:
1402 return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
1403 case media::AudioOutputFlags::MMAP_NOIRQ:
1404 return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
1405 case media::AudioOutputFlags::VOIP_RX:
1406 return AUDIO_OUTPUT_FLAG_VOIP_RX;
1407 case media::AudioOutputFlags::INCALL_MUSIC:
1408 return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +01001409 case media::AudioOutputFlags::GAPLESS_OFFLOAD:
1410 return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001411 }
Andy Hung3f69c162020-12-09 12:08:48 -08001412 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001413}
1414
1415ConversionResult<media::AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
1416 audio_output_flags_t legacy) {
1417 switch (legacy) {
Andy Hung3f69c162020-12-09 12:08:48 -08001418 case AUDIO_OUTPUT_FLAG_NONE:
1419 break; // shouldn't get here. must be listed -Werror,-Wswitch
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001420 case AUDIO_OUTPUT_FLAG_DIRECT:
1421 return media::AudioOutputFlags::DIRECT;
1422 case AUDIO_OUTPUT_FLAG_PRIMARY:
1423 return media::AudioOutputFlags::PRIMARY;
1424 case AUDIO_OUTPUT_FLAG_FAST:
1425 return media::AudioOutputFlags::FAST;
1426 case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
1427 return media::AudioOutputFlags::DEEP_BUFFER;
1428 case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
1429 return media::AudioOutputFlags::COMPRESS_OFFLOAD;
1430 case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
1431 return media::AudioOutputFlags::NON_BLOCKING;
1432 case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
1433 return media::AudioOutputFlags::HW_AV_SYNC;
1434 case AUDIO_OUTPUT_FLAG_TTS:
1435 return media::AudioOutputFlags::TTS;
1436 case AUDIO_OUTPUT_FLAG_RAW:
1437 return media::AudioOutputFlags::RAW;
1438 case AUDIO_OUTPUT_FLAG_SYNC:
1439 return media::AudioOutputFlags::SYNC;
1440 case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
1441 return media::AudioOutputFlags::IEC958_NONAUDIO;
1442 case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
1443 return media::AudioOutputFlags::DIRECT_PCM;
1444 case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
1445 return media::AudioOutputFlags::MMAP_NOIRQ;
1446 case AUDIO_OUTPUT_FLAG_VOIP_RX:
1447 return media::AudioOutputFlags::VOIP_RX;
1448 case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
1449 return media::AudioOutputFlags::INCALL_MUSIC;
Eric Laurent90fe31c2020-11-26 20:06:35 +01001450 case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
1451 return media::AudioOutputFlags::GAPLESS_OFFLOAD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001452 }
Andy Hung3f69c162020-12-09 12:08:48 -08001453 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001454}
1455
Andy Hung973638a2020-12-08 20:47:45 -08001456ConversionResult<audio_input_flags_t> aidl2legacy_int32_t_audio_input_flags_t_mask(
1457 int32_t aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001458 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1459
1460 LegacyMask converted = VALUE_OR_RETURN(
1461 (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, media::AudioInputFlags>(
1462 aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001463 indexToEnum_index<media::AudioInputFlags>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001464 enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
1465 return static_cast<audio_input_flags_t>(converted);
1466}
1467
Andy Hung973638a2020-12-08 20:47:45 -08001468ConversionResult<int32_t> legacy2aidl_audio_input_flags_t_int32_t_mask(
1469 audio_input_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001470 using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1471
1472 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1473 return convertBitmask<int32_t, LegacyMask, media::AudioInputFlags, audio_input_flags_t>(
1474 legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001475 indexToEnum_bitmask<audio_input_flags_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001476 enumToMask_index<int32_t, media::AudioInputFlags>);
1477}
1478
Andy Hung973638a2020-12-08 20:47:45 -08001479ConversionResult<audio_output_flags_t> aidl2legacy_int32_t_audio_output_flags_t_mask(
1480 int32_t aidl) {
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001481 return convertBitmask<audio_output_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001482 int32_t,
1483 audio_output_flags_t,
1484 media::AudioOutputFlags>(
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001485 aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001486 indexToEnum_index<media::AudioOutputFlags>,
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001487 enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001488}
1489
Andy Hung973638a2020-12-08 20:47:45 -08001490ConversionResult<int32_t> legacy2aidl_audio_output_flags_t_int32_t_mask(
1491 audio_output_flags_t legacy) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001492 using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
1493
1494 LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1495 return convertBitmask<int32_t, LegacyMask, media::AudioOutputFlags, audio_output_flags_t>(
1496 legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08001497 indexToEnum_bitmask<audio_output_flags_t>,
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001498 enumToMask_index<int32_t, media::AudioOutputFlags>);
1499}
1500
1501ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
1502 const media::AudioIoFlags& aidl, media::AudioPortRole role, media::AudioPortType type) {
1503 audio_io_flags legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001504 Direction dir = VALUE_OR_RETURN(direction(role, type));
1505 switch (dir) {
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001506 case Direction::INPUT: {
1507 legacy.input = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001508 aidl2legacy_int32_t_audio_input_flags_t_mask(
1509 VALUE_OR_RETURN(UNION_GET(aidl, input))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001510 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001511 break;
1512
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001513 case Direction::OUTPUT: {
1514 legacy.output = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001515 aidl2legacy_int32_t_audio_output_flags_t_mask(
1516 VALUE_OR_RETURN(UNION_GET(aidl, output))));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001517 }
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001518 break;
1519 }
1520
1521 return legacy;
1522}
1523
1524ConversionResult<media::AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
1525 const audio_io_flags& legacy, audio_port_role_t role, audio_port_type_t type) {
1526 media::AudioIoFlags aidl;
1527
1528 Direction dir = VALUE_OR_RETURN(direction(role, type));
1529 switch (dir) {
1530 case Direction::INPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001531 UNION_SET(aidl, input,
Andy Hung973638a2020-12-08 20:47:45 -08001532 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(
1533 legacy.input)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001534 break;
1535 case Direction::OUTPUT:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001536 UNION_SET(aidl, output,
Andy Hung973638a2020-12-08 20:47:45 -08001537 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(
1538 legacy.output)));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001539 break;
1540 }
1541 return aidl;
1542}
1543
Andy Hung973638a2020-12-08 20:47:45 -08001544ConversionResult<audio_port_config_device_ext>
1545aidl2legacy_AudioPortConfigDeviceExt_audio_port_config_device_ext(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001546 const media::AudioPortConfigDeviceExt& aidl) {
1547 audio_port_config_device_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001548 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Mikhail Naganov932cb962021-09-16 01:05:27 +00001549 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
1550 aidl.device, &legacy.type, legacy.address));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001551 return legacy;
1552}
1553
Andy Hung973638a2020-12-08 20:47:45 -08001554ConversionResult<media::AudioPortConfigDeviceExt>
1555legacy2aidl_audio_port_config_device_ext_AudioPortConfigDeviceExt(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001556 const audio_port_config_device_ext& legacy) {
1557 media::AudioPortConfigDeviceExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001558 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Mikhail Naganov932cb962021-09-16 01:05:27 +00001559 aidl.device = VALUE_OR_RETURN(legacy2aidl_audio_device_AudioDevice(
1560 legacy.type, legacy.address));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001561 return aidl;
1562}
1563
1564ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001565 AudioStreamType aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001566 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001567 case AudioStreamType::INVALID:
1568 break; // return error
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001569 case AudioStreamType::SYS_RESERVED_DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001570 return AUDIO_STREAM_DEFAULT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001571 case AudioStreamType::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001572 return AUDIO_STREAM_VOICE_CALL;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001573 case AudioStreamType::SYSTEM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001574 return AUDIO_STREAM_SYSTEM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001575 case AudioStreamType::RING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001576 return AUDIO_STREAM_RING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001577 case AudioStreamType::MUSIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001578 return AUDIO_STREAM_MUSIC;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001579 case AudioStreamType::ALARM:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001580 return AUDIO_STREAM_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001581 case AudioStreamType::NOTIFICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001582 return AUDIO_STREAM_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001583 case AudioStreamType::BLUETOOTH_SCO:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001584 return AUDIO_STREAM_BLUETOOTH_SCO;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001585 case AudioStreamType::ENFORCED_AUDIBLE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001586 return AUDIO_STREAM_ENFORCED_AUDIBLE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001587 case AudioStreamType::DTMF:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001588 return AUDIO_STREAM_DTMF;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001589 case AudioStreamType::TTS:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001590 return AUDIO_STREAM_TTS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001591 case AudioStreamType::ACCESSIBILITY:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001592 return AUDIO_STREAM_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001593 case AudioStreamType::ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001594 return AUDIO_STREAM_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001595 case AudioStreamType::SYS_RESERVED_REROUTING:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001596 return AUDIO_STREAM_REROUTING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001597 case AudioStreamType::SYS_RESERVED_PATCH:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001598 return AUDIO_STREAM_PATCH;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001599 case AudioStreamType::CALL_ASSISTANT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001600 return AUDIO_STREAM_CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001601 }
Andy Hung3f69c162020-12-09 12:08:48 -08001602 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001603}
1604
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001605ConversionResult<AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001606 audio_stream_type_t legacy) {
1607 switch (legacy) {
1608 case AUDIO_STREAM_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001609 return AudioStreamType::SYS_RESERVED_DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001610 case AUDIO_STREAM_VOICE_CALL:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001611 return AudioStreamType::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001612 case AUDIO_STREAM_SYSTEM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001613 return AudioStreamType::SYSTEM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001614 case AUDIO_STREAM_RING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001615 return AudioStreamType::RING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001616 case AUDIO_STREAM_MUSIC:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001617 return AudioStreamType::MUSIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001618 case AUDIO_STREAM_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001619 return AudioStreamType::ALARM;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001620 case AUDIO_STREAM_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001621 return AudioStreamType::NOTIFICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001622 case AUDIO_STREAM_BLUETOOTH_SCO:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001623 return AudioStreamType::BLUETOOTH_SCO;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001624 case AUDIO_STREAM_ENFORCED_AUDIBLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001625 return AudioStreamType::ENFORCED_AUDIBLE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001626 case AUDIO_STREAM_DTMF:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001627 return AudioStreamType::DTMF;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001628 case AUDIO_STREAM_TTS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001629 return AudioStreamType::TTS;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001630 case AUDIO_STREAM_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001631 return AudioStreamType::ACCESSIBILITY;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001632 case AUDIO_STREAM_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001633 return AudioStreamType::ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001634 case AUDIO_STREAM_REROUTING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001635 return AudioStreamType::SYS_RESERVED_REROUTING;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001636 case AUDIO_STREAM_PATCH:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001637 return AudioStreamType::SYS_RESERVED_PATCH;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001638 case AUDIO_STREAM_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001639 return AudioStreamType::CALL_ASSISTANT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001640 }
Andy Hung3f69c162020-12-09 12:08:48 -08001641 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001642}
1643
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001644ConversionResult<audio_source_t> aidl2legacy_AudioSource_audio_source_t(
1645 AudioSource aidl) {
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001646 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001647 case AudioSource::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001648 return AUDIO_SOURCE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001649 case AudioSource::DEFAULT:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001650 return AUDIO_SOURCE_DEFAULT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001651 case AudioSource::MIC:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001652 return AUDIO_SOURCE_MIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001653 case AudioSource::VOICE_UPLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001654 return AUDIO_SOURCE_VOICE_UPLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001655 case AudioSource::VOICE_DOWNLINK:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001656 return AUDIO_SOURCE_VOICE_DOWNLINK;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001657 case AudioSource::VOICE_CALL:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001658 return AUDIO_SOURCE_VOICE_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001659 case AudioSource::CAMCORDER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001660 return AUDIO_SOURCE_CAMCORDER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001661 case AudioSource::VOICE_RECOGNITION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001662 return AUDIO_SOURCE_VOICE_RECOGNITION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001663 case AudioSource::VOICE_COMMUNICATION:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001664 return AUDIO_SOURCE_VOICE_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001665 case AudioSource::REMOTE_SUBMIX:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001666 return AUDIO_SOURCE_REMOTE_SUBMIX;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001667 case AudioSource::UNPROCESSED:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001668 return AUDIO_SOURCE_UNPROCESSED;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001669 case AudioSource::VOICE_PERFORMANCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001670 return AUDIO_SOURCE_VOICE_PERFORMANCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001671 case AudioSource::ECHO_REFERENCE:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001672 return AUDIO_SOURCE_ECHO_REFERENCE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001673 case AudioSource::FM_TUNER:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001674 return AUDIO_SOURCE_FM_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001675 case AudioSource::HOTWORD:
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001676 return AUDIO_SOURCE_HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001677 }
Andy Hung3f69c162020-12-09 12:08:48 -08001678 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001679}
1680
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001681ConversionResult<AudioSource> legacy2aidl_audio_source_t_AudioSource(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001682 audio_source_t legacy) {
1683 switch (legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001684 case AUDIO_SOURCE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001685 return AudioSource::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001686 case AUDIO_SOURCE_DEFAULT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001687 return AudioSource::DEFAULT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001688 case AUDIO_SOURCE_MIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001689 return AudioSource::MIC;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001690 case AUDIO_SOURCE_VOICE_UPLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001691 return AudioSource::VOICE_UPLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001692 case AUDIO_SOURCE_VOICE_DOWNLINK:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001693 return AudioSource::VOICE_DOWNLINK;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001694 case AUDIO_SOURCE_VOICE_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001695 return AudioSource::VOICE_CALL;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001696 case AUDIO_SOURCE_CAMCORDER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001697 return AudioSource::CAMCORDER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001698 case AUDIO_SOURCE_VOICE_RECOGNITION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001699 return AudioSource::VOICE_RECOGNITION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001700 case AUDIO_SOURCE_VOICE_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001701 return AudioSource::VOICE_COMMUNICATION;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001702 case AUDIO_SOURCE_REMOTE_SUBMIX:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001703 return AudioSource::REMOTE_SUBMIX;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001704 case AUDIO_SOURCE_UNPROCESSED:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001705 return AudioSource::UNPROCESSED;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001706 case AUDIO_SOURCE_VOICE_PERFORMANCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001707 return AudioSource::VOICE_PERFORMANCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001708 case AUDIO_SOURCE_ECHO_REFERENCE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001709 return AudioSource::ECHO_REFERENCE;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001710 case AUDIO_SOURCE_FM_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001711 return AudioSource::FM_TUNER;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001712 case AUDIO_SOURCE_HOTWORD:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001713 return AudioSource::HOTWORD;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001714 }
Andy Hung3f69c162020-12-09 12:08:48 -08001715 return unexpected(BAD_VALUE);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001716}
1717
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001718ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
1719 return convertReinterpret<audio_session_t>(aidl);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001720}
1721
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001722ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
1723 return convertReinterpret<int32_t>(legacy);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001724}
1725
1726// This type is unnamed in the original definition, thus we name it here.
1727using audio_port_config_mix_ext_usecase = decltype(audio_port_config_mix_ext::usecase);
1728
1729ConversionResult<audio_port_config_mix_ext_usecase> aidl2legacy_AudioPortConfigMixExtUseCase(
1730 const media::AudioPortConfigMixExtUseCase& aidl, media::AudioPortRole role) {
1731 audio_port_config_mix_ext_usecase legacy;
1732
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001733 switch (role) {
1734 case media::AudioPortRole::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001735 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001736 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001737 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001738
1739 case media::AudioPortRole::SOURCE:
1740 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001741 legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
1742 VALUE_OR_RETURN(UNION_GET(aidl, stream))));
Andy Hung3f69c162020-12-09 12:08:48 -08001743 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001744
1745 case media::AudioPortRole::SINK:
1746 // This is not a bug. A SINK role corresponds to the source field.
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001747 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001748 VALUE_OR_RETURN(UNION_GET(aidl, source))));
Andy Hung3f69c162020-12-09 12:08:48 -08001749 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001750 }
Andy Hung3f69c162020-12-09 12:08:48 -08001751 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001752}
1753
1754ConversionResult<media::AudioPortConfigMixExtUseCase> legacy2aidl_AudioPortConfigMixExtUseCase(
1755 const audio_port_config_mix_ext_usecase& legacy, audio_port_role_t role) {
1756 media::AudioPortConfigMixExtUseCase aidl;
1757
1758 switch (role) {
1759 case AUDIO_PORT_ROLE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001760 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001761 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001762 case AUDIO_PORT_ROLE_SOURCE:
1763 // This is not a bug. A SOURCE role corresponds to the stream field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001764 UNION_SET(aidl, stream, VALUE_OR_RETURN(
1765 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
Andy Hung3f69c162020-12-09 12:08:48 -08001766 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001767 case AUDIO_PORT_ROLE_SINK:
1768 // This is not a bug. A SINK role corresponds to the source field.
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001769 UNION_SET(aidl, source,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001770 VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source)));
Andy Hung3f69c162020-12-09 12:08:48 -08001771 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001772 }
Andy Hung3f69c162020-12-09 12:08:48 -08001773 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001774}
1775
1776ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortConfigMixExt(
1777 const media::AudioPortConfigMixExt& aidl, media::AudioPortRole role) {
1778 audio_port_config_mix_ext legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001779 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
1780 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001781 legacy.usecase = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigMixExtUseCase(aidl.usecase, role));
1782 return legacy;
1783}
1784
1785ConversionResult<media::AudioPortConfigMixExt> legacy2aidl_AudioPortConfigMixExt(
1786 const audio_port_config_mix_ext& legacy, audio_port_role_t role) {
1787 media::AudioPortConfigMixExt aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001788 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
1789 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001790 aidl.usecase = VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExtUseCase(legacy.usecase, role));
1791 return aidl;
1792}
1793
Andy Hung973638a2020-12-08 20:47:45 -08001794ConversionResult<audio_port_config_session_ext>
1795aidl2legacy_AudioPortConfigSessionExt_audio_port_config_session_ext(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001796 const media::AudioPortConfigSessionExt& aidl) {
1797 audio_port_config_session_ext legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001798 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001799 return legacy;
1800}
1801
Andy Hung973638a2020-12-08 20:47:45 -08001802ConversionResult<media::AudioPortConfigSessionExt>
1803legacy2aidl_audio_port_config_session_ext_AudioPortConfigSessionExt(
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001804 const audio_port_config_session_ext& legacy) {
1805 media::AudioPortConfigSessionExt aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08001806 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001807 return aidl;
1808}
1809
1810// This type is unnamed in the original definition, thus we name it here.
1811using audio_port_config_ext = decltype(audio_port_config::ext);
1812
1813ConversionResult<audio_port_config_ext> aidl2legacy_AudioPortConfigExt(
1814 const media::AudioPortConfigExt& aidl, media::AudioPortType type,
1815 media::AudioPortRole role) {
1816 audio_port_config_ext legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001817 switch (type) {
1818 case media::AudioPortType::NONE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001819 // Just verify that the union is empty.
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001820 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08001821 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001822 case media::AudioPortType::DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001823 legacy.device = VALUE_OR_RETURN(
Andy Hung973638a2020-12-08 20:47:45 -08001824 aidl2legacy_AudioPortConfigDeviceExt_audio_port_config_device_ext(
1825 VALUE_OR_RETURN(UNION_GET(aidl, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08001826 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001827 case media::AudioPortType::MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001828 legacy.mix = VALUE_OR_RETURN(
1829 aidl2legacy_AudioPortConfigMixExt(VALUE_OR_RETURN(UNION_GET(aidl, mix)), role));
Andy Hung3f69c162020-12-09 12:08:48 -08001830 return legacy;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001831 case media::AudioPortType::SESSION:
Andy Hung973638a2020-12-08 20:47:45 -08001832 legacy.session = VALUE_OR_RETURN(
1833 aidl2legacy_AudioPortConfigSessionExt_audio_port_config_session_ext(
1834 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08001835 return legacy;
1836
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001837 }
Andy Hung3f69c162020-12-09 12:08:48 -08001838 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001839}
1840
1841ConversionResult<media::AudioPortConfigExt> legacy2aidl_AudioPortConfigExt(
1842 const audio_port_config_ext& legacy, audio_port_type_t type, audio_port_role_t role) {
1843 media::AudioPortConfigExt aidl;
1844
1845 switch (type) {
1846 case AUDIO_PORT_TYPE_NONE:
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08001847 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08001848 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001849 case AUDIO_PORT_TYPE_DEVICE:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001850 UNION_SET(aidl, device,
Andy Hung973638a2020-12-08 20:47:45 -08001851 VALUE_OR_RETURN(
1852 legacy2aidl_audio_port_config_device_ext_AudioPortConfigDeviceExt(
1853 legacy.device)));
Andy Hung3f69c162020-12-09 12:08:48 -08001854 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001855 case AUDIO_PORT_TYPE_MIX:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001856 UNION_SET(aidl, mix,
1857 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigMixExt(legacy.mix, role)));
Andy Hung3f69c162020-12-09 12:08:48 -08001858 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001859 case AUDIO_PORT_TYPE_SESSION:
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07001860 UNION_SET(aidl, session,
Andy Hung973638a2020-12-08 20:47:45 -08001861 VALUE_OR_RETURN(
1862 legacy2aidl_audio_port_config_session_ext_AudioPortConfigSessionExt(
1863 legacy.session)));
Andy Hung3f69c162020-12-09 12:08:48 -08001864 return aidl;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001865 }
Andy Hung3f69c162020-12-09 12:08:48 -08001866 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001867}
1868
1869ConversionResult<audio_port_config> aidl2legacy_AudioPortConfig_audio_port_config(
1870 const media::AudioPortConfig& aidl) {
1871 audio_port_config legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001872 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001873 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
1874 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
1875 legacy.config_mask = VALUE_OR_RETURN(aidl2legacy_int32_t_config_mask(aidl.configMask));
1876 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::SAMPLE_RATE)) {
1877 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sampleRate));
1878 }
1879 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::CHANNEL_MASK)) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001880 const bool isInput = VALUE_OR_RETURN(direction(aidl.role, aidl.type)) == Direction::INPUT;
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001881 legacy.channel_mask =
Mikhail Naganov2d8df4e2021-06-03 13:59:13 -07001882 VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001883 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
1884 aidl.channelMask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001885 }
1886 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FORMAT)) {
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001887 legacy.format = VALUE_OR_RETURN(
1888 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001889 }
1890 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::GAIN)) {
1891 legacy.gain = VALUE_OR_RETURN(
1892 aidl2legacy_AudioGainConfig_audio_gain_config(aidl.gain, aidl.role, aidl.type));
1893 }
1894 if (bitmaskIsSet(aidl.configMask, media::AudioPortConfigType::FLAGS)) {
1895 legacy.flags = VALUE_OR_RETURN(
1896 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags, aidl.role, aidl.type));
1897 }
1898 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortConfigExt(aidl.ext, aidl.type, aidl.role));
1899 return legacy;
1900}
1901
1902ConversionResult<media::AudioPortConfig> legacy2aidl_audio_port_config_AudioPortConfig(
1903 const audio_port_config& legacy) {
1904 media::AudioPortConfig aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001905 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001906 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
1907 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
1908 aidl.configMask = VALUE_OR_RETURN(legacy2aidl_config_mask_int32_t(legacy.config_mask));
1909 if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
1910 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
1911 }
1912 if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001913 const bool isInput = VALUE_OR_RETURN(
1914 direction(legacy.role, legacy.type)) == Direction::INPUT;
1915 aidl.channelMask = VALUE_OR_RETURN(
1916 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001917 }
1918 if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001919 aidl.format = VALUE_OR_RETURN(
1920 legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001921 }
1922 if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
1923 aidl.gain = VALUE_OR_RETURN(legacy2aidl_audio_gain_config_AudioGainConfig(
1924 legacy.gain, legacy.role, legacy.type));
1925 }
1926 if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
1927 aidl.flags = VALUE_OR_RETURN(
1928 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, legacy.role, legacy.type));
1929 }
1930 aidl.ext =
1931 VALUE_OR_RETURN(legacy2aidl_AudioPortConfigExt(legacy.ext, legacy.type, legacy.role));
1932 return aidl;
1933}
1934
1935ConversionResult<struct audio_patch> aidl2legacy_AudioPatch_audio_patch(
1936 const media::AudioPatch& aidl) {
1937 struct audio_patch legacy;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001938 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_patch_handle_t(aidl.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001939 legacy.num_sinks = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sinks.size()));
1940 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1941 return unexpected(BAD_VALUE);
1942 }
1943 for (size_t i = 0; i < legacy.num_sinks; ++i) {
1944 legacy.sinks[i] =
1945 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sinks[i]));
1946 }
1947 legacy.num_sources = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.sources.size()));
1948 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1949 return unexpected(BAD_VALUE);
1950 }
1951 for (size_t i = 0; i < legacy.num_sources; ++i) {
1952 legacy.sources[i] =
1953 VALUE_OR_RETURN(aidl2legacy_AudioPortConfig_audio_port_config(aidl.sources[i]));
1954 }
1955 return legacy;
1956}
1957
1958ConversionResult<media::AudioPatch> legacy2aidl_audio_patch_AudioPatch(
1959 const struct audio_patch& legacy) {
1960 media::AudioPatch aidl;
Ytai Ben-Tsvi49298c52020-10-15 10:56:48 -07001961 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_patch_handle_t_int32_t(legacy.id));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001962
1963 if (legacy.num_sinks > AUDIO_PATCH_PORTS_MAX) {
1964 return unexpected(BAD_VALUE);
1965 }
1966 for (unsigned int i = 0; i < legacy.num_sinks; ++i) {
1967 aidl.sinks.push_back(
1968 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sinks[i])));
1969 }
1970 if (legacy.num_sources > AUDIO_PATCH_PORTS_MAX) {
1971 return unexpected(BAD_VALUE);
1972 }
1973 for (unsigned int i = 0; i < legacy.num_sources; ++i) {
1974 aidl.sources.push_back(
1975 VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(legacy.sources[i])));
1976 }
1977 return aidl;
1978}
1979
1980ConversionResult<sp<AudioIoDescriptor>> aidl2legacy_AudioIoDescriptor_AudioIoDescriptor(
1981 const media::AudioIoDescriptor& aidl) {
Mikhail Naganov88536df2021-07-26 17:30:29 -07001982 const audio_io_handle_t io_handle = VALUE_OR_RETURN(
1983 aidl2legacy_int32_t_audio_io_handle_t(aidl.ioHandle));
1984 const struct audio_patch patch = VALUE_OR_RETURN(
1985 aidl2legacy_AudioPatch_audio_patch(aidl.patch));
1986 const bool isInput = aidl.isInput;
1987 const uint32_t sampling_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.samplingRate));
1988 const audio_format_t format = VALUE_OR_RETURN(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001989 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001990 const audio_channel_mask_t channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001991 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganov88536df2021-07-26 17:30:29 -07001992 const size_t frame_count = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
1993 const size_t frame_count_hal = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCountHAL));
1994 const uint32_t latency = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.latency));
1995 const audio_port_handle_t port_id = VALUE_OR_RETURN(
1996 aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
1997 return sp<AudioIoDescriptor>::make(io_handle, patch, isInput, sampling_rate, format,
1998 channel_mask, frame_count, frame_count_hal, latency, port_id);
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07001999}
2000
2001ConversionResult<media::AudioIoDescriptor> legacy2aidl_AudioIoDescriptor_AudioIoDescriptor(
2002 const sp<AudioIoDescriptor>& legacy) {
2003 media::AudioIoDescriptor aidl;
Mikhail Naganov88536df2021-07-26 17:30:29 -07002004 aidl.ioHandle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy->getIoHandle()));
2005 aidl.patch = VALUE_OR_RETURN(legacy2aidl_audio_patch_AudioPatch(legacy->getPatch()));
2006 aidl.isInput = legacy->getIsInput();
2007 aidl.samplingRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getSamplingRate()));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002008 aidl.format = VALUE_OR_RETURN(
Mikhail Naganov88536df2021-07-26 17:30:29 -07002009 legacy2aidl_audio_format_t_AudioFormatDescription(legacy->getFormat()));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002010 aidl.channelMask = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
2011 legacy->getChannelMask(), legacy->getIsInput()));
Mikhail Naganov88536df2021-07-26 17:30:29 -07002012 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCount()));
2013 aidl.frameCountHAL = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy->getFrameCountHAL()));
2014 aidl.latency = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy->getLatency()));
2015 aidl.portId = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy->getPortId()));
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07002016 return aidl;
2017}
2018
Andy Hung973638a2020-12-08 20:47:45 -08002019ConversionResult<AudioClient> aidl2legacy_AudioClient_AudioClient(
2020 const media::AudioClient& aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002021 AudioClient legacy;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002022 legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002023 legacy.attributionSource = aidl.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002024 return legacy;
2025}
2026
Andy Hung973638a2020-12-08 20:47:45 -08002027ConversionResult<media::AudioClient> legacy2aidl_AudioClient_AudioClient(
2028 const AudioClient& legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002029 media::AudioClient aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002030 aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002031 aidl.attributionSource = legacy.attributionSource;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002032 return aidl;
2033}
2034
2035ConversionResult<audio_content_type_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002036aidl2legacy_AudioContentType_audio_content_type_t(AudioContentType aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002037 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002038 case AudioContentType::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002039 return AUDIO_CONTENT_TYPE_UNKNOWN;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002040 case AudioContentType::SPEECH:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002041 return AUDIO_CONTENT_TYPE_SPEECH;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002042 case AudioContentType::MUSIC:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002043 return AUDIO_CONTENT_TYPE_MUSIC;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002044 case AudioContentType::MOVIE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002045 return AUDIO_CONTENT_TYPE_MOVIE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002046 case AudioContentType::SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002047 return AUDIO_CONTENT_TYPE_SONIFICATION;
2048 }
2049 return unexpected(BAD_VALUE);
2050}
2051
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002052ConversionResult<AudioContentType>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002053legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
2054 switch (legacy) {
2055 case AUDIO_CONTENT_TYPE_UNKNOWN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002056 return AudioContentType::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002057 case AUDIO_CONTENT_TYPE_SPEECH:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002058 return AudioContentType::SPEECH;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002059 case AUDIO_CONTENT_TYPE_MUSIC:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002060 return AudioContentType::MUSIC;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002061 case AUDIO_CONTENT_TYPE_MOVIE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002062 return AudioContentType::MOVIE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002063 case AUDIO_CONTENT_TYPE_SONIFICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002064 return AudioContentType::SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002065 }
2066 return unexpected(BAD_VALUE);
2067}
2068
2069ConversionResult<audio_usage_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002070aidl2legacy_AudioUsage_audio_usage_t(AudioUsage aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002071 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002072 case AudioUsage::INVALID:
2073 break; // return error
2074 case AudioUsage::UNKNOWN:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002075 return AUDIO_USAGE_UNKNOWN;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002076 case AudioUsage::MEDIA:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002077 return AUDIO_USAGE_MEDIA;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002078 case AudioUsage::VOICE_COMMUNICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002079 return AUDIO_USAGE_VOICE_COMMUNICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002080 case AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002081 return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002082 case AudioUsage::ALARM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002083 return AUDIO_USAGE_ALARM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002084 case AudioUsage::NOTIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002085 return AUDIO_USAGE_NOTIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002086 case AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002087 return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002088 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002089 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002090 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002091 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002092 case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002093 return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002094 case AudioUsage::NOTIFICATION_EVENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002095 return AUDIO_USAGE_NOTIFICATION_EVENT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002096 case AudioUsage::ASSISTANCE_ACCESSIBILITY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002097 return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002098 case AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002099 return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002100 case AudioUsage::ASSISTANCE_SONIFICATION:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002101 return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002102 case AudioUsage::GAME:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002103 return AUDIO_USAGE_GAME;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002104 case AudioUsage::VIRTUAL_SOURCE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002105 return AUDIO_USAGE_VIRTUAL_SOURCE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002106 case AudioUsage::ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002107 return AUDIO_USAGE_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002108 case AudioUsage::CALL_ASSISTANT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002109 return AUDIO_USAGE_CALL_ASSISTANT;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002110 case AudioUsage::EMERGENCY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002111 return AUDIO_USAGE_EMERGENCY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002112 case AudioUsage::SAFETY:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002113 return AUDIO_USAGE_SAFETY;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002114 case AudioUsage::VEHICLE_STATUS:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002115 return AUDIO_USAGE_VEHICLE_STATUS;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002116 case AudioUsage::ANNOUNCEMENT:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002117 return AUDIO_USAGE_ANNOUNCEMENT;
2118 }
2119 return unexpected(BAD_VALUE);
2120}
2121
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002122ConversionResult<AudioUsage>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002123legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
2124 switch (legacy) {
2125 case AUDIO_USAGE_UNKNOWN:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002126 return AudioUsage::UNKNOWN;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002127 case AUDIO_USAGE_MEDIA:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002128 return AudioUsage::MEDIA;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002129 case AUDIO_USAGE_VOICE_COMMUNICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002130 return AudioUsage::VOICE_COMMUNICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002131 case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002132 return AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002133 case AUDIO_USAGE_ALARM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002134 return AudioUsage::ALARM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002135 case AUDIO_USAGE_NOTIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002136 return AudioUsage::NOTIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002137 case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002138 return AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002139 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002140 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002141 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002142 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002143 case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002144 return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002145 case AUDIO_USAGE_NOTIFICATION_EVENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002146 return AudioUsage::NOTIFICATION_EVENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002147 case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002148 return AudioUsage::ASSISTANCE_ACCESSIBILITY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002149 case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002150 return AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002151 case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002152 return AudioUsage::ASSISTANCE_SONIFICATION;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002153 case AUDIO_USAGE_GAME:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002154 return AudioUsage::GAME;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002155 case AUDIO_USAGE_VIRTUAL_SOURCE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002156 return AudioUsage::VIRTUAL_SOURCE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002157 case AUDIO_USAGE_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002158 return AudioUsage::ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002159 case AUDIO_USAGE_CALL_ASSISTANT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002160 return AudioUsage::CALL_ASSISTANT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002161 case AUDIO_USAGE_EMERGENCY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002162 return AudioUsage::EMERGENCY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002163 case AUDIO_USAGE_SAFETY:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002164 return AudioUsage::SAFETY;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002165 case AUDIO_USAGE_VEHICLE_STATUS:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002166 return AudioUsage::VEHICLE_STATUS;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002167 case AUDIO_USAGE_ANNOUNCEMENT:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002168 return AudioUsage::ANNOUNCEMENT;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002169 }
2170 return unexpected(BAD_VALUE);
2171}
2172
2173ConversionResult<audio_flags_mask_t>
2174aidl2legacy_AudioFlag_audio_flags_mask_t(media::AudioFlag aidl) {
2175 switch (aidl) {
2176 case media::AudioFlag::AUDIBILITY_ENFORCED:
2177 return AUDIO_FLAG_AUDIBILITY_ENFORCED;
2178 case media::AudioFlag::SECURE:
2179 return AUDIO_FLAG_SECURE;
2180 case media::AudioFlag::SCO:
2181 return AUDIO_FLAG_SCO;
2182 case media::AudioFlag::BEACON:
2183 return AUDIO_FLAG_BEACON;
2184 case media::AudioFlag::HW_AV_SYNC:
2185 return AUDIO_FLAG_HW_AV_SYNC;
2186 case media::AudioFlag::HW_HOTWORD:
2187 return AUDIO_FLAG_HW_HOTWORD;
2188 case media::AudioFlag::BYPASS_INTERRUPTION_POLICY:
2189 return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
2190 case media::AudioFlag::BYPASS_MUTE:
2191 return AUDIO_FLAG_BYPASS_MUTE;
2192 case media::AudioFlag::LOW_LATENCY:
2193 return AUDIO_FLAG_LOW_LATENCY;
2194 case media::AudioFlag::DEEP_BUFFER:
2195 return AUDIO_FLAG_DEEP_BUFFER;
2196 case media::AudioFlag::NO_MEDIA_PROJECTION:
2197 return AUDIO_FLAG_NO_MEDIA_PROJECTION;
2198 case media::AudioFlag::MUTE_HAPTIC:
2199 return AUDIO_FLAG_MUTE_HAPTIC;
2200 case media::AudioFlag::NO_SYSTEM_CAPTURE:
2201 return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
2202 case media::AudioFlag::CAPTURE_PRIVATE:
2203 return AUDIO_FLAG_CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002204 case media::AudioFlag::CONTENT_SPATIALIZED:
2205 return AUDIO_FLAG_CONTENT_SPATIALIZED;
2206 case media::AudioFlag::NEVER_SPATIALIZE:
2207 return AUDIO_FLAG_NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002208 }
2209 return unexpected(BAD_VALUE);
2210}
2211
2212ConversionResult<media::AudioFlag>
2213legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
2214 switch (legacy) {
2215 case AUDIO_FLAG_NONE:
2216 return unexpected(BAD_VALUE);
2217 case AUDIO_FLAG_AUDIBILITY_ENFORCED:
2218 return media::AudioFlag::AUDIBILITY_ENFORCED;
2219 case AUDIO_FLAG_SECURE:
2220 return media::AudioFlag::SECURE;
2221 case AUDIO_FLAG_SCO:
2222 return media::AudioFlag::SCO;
2223 case AUDIO_FLAG_BEACON:
2224 return media::AudioFlag::BEACON;
2225 case AUDIO_FLAG_HW_AV_SYNC:
2226 return media::AudioFlag::HW_AV_SYNC;
2227 case AUDIO_FLAG_HW_HOTWORD:
2228 return media::AudioFlag::HW_HOTWORD;
2229 case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
2230 return media::AudioFlag::BYPASS_INTERRUPTION_POLICY;
2231 case AUDIO_FLAG_BYPASS_MUTE:
2232 return media::AudioFlag::BYPASS_MUTE;
2233 case AUDIO_FLAG_LOW_LATENCY:
2234 return media::AudioFlag::LOW_LATENCY;
2235 case AUDIO_FLAG_DEEP_BUFFER:
2236 return media::AudioFlag::DEEP_BUFFER;
2237 case AUDIO_FLAG_NO_MEDIA_PROJECTION:
2238 return media::AudioFlag::NO_MEDIA_PROJECTION;
2239 case AUDIO_FLAG_MUTE_HAPTIC:
2240 return media::AudioFlag::MUTE_HAPTIC;
2241 case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
2242 return media::AudioFlag::NO_SYSTEM_CAPTURE;
2243 case AUDIO_FLAG_CAPTURE_PRIVATE:
2244 return media::AudioFlag::CAPTURE_PRIVATE;
Eric Laurentac08f912021-08-25 15:01:05 +02002245 case AUDIO_FLAG_CONTENT_SPATIALIZED:
2246 return media::AudioFlag::CONTENT_SPATIALIZED;
2247 case AUDIO_FLAG_NEVER_SPATIALIZE:
2248 return media::AudioFlag::NEVER_SPATIALIZE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002249 }
2250 return unexpected(BAD_VALUE);
2251}
2252
2253ConversionResult<audio_flags_mask_t>
2254aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
2255 return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, media::AudioFlag>(
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002256 aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, indexToEnum_index<media::AudioFlag>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002257 enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
2258}
2259
2260ConversionResult<int32_t>
2261legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
2262 return convertBitmask<int32_t, audio_flags_mask_t, media::AudioFlag, audio_flags_mask_t>(
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002263 legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002264 indexToEnum_bitmask<audio_flags_mask_t>,
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002265 enumToMask_index<int32_t, media::AudioFlag>);
2266}
2267
2268ConversionResult<audio_attributes_t>
2269aidl2legacy_AudioAttributesInternal_audio_attributes_t(const media::AudioAttributesInternal& aidl) {
2270 audio_attributes_t legacy;
2271 legacy.content_type = VALUE_OR_RETURN(
2272 aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
2273 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002274 legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002275 legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
2276 RETURN_IF_ERROR(aidl2legacy_string(aidl.tags, legacy.tags, sizeof(legacy.tags)));
2277 return legacy;
2278}
2279
2280ConversionResult<media::AudioAttributesInternal>
2281legacy2aidl_audio_attributes_t_AudioAttributesInternal(const audio_attributes_t& legacy) {
2282 media::AudioAttributesInternal aidl;
2283 aidl.contentType = VALUE_OR_RETURN(
2284 legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
2285 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002286 aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002287 aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
2288 aidl.tags = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
2289 return aidl;
2290}
2291
2292ConversionResult<audio_encapsulation_mode_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002293aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(AudioEncapsulationMode aidl) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002294 switch (aidl) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002295 case AudioEncapsulationMode::INVALID:
2296 break; // return error
2297 case AudioEncapsulationMode::NONE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002298 return AUDIO_ENCAPSULATION_MODE_NONE;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002299 case AudioEncapsulationMode::ELEMENTARY_STREAM:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002300 return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002301 case AudioEncapsulationMode::HANDLE:
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002302 return AUDIO_ENCAPSULATION_MODE_HANDLE;
2303 }
2304 return unexpected(BAD_VALUE);
2305}
2306
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002307ConversionResult<AudioEncapsulationMode>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002308legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002309 switch (legacy) {
2310 case AUDIO_ENCAPSULATION_MODE_NONE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002311 return AudioEncapsulationMode::NONE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002312 case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002313 return AudioEncapsulationMode::ELEMENTARY_STREAM;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002314 case AUDIO_ENCAPSULATION_MODE_HANDLE:
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002315 return AudioEncapsulationMode::HANDLE;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002316 }
2317 return unexpected(BAD_VALUE);
2318}
2319
2320ConversionResult<audio_offload_info_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002321aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const AudioOffloadInfo& aidl) {
2322 audio_offload_info_t legacy = AUDIO_INFO_INITIALIZER;
2323 audio_config_base_t base = VALUE_OR_RETURN(
2324 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, false /*isInput*/));
2325 legacy.sample_rate = base.sample_rate;
2326 legacy.channel_mask = base.channel_mask;
2327 legacy.format = base.format;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002328 legacy.stream_type = VALUE_OR_RETURN(
2329 aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002330 legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitRatePerSecond));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002331 legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
2332 legacy.has_video = aidl.hasVideo;
2333 legacy.is_streaming = aidl.isStreaming;
2334 legacy.bit_width = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.bitWidth));
2335 legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.offloadBufferSize));
2336 legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
2337 legacy.encapsulation_mode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002338 aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002339 legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
2340 legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
2341 return legacy;
2342}
2343
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002344ConversionResult<AudioOffloadInfo>
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002345legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002346 AudioOffloadInfo aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002347 // Version 0.1 fields.
2348 if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
2349 return unexpected(BAD_VALUE);
2350 }
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002351 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2352 .channel_mask = legacy.channel_mask, .format = legacy.format };
2353 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(
2354 base, false /*isInput*/));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002355 aidl.streamType = VALUE_OR_RETURN(
2356 legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002357 aidl.bitRatePerSecond = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002358 aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
2359 aidl.hasVideo = legacy.has_video;
2360 aidl.isStreaming = legacy.is_streaming;
2361 aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
2362 aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
2363 aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
2364
2365 // Version 0.2 fields.
2366 if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
2367 if (legacy.size <
2368 offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
2369 return unexpected(BAD_VALUE);
2370 }
2371 aidl.encapsulationMode = VALUE_OR_RETURN(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002372 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002373 legacy.encapsulation_mode));
2374 aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
2375 aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
2376 }
2377 return aidl;
2378}
2379
2380ConversionResult<audio_config_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002381aidl2legacy_AudioConfig_audio_config_t(const AudioConfig& aidl, bool isInput) {
2382 const audio_config_base_t legacyBase = VALUE_OR_RETURN(
2383 aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, isInput));
2384 audio_config_t legacy = AUDIO_CONFIG_INITIALIZER;
2385 legacy.sample_rate = legacyBase.sample_rate;
2386 legacy.channel_mask = legacyBase.channel_mask;
2387 legacy.format = legacyBase.format;
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002388 legacy.offload_info = VALUE_OR_RETURN(
2389 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002390 legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
2391 return legacy;
2392}
2393
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002394ConversionResult<AudioConfig>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002395legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002396 const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2397 .channel_mask = legacy.channel_mask, .format = legacy.format };
2398 AudioConfig aidl;
2399 aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(base, isInput));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002400 aidl.offloadInfo = VALUE_OR_RETURN(
2401 legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002402 aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
2403 return aidl;
2404}
2405
2406ConversionResult<audio_config_base_t>
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002407aidl2legacy_AudioConfigBase_audio_config_base_t(const AudioConfigBase& aidl, bool isInput) {
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002408 audio_config_base_t legacy;
2409 legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sampleRate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002410 legacy.channel_mask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002411 aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002412 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002413 return legacy;
2414}
2415
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002416ConversionResult<AudioConfigBase>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002417legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy, bool isInput) {
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002418 AudioConfigBase aidl;
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002419 aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
Ytai Ben-Tsvia3815202020-10-28 14:58:08 -07002420 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002421 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002422 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi4dfeb622020-11-02 12:47:30 -08002423 return aidl;
2424}
2425
2426ConversionResult<sp<IMemory>>
2427aidl2legacy_SharedFileRegion_IMemory(const media::SharedFileRegion& aidl) {
2428 sp<IMemory> legacy;
2429 if (!convertSharedFileRegionToIMemory(aidl, &legacy)) {
2430 return unexpected(BAD_VALUE);
2431 }
2432 return legacy;
2433}
2434
2435ConversionResult<media::SharedFileRegion>
2436legacy2aidl_IMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2437 media::SharedFileRegion aidl;
2438 if (!convertIMemoryToSharedFileRegion(legacy, &aidl)) {
2439 return unexpected(BAD_VALUE);
2440 }
2441 return aidl;
2442}
2443
2444ConversionResult<sp<IMemory>>
2445aidl2legacy_NullableSharedFileRegion_IMemory(const std::optional<media::SharedFileRegion>& aidl) {
2446 sp<IMemory> legacy;
2447 if (!convertNullableSharedFileRegionToIMemory(aidl, &legacy)) {
2448 return unexpected(BAD_VALUE);
2449 }
2450 return legacy;
2451}
2452
2453ConversionResult<std::optional<media::SharedFileRegion>>
2454legacy2aidl_NullableIMemory_SharedFileRegion(const sp<IMemory>& legacy) {
2455 std::optional<media::SharedFileRegion> aidl;
2456 if (!convertNullableIMemoryToSharedFileRegion(legacy, &aidl)) {
2457 return unexpected(BAD_VALUE);
2458 }
2459 return aidl;
2460}
2461
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002462ConversionResult<AudioTimestamp>
Andy Hung973638a2020-12-08 20:47:45 -08002463aidl2legacy_AudioTimestampInternal_AudioTimestamp(const media::AudioTimestampInternal& aidl) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002464 AudioTimestamp legacy;
2465 legacy.mPosition = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.position));
2466 legacy.mTime.tv_sec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.sec));
2467 legacy.mTime.tv_nsec = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.nsec));
2468 return legacy;
2469}
2470
2471ConversionResult<media::AudioTimestampInternal>
Andy Hung973638a2020-12-08 20:47:45 -08002472legacy2aidl_AudioTimestamp_AudioTimestampInternal(const AudioTimestamp& legacy) {
Ytai Ben-Tsvibdc293a2020-11-02 17:01:38 -08002473 media::AudioTimestampInternal aidl;
2474 aidl.position = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mPosition));
2475 aidl.sec = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.mTime.tv_sec));
2476 aidl.nsec = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.mTime.tv_nsec));
2477 return aidl;
2478}
2479
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002480ConversionResult<audio_uuid_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002481aidl2legacy_AudioUuid_audio_uuid_t(const AudioUuid& aidl) {
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002482 audio_uuid_t legacy;
2483 legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
2484 legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
2485 legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
2486 legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
2487 if (aidl.node.size() != std::size(legacy.node)) {
2488 return unexpected(BAD_VALUE);
2489 }
2490 std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
2491 return legacy;
2492}
2493
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002494ConversionResult<AudioUuid>
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002495legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002496 AudioUuid aidl;
Ytai Ben-Tsvice182942020-11-04 14:48:01 -08002497 aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
2498 aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
2499 aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
2500 aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
2501 std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
2502 return aidl;
2503}
2504
2505ConversionResult<effect_descriptor_t>
2506aidl2legacy_EffectDescriptor_effect_descriptor_t(const media::EffectDescriptor& aidl) {
2507 effect_descriptor_t legacy;
2508 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.type));
2509 legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.uuid));
2510 legacy.apiVersion = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.apiVersion));
2511 legacy.flags = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.flags));
2512 legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.cpuLoad));
2513 legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.memoryUsage));
2514 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2515 RETURN_IF_ERROR(
2516 aidl2legacy_string(aidl.implementor, legacy.implementor, sizeof(legacy.implementor)));
2517 return legacy;
2518}
2519
2520ConversionResult<media::EffectDescriptor>
2521legacy2aidl_effect_descriptor_t_EffectDescriptor(const effect_descriptor_t& legacy) {
2522 media::EffectDescriptor aidl;
2523 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
2524 aidl.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
2525 aidl.apiVersion = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.apiVersion));
2526 aidl.flags = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.flags));
2527 aidl.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
2528 aidl.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
2529 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2530 aidl.implementor = VALUE_OR_RETURN(
2531 legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
2532 return aidl;
2533}
2534
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002535ConversionResult<audio_encapsulation_metadata_type_t>
2536aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002537 AudioEncapsulationMetadataType aidl) {
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002538 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002539 case AudioEncapsulationMetadataType::NONE:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002540 return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002541 case AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002542 return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002543 case AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002544 return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
2545 }
2546 return unexpected(BAD_VALUE);
2547}
2548
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002549ConversionResult<AudioEncapsulationMetadataType>
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002550legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
2551 audio_encapsulation_metadata_type_t legacy) {
2552 switch (legacy) {
2553 case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002554 return AudioEncapsulationMetadataType::NONE;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002555 case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002556 return AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002557 case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002558 return AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002559 }
2560 return unexpected(BAD_VALUE);
2561}
2562
2563ConversionResult<uint32_t>
2564aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
2565 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002566 int32_t,
2567 audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002568 AudioEncapsulationMode>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002569 aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002570 indexToEnum_index<AudioEncapsulationMode>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002571 enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
2572}
2573
2574ConversionResult<int32_t>
2575legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
2576 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002577 uint32_t,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002578 AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002579 audio_encapsulation_mode_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002580 legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002581 indexToEnum_index<audio_encapsulation_mode_t>,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002582 enumToMask_index<int32_t, AudioEncapsulationMode>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002583}
2584
2585ConversionResult<uint32_t>
2586aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
2587 return convertBitmask<uint32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002588 int32_t,
2589 audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002590 AudioEncapsulationMetadataType>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002591 aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002592 indexToEnum_index<AudioEncapsulationMetadataType>,
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002593 enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
2594}
2595
2596ConversionResult<int32_t>
2597legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
2598 return convertBitmask<int32_t,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002599 uint32_t,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002600 AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002601 audio_encapsulation_metadata_type_t>(
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002602 legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
Ytai Ben-Tsvi08c7d9e2020-12-16 14:32:56 -08002603 indexToEnum_index<audio_encapsulation_metadata_type_t>,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002604 enumToMask_index<int32_t, AudioEncapsulationMetadataType>);
Ytai Ben-Tsvi50e016a2020-11-12 14:26:12 -08002605}
2606
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002607ConversionResult<audio_mix_latency_class_t>
2608aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(
2609 media::AudioMixLatencyClass aidl) {
2610 switch (aidl) {
2611 case media::AudioMixLatencyClass::LOW:
2612 return AUDIO_LATENCY_LOW;
2613 case media::AudioMixLatencyClass::NORMAL:
2614 return AUDIO_LATENCY_NORMAL;
2615 }
2616 return unexpected(BAD_VALUE);
2617}
2618
2619ConversionResult<media::AudioMixLatencyClass>
2620legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(
2621 audio_mix_latency_class_t legacy) {
2622 switch (legacy) {
2623 case AUDIO_LATENCY_LOW:
2624 return media::AudioMixLatencyClass::LOW;
2625 case AUDIO_LATENCY_NORMAL:
2626 return media::AudioMixLatencyClass::NORMAL;
2627 }
2628 return unexpected(BAD_VALUE);
2629}
2630
2631ConversionResult<audio_port_device_ext>
2632aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const media::AudioPortDeviceExt& aidl) {
2633 audio_port_device_ext legacy;
2634 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
Mikhail Naganov932cb962021-09-16 01:05:27 +00002635 RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
2636 aidl.device, &legacy.type, legacy.address));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002637 legacy.encapsulation_modes = VALUE_OR_RETURN(
2638 aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
2639 legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
2640 aidl2legacy_AudioEncapsulationMetadataType_mask(aidl.encapsulationMetadataTypes));
2641 return legacy;
2642}
2643
2644ConversionResult<media::AudioPortDeviceExt>
2645legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext& legacy) {
2646 media::AudioPortDeviceExt aidl;
2647 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
Mikhail Naganov932cb962021-09-16 01:05:27 +00002648 aidl.device = VALUE_OR_RETURN(legacy2aidl_audio_device_AudioDevice(
2649 legacy.type, legacy.address));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002650 aidl.encapsulationModes = VALUE_OR_RETURN(
2651 legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
2652 aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
2653 legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
2654 return aidl;
2655}
2656
2657ConversionResult<audio_port_mix_ext>
2658aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const media::AudioPortMixExt& aidl) {
2659 audio_port_mix_ext legacy;
2660 legacy.hw_module = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_module_handle_t(aidl.hwModule));
2661 legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
2662 legacy.latency_class = VALUE_OR_RETURN(
2663 aidl2legacy_AudioMixLatencyClass_audio_mix_latency_class_t(aidl.latencyClass));
2664 return legacy;
2665}
2666
2667ConversionResult<media::AudioPortMixExt>
2668legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext& legacy) {
2669 media::AudioPortMixExt aidl;
2670 aidl.hwModule = VALUE_OR_RETURN(legacy2aidl_audio_module_handle_t_int32_t(legacy.hw_module));
2671 aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
2672 aidl.latencyClass = VALUE_OR_RETURN(
2673 legacy2aidl_audio_mix_latency_class_t_AudioMixLatencyClass(legacy.latency_class));
2674 return aidl;
2675}
2676
2677ConversionResult<audio_port_session_ext>
2678aidl2legacy_AudioPortSessionExt_audio_port_session_ext(const media::AudioPortSessionExt& aidl) {
2679 audio_port_session_ext legacy;
2680 legacy.session = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_session_t(aidl.session));
2681 return legacy;
2682}
2683
2684ConversionResult<media::AudioPortSessionExt>
2685legacy2aidl_audio_port_session_ext_AudioPortSessionExt(const audio_port_session_ext& legacy) {
2686 media::AudioPortSessionExt aidl;
2687 aidl.session = VALUE_OR_RETURN(legacy2aidl_audio_session_t_int32_t(legacy.session));
2688 return aidl;
2689}
2690
2691// This type is unnamed in the original definition, thus we name it here.
2692using audio_port_v7_ext = decltype(audio_port_v7::ext);
2693
2694ConversionResult<audio_port_v7_ext> aidl2legacy_AudioPortExt(
2695 const media::AudioPortExt& aidl, media::AudioPortType type) {
2696 audio_port_v7_ext legacy;
2697 switch (type) {
2698 case media::AudioPortType::NONE:
2699 // Just verify that the union is empty.
2700 VALUE_OR_RETURN(UNION_GET(aidl, unspecified));
Andy Hung3f69c162020-12-09 12:08:48 -08002701 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002702 case media::AudioPortType::DEVICE:
2703 legacy.device = VALUE_OR_RETURN(
2704 aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
2705 VALUE_OR_RETURN(UNION_GET(aidl, device))));
Andy Hung3f69c162020-12-09 12:08:48 -08002706 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002707 case media::AudioPortType::MIX:
2708 legacy.mix = VALUE_OR_RETURN(
2709 aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
2710 VALUE_OR_RETURN(UNION_GET(aidl, mix))));
Andy Hung3f69c162020-12-09 12:08:48 -08002711 return legacy;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002712 case media::AudioPortType::SESSION:
2713 legacy.session = VALUE_OR_RETURN(aidl2legacy_AudioPortSessionExt_audio_port_session_ext(
2714 VALUE_OR_RETURN(UNION_GET(aidl, session))));
Andy Hung3f69c162020-12-09 12:08:48 -08002715 return legacy;
2716
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002717 }
Andy Hung3f69c162020-12-09 12:08:48 -08002718 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002719}
2720
2721ConversionResult<media::AudioPortExt> legacy2aidl_AudioPortExt(
2722 const audio_port_v7_ext& legacy, audio_port_type_t type) {
2723 media::AudioPortExt aidl;
2724 switch (type) {
2725 case AUDIO_PORT_TYPE_NONE:
2726 UNION_SET(aidl, unspecified, false);
Andy Hung3f69c162020-12-09 12:08:48 -08002727 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002728 case AUDIO_PORT_TYPE_DEVICE:
2729 UNION_SET(aidl, device,
2730 VALUE_OR_RETURN(
2731 legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device)));
Andy Hung3f69c162020-12-09 12:08:48 -08002732 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002733 case AUDIO_PORT_TYPE_MIX:
2734 UNION_SET(aidl, mix,
2735 VALUE_OR_RETURN(legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix)));
Andy Hung3f69c162020-12-09 12:08:48 -08002736 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002737 case AUDIO_PORT_TYPE_SESSION:
2738 UNION_SET(aidl, session,
2739 VALUE_OR_RETURN(legacy2aidl_audio_port_session_ext_AudioPortSessionExt(
2740 legacy.session)));
Andy Hung3f69c162020-12-09 12:08:48 -08002741 return aidl;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002742 }
Andy Hung3f69c162020-12-09 12:08:48 -08002743 LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002744}
2745
2746ConversionResult<audio_profile>
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002747aidl2legacy_AudioProfile_audio_profile(const AudioProfile& aidl, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002748 audio_profile legacy;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002749 legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002750
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002751 if (aidl.sampleRates.size() > std::size(legacy.sample_rates)) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002752 return unexpected(BAD_VALUE);
2753 }
2754 RETURN_IF_ERROR(
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002755 convertRange(aidl.sampleRates.begin(), aidl.sampleRates.end(), legacy.sample_rates,
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002756 convertIntegral<int32_t, unsigned int>));
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002757 legacy.num_sample_rates = aidl.sampleRates.size();
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002758
2759 if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
2760 return unexpected(BAD_VALUE);
2761 }
2762 RETURN_IF_ERROR(
2763 convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002764 [isInput](const AudioChannelLayout& l) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002765 return aidl2legacy_AudioChannelLayout_audio_channel_mask_t(l, isInput);
2766 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002767 legacy.num_channel_masks = aidl.channelMasks.size();
jiabin82e56932021-03-05 06:35:19 +00002768
2769 legacy.encapsulation_type = VALUE_OR_RETURN(
2770 aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(aidl.encapsulationType));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002771 return legacy;
2772}
2773
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002774ConversionResult<AudioProfile>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002775legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy, bool isInput) {
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002776 AudioProfile aidl;
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002777 aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002778
2779 if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
2780 return unexpected(BAD_VALUE);
2781 }
2782 RETURN_IF_ERROR(
2783 convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002784 std::back_inserter(aidl.sampleRates),
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002785 convertIntegral<unsigned int, int32_t>));
2786
2787 if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2788 return unexpected(BAD_VALUE);
2789 }
2790 RETURN_IF_ERROR(
2791 convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2792 std::back_inserter(aidl.channelMasks),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002793 [isInput](audio_channel_mask_t m) {
2794 return legacy2aidl_audio_channel_mask_t_AudioChannelLayout(m, isInput);
2795 }));
jiabin82e56932021-03-05 06:35:19 +00002796
2797 aidl.encapsulationType = VALUE_OR_RETURN(
2798 legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2799 legacy.encapsulation_type));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002800 return aidl;
2801}
2802
2803ConversionResult<audio_gain>
2804aidl2legacy_AudioGain_audio_gain(const media::AudioGain& aidl) {
2805 audio_gain legacy;
2806 legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002807 legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
Mikhail Naganov866c77d2021-07-30 15:11:35 -07002808 aidl.channelMask, aidl.isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002809 legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2810 legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2811 legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2812 legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2813 legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2814 legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2815 return legacy;
2816}
2817
2818ConversionResult<media::AudioGain>
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002819legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy, bool isInput) {
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002820 media::AudioGain aidl;
Andy Hung973638a2020-12-08 20:47:45 -08002821 aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
Mikhail Naganov866c77d2021-07-30 15:11:35 -07002822 aidl.isInput = isInput;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002823 aidl.channelMask = VALUE_OR_RETURN(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002824 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002825 aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2826 aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2827 aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2828 aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2829 aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2830 aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2831 return aidl;
2832}
2833
2834ConversionResult<audio_port_v7>
2835aidl2legacy_AudioPort_audio_port_v7(const media::AudioPort& aidl) {
2836 audio_port_v7 legacy;
2837 legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2838 legacy.role = VALUE_OR_RETURN(aidl2legacy_AudioPortRole_audio_port_role_t(aidl.role));
2839 legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioPortType_audio_port_type_t(aidl.type));
2840 RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2841
2842 if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2843 return unexpected(BAD_VALUE);
2844 }
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002845 const bool isInput = VALUE_OR_RETURN(direction(aidl.role, aidl.type)) == Direction::INPUT;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002846 RETURN_IF_ERROR(convertRange(aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002847 [isInput](const AudioProfile& p) {
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002848 return aidl2legacy_AudioProfile_audio_profile(p, isInput);
2849 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002850 legacy.num_audio_profiles = aidl.profiles.size();
2851
jiabin82e56932021-03-05 06:35:19 +00002852 if (aidl.extraAudioDescriptors.size() > std::size(legacy.extra_audio_descriptors)) {
2853 return unexpected(BAD_VALUE);
2854 }
2855 RETURN_IF_ERROR(
2856 convertRange(aidl.extraAudioDescriptors.begin(), aidl.extraAudioDescriptors.end(),
2857 legacy.extra_audio_descriptors,
2858 aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor));
2859 legacy.num_extra_audio_descriptors = aidl.extraAudioDescriptors.size();
2860
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002861 if (aidl.gains.size() > std::size(legacy.gains)) {
2862 return unexpected(BAD_VALUE);
2863 }
2864 RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2865 aidl2legacy_AudioGain_audio_gain));
2866 legacy.num_gains = aidl.gains.size();
2867
2868 legacy.active_config = VALUE_OR_RETURN(
2869 aidl2legacy_AudioPortConfig_audio_port_config(aidl.activeConfig));
2870 legacy.ext = VALUE_OR_RETURN(aidl2legacy_AudioPortExt(aidl.ext, aidl.type));
2871 return legacy;
2872}
2873
2874ConversionResult<media::AudioPort>
2875legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy) {
2876 media::AudioPort aidl;
2877 aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2878 aidl.role = VALUE_OR_RETURN(legacy2aidl_audio_port_role_t_AudioPortRole(legacy.role));
2879 aidl.type = VALUE_OR_RETURN(legacy2aidl_audio_port_type_t_AudioPortType(legacy.type));
2880 aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2881
2882 if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2883 return unexpected(BAD_VALUE);
2884 }
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002885 const bool isInput = VALUE_OR_RETURN(direction(legacy.role, legacy.type)) == Direction::INPUT;
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002886 RETURN_IF_ERROR(
2887 convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2888 std::back_inserter(aidl.profiles),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002889 [isInput](const audio_profile& p) {
2890 return legacy2aidl_audio_profile_AudioProfile(p, isInput);
2891 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002892
jiabin82e56932021-03-05 06:35:19 +00002893 if (legacy.num_extra_audio_descriptors > std::size(legacy.extra_audio_descriptors)) {
2894 return unexpected(BAD_VALUE);
2895 }
Mikhail Naganov89818ba2021-09-21 20:37:13 +00002896 aidl.profilesSys.resize(legacy.num_audio_profiles);
jiabin82e56932021-03-05 06:35:19 +00002897 RETURN_IF_ERROR(
2898 convertRange(legacy.extra_audio_descriptors,
2899 legacy.extra_audio_descriptors + legacy.num_extra_audio_descriptors,
2900 std::back_inserter(aidl.extraAudioDescriptors),
2901 legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor));
2902
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002903 if (legacy.num_gains > std::size(legacy.gains)) {
2904 return unexpected(BAD_VALUE);
2905 }
2906 RETURN_IF_ERROR(
2907 convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2908 std::back_inserter(aidl.gains),
Mikhail Naganovde3fa182021-07-30 15:06:42 -07002909 [isInput](const audio_gain& g) {
2910 return legacy2aidl_audio_gain_AudioGain(g, isInput);
2911 }));
Ytai Ben-Tsvi0cf92652020-11-23 13:23:00 -08002912
2913 aidl.activeConfig = VALUE_OR_RETURN(
2914 legacy2aidl_audio_port_config_AudioPortConfig(legacy.active_config));
2915 aidl.ext = VALUE_OR_RETURN(legacy2aidl_AudioPortExt(legacy.ext, legacy.type));
2916 return aidl;
2917}
2918
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002919ConversionResult<audio_mode_t>
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002920aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl) {
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002921 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002922 case AudioMode::SYS_RESERVED_INVALID:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002923 return AUDIO_MODE_INVALID;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002924 case AudioMode::SYS_RESERVED_CURRENT:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002925 return AUDIO_MODE_CURRENT;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002926 case AudioMode::NORMAL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002927 return AUDIO_MODE_NORMAL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002928 case AudioMode::RINGTONE:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002929 return AUDIO_MODE_RINGTONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002930 case AudioMode::IN_CALL:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002931 return AUDIO_MODE_IN_CALL;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002932 case AudioMode::IN_COMMUNICATION:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002933 return AUDIO_MODE_IN_COMMUNICATION;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002934 case AudioMode::CALL_SCREEN:
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002935 return AUDIO_MODE_CALL_SCREEN;
2936 }
2937 return unexpected(BAD_VALUE);
2938}
2939
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002940ConversionResult<AudioMode>
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002941legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2942 switch (legacy) {
2943 case AUDIO_MODE_INVALID:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002944 return AudioMode::SYS_RESERVED_INVALID;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002945 case AUDIO_MODE_CURRENT:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002946 return AudioMode::SYS_RESERVED_CURRENT;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002947 case AUDIO_MODE_NORMAL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002948 return AudioMode::NORMAL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002949 case AUDIO_MODE_RINGTONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002950 return AudioMode::RINGTONE;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002951 case AUDIO_MODE_IN_CALL:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002952 return AudioMode::IN_CALL;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002953 case AUDIO_MODE_IN_COMMUNICATION:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002954 return AudioMode::IN_COMMUNICATION;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002955 case AUDIO_MODE_CALL_SCREEN:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002956 return AudioMode::CALL_SCREEN;
Ytai Ben-Tsvi50b8ccb2020-11-24 13:47:54 -08002957 case AUDIO_MODE_CNT:
2958 break;
2959 }
2960 return unexpected(BAD_VALUE);
2961}
2962
2963ConversionResult<audio_unique_id_use_t>
2964aidl2legacy_AudioUniqueIdUse_audio_unique_id_use_t(media::AudioUniqueIdUse aidl) {
2965 switch (aidl) {
2966 case media::AudioUniqueIdUse::UNSPECIFIED:
2967 return AUDIO_UNIQUE_ID_USE_UNSPECIFIED;
2968 case media::AudioUniqueIdUse::SESSION:
2969 return AUDIO_UNIQUE_ID_USE_SESSION;
2970 case media::AudioUniqueIdUse::MODULE:
2971 return AUDIO_UNIQUE_ID_USE_MODULE;
2972 case media::AudioUniqueIdUse::EFFECT:
2973 return AUDIO_UNIQUE_ID_USE_EFFECT;
2974 case media::AudioUniqueIdUse::PATCH:
2975 return AUDIO_UNIQUE_ID_USE_PATCH;
2976 case media::AudioUniqueIdUse::OUTPUT:
2977 return AUDIO_UNIQUE_ID_USE_OUTPUT;
2978 case media::AudioUniqueIdUse::INPUT:
2979 return AUDIO_UNIQUE_ID_USE_INPUT;
2980 case media::AudioUniqueIdUse::CLIENT:
2981 return AUDIO_UNIQUE_ID_USE_CLIENT;
2982 }
2983 return unexpected(BAD_VALUE);
2984}
2985
2986ConversionResult<media::AudioUniqueIdUse>
2987legacy2aidl_audio_unique_id_use_t_AudioUniqueIdUse(audio_unique_id_use_t legacy) {
2988 switch (legacy) {
2989 case AUDIO_UNIQUE_ID_USE_UNSPECIFIED:
2990 return media::AudioUniqueIdUse::UNSPECIFIED;
2991 case AUDIO_UNIQUE_ID_USE_SESSION:
2992 return media::AudioUniqueIdUse::SESSION;
2993 case AUDIO_UNIQUE_ID_USE_MODULE:
2994 return media::AudioUniqueIdUse::MODULE;
2995 case AUDIO_UNIQUE_ID_USE_EFFECT:
2996 return media::AudioUniqueIdUse::EFFECT;
2997 case AUDIO_UNIQUE_ID_USE_PATCH:
2998 return media::AudioUniqueIdUse::PATCH;
2999 case AUDIO_UNIQUE_ID_USE_OUTPUT:
3000 return media::AudioUniqueIdUse::OUTPUT;
3001 case AUDIO_UNIQUE_ID_USE_INPUT:
3002 return media::AudioUniqueIdUse::INPUT;
3003 case AUDIO_UNIQUE_ID_USE_CLIENT:
3004 return media::AudioUniqueIdUse::CLIENT;
3005 case AUDIO_UNIQUE_ID_USE_MAX:
3006 break;
3007 }
3008 return unexpected(BAD_VALUE);
3009}
3010
Ytai Ben-Tsvi7e7a79d2020-12-15 16:48:16 -08003011ConversionResult<volume_group_t>
3012aidl2legacy_int32_t_volume_group_t(int32_t aidl) {
3013 return convertReinterpret<volume_group_t>(aidl);
3014}
3015
3016ConversionResult<int32_t>
3017legacy2aidl_volume_group_t_int32_t(volume_group_t legacy) {
3018 return convertReinterpret<int32_t>(legacy);
3019}
3020
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08003021ConversionResult<product_strategy_t>
3022aidl2legacy_int32_t_product_strategy_t(int32_t aidl) {
3023 return convertReinterpret<product_strategy_t>(aidl);
3024}
3025
3026ConversionResult<int32_t>
3027legacy2aidl_product_strategy_t_int32_t(product_strategy_t legacy) {
3028 return convertReinterpret<int32_t>(legacy);
3029}
3030
Kuowei Lid4adbdb2020-08-13 14:44:25 +08003031ConversionResult<audio_dual_mono_mode_t>
3032aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(media::AudioDualMonoMode aidl) {
3033 switch (aidl) {
3034 case media::AudioDualMonoMode::OFF:
3035 return AUDIO_DUAL_MONO_MODE_OFF;
3036 case media::AudioDualMonoMode::LR:
3037 return AUDIO_DUAL_MONO_MODE_LR;
3038 case media::AudioDualMonoMode::LL:
3039 return AUDIO_DUAL_MONO_MODE_LL;
3040 case media::AudioDualMonoMode::RR:
3041 return AUDIO_DUAL_MONO_MODE_RR;
3042 }
3043 return unexpected(BAD_VALUE);
3044}
3045
3046ConversionResult<media::AudioDualMonoMode>
3047legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(audio_dual_mono_mode_t legacy) {
3048 switch (legacy) {
3049 case AUDIO_DUAL_MONO_MODE_OFF:
3050 return media::AudioDualMonoMode::OFF;
3051 case AUDIO_DUAL_MONO_MODE_LR:
3052 return media::AudioDualMonoMode::LR;
3053 case AUDIO_DUAL_MONO_MODE_LL:
3054 return media::AudioDualMonoMode::LL;
3055 case AUDIO_DUAL_MONO_MODE_RR:
3056 return media::AudioDualMonoMode::RR;
3057 }
3058 return unexpected(BAD_VALUE);
3059}
3060
3061ConversionResult<audio_timestretch_fallback_mode_t>
3062aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(int32_t aidl) {
3063 return convertReinterpret<audio_timestretch_fallback_mode_t>(aidl);
3064}
3065
3066ConversionResult<int32_t>
3067legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(audio_timestretch_fallback_mode_t legacy) {
3068 return convertReinterpret<int32_t>(legacy);
3069}
3070
3071ConversionResult<audio_timestretch_stretch_mode_t>
3072aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(int32_t aidl) {
3073 return convertReinterpret<audio_timestretch_stretch_mode_t>(aidl);
3074}
3075
3076ConversionResult<int32_t>
3077legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(audio_timestretch_stretch_mode_t legacy) {
3078 return convertReinterpret<int32_t>(legacy);
3079}
3080
3081ConversionResult<audio_playback_rate_t>
3082aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(const media::AudioPlaybackRate& aidl) {
3083 audio_playback_rate_t legacy;
3084 legacy.mSpeed = aidl.speed;
3085 legacy.mPitch = aidl.pitch;
3086 legacy.mFallbackMode = VALUE_OR_RETURN(
3087 aidl2legacy_int32_t_audio_timestretch_fallback_mode_t(aidl.fallbackMode));
3088 legacy.mStretchMode = VALUE_OR_RETURN(
3089 aidl2legacy_int32_t_audio_timestretch_stretch_mode_t(aidl.stretchMode));
3090 return legacy;
3091}
3092
3093ConversionResult<media::AudioPlaybackRate>
3094legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t& legacy) {
3095 media::AudioPlaybackRate aidl;
3096 aidl.speed = legacy.mSpeed;
3097 aidl.pitch = legacy.mPitch;
3098 aidl.fallbackMode = VALUE_OR_RETURN(
3099 legacy2aidl_audio_timestretch_fallback_mode_t_int32_t(legacy.mFallbackMode));
3100 aidl.stretchMode = VALUE_OR_RETURN(
3101 legacy2aidl_audio_timestretch_stretch_mode_t_int32_t(legacy.mStretchMode));
3102 return aidl;
3103}
3104
jiabin82e56932021-03-05 06:35:19 +00003105ConversionResult<audio_standard_t>
3106aidl2legacy_AudioStandard_audio_standard_t(media::AudioStandard aidl) {
3107 switch (aidl) {
3108 case media::AudioStandard::NONE:
3109 return AUDIO_STANDARD_NONE;
3110 case media::AudioStandard::EDID:
3111 return AUDIO_STANDARD_EDID;
3112 }
3113 return unexpected(BAD_VALUE);
3114}
3115
3116ConversionResult<media::AudioStandard>
3117legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy) {
3118 switch (legacy) {
3119 case AUDIO_STANDARD_NONE:
3120 return media::AudioStandard::NONE;
3121 case AUDIO_STANDARD_EDID:
3122 return media::AudioStandard::EDID;
3123 }
3124 return unexpected(BAD_VALUE);
3125}
3126
3127ConversionResult<audio_extra_audio_descriptor>
3128aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(
3129 const media::ExtraAudioDescriptor& aidl) {
3130 audio_extra_audio_descriptor legacy;
3131 legacy.standard = VALUE_OR_RETURN(aidl2legacy_AudioStandard_audio_standard_t(aidl.standard));
3132 if (aidl.audioDescriptor.size() > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3133 return unexpected(BAD_VALUE);
3134 }
3135 legacy.descriptor_length = aidl.audioDescriptor.size();
3136 std::copy(aidl.audioDescriptor.begin(), aidl.audioDescriptor.end(),
3137 std::begin(legacy.descriptor));
3138 legacy.encapsulation_type =
3139 VALUE_OR_RETURN(aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
3140 aidl.encapsulationType));
3141 return legacy;
3142}
3143
3144ConversionResult<media::ExtraAudioDescriptor>
3145legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(
3146 const audio_extra_audio_descriptor& legacy) {
3147 media::ExtraAudioDescriptor aidl;
3148 aidl.standard = VALUE_OR_RETURN(legacy2aidl_audio_standard_t_AudioStandard(legacy.standard));
3149 if (legacy.descriptor_length > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
3150 return unexpected(BAD_VALUE);
3151 }
3152 aidl.audioDescriptor.resize(legacy.descriptor_length);
3153 std::copy(legacy.descriptor, legacy.descriptor + legacy.descriptor_length,
3154 aidl.audioDescriptor.begin());
3155 aidl.encapsulationType =
3156 VALUE_OR_RETURN(legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3157 legacy.encapsulation_type));
3158 return aidl;
3159}
3160
3161ConversionResult<audio_encapsulation_type_t>
3162aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003163 const AudioEncapsulationType& aidl) {
jiabin82e56932021-03-05 06:35:19 +00003164 switch (aidl) {
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003165 case AudioEncapsulationType::NONE:
jiabin82e56932021-03-05 06:35:19 +00003166 return AUDIO_ENCAPSULATION_TYPE_NONE;
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003167 case AudioEncapsulationType::IEC61937:
jiabin82e56932021-03-05 06:35:19 +00003168 return AUDIO_ENCAPSULATION_TYPE_IEC61937;
3169 }
3170 return unexpected(BAD_VALUE);
3171}
3172
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003173ConversionResult<AudioEncapsulationType>
jiabin82e56932021-03-05 06:35:19 +00003174legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
3175 const audio_encapsulation_type_t & legacy) {
3176 switch (legacy) {
3177 case AUDIO_ENCAPSULATION_TYPE_NONE:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003178 return AudioEncapsulationType::NONE;
jiabin82e56932021-03-05 06:35:19 +00003179 case AUDIO_ENCAPSULATION_TYPE_IEC61937:
Mikhail Naganovddceecc2021-09-03 13:58:56 -07003180 return AudioEncapsulationType::IEC61937;
jiabin82e56932021-03-05 06:35:19 +00003181 }
3182 return unexpected(BAD_VALUE);
3183}
3184
jiabin10a03f12021-05-07 23:46:28 +00003185ConversionResult<TrackSecondaryOutputInfoPair>
3186aidl2legacy_TrackSecondaryOutputInfo_TrackSecondaryOutputInfoPair(
3187 const media::TrackSecondaryOutputInfo& aidl) {
3188 TrackSecondaryOutputInfoPair trackSecondaryOutputInfoPair;
3189 trackSecondaryOutputInfoPair.first =
3190 VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.portId));
3191 trackSecondaryOutputInfoPair.second =
3192 VALUE_OR_RETURN(convertContainer<std::vector<audio_port_handle_t>>(
3193 aidl.secondaryOutputIds, aidl2legacy_int32_t_audio_io_handle_t));
3194 return trackSecondaryOutputInfoPair;
3195}
3196
3197ConversionResult<media::TrackSecondaryOutputInfo>
3198legacy2aidl_TrackSecondaryOutputInfoPair_TrackSecondaryOutputInfo(
3199 const TrackSecondaryOutputInfoPair& legacy) {
3200 media::TrackSecondaryOutputInfo trackSecondaryOutputInfo;
3201 trackSecondaryOutputInfo.portId =
3202 VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.first));
3203 trackSecondaryOutputInfo.secondaryOutputIds =
3204 VALUE_OR_RETURN(convertContainer<std::vector<int32_t>>(
3205 legacy.second, legacy2aidl_audio_io_handle_t_int32_t));
3206 return trackSecondaryOutputInfo;
3207}
3208
Ytai Ben-Tsvi10dc0a62020-09-18 11:31:55 -07003209} // namespace android