xref: /aosp_15_r20/frameworks/av/media/audioaidlconversion/AidlConversionCppNdk.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #include <stdio.h>
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <algorithm>
20*ec779b8eSAndroid Build Coastguard Worker #include <map>
21*ec779b8eSAndroid Build Coastguard Worker #include <sstream>
22*ec779b8eSAndroid Build Coastguard Worker #include <utility>
23*ec779b8eSAndroid Build Coastguard Worker #include <vector>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AidlConversionCppNdk"
26*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
27*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker #include "media/AidlConversionCppNdk.h"
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/MediaDefs.h>
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////
34*ec779b8eSAndroid Build Coastguard Worker // AIDL CPP/NDK backend to legacy audio data structure conversion utilities.
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker #if defined(BACKEND_NDK)
37*ec779b8eSAndroid Build Coastguard Worker /* AIDL String generated in NDK is different than CPP */
38*ec779b8eSAndroid Build Coastguard Worker #define GET_DEVICE_DESC_CONNECTION(x)  AudioDeviceDescription::CONNECTION_##x
39*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
40*ec779b8eSAndroid Build Coastguard Worker #else
41*ec779b8eSAndroid Build Coastguard Worker #define GET_DEVICE_DESC_CONNECTION(x)  AudioDeviceDescription::CONNECTION_##x()
42*ec779b8eSAndroid Build Coastguard Worker #endif
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker namespace android {
45*ec779b8eSAndroid Build Coastguard Worker 
46*ec779b8eSAndroid Build Coastguard Worker using ::android::BAD_VALUE;
47*ec779b8eSAndroid Build Coastguard Worker using ::android::OK;
48*ec779b8eSAndroid Build Coastguard Worker using ::android::String16;
49*ec779b8eSAndroid Build Coastguard Worker using ::android::String8;
50*ec779b8eSAndroid Build Coastguard Worker using ::android::status_t;
51*ec779b8eSAndroid Build Coastguard Worker using ::android::base::unexpected;
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioAttributes;
54*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioChannelLayout;
55*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfig;
56*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfigBase;
57*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioContentType;
58*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDevice;
59*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceAddress;
60*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceDescription;
61*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceType;
62*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDualMonoMode;
63*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioEncapsulationMetadataType;
64*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioEncapsulationMode;
65*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioEncapsulationType;
66*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFlag;
67*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatDescription;
68*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatType;
69*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioGain;
70*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioGainConfig;
71*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioGainMode;
72*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioInputFlags;
73*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioIoFlags;
74*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioLatencyMode;
75*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMode;
76*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioOffloadInfo;
77*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioOutputFlags;
78*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPlaybackRate;
79*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPort;
80*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPortConfig;
81*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPortDeviceExt;
82*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPortExt;
83*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPortMixExt;
84*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioPortMixExtUseCase;
85*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioProfile;
86*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource;
87*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStandard;
88*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStreamType;
89*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUsage;
90*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUuid;
91*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::ExtraAudioDescriptor;
92*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::Int;
93*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::MicrophoneDynamicInfo;
94*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::MicrophoneInfo;
95*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::PcmType;
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////
98*ec779b8eSAndroid Build Coastguard Worker // Converters
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker namespace {
101*ec779b8eSAndroid Build Coastguard Worker 
splitString(const std::string & s,char separator)102*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> splitString(const std::string& s, char separator) {
103*ec779b8eSAndroid Build Coastguard Worker     std::istringstream iss(s);
104*ec779b8eSAndroid Build Coastguard Worker     std::string t;
105*ec779b8eSAndroid Build Coastguard Worker     std::vector<std::string> result;
106*ec779b8eSAndroid Build Coastguard Worker     while (std::getline(iss, t, separator)) {
107*ec779b8eSAndroid Build Coastguard Worker         result.push_back(std::move(t));
108*ec779b8eSAndroid Build Coastguard Worker     }
109*ec779b8eSAndroid Build Coastguard Worker     return result;
110*ec779b8eSAndroid Build Coastguard Worker }
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker }  // namespace
113*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_string(std::string_view aidl,char * dest,size_t maxSize)114*ec779b8eSAndroid Build Coastguard Worker ::android::status_t aidl2legacy_string(std::string_view aidl, char* dest, size_t maxSize) {
115*ec779b8eSAndroid Build Coastguard Worker     if (aidl.size() > maxSize - 1) {
116*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
117*ec779b8eSAndroid Build Coastguard Worker     }
118*ec779b8eSAndroid Build Coastguard Worker     aidl.copy(dest, aidl.size());
119*ec779b8eSAndroid Build Coastguard Worker     dest[aidl.size()] = '\0';
120*ec779b8eSAndroid Build Coastguard Worker     return OK;
121*ec779b8eSAndroid Build Coastguard Worker }
122*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_string(const char * legacy,size_t maxSize)123*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::string> legacy2aidl_string(const char* legacy, size_t maxSize) {
124*ec779b8eSAndroid Build Coastguard Worker     if (legacy == nullptr) {
125*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
126*ec779b8eSAndroid Build Coastguard Worker     }
127*ec779b8eSAndroid Build Coastguard Worker     if (strnlen(legacy, maxSize) == maxSize) {
128*ec779b8eSAndroid Build Coastguard Worker         // No null-terminator.
129*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
130*ec779b8eSAndroid Build Coastguard Worker     }
131*ec779b8eSAndroid Build Coastguard Worker     return std::string(legacy);
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl)134*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_module_handle_t> aidl2legacy_int32_t_audio_module_handle_t(int32_t aidl) {
135*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_module_handle_t>(aidl);
136*ec779b8eSAndroid Build Coastguard Worker }
137*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy)138*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_module_handle_t_int32_t(audio_module_handle_t legacy) {
139*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
140*ec779b8eSAndroid Build Coastguard Worker }
141*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl)142*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_io_handle_t> aidl2legacy_int32_t_audio_io_handle_t(int32_t aidl) {
143*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_io_handle_t>(aidl);
144*ec779b8eSAndroid Build Coastguard Worker }
145*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy)146*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_io_handle_t_int32_t(audio_io_handle_t legacy) {
147*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl)150*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_handle_t> aidl2legacy_int32_t_audio_port_handle_t(int32_t aidl) {
151*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_port_handle_t>(aidl);
152*ec779b8eSAndroid Build Coastguard Worker }
153*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy)154*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_port_handle_t_int32_t(audio_port_handle_t legacy) {
155*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
156*ec779b8eSAndroid Build Coastguard Worker }
157*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl)158*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_patch_handle_t> aidl2legacy_int32_t_audio_patch_handle_t(int32_t aidl) {
159*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_patch_handle_t>(aidl);
160*ec779b8eSAndroid Build Coastguard Worker }
161*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy)162*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_patch_handle_t_int32_t(audio_patch_handle_t legacy) {
163*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
164*ec779b8eSAndroid Build Coastguard Worker }
165*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl)166*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_unique_id_t> aidl2legacy_int32_t_audio_unique_id_t(int32_t aidl) {
167*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_unique_id_t>(aidl);
168*ec779b8eSAndroid Build Coastguard Worker }
169*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy)170*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_unique_id_t_int32_t(audio_unique_id_t legacy) {
171*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
172*ec779b8eSAndroid Build Coastguard Worker }
173*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl)174*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_hw_sync_t> aidl2legacy_int32_t_audio_hw_sync_t(int32_t aidl) {
175*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_hw_sync_t>(aidl);
176*ec779b8eSAndroid Build Coastguard Worker }
177*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy)178*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_hw_sync_t_int32_t(audio_hw_sync_t legacy) {
179*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
180*ec779b8eSAndroid Build Coastguard Worker }
181*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_pid_t(int32_t aidl)182*ec779b8eSAndroid Build Coastguard Worker ConversionResult<pid_t> aidl2legacy_int32_t_pid_t(int32_t aidl) {
183*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<pid_t>(aidl);
184*ec779b8eSAndroid Build Coastguard Worker }
185*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_pid_t_int32_t(pid_t legacy)186*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_pid_t_int32_t(pid_t legacy) {
187*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
188*ec779b8eSAndroid Build Coastguard Worker }
189*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_uid_t(int32_t aidl)190*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uid_t> aidl2legacy_int32_t_uid_t(int32_t aidl) {
191*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<uid_t>(aidl);
192*ec779b8eSAndroid Build Coastguard Worker }
193*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uid_t_int32_t(uid_t legacy)194*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_uid_t_int32_t(uid_t legacy) {
195*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
196*ec779b8eSAndroid Build Coastguard Worker }
197*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_string_view_String16(std::string_view aidl)198*ec779b8eSAndroid Build Coastguard Worker ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl) {
199*ec779b8eSAndroid Build Coastguard Worker     return String16(aidl.data(), aidl.size());
200*ec779b8eSAndroid Build Coastguard Worker }
201*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_String16_string(const String16 & legacy)202*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy) {
203*ec779b8eSAndroid Build Coastguard Worker     return std::string(String8(legacy).c_str());
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker 
206*ec779b8eSAndroid Build Coastguard Worker // TODO b/182392769: create an optional -> optional util
207*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::optional<String16>>
aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl)208*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl) {
209*ec779b8eSAndroid Build Coastguard Worker     if (!aidl.has_value()) {
210*ec779b8eSAndroid Build Coastguard Worker         return std::nullopt;
211*ec779b8eSAndroid Build Coastguard Worker     }
212*ec779b8eSAndroid Build Coastguard Worker     ConversionResult<String16> conversion =
213*ec779b8eSAndroid Build Coastguard Worker         VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.value()));
214*ec779b8eSAndroid Build Coastguard Worker     return conversion.value();
215*ec779b8eSAndroid Build Coastguard Worker }
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::optional<std::string_view>>
legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy)218*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy) {
219*ec779b8eSAndroid Build Coastguard Worker   if (!legacy.has_value()) {
220*ec779b8eSAndroid Build Coastguard Worker     return std::nullopt;
221*ec779b8eSAndroid Build Coastguard Worker   }
222*ec779b8eSAndroid Build Coastguard Worker   ConversionResult<std::string> conversion =
223*ec779b8eSAndroid Build Coastguard Worker       VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.value()));
224*ec779b8eSAndroid Build Coastguard Worker   return conversion.value();
225*ec779b8eSAndroid Build Coastguard Worker }
226*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_string_view_String8(std::string_view aidl)227*ec779b8eSAndroid Build Coastguard Worker ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
228*ec779b8eSAndroid Build Coastguard Worker     return String8(aidl.data(), aidl.size());
229*ec779b8eSAndroid Build Coastguard Worker }
230*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_String8_string(const String8 & legacy)231*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::string> legacy2aidl_String8_string(const String8& legacy) {
232*ec779b8eSAndroid Build Coastguard Worker     return std::string(legacy.c_str());
233*ec779b8eSAndroid Build Coastguard Worker }
234*ec779b8eSAndroid Build Coastguard Worker 
235*ec779b8eSAndroid Build Coastguard Worker namespace {
236*ec779b8eSAndroid Build Coastguard Worker 
237*ec779b8eSAndroid Build Coastguard Worker namespace detail {
238*ec779b8eSAndroid Build Coastguard Worker using AudioChannelBitPair = std::pair<audio_channel_mask_t, int>;
239*ec779b8eSAndroid Build Coastguard Worker using AudioChannelBitPairs = std::vector<AudioChannelBitPair>;
240*ec779b8eSAndroid Build Coastguard Worker using AudioChannelPair = std::pair<audio_channel_mask_t, AudioChannelLayout>;
241*ec779b8eSAndroid Build Coastguard Worker using AudioChannelPairs = std::vector<AudioChannelPair>;
242*ec779b8eSAndroid Build Coastguard Worker using AudioDevicePair = std::pair<audio_devices_t, AudioDeviceDescription>;
243*ec779b8eSAndroid Build Coastguard Worker using AudioDevicePairs = std::vector<AudioDevicePair>;
244*ec779b8eSAndroid Build Coastguard Worker using AudioFormatPair = std::pair<audio_format_t, AudioFormatDescription>;
245*ec779b8eSAndroid Build Coastguard Worker using AudioFormatPairs = std::vector<AudioFormatPair>;
246*ec779b8eSAndroid Build Coastguard Worker }
247*ec779b8eSAndroid Build Coastguard Worker 
getInAudioChannelBits()248*ec779b8eSAndroid Build Coastguard Worker const detail::AudioChannelBitPairs& getInAudioChannelBits() {
249*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioChannelBitPairs pairs = {
250*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_LEFT, AudioChannelLayout::CHANNEL_FRONT_LEFT },
251*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_RIGHT, AudioChannelLayout::CHANNEL_FRONT_RIGHT },
252*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_FRONT is at the end
253*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_BACK, AudioChannelLayout::CHANNEL_BACK_CENTER },
254*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_*_PROCESSED not supported
255*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_PRESSURE not supported
256*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_*_AXIS not supported
257*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_VOICE_* not supported
258*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_BACK_LEFT, AudioChannelLayout::CHANNEL_BACK_LEFT },
259*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_BACK_RIGHT, AudioChannelLayout::CHANNEL_BACK_RIGHT },
260*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_CENTER, AudioChannelLayout::CHANNEL_FRONT_CENTER },
261*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_LOW_FREQUENCY, AudioChannelLayout::CHANNEL_LOW_FREQUENCY },
262*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_TOP_LEFT, AudioChannelLayout::CHANNEL_TOP_SIDE_LEFT },
263*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_TOP_RIGHT, AudioChannelLayout::CHANNEL_TOP_SIDE_RIGHT },
264*ec779b8eSAndroid Build Coastguard Worker         // When going from aidl to legacy, IN_CENTER is used
265*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_IN_FRONT, AudioChannelLayout::CHANNEL_FRONT_CENTER }
266*ec779b8eSAndroid Build Coastguard Worker     };
267*ec779b8eSAndroid Build Coastguard Worker     return pairs;
268*ec779b8eSAndroid Build Coastguard Worker }
269*ec779b8eSAndroid Build Coastguard Worker 
getInAudioChannelPairs()270*ec779b8eSAndroid Build Coastguard Worker const detail::AudioChannelPairs& getInAudioChannelPairs() {
271*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioChannelPairs pairs = {
272*ec779b8eSAndroid Build Coastguard Worker #define DEFINE_INPUT_LAYOUT(n)                                                 \
273*ec779b8eSAndroid Build Coastguard Worker             {                                                                  \
274*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_CHANNEL_IN_##n,                                          \
275*ec779b8eSAndroid Build Coastguard Worker                 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
276*ec779b8eSAndroid Build Coastguard Worker                         AudioChannelLayout::LAYOUT_##n)                        \
277*ec779b8eSAndroid Build Coastguard Worker             }
278*ec779b8eSAndroid Build Coastguard Worker 
279*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(MONO),
280*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(STEREO),
281*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(2POINT1),
282*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(FRONT_BACK),
283*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(TRI),
284*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(3POINT1),
285*ec779b8eSAndroid Build Coastguard Worker         // AUDIO_CHANNEL_IN_6 not supported
286*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(2POINT0POINT2),
287*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(2POINT1POINT2),
288*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(3POINT0POINT2),
289*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(3POINT1POINT2),
290*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(QUAD),
291*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(PENTA),
292*ec779b8eSAndroid Build Coastguard Worker         DEFINE_INPUT_LAYOUT(5POINT1)
293*ec779b8eSAndroid Build Coastguard Worker #undef DEFINE_INPUT_LAYOUT
294*ec779b8eSAndroid Build Coastguard Worker     };
295*ec779b8eSAndroid Build Coastguard Worker     return pairs;
296*ec779b8eSAndroid Build Coastguard Worker }
297*ec779b8eSAndroid Build Coastguard Worker 
getOutAudioChannelBits()298*ec779b8eSAndroid Build Coastguard Worker const detail::AudioChannelBitPairs& getOutAudioChannelBits() {
299*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioChannelBitPairs pairs = {
300*ec779b8eSAndroid Build Coastguard Worker #define DEFINE_OUTPUT_BITS(n)                                                  \
301*ec779b8eSAndroid Build Coastguard Worker             { AUDIO_CHANNEL_OUT_##n, AudioChannelLayout::CHANNEL_##n }
302*ec779b8eSAndroid Build Coastguard Worker 
303*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_LEFT),
304*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_RIGHT),
305*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_CENTER),
306*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(LOW_FREQUENCY),
307*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BACK_LEFT),
308*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BACK_RIGHT),
309*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_LEFT_OF_CENTER),
310*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_RIGHT_OF_CENTER),
311*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BACK_CENTER),
312*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(SIDE_LEFT),
313*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(SIDE_RIGHT),
314*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_CENTER),
315*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_FRONT_LEFT),
316*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_FRONT_CENTER),
317*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_FRONT_RIGHT),
318*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_BACK_LEFT),
319*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_BACK_CENTER),
320*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_BACK_RIGHT),
321*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_SIDE_LEFT),
322*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(TOP_SIDE_RIGHT),
323*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BOTTOM_FRONT_LEFT),
324*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BOTTOM_FRONT_CENTER),
325*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(BOTTOM_FRONT_RIGHT),
326*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(LOW_FREQUENCY_2),
327*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_WIDE_LEFT),
328*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_BITS(FRONT_WIDE_RIGHT),
329*ec779b8eSAndroid Build Coastguard Worker #undef DEFINE_OUTPUT_BITS
330*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_OUT_HAPTIC_A, AudioChannelLayout::CHANNEL_HAPTIC_A },
331*ec779b8eSAndroid Build Coastguard Worker         { AUDIO_CHANNEL_OUT_HAPTIC_B, AudioChannelLayout::CHANNEL_HAPTIC_B }
332*ec779b8eSAndroid Build Coastguard Worker     };
333*ec779b8eSAndroid Build Coastguard Worker     return pairs;
334*ec779b8eSAndroid Build Coastguard Worker }
335*ec779b8eSAndroid Build Coastguard Worker 
getOutAudioChannelPairs()336*ec779b8eSAndroid Build Coastguard Worker const detail::AudioChannelPairs& getOutAudioChannelPairs() {
337*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioChannelPairs pairs = {
338*ec779b8eSAndroid Build Coastguard Worker #define DEFINE_OUTPUT_LAYOUT(n)                                                \
339*ec779b8eSAndroid Build Coastguard Worker             {                                                                  \
340*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_CHANNEL_OUT_##n,                                         \
341*ec779b8eSAndroid Build Coastguard Worker                 AudioChannelLayout::make<AudioChannelLayout::Tag::layoutMask>( \
342*ec779b8eSAndroid Build Coastguard Worker                         AudioChannelLayout::LAYOUT_##n)                        \
343*ec779b8eSAndroid Build Coastguard Worker             }
344*ec779b8eSAndroid Build Coastguard Worker 
345*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(MONO),
346*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(STEREO),
347*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(2POINT1),
348*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(TRI),
349*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(TRI_BACK),
350*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(3POINT1),
351*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(2POINT0POINT2),
352*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(2POINT1POINT2),
353*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(3POINT0POINT2),
354*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(3POINT1POINT2),
355*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(QUAD),
356*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(QUAD_SIDE),
357*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(SURROUND),
358*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(PENTA),
359*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(5POINT1),
360*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(5POINT1_SIDE),
361*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(5POINT1POINT2),
362*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(5POINT1POINT4),
363*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(6POINT1),
364*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(7POINT1),
365*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(7POINT1POINT2),
366*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(7POINT1POINT4),
367*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(13POINT_360RA),
368*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(22POINT2),
369*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_A),
370*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_A),
371*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(HAPTIC_AB),
372*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(MONO_HAPTIC_AB),
373*ec779b8eSAndroid Build Coastguard Worker         DEFINE_OUTPUT_LAYOUT(STEREO_HAPTIC_AB)
374*ec779b8eSAndroid Build Coastguard Worker #undef DEFINE_OUTPUT_LAYOUT
375*ec779b8eSAndroid Build Coastguard Worker     };
376*ec779b8eSAndroid Build Coastguard Worker     return pairs;
377*ec779b8eSAndroid Build Coastguard Worker }
378*ec779b8eSAndroid Build Coastguard Worker 
getVoiceAudioChannelPairs()379*ec779b8eSAndroid Build Coastguard Worker const detail::AudioChannelPairs& getVoiceAudioChannelPairs() {
380*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioChannelPairs pairs = {
381*ec779b8eSAndroid Build Coastguard Worker #define DEFINE_VOICE_LAYOUT(n)                                                 \
382*ec779b8eSAndroid Build Coastguard Worker             {                                                                  \
383*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_CHANNEL_IN_VOICE_##n,                                    \
384*ec779b8eSAndroid Build Coastguard Worker                 AudioChannelLayout::make<AudioChannelLayout::Tag::voiceMask>(  \
385*ec779b8eSAndroid Build Coastguard Worker                         AudioChannelLayout::VOICE_##n)                         \
386*ec779b8eSAndroid Build Coastguard Worker             }
387*ec779b8eSAndroid Build Coastguard Worker         DEFINE_VOICE_LAYOUT(UPLINK_MONO),
388*ec779b8eSAndroid Build Coastguard Worker         DEFINE_VOICE_LAYOUT(DNLINK_MONO),
389*ec779b8eSAndroid Build Coastguard Worker         DEFINE_VOICE_LAYOUT(CALL_MONO)
390*ec779b8eSAndroid Build Coastguard Worker #undef DEFINE_VOICE_LAYOUT
391*ec779b8eSAndroid Build Coastguard Worker     };
392*ec779b8eSAndroid Build Coastguard Worker     return pairs;
393*ec779b8eSAndroid Build Coastguard Worker }
394*ec779b8eSAndroid Build Coastguard Worker 
make_AudioDeviceDescription(AudioDeviceType type,const std::string & connection="")395*ec779b8eSAndroid Build Coastguard Worker AudioDeviceDescription make_AudioDeviceDescription(AudioDeviceType type,
396*ec779b8eSAndroid Build Coastguard Worker         const std::string& connection = "") {
397*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceDescription result;
398*ec779b8eSAndroid Build Coastguard Worker     result.type = type;
399*ec779b8eSAndroid Build Coastguard Worker     result.connection = connection;
400*ec779b8eSAndroid Build Coastguard Worker     return result;
401*ec779b8eSAndroid Build Coastguard Worker }
402*ec779b8eSAndroid Build Coastguard Worker 
append_AudioDeviceDescription(detail::AudioDevicePairs & pairs,audio_devices_t inputType,audio_devices_t outputType,AudioDeviceType inType,AudioDeviceType outType,const std::string & connection="")403*ec779b8eSAndroid Build Coastguard Worker void append_AudioDeviceDescription(detail::AudioDevicePairs& pairs,
404*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t inputType, audio_devices_t outputType,
405*ec779b8eSAndroid Build Coastguard Worker         AudioDeviceType inType, AudioDeviceType outType,
406*ec779b8eSAndroid Build Coastguard Worker         const std::string& connection = "") {
407*ec779b8eSAndroid Build Coastguard Worker     pairs.push_back(std::make_pair(inputType, make_AudioDeviceDescription(inType, connection)));
408*ec779b8eSAndroid Build Coastguard Worker     pairs.push_back(std::make_pair(outputType, make_AudioDeviceDescription(outType, connection)));
409*ec779b8eSAndroid Build Coastguard Worker }
410*ec779b8eSAndroid Build Coastguard Worker 
getAudioDevicePairs()411*ec779b8eSAndroid Build Coastguard Worker const detail::AudioDevicePairs& getAudioDevicePairs() {
412*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioDevicePairs pairs = []() {
413*ec779b8eSAndroid Build Coastguard Worker         detail::AudioDevicePairs pairs = {{
414*ec779b8eSAndroid Build Coastguard Worker             {
415*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_NONE, AudioDeviceDescription{}
416*ec779b8eSAndroid Build Coastguard Worker             },
417*ec779b8eSAndroid Build Coastguard Worker             {
418*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_EARPIECE, make_AudioDeviceDescription(
419*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_SPEAKER_EARPIECE)
420*ec779b8eSAndroid Build Coastguard Worker             },
421*ec779b8eSAndroid Build Coastguard Worker             {
422*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_SPEAKER, make_AudioDeviceDescription(
423*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_SPEAKER)
424*ec779b8eSAndroid Build Coastguard Worker             },
425*ec779b8eSAndroid Build Coastguard Worker             {
426*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_WIRED_HEADPHONE, make_AudioDeviceDescription(
427*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_HEADPHONE,
428*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(ANALOG))
429*ec779b8eSAndroid Build Coastguard Worker             },
430*ec779b8eSAndroid Build Coastguard Worker             {
431*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLUETOOTH_SCO, make_AudioDeviceDescription(
432*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_DEVICE,
433*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_SCO))
434*ec779b8eSAndroid Build Coastguard Worker             },
435*ec779b8eSAndroid Build Coastguard Worker             {
436*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, make_AudioDeviceDescription(
437*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_CARKIT,
438*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_SCO))
439*ec779b8eSAndroid Build Coastguard Worker             },
440*ec779b8eSAndroid Build Coastguard Worker             {
441*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, make_AudioDeviceDescription(
442*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_HEADPHONE,
443*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_A2DP))
444*ec779b8eSAndroid Build Coastguard Worker             },
445*ec779b8eSAndroid Build Coastguard Worker             {
446*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, make_AudioDeviceDescription(
447*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_SPEAKER,
448*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_A2DP))
449*ec779b8eSAndroid Build Coastguard Worker             },
450*ec779b8eSAndroid Build Coastguard Worker             {
451*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_TELEPHONY_TX, make_AudioDeviceDescription(
452*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_TELEPHONY_TX)
453*ec779b8eSAndroid Build Coastguard Worker             },
454*ec779b8eSAndroid Build Coastguard Worker             {
455*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_AUX_LINE, make_AudioDeviceDescription(
456*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_LINE_AUX)
457*ec779b8eSAndroid Build Coastguard Worker             },
458*ec779b8eSAndroid Build Coastguard Worker             {
459*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_SPEAKER_SAFE, make_AudioDeviceDescription(
460*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_SPEAKER_SAFE)
461*ec779b8eSAndroid Build Coastguard Worker             },
462*ec779b8eSAndroid Build Coastguard Worker             {
463*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_HEARING_AID, make_AudioDeviceDescription(
464*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_HEARING_AID,
465*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(WIRELESS))
466*ec779b8eSAndroid Build Coastguard Worker             },
467*ec779b8eSAndroid Build Coastguard Worker             {
468*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_ECHO_CANCELLER, make_AudioDeviceDescription(
469*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_ECHO_CANCELLER)
470*ec779b8eSAndroid Build Coastguard Worker             },
471*ec779b8eSAndroid Build Coastguard Worker             {
472*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLE_SPEAKER, make_AudioDeviceDescription(
473*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_SPEAKER,
474*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_LE))
475*ec779b8eSAndroid Build Coastguard Worker             },
476*ec779b8eSAndroid Build Coastguard Worker             {
477*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_BLE_BROADCAST, make_AudioDeviceDescription(
478*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_BROADCAST,
479*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_LE))
480*ec779b8eSAndroid Build Coastguard Worker             },
481*ec779b8eSAndroid Build Coastguard Worker             {
482*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_OUT_MULTICHANNEL_GROUP, make_AudioDeviceDescription(
483*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::OUT_MULTICHANNEL_GROUP,
484*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(VIRTUAL))
485*ec779b8eSAndroid Build Coastguard Worker             },
486*ec779b8eSAndroid Build Coastguard Worker             // AUDIO_DEVICE_IN_AMBIENT and IN_COMMUNICATION are removed since they were deprecated.
487*ec779b8eSAndroid Build Coastguard Worker             {
488*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BUILTIN_MIC, make_AudioDeviceDescription(
489*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_MICROPHONE)
490*ec779b8eSAndroid Build Coastguard Worker             },
491*ec779b8eSAndroid Build Coastguard Worker             {
492*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BACK_MIC, make_AudioDeviceDescription(
493*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_MICROPHONE_BACK)
494*ec779b8eSAndroid Build Coastguard Worker             },
495*ec779b8eSAndroid Build Coastguard Worker             {
496*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_TELEPHONY_RX, make_AudioDeviceDescription(
497*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_TELEPHONY_RX)
498*ec779b8eSAndroid Build Coastguard Worker             },
499*ec779b8eSAndroid Build Coastguard Worker             {
500*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_TV_TUNER, make_AudioDeviceDescription(
501*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_TV_TUNER)
502*ec779b8eSAndroid Build Coastguard Worker             },
503*ec779b8eSAndroid Build Coastguard Worker             {
504*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_LOOPBACK, make_AudioDeviceDescription(
505*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_LOOPBACK)
506*ec779b8eSAndroid Build Coastguard Worker             },
507*ec779b8eSAndroid Build Coastguard Worker             {
508*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BLUETOOTH_BLE, make_AudioDeviceDescription(
509*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_DEVICE,
510*ec779b8eSAndroid Build Coastguard Worker                         GET_DEVICE_DESC_CONNECTION(BT_LE))
511*ec779b8eSAndroid Build Coastguard Worker             },
512*ec779b8eSAndroid Build Coastguard Worker             {
513*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_ECHO_REFERENCE, make_AudioDeviceDescription(
514*ec779b8eSAndroid Build Coastguard Worker                         AudioDeviceType::IN_ECHO_REFERENCE)
515*ec779b8eSAndroid Build Coastguard Worker             }
516*ec779b8eSAndroid Build Coastguard Worker         }};
517*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
518*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_OUT_DEFAULT,
519*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEFAULT, AudioDeviceType::OUT_DEFAULT);
520*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
521*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_OUT_WIRED_HEADSET,
522*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
523*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(ANALOG));
524*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
525*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
526*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
527*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(BT_SCO));
528*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
529*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_OUT_HDMI,
530*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
531*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(HDMI));
532*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
533*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET,
534*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
535*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(ANALOG));
536*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
537*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET,
538*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DOCK, AudioDeviceType::OUT_DOCK,
539*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(USB));
540*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
541*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_OUT_USB_ACCESSORY,
542*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_ACCESSORY, AudioDeviceType::OUT_ACCESSORY,
543*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(USB));
544*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
545*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_OUT_USB_DEVICE,
546*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
547*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(USB));
548*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
549*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_OUT_FM,
550*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_FM_TUNER, AudioDeviceType::OUT_FM);
551*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
552*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_OUT_LINE,
553*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
554*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(ANALOG));
555*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
556*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_OUT_SPDIF,
557*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
558*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(SPDIF));
559*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
560*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_OUT_BLUETOOTH_A2DP,
561*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
562*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(BT_A2DP));
563*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
564*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_OUT_IP,
565*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
566*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(IP_V4));
567*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
568*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_OUT_BUS,
569*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_BUS, AudioDeviceType::OUT_BUS);
570*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
571*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_OUT_PROXY,
572*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_AFE_PROXY, AudioDeviceType::OUT_AFE_PROXY,
573*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(VIRTUAL));
574*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
575*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_OUT_USB_HEADSET,
576*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
577*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(USB));
578*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
579*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_OUT_HDMI_ARC,
580*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
581*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(HDMI_ARC));
582*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
583*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_OUT_HDMI_EARC,
584*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_DEVICE, AudioDeviceType::OUT_DEVICE,
585*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(HDMI_EARC));
586*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
587*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_OUT_BLE_HEADSET,
588*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_HEADSET, AudioDeviceType::OUT_HEADSET,
589*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(BT_LE));
590*ec779b8eSAndroid Build Coastguard Worker         append_AudioDeviceDescription(pairs,
591*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_REMOTE_SUBMIX,
592*ec779b8eSAndroid Build Coastguard Worker                 AudioDeviceType::IN_SUBMIX, AudioDeviceType::OUT_SUBMIX,
593*ec779b8eSAndroid Build Coastguard Worker                 GET_DEVICE_DESC_CONNECTION(VIRTUAL));
594*ec779b8eSAndroid Build Coastguard Worker 
595*ec779b8eSAndroid Build Coastguard Worker         return pairs;
596*ec779b8eSAndroid Build Coastguard Worker     }();
597*ec779b8eSAndroid Build Coastguard Worker     return pairs;
598*ec779b8eSAndroid Build Coastguard Worker }
599*ec779b8eSAndroid Build Coastguard Worker 
make_AudioFormatDescription(AudioFormatType type)600*ec779b8eSAndroid Build Coastguard Worker AudioFormatDescription make_AudioFormatDescription(AudioFormatType type) {
601*ec779b8eSAndroid Build Coastguard Worker     AudioFormatDescription result;
602*ec779b8eSAndroid Build Coastguard Worker     result.type = type;
603*ec779b8eSAndroid Build Coastguard Worker     return result;
604*ec779b8eSAndroid Build Coastguard Worker }
605*ec779b8eSAndroid Build Coastguard Worker 
make_AudioFormatDescription(PcmType pcm)606*ec779b8eSAndroid Build Coastguard Worker AudioFormatDescription make_AudioFormatDescription(PcmType pcm) {
607*ec779b8eSAndroid Build Coastguard Worker     auto result = make_AudioFormatDescription(AudioFormatType::PCM);
608*ec779b8eSAndroid Build Coastguard Worker     result.pcm = pcm;
609*ec779b8eSAndroid Build Coastguard Worker     return result;
610*ec779b8eSAndroid Build Coastguard Worker }
611*ec779b8eSAndroid Build Coastguard Worker 
make_AudioFormatDescription(const std::string & encoding)612*ec779b8eSAndroid Build Coastguard Worker AudioFormatDescription make_AudioFormatDescription(const std::string& encoding) {
613*ec779b8eSAndroid Build Coastguard Worker     AudioFormatDescription result;
614*ec779b8eSAndroid Build Coastguard Worker     result.encoding = encoding;
615*ec779b8eSAndroid Build Coastguard Worker     return result;
616*ec779b8eSAndroid Build Coastguard Worker }
617*ec779b8eSAndroid Build Coastguard Worker 
make_AudioFormatDescription(PcmType transport,const std::string & encoding)618*ec779b8eSAndroid Build Coastguard Worker AudioFormatDescription make_AudioFormatDescription(PcmType transport,
619*ec779b8eSAndroid Build Coastguard Worker         const std::string& encoding) {
620*ec779b8eSAndroid Build Coastguard Worker     auto result = make_AudioFormatDescription(encoding);
621*ec779b8eSAndroid Build Coastguard Worker     result.pcm = transport;
622*ec779b8eSAndroid Build Coastguard Worker     return result;
623*ec779b8eSAndroid Build Coastguard Worker }
624*ec779b8eSAndroid Build Coastguard Worker 
getAudioFormatPairs()625*ec779b8eSAndroid Build Coastguard Worker const detail::AudioFormatPairs& getAudioFormatPairs() {
626*ec779b8eSAndroid Build Coastguard Worker     static const detail::AudioFormatPairs pairs = {{
627*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_INVALID,
628*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(AudioFormatType::SYS_RESERVED_INVALID)},
629*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DEFAULT, AudioFormatDescription{}},
630*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_16_BIT, make_AudioFormatDescription(PcmType::INT_16_BIT)},
631*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_8_BIT, make_AudioFormatDescription(PcmType::UINT_8_BIT)},
632*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_32_BIT, make_AudioFormatDescription(PcmType::INT_32_BIT)},
633*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_8_24_BIT, make_AudioFormatDescription(PcmType::FIXED_Q_8_24)},
634*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_FLOAT, make_AudioFormatDescription(PcmType::FLOAT_32_BIT)},
635*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_PCM_24_BIT_PACKED, make_AudioFormatDescription(PcmType::INT_24_BIT)},
636*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MP3, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEG)},
637*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AMR_NB,
638*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AMR_NB)},
639*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AMR_WB,
640*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AMR_WB)},
641*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC,
642*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_MP4)},
643*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_MAIN,
644*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_MAIN)},
645*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LC,
646*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LC)},
647*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_SSR,
648*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_SSR)},
649*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LTP,
650*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LTP)},
651*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_HE_V1,
652*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_HE_V1)},
653*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_SCALABLE,
654*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_SCALABLE)},
655*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ERLC,
656*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ERLC)},
657*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LD,
658*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LD)},
659*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_HE_V2,
660*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_HE_V2)},
661*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ELD,
662*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ELD)},
663*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_XHE,
664*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_XHE)
665*ec779b8eSAndroid Build Coastguard Worker 
666*ec779b8eSAndroid Build Coastguard Worker             },
667*ec779b8eSAndroid Build Coastguard Worker             // AUDIO_FORMAT_HE_AAC_V1 and HE_AAC_V2 are removed since they were deprecated long time
668*ec779b8eSAndroid Build Coastguard Worker             // ago.
669*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_VORBIS,
670*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_VORBIS)},
671*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_OPUS, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_OPUS)},
672*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AC3, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AC3)},
673*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_E_AC3, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EAC3)},
674*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_E_AC3_JOC,
675*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EAC3_JOC)},
676*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DTS, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DTS)},
677*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DTS_HD,
678*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DTS_HD)},
679*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DTS_HD_MA,
680*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DTS_HD_MA)},
681*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DTS_UHD,
682*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DTS_UHD_P1)},
683*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DTS_UHD_P2,
684*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DTS_UHD_P2)},
685*ec779b8eSAndroid Build Coastguard Worker             // In the future, we would like to represent encapsulated bitstreams as
686*ec779b8eSAndroid Build Coastguard Worker             // nested AudioFormatDescriptions. The legacy 'AUDIO_FORMAT_IEC61937' type doesn't
687*ec779b8eSAndroid Build Coastguard Worker             // specify the format of the encapsulated bitstream.
688*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_IEC61937,
689*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(PcmType::INT_16_BIT,
690*ec779b8eSAndroid Build Coastguard Worker                                          ::android::MEDIA_MIMETYPE_AUDIO_IEC61937)},
691*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DOLBY_TRUEHD,
692*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DOLBY_TRUEHD)},
693*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_EVRC, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EVRC)},
694*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_EVRCB,
695*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EVRCB)},
696*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_EVRCWB,
697*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EVRCWB)},
698*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_EVRCNW,
699*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_EVRCNW)},
700*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADIF,
701*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADIF)},
702*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_WMA, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_WMA)},
703*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
704*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_WMA_PRO, make_AudioFormatDescription("audio/x-ms-wma.pro")},
705*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AMR_WB_PLUS,
706*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS)},
707*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MP2,
708*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II)},
709*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_QCELP,
710*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_QCELP)},
711*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
712*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_DSD, make_AudioFormatDescription("audio/vnd.sony.dsd")},
713*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_FLAC, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_FLAC)},
714*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_ALAC, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_ALAC)},
715*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
716*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APE, make_AudioFormatDescription("audio/x-ape")},
717*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS,
718*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS)},
719*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_MAIN,
720*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_MAIN)},
721*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_LC,
722*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LC)},
723*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_SSR,
724*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SSR)},
725*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_LTP,
726*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LTP)},
727*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_HE_V1,
728*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V1)},
729*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_SCALABLE,
730*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_SCALABLE)},
731*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_ERLC,
732*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ERLC)},
733*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_LD,
734*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_LD)},
735*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_HE_V2,
736*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_HE_V2)},
737*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_ELD,
738*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_ELD)},
739*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_ADTS_XHE,
740*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_ADTS_XHE)},
741*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry. "vnd.octel.sbc" is not BT SBC.
742*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_SBC, make_AudioFormatDescription("audio/x-sbc")},
743*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_APTX, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_APTX)},
744*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
745*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APTX_HD, make_AudioFormatDescription("audio/vnd.qcom.aptx.hd")},
746*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AC4, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AC4)},
747*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AC4_L4, make_AudioFormatDescription(
748*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_AC4) + ";version=02.01.04")},
749*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
750*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_LDAC, make_AudioFormatDescription("audio/vnd.sony.ldac")},
751*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MAT,
752*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DOLBY_MAT)},
753*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
754*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_MAT_1_0,
755*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DOLBY_MAT +
756*ec779b8eSAndroid Build Coastguard Worker                                          std::string(".1.0"))},
757*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
758*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_MAT_2_0,
759*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DOLBY_MAT +
760*ec779b8eSAndroid Build Coastguard Worker                                          std::string(".2.0"))},
761*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
762*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_MAT_2_1,
763*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DOLBY_MAT +
764*ec779b8eSAndroid Build Coastguard Worker                                          std::string(".2.1"))},
765*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LATM,
766*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC)},
767*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LATM_LC,
768*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LATM_LC)},
769*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LATM_HE_V1,
770*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V1)},
771*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_AAC_LATM_HE_V2,
772*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_AAC_LATM_HE_V2)},
773*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
774*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_CELT, make_AudioFormatDescription("audio/x-celt")},
775*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
776*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APTX_ADAPTIVE,
777*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive")},
778*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
779*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_LHDC, make_AudioFormatDescription("audio/vnd.savitech.lhdc")},
780*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
781*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_LHDC_LL, make_AudioFormatDescription("audio/vnd.savitech.lhdc.ll")},
782*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
783*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APTX_TWSP, make_AudioFormatDescription("audio/vnd.qcom.aptx.twsp")},
784*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
785*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_LC3, make_AudioFormatDescription("audio/x-lc3")},
786*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MPEGH,
787*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEGH_MHM1)},
788*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MPEGH_BL_L3,
789*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L3)},
790*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MPEGH_BL_L4,
791*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEGH_BL_L4)},
792*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MPEGH_LC_L3,
793*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L3)},
794*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_MPEGH_LC_L4,
795*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_MPEGH_LC_L4)},
796*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_IEC60958,
797*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription(PcmType::INT_24_BIT,
798*ec779b8eSAndroid Build Coastguard Worker                                          ::android::MEDIA_MIMETYPE_AUDIO_IEC60958)},
799*ec779b8eSAndroid Build Coastguard Worker             {AUDIO_FORMAT_DRA, make_AudioFormatDescription(::android::MEDIA_MIMETYPE_AUDIO_DRA)},
800*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
801*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APTX_ADAPTIVE_QLEA,
802*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive.r3")},
803*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
804*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_APTX_ADAPTIVE_R4,
805*ec779b8eSAndroid Build Coastguard Worker              make_AudioFormatDescription("audio/vnd.qcom.aptx.adaptive.r4")},
806*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
807*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_SIMPLE_OPUS, make_AudioFormatDescription(
808*ec779b8eSAndroid Build Coastguard Worker                      std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".simple.opus")},
809*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
810*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_SIMPLE_AAC, make_AudioFormatDescription(
811*ec779b8eSAndroid Build Coastguard Worker                      std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".simple.aac")},
812*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
813*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_SIMPLE_FLAC, make_AudioFormatDescription(
814*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".simple.flac")},
815*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
816*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_SIMPLE_PCM, make_AudioFormatDescription(
817*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".simple.pcm")},
818*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
819*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_OPUS, make_AudioFormatDescription(
820*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base.opus")},
821*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
822*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_AAC, make_AudioFormatDescription(
823*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base.aac")},
824*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
825*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_FLAC, make_AudioFormatDescription(
826*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base.flac")},
827*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
828*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_PCM, make_AudioFormatDescription(
829*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base.pcm")},
830*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
831*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_ENHANCED_OPUS, make_AudioFormatDescription(
832*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base_enhanced.opus")},
833*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
834*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_ENHANCED_AAC, make_AudioFormatDescription(
835*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base_enhanced.aac")},
836*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
837*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_ENHANCED_FLAC, make_AudioFormatDescription(
838*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base_enhanced.flac")},
839*ec779b8eSAndroid Build Coastguard Worker             {// Note: not in the IANA registry.
840*ec779b8eSAndroid Build Coastguard Worker              AUDIO_FORMAT_IAMF_BASE_ENHANCED_PCM, make_AudioFormatDescription(
841*ec779b8eSAndroid Build Coastguard Worker                     std::string(::android::MEDIA_MIMETYPE_AUDIO_IAMF) + ".base_enhanced.pcm")},
842*ec779b8eSAndroid Build Coastguard Worker     }};
843*ec779b8eSAndroid Build Coastguard Worker     return pairs;
844*ec779b8eSAndroid Build Coastguard Worker }
845*ec779b8eSAndroid Build Coastguard Worker 
846*ec779b8eSAndroid Build Coastguard Worker template<typename S, typename T>
make_DirectMap(const std::vector<std::pair<S,T>> & v)847*ec779b8eSAndroid Build Coastguard Worker std::map<S, T> make_DirectMap(const std::vector<std::pair<S, T>>& v) {
848*ec779b8eSAndroid Build Coastguard Worker     std::map<S, T> result(v.begin(), v.end());
849*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
850*ec779b8eSAndroid Build Coastguard Worker     return result;
851*ec779b8eSAndroid Build Coastguard Worker }
852*ec779b8eSAndroid Build Coastguard Worker 
853*ec779b8eSAndroid Build Coastguard Worker template<typename S, typename T>
make_DirectMap(const std::vector<std::pair<S,T>> & v1,const std::vector<std::pair<S,T>> & v2)854*ec779b8eSAndroid Build Coastguard Worker std::map<S, T> make_DirectMap(
855*ec779b8eSAndroid Build Coastguard Worker         const std::vector<std::pair<S, T>>& v1, const std::vector<std::pair<S, T>>& v2) {
856*ec779b8eSAndroid Build Coastguard Worker     std::map<S, T> result(v1.begin(), v1.end());
857*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(result.size() != v1.size(), "Duplicate key elements detected in v1");
858*ec779b8eSAndroid Build Coastguard Worker     result.insert(v2.begin(), v2.end());
859*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(result.size() != v1.size() + v2.size(),
860*ec779b8eSAndroid Build Coastguard Worker             "Duplicate key elements detected in v1+v2");
861*ec779b8eSAndroid Build Coastguard Worker     return result;
862*ec779b8eSAndroid Build Coastguard Worker }
863*ec779b8eSAndroid Build Coastguard Worker 
864*ec779b8eSAndroid Build Coastguard Worker template<typename S, typename T>
make_ReverseMap(const std::vector<std::pair<S,T>> & v)865*ec779b8eSAndroid Build Coastguard Worker std::map<T, S> make_ReverseMap(const std::vector<std::pair<S, T>>& v) {
866*ec779b8eSAndroid Build Coastguard Worker     std::map<T, S> result;
867*ec779b8eSAndroid Build Coastguard Worker     std::transform(v.begin(), v.end(), std::inserter(result, result.begin()),
868*ec779b8eSAndroid Build Coastguard Worker             [](const std::pair<S, T>& p) {
869*ec779b8eSAndroid Build Coastguard Worker                 return std::make_pair(p.second, p.first);
870*ec779b8eSAndroid Build Coastguard Worker             });
871*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(result.size() != v.size(), "Duplicate key elements detected");
872*ec779b8eSAndroid Build Coastguard Worker     return result;
873*ec779b8eSAndroid Build Coastguard Worker }
874*ec779b8eSAndroid Build Coastguard Worker 
875*ec779b8eSAndroid Build Coastguard Worker }  // namespace
876*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioChannelLayout_layout_audio_channel_mask_t_bits(int aidlLayout,bool isInput)877*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t aidl2legacy_AudioChannelLayout_layout_audio_channel_mask_t_bits(
878*ec779b8eSAndroid Build Coastguard Worker         int aidlLayout, bool isInput) {
879*ec779b8eSAndroid Build Coastguard Worker     auto& bitMapping = isInput ? getInAudioChannelBits() : getOutAudioChannelBits();
880*ec779b8eSAndroid Build Coastguard Worker     const int aidlLayoutInitial = aidlLayout; // for error message
881*ec779b8eSAndroid Build Coastguard Worker     audio_channel_mask_t legacy = AUDIO_CHANNEL_NONE;
882*ec779b8eSAndroid Build Coastguard Worker     for (const auto& bitPair : bitMapping) {
883*ec779b8eSAndroid Build Coastguard Worker         if ((aidlLayout & bitPair.second) == bitPair.second) {
884*ec779b8eSAndroid Build Coastguard Worker             legacy = static_cast<audio_channel_mask_t>(legacy | bitPair.first);
885*ec779b8eSAndroid Build Coastguard Worker             aidlLayout &= ~bitPair.second;
886*ec779b8eSAndroid Build Coastguard Worker             if (aidlLayout == 0) {
887*ec779b8eSAndroid Build Coastguard Worker                 return legacy;
888*ec779b8eSAndroid Build Coastguard Worker             }
889*ec779b8eSAndroid Build Coastguard Worker         }
890*ec779b8eSAndroid Build Coastguard Worker     }
891*ec779b8eSAndroid Build Coastguard Worker     ALOGE("%s: aidl layout 0x%x contains bits 0x%x that have no match to legacy %s bits",
892*ec779b8eSAndroid Build Coastguard Worker             __func__, aidlLayoutInitial, aidlLayout, isInput ? "input" : "output");
893*ec779b8eSAndroid Build Coastguard Worker     return AUDIO_CHANNEL_NONE;
894*ec779b8eSAndroid Build Coastguard Worker }
895*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioChannelLayout_audio_channel_mask_t(const AudioChannelLayout & aidl,bool isInput)896*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_channel_mask_t> aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
897*ec779b8eSAndroid Build Coastguard Worker         const AudioChannelLayout& aidl, bool isInput) {
898*ec779b8eSAndroid Build Coastguard Worker     using ReverseMap = std::map<AudioChannelLayout, audio_channel_mask_t>;
899*ec779b8eSAndroid Build Coastguard Worker     using Tag = AudioChannelLayout::Tag;
900*ec779b8eSAndroid Build Coastguard Worker     static const ReverseMap mIn = make_ReverseMap(getInAudioChannelPairs());
901*ec779b8eSAndroid Build Coastguard Worker     static const ReverseMap mOut = make_ReverseMap(getOutAudioChannelPairs());
902*ec779b8eSAndroid Build Coastguard Worker     static const ReverseMap mVoice = make_ReverseMap(getVoiceAudioChannelPairs());
903*ec779b8eSAndroid Build Coastguard Worker 
904*ec779b8eSAndroid Build Coastguard Worker     auto convert = [](const AudioChannelLayout& aidl, const ReverseMap& m,
905*ec779b8eSAndroid Build Coastguard Worker             const char* func, const char* type) -> ConversionResult<audio_channel_mask_t> {
906*ec779b8eSAndroid Build Coastguard Worker         if (auto it = m.find(aidl); it != m.end()) {
907*ec779b8eSAndroid Build Coastguard Worker             return it->second;
908*ec779b8eSAndroid Build Coastguard Worker         } else {
909*ec779b8eSAndroid Build Coastguard Worker             ALOGW("%s: no legacy %s audio_channel_mask_t found for %s", func, type,
910*ec779b8eSAndroid Build Coastguard Worker                     aidl.toString().c_str());
911*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
912*ec779b8eSAndroid Build Coastguard Worker         }
913*ec779b8eSAndroid Build Coastguard Worker     };
914*ec779b8eSAndroid Build Coastguard Worker 
915*ec779b8eSAndroid Build Coastguard Worker     switch (aidl.getTag()) {
916*ec779b8eSAndroid Build Coastguard Worker         case Tag::none:
917*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CHANNEL_NONE;
918*ec779b8eSAndroid Build Coastguard Worker         case Tag::invalid:
919*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CHANNEL_INVALID;
920*ec779b8eSAndroid Build Coastguard Worker         case Tag::indexMask:
921*ec779b8eSAndroid Build Coastguard Worker             // Index masks do not have pre-defined values.
922*ec779b8eSAndroid Build Coastguard Worker             if (const int bits = aidl.get<Tag::indexMask>();
923*ec779b8eSAndroid Build Coastguard Worker                 __builtin_popcount(bits) != 0 &&
924*ec779b8eSAndroid Build Coastguard Worker                 __builtin_popcount(bits) <= (int)AUDIO_CHANNEL_COUNT_MAX) {
925*ec779b8eSAndroid Build Coastguard Worker                 return audio_channel_mask_from_representation_and_bits(
926*ec779b8eSAndroid Build Coastguard Worker                         AUDIO_CHANNEL_REPRESENTATION_INDEX, bits);
927*ec779b8eSAndroid Build Coastguard Worker             } else {
928*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: invalid indexMask value 0x%x in %s",
929*ec779b8eSAndroid Build Coastguard Worker                         __func__, bits, aidl.toString().c_str());
930*ec779b8eSAndroid Build Coastguard Worker                 return unexpected(BAD_VALUE);
931*ec779b8eSAndroid Build Coastguard Worker             }
932*ec779b8eSAndroid Build Coastguard Worker         case Tag::layoutMask:
933*ec779b8eSAndroid Build Coastguard Worker             // The fast path is to find a direct match for some known layout mask.
934*ec779b8eSAndroid Build Coastguard Worker             if (const auto layoutMatch = convert(aidl, isInput ? mIn : mOut, __func__,
935*ec779b8eSAndroid Build Coastguard Worker                     isInput ? "input" : "output");
936*ec779b8eSAndroid Build Coastguard Worker                     layoutMatch.ok()) {
937*ec779b8eSAndroid Build Coastguard Worker                 return layoutMatch;
938*ec779b8eSAndroid Build Coastguard Worker             }
939*ec779b8eSAndroid Build Coastguard Worker             // If a match for a predefined layout wasn't found, make a custom one from bits.
940*ec779b8eSAndroid Build Coastguard Worker             if (audio_channel_mask_t bitMask =
941*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_AudioChannelLayout_layout_audio_channel_mask_t_bits(
942*ec779b8eSAndroid Build Coastguard Worker                             aidl.get<Tag::layoutMask>(), isInput);
943*ec779b8eSAndroid Build Coastguard Worker                     bitMask != AUDIO_CHANNEL_NONE) {
944*ec779b8eSAndroid Build Coastguard Worker                 return bitMask;
945*ec779b8eSAndroid Build Coastguard Worker             }
946*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
947*ec779b8eSAndroid Build Coastguard Worker         case Tag::voiceMask:
948*ec779b8eSAndroid Build Coastguard Worker             return convert(aidl, mVoice, __func__, "voice");
949*ec779b8eSAndroid Build Coastguard Worker     }
950*ec779b8eSAndroid Build Coastguard Worker     ALOGE("%s: unexpected tag value %d", __func__, static_cast<int>(aidl.getTag()));
951*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
952*ec779b8eSAndroid Build Coastguard Worker }
953*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_channel_mask_t_bits_AudioChannelLayout_layout(audio_channel_mask_t legacy,bool isInput)954*ec779b8eSAndroid Build Coastguard Worker int legacy2aidl_audio_channel_mask_t_bits_AudioChannelLayout_layout(
955*ec779b8eSAndroid Build Coastguard Worker         audio_channel_mask_t legacy, bool isInput) {
956*ec779b8eSAndroid Build Coastguard Worker     auto& bitMapping = isInput ? getInAudioChannelBits() : getOutAudioChannelBits();
957*ec779b8eSAndroid Build Coastguard Worker     const int legacyInitial = legacy; // for error message
958*ec779b8eSAndroid Build Coastguard Worker     int aidlLayout = 0;
959*ec779b8eSAndroid Build Coastguard Worker     for (const auto& bitPair : bitMapping) {
960*ec779b8eSAndroid Build Coastguard Worker         if ((legacy & bitPair.first) == bitPair.first) {
961*ec779b8eSAndroid Build Coastguard Worker             aidlLayout |= bitPair.second;
962*ec779b8eSAndroid Build Coastguard Worker             legacy = static_cast<audio_channel_mask_t>(legacy & ~bitPair.first);
963*ec779b8eSAndroid Build Coastguard Worker             if (legacy == 0) {
964*ec779b8eSAndroid Build Coastguard Worker                 return aidlLayout;
965*ec779b8eSAndroid Build Coastguard Worker             }
966*ec779b8eSAndroid Build Coastguard Worker         }
967*ec779b8eSAndroid Build Coastguard Worker     }
968*ec779b8eSAndroid Build Coastguard Worker     ALOGE("%s: legacy %s audio_channel_mask_t 0x%x contains unrecognized bits 0x%x",
969*ec779b8eSAndroid Build Coastguard Worker             __func__, isInput ? "input" : "output", legacyInitial, legacy);
970*ec779b8eSAndroid Build Coastguard Worker     return 0;
971*ec779b8eSAndroid Build Coastguard Worker }
972*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_channel_mask_t_AudioChannelLayout(audio_channel_mask_t legacy,bool isInput)973*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioChannelLayout> legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
974*ec779b8eSAndroid Build Coastguard Worker         audio_channel_mask_t legacy, bool isInput) {
975*ec779b8eSAndroid Build Coastguard Worker     using DirectMap = std::map<audio_channel_mask_t, AudioChannelLayout>;
976*ec779b8eSAndroid Build Coastguard Worker     using Tag = AudioChannelLayout::Tag;
977*ec779b8eSAndroid Build Coastguard Worker     static const DirectMap mInAndVoice = make_DirectMap(
978*ec779b8eSAndroid Build Coastguard Worker             getInAudioChannelPairs(), getVoiceAudioChannelPairs());
979*ec779b8eSAndroid Build Coastguard Worker     static const DirectMap mOut = make_DirectMap(getOutAudioChannelPairs());
980*ec779b8eSAndroid Build Coastguard Worker 
981*ec779b8eSAndroid Build Coastguard Worker     auto convert = [](const audio_channel_mask_t legacy, const DirectMap& m,
982*ec779b8eSAndroid Build Coastguard Worker             const char* func, const char* type) -> ConversionResult<AudioChannelLayout> {
983*ec779b8eSAndroid Build Coastguard Worker         if (auto it = m.find(legacy); it != m.end()) {
984*ec779b8eSAndroid Build Coastguard Worker             return it->second;
985*ec779b8eSAndroid Build Coastguard Worker         } else {
986*ec779b8eSAndroid Build Coastguard Worker             ALOGW("%s: no AudioChannelLayout found for legacy %s audio_channel_mask_t value 0x%x",
987*ec779b8eSAndroid Build Coastguard Worker                     func, type, legacy);
988*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
989*ec779b8eSAndroid Build Coastguard Worker         }
990*ec779b8eSAndroid Build Coastguard Worker     };
991*ec779b8eSAndroid Build Coastguard Worker 
992*ec779b8eSAndroid Build Coastguard Worker     if (legacy == AUDIO_CHANNEL_NONE) {
993*ec779b8eSAndroid Build Coastguard Worker         return AudioChannelLayout{};
994*ec779b8eSAndroid Build Coastguard Worker     } else if (legacy == AUDIO_CHANNEL_INVALID) {
995*ec779b8eSAndroid Build Coastguard Worker         return AudioChannelLayout::make<Tag::invalid>(0);
996*ec779b8eSAndroid Build Coastguard Worker     }
997*ec779b8eSAndroid Build Coastguard Worker 
998*ec779b8eSAndroid Build Coastguard Worker     const audio_channel_representation_t repr = audio_channel_mask_get_representation(legacy);
999*ec779b8eSAndroid Build Coastguard Worker     if (repr == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
1000*ec779b8eSAndroid Build Coastguard Worker         if (audio_channel_mask_is_valid(legacy)) {
1001*ec779b8eSAndroid Build Coastguard Worker             const int indexMask = VALUE_OR_RETURN(
1002*ec779b8eSAndroid Build Coastguard Worker                     convertIntegral<int>(audio_channel_mask_get_bits(legacy)));
1003*ec779b8eSAndroid Build Coastguard Worker             return AudioChannelLayout::make<Tag::indexMask>(indexMask);
1004*ec779b8eSAndroid Build Coastguard Worker         } else {
1005*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: legacy audio_channel_mask_t value 0x%x is invalid", __func__, legacy);
1006*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
1007*ec779b8eSAndroid Build Coastguard Worker         }
1008*ec779b8eSAndroid Build Coastguard Worker     } else if (repr == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
1009*ec779b8eSAndroid Build Coastguard Worker         // The fast path is to find a direct match for some known layout mask.
1010*ec779b8eSAndroid Build Coastguard Worker         if (const auto layoutMatch = convert(legacy, isInput ? mInAndVoice : mOut, __func__,
1011*ec779b8eSAndroid Build Coastguard Worker                 isInput ? "input / voice" : "output");
1012*ec779b8eSAndroid Build Coastguard Worker                 layoutMatch.ok()) {
1013*ec779b8eSAndroid Build Coastguard Worker             return layoutMatch;
1014*ec779b8eSAndroid Build Coastguard Worker         }
1015*ec779b8eSAndroid Build Coastguard Worker         // If a match for a predefined layout wasn't found, make a custom one from bits,
1016*ec779b8eSAndroid Build Coastguard Worker         // rejecting those with voice channel bits.
1017*ec779b8eSAndroid Build Coastguard Worker         if (!isInput ||
1018*ec779b8eSAndroid Build Coastguard Worker                 (legacy & (AUDIO_CHANNEL_IN_VOICE_UPLINK | AUDIO_CHANNEL_IN_VOICE_DNLINK)) == 0) {
1019*ec779b8eSAndroid Build Coastguard Worker             if (int bitMaskLayout =
1020*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_channel_mask_t_bits_AudioChannelLayout_layout(
1021*ec779b8eSAndroid Build Coastguard Worker                             legacy, isInput);
1022*ec779b8eSAndroid Build Coastguard Worker                     bitMaskLayout != 0) {
1023*ec779b8eSAndroid Build Coastguard Worker                 return AudioChannelLayout::make<Tag::layoutMask>(bitMaskLayout);
1024*ec779b8eSAndroid Build Coastguard Worker             }
1025*ec779b8eSAndroid Build Coastguard Worker         } else {
1026*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: legacy audio_channel_mask_t value 0x%x contains voice bits",
1027*ec779b8eSAndroid Build Coastguard Worker                     __func__, legacy);
1028*ec779b8eSAndroid Build Coastguard Worker         }
1029*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1030*ec779b8eSAndroid Build Coastguard Worker     }
1031*ec779b8eSAndroid Build Coastguard Worker 
1032*ec779b8eSAndroid Build Coastguard Worker     ALOGE("%s: unknown representation %d in audio_channel_mask_t value 0x%x",
1033*ec779b8eSAndroid Build Coastguard Worker             __func__, repr, legacy);
1034*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1035*ec779b8eSAndroid Build Coastguard Worker }
1036*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioDeviceDescription_audio_devices_t(const AudioDeviceDescription & aidl)1037*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_devices_t> aidl2legacy_AudioDeviceDescription_audio_devices_t(
1038*ec779b8eSAndroid Build Coastguard Worker         const AudioDeviceDescription& aidl) {
1039*ec779b8eSAndroid Build Coastguard Worker     static const std::map<AudioDeviceDescription, audio_devices_t> m =
1040*ec779b8eSAndroid Build Coastguard Worker             make_ReverseMap(getAudioDevicePairs());
1041*ec779b8eSAndroid Build Coastguard Worker     if (auto it = m.find(aidl); it != m.end()) {
1042*ec779b8eSAndroid Build Coastguard Worker         return it->second;
1043*ec779b8eSAndroid Build Coastguard Worker     } else {
1044*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: no legacy audio_devices_t found for %s", __func__, aidl.toString().c_str());
1045*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1046*ec779b8eSAndroid Build Coastguard Worker     }
1047*ec779b8eSAndroid Build Coastguard Worker }
1048*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_devices_t_AudioDeviceDescription(audio_devices_t legacy)1049*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioDeviceDescription> legacy2aidl_audio_devices_t_AudioDeviceDescription(
1050*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t legacy) {
1051*ec779b8eSAndroid Build Coastguard Worker     static const std::map<audio_devices_t, AudioDeviceDescription> m =
1052*ec779b8eSAndroid Build Coastguard Worker             make_DirectMap(getAudioDevicePairs());
1053*ec779b8eSAndroid Build Coastguard Worker     if (auto it = m.find(legacy); it != m.end()) {
1054*ec779b8eSAndroid Build Coastguard Worker         return it->second;
1055*ec779b8eSAndroid Build Coastguard Worker     } else {
1056*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: no AudioDeviceDescription found for legacy audio_devices_t value 0x%x",
1057*ec779b8eSAndroid Build Coastguard Worker                 __func__, legacy);
1058*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1059*ec779b8eSAndroid Build Coastguard Worker     }
1060*ec779b8eSAndroid Build Coastguard Worker }
1061*ec779b8eSAndroid Build Coastguard Worker 
suggestDeviceAddressTag(const AudioDeviceDescription & description)1062*ec779b8eSAndroid Build Coastguard Worker AudioDeviceAddress::Tag suggestDeviceAddressTag(const AudioDeviceDescription& description) {
1063*ec779b8eSAndroid Build Coastguard Worker     using Tag = AudioDeviceAddress::Tag;
1064*ec779b8eSAndroid Build Coastguard Worker     if (std::string connection = description.connection;
1065*ec779b8eSAndroid Build Coastguard Worker             connection == GET_DEVICE_DESC_CONNECTION(BT_A2DP) ||
1066*ec779b8eSAndroid Build Coastguard Worker             // Note: BT LE Broadcast uses a "group id".
1067*ec779b8eSAndroid Build Coastguard Worker             (description.type != AudioDeviceType::OUT_BROADCAST &&
1068*ec779b8eSAndroid Build Coastguard Worker                     connection == GET_DEVICE_DESC_CONNECTION(BT_LE)) ||
1069*ec779b8eSAndroid Build Coastguard Worker             connection == GET_DEVICE_DESC_CONNECTION(BT_SCO) ||
1070*ec779b8eSAndroid Build Coastguard Worker             connection == GET_DEVICE_DESC_CONNECTION(WIRELESS)) {
1071*ec779b8eSAndroid Build Coastguard Worker         return Tag::mac;
1072*ec779b8eSAndroid Build Coastguard Worker     } else if (connection == GET_DEVICE_DESC_CONNECTION(IP_V4)) {
1073*ec779b8eSAndroid Build Coastguard Worker         return Tag::ipv4;
1074*ec779b8eSAndroid Build Coastguard Worker     } else if (connection == GET_DEVICE_DESC_CONNECTION(USB)) {
1075*ec779b8eSAndroid Build Coastguard Worker         return Tag::alsa;
1076*ec779b8eSAndroid Build Coastguard Worker     }
1077*ec779b8eSAndroid Build Coastguard Worker     return Tag::id;
1078*ec779b8eSAndroid Build Coastguard Worker }
1079*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioDevice_audio_device(const AudioDevice & aidl,audio_devices_t * legacyType,char * legacyAddress)1080*ec779b8eSAndroid Build Coastguard Worker ::android::status_t aidl2legacy_AudioDevice_audio_device(
1081*ec779b8eSAndroid Build Coastguard Worker         const AudioDevice& aidl,
1082*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t* legacyType, char* legacyAddress) {
1083*ec779b8eSAndroid Build Coastguard Worker     std::string stringAddress;
1084*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
1085*ec779b8eSAndroid Build Coastguard Worker                     aidl, legacyType, &stringAddress));
1086*ec779b8eSAndroid Build Coastguard Worker     return aidl2legacy_string(stringAddress, legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN);
1087*ec779b8eSAndroid Build Coastguard Worker }
1088*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioDevice_audio_device(const AudioDevice & aidl,audio_devices_t * legacyType,String8 * legacyAddress)1089*ec779b8eSAndroid Build Coastguard Worker ::android::status_t aidl2legacy_AudioDevice_audio_device(
1090*ec779b8eSAndroid Build Coastguard Worker         const AudioDevice& aidl,
1091*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t* legacyType, String8* legacyAddress) {
1092*ec779b8eSAndroid Build Coastguard Worker     std::string stringAddress;
1093*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
1094*ec779b8eSAndroid Build Coastguard Worker                     aidl, legacyType, &stringAddress));
1095*ec779b8eSAndroid Build Coastguard Worker     *legacyAddress = VALUE_OR_RETURN_STATUS(aidl2legacy_string_view_String8(stringAddress));
1096*ec779b8eSAndroid Build Coastguard Worker     return OK;
1097*ec779b8eSAndroid Build Coastguard Worker }
1098*ec779b8eSAndroid Build Coastguard Worker 
1099*ec779b8eSAndroid Build Coastguard Worker namespace {
1100*ec779b8eSAndroid Build Coastguard Worker     // Use '01' for LSB bits 0 and 1 as Bluetooth MAC addresses are never multicast
1101*ec779b8eSAndroid Build Coastguard Worker     // and universaly administered
1102*ec779b8eSAndroid Build Coastguard Worker     constexpr std::array<uint8_t, 4> BTANON_PREFIX {0xFD, 0xFF, 0xFF, 0xFF};
1103*ec779b8eSAndroid Build Coastguard Worker     // Keep sync with ServiceUtilities.cpp anonymizeBluetoothAddress
1104*ec779b8eSAndroid Build Coastguard Worker     constexpr const char * BTANON_PREFIX_STR = "XX:XX:XX:XX:";
1105*ec779b8eSAndroid Build Coastguard Worker }
1106*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioDevice_audio_device(const AudioDevice & aidl,audio_devices_t * legacyType,std::string * legacyAddress)1107*ec779b8eSAndroid Build Coastguard Worker ::android::status_t aidl2legacy_AudioDevice_audio_device(
1108*ec779b8eSAndroid Build Coastguard Worker         const AudioDevice& aidl,
1109*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t* legacyType, std::string* legacyAddress) {
1110*ec779b8eSAndroid Build Coastguard Worker     using Tag = AudioDeviceAddress::Tag;
1111*ec779b8eSAndroid Build Coastguard Worker     *legacyType = VALUE_OR_RETURN_STATUS(
1112*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(aidl.type));
1113*ec779b8eSAndroid Build Coastguard Worker     char addressBuffer[AUDIO_DEVICE_MAX_ADDRESS_LEN]{};
1114*ec779b8eSAndroid Build Coastguard Worker     // 'aidl.address' can be empty even when the connection type is not.
1115*ec779b8eSAndroid Build Coastguard Worker     // This happens for device ports that act as "blueprints". In this case
1116*ec779b8eSAndroid Build Coastguard Worker     // we pass an empty string using the 'id' variant.
1117*ec779b8eSAndroid Build Coastguard Worker     switch (aidl.address.getTag()) {
1118*ec779b8eSAndroid Build Coastguard Worker         case Tag::mac: {
1119*ec779b8eSAndroid Build Coastguard Worker             const std::vector<uint8_t>& mac = aidl.address.get<AudioDeviceAddress::mac>();
1120*ec779b8eSAndroid Build Coastguard Worker             if (mac.size() != 6) return BAD_VALUE;
1121*ec779b8eSAndroid Build Coastguard Worker             if (std::equal(BTANON_PREFIX.begin(), BTANON_PREFIX.end(), mac.begin())) {
1122*ec779b8eSAndroid Build Coastguard Worker                 // special case for anonymized mac address:
1123*ec779b8eSAndroid Build Coastguard Worker                 // change anonymized bytes back from FD:FF:FF:FF: to XX:XX:XX:XX:
1124*ec779b8eSAndroid Build Coastguard Worker                 snprintf(addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN,
1125*ec779b8eSAndroid Build Coastguard Worker                         "%s%02X:%02X", BTANON_PREFIX_STR, mac[4], mac[5]);
1126*ec779b8eSAndroid Build Coastguard Worker             } else {
1127*ec779b8eSAndroid Build Coastguard Worker                 snprintf(addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN,
1128*ec779b8eSAndroid Build Coastguard Worker                         "%02X:%02X:%02X:%02X:%02X:%02X",
1129*ec779b8eSAndroid Build Coastguard Worker                         mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
1130*ec779b8eSAndroid Build Coastguard Worker             }
1131*ec779b8eSAndroid Build Coastguard Worker         } break;
1132*ec779b8eSAndroid Build Coastguard Worker         case Tag::ipv4: {
1133*ec779b8eSAndroid Build Coastguard Worker             const std::vector<uint8_t>& ipv4 = aidl.address.get<AudioDeviceAddress::ipv4>();
1134*ec779b8eSAndroid Build Coastguard Worker             if (ipv4.size() != 4) return BAD_VALUE;
1135*ec779b8eSAndroid Build Coastguard Worker             snprintf(addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%u.%u.%u.%u",
1136*ec779b8eSAndroid Build Coastguard Worker                     ipv4[0], ipv4[1], ipv4[2], ipv4[3]);
1137*ec779b8eSAndroid Build Coastguard Worker         } break;
1138*ec779b8eSAndroid Build Coastguard Worker         case Tag::ipv6: {
1139*ec779b8eSAndroid Build Coastguard Worker             const std::vector<int32_t>& ipv6 = aidl.address.get<AudioDeviceAddress::ipv6>();
1140*ec779b8eSAndroid Build Coastguard Worker             if (ipv6.size() != 8) return BAD_VALUE;
1141*ec779b8eSAndroid Build Coastguard Worker // FIXME: Code warning found by clang-r510928
1142*ec779b8eSAndroid Build Coastguard Worker #pragma clang diagnostic push
1143*ec779b8eSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wfortify-source"
1144*ec779b8eSAndroid Build Coastguard Worker             snprintf(addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN,
1145*ec779b8eSAndroid Build Coastguard Worker                     "%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X",
1146*ec779b8eSAndroid Build Coastguard Worker                     ipv6[0], ipv6[1], ipv6[2], ipv6[3], ipv6[4], ipv6[5], ipv6[6], ipv6[7]);
1147*ec779b8eSAndroid Build Coastguard Worker #pragma clang diagnostic pop
1148*ec779b8eSAndroid Build Coastguard Worker         } break;
1149*ec779b8eSAndroid Build Coastguard Worker         case Tag::alsa: {
1150*ec779b8eSAndroid Build Coastguard Worker             const std::vector<int32_t>& alsa = aidl.address.get<AudioDeviceAddress::alsa>();
1151*ec779b8eSAndroid Build Coastguard Worker             if (alsa.size() != 2) return BAD_VALUE;
1152*ec779b8eSAndroid Build Coastguard Worker             snprintf(addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN, "card=%d;device=%d",
1153*ec779b8eSAndroid Build Coastguard Worker                     alsa[0], alsa[1]);
1154*ec779b8eSAndroid Build Coastguard Worker         } break;
1155*ec779b8eSAndroid Build Coastguard Worker         case Tag::id: {
1156*ec779b8eSAndroid Build Coastguard Worker             RETURN_STATUS_IF_ERROR(aidl2legacy_string(aidl.address.get<AudioDeviceAddress::id>(),
1157*ec779b8eSAndroid Build Coastguard Worker                             addressBuffer, AUDIO_DEVICE_MAX_ADDRESS_LEN));
1158*ec779b8eSAndroid Build Coastguard Worker         } break;
1159*ec779b8eSAndroid Build Coastguard Worker     }
1160*ec779b8eSAndroid Build Coastguard Worker     *legacyAddress = addressBuffer;
1161*ec779b8eSAndroid Build Coastguard Worker     return OK;
1162*ec779b8eSAndroid Build Coastguard Worker }
1163*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_device_AudioDevice(audio_devices_t legacyType,const char * legacyAddress)1164*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioDevice> legacy2aidl_audio_device_AudioDevice(
1165*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t legacyType, const char* legacyAddress) {
1166*ec779b8eSAndroid Build Coastguard Worker     const std::string stringAddress = VALUE_OR_RETURN(
1167*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_string(legacyAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN));
1168*ec779b8eSAndroid Build Coastguard Worker     return legacy2aidl_audio_device_AudioDevice(legacyType, stringAddress);
1169*ec779b8eSAndroid Build Coastguard Worker }
1170*ec779b8eSAndroid Build Coastguard Worker 
1171*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioDevice>
legacy2aidl_audio_device_AudioDevice(audio_devices_t legacyType,const String8 & legacyAddress)1172*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_device_AudioDevice(
1173*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t legacyType, const String8& legacyAddress) {
1174*ec779b8eSAndroid Build Coastguard Worker     const std::string stringAddress = VALUE_OR_RETURN(legacy2aidl_String8_string(legacyAddress));
1175*ec779b8eSAndroid Build Coastguard Worker     return legacy2aidl_audio_device_AudioDevice(legacyType, stringAddress);
1176*ec779b8eSAndroid Build Coastguard Worker }
1177*ec779b8eSAndroid Build Coastguard Worker 
1178*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioDevice>
legacy2aidl_audio_device_AudioDevice(audio_devices_t legacyType,const std::string & legacyAddress)1179*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_device_AudioDevice(
1180*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t legacyType, const std::string& legacyAddress) {
1181*ec779b8eSAndroid Build Coastguard Worker     using Tag = AudioDeviceAddress::Tag;
1182*ec779b8eSAndroid Build Coastguard Worker     AudioDevice aidl;
1183*ec779b8eSAndroid Build Coastguard Worker     aidl.type = VALUE_OR_RETURN(
1184*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_devices_t_AudioDeviceDescription(legacyType));
1185*ec779b8eSAndroid Build Coastguard Worker     // 'legacyAddress' can be empty even when the connection type is not.
1186*ec779b8eSAndroid Build Coastguard Worker     // This happens for device ports that act as "blueprints". In this case
1187*ec779b8eSAndroid Build Coastguard Worker     // we pass an empty string using the 'id' variant.
1188*ec779b8eSAndroid Build Coastguard Worker     if (!legacyAddress.empty()) {
1189*ec779b8eSAndroid Build Coastguard Worker         switch (suggestDeviceAddressTag(aidl.type)) {
1190*ec779b8eSAndroid Build Coastguard Worker             case Tag::mac: {
1191*ec779b8eSAndroid Build Coastguard Worker                 std::vector<uint8_t> mac(6);
1192*ec779b8eSAndroid Build Coastguard Worker                 int status;
1193*ec779b8eSAndroid Build Coastguard Worker                 // special case for anonymized mac address:
1194*ec779b8eSAndroid Build Coastguard Worker                 // change anonymized bytes so that they can be scanned as HEX bytes
1195*ec779b8eSAndroid Build Coastguard Worker                 if (legacyAddress.starts_with(BTANON_PREFIX_STR)) {
1196*ec779b8eSAndroid Build Coastguard Worker                     std::copy(BTANON_PREFIX.begin(), BTANON_PREFIX.end(), mac.begin());
1197*ec779b8eSAndroid Build Coastguard Worker                     LOG_ALWAYS_FATAL_IF(legacyAddress.length() <= strlen(BTANON_PREFIX_STR));
1198*ec779b8eSAndroid Build Coastguard Worker                     status = sscanf(legacyAddress.c_str() + strlen(BTANON_PREFIX_STR),
1199*ec779b8eSAndroid Build Coastguard Worker                                         "%hhX:%hhX",
1200*ec779b8eSAndroid Build Coastguard Worker                                         &mac[4], &mac[5]);
1201*ec779b8eSAndroid Build Coastguard Worker                     status += 4;
1202*ec779b8eSAndroid Build Coastguard Worker                 } else {
1203*ec779b8eSAndroid Build Coastguard Worker                     status = sscanf(legacyAddress.c_str(), "%hhX:%hhX:%hhX:%hhX:%hhX:%hhX",
1204*ec779b8eSAndroid Build Coastguard Worker                             &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);
1205*ec779b8eSAndroid Build Coastguard Worker                 }
1206*ec779b8eSAndroid Build Coastguard Worker                 if (status != mac.size()) {
1207*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("%s: malformed MAC address: \"%s\"", __func__, legacyAddress.c_str());
1208*ec779b8eSAndroid Build Coastguard Worker                     return unexpected(BAD_VALUE);
1209*ec779b8eSAndroid Build Coastguard Worker                 }
1210*ec779b8eSAndroid Build Coastguard Worker                 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::mac>(std::move(mac));
1211*ec779b8eSAndroid Build Coastguard Worker             } break;
1212*ec779b8eSAndroid Build Coastguard Worker             case Tag::ipv4: {
1213*ec779b8eSAndroid Build Coastguard Worker                 std::vector<uint8_t> ipv4(4);
1214*ec779b8eSAndroid Build Coastguard Worker                 int status = sscanf(legacyAddress.c_str(), "%hhu.%hhu.%hhu.%hhu",
1215*ec779b8eSAndroid Build Coastguard Worker                         &ipv4[0], &ipv4[1], &ipv4[2], &ipv4[3]);
1216*ec779b8eSAndroid Build Coastguard Worker                 if (status != ipv4.size()) {
1217*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("%s: malformed IPv4 address: \"%s\"", __func__, legacyAddress.c_str());
1218*ec779b8eSAndroid Build Coastguard Worker                     return unexpected(BAD_VALUE);
1219*ec779b8eSAndroid Build Coastguard Worker                 }
1220*ec779b8eSAndroid Build Coastguard Worker                 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::ipv4>(std::move(ipv4));
1221*ec779b8eSAndroid Build Coastguard Worker             } break;
1222*ec779b8eSAndroid Build Coastguard Worker             case Tag::ipv6: {
1223*ec779b8eSAndroid Build Coastguard Worker                 std::vector<int32_t> ipv6(8);
1224*ec779b8eSAndroid Build Coastguard Worker                 int status = sscanf(legacyAddress.c_str(), "%X:%X:%X:%X:%X:%X:%X:%X",
1225*ec779b8eSAndroid Build Coastguard Worker                         &ipv6[0], &ipv6[1], &ipv6[2], &ipv6[3], &ipv6[4], &ipv6[5], &ipv6[6],
1226*ec779b8eSAndroid Build Coastguard Worker                         &ipv6[7]);
1227*ec779b8eSAndroid Build Coastguard Worker                 if (status != ipv6.size()) {
1228*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("%s: malformed IPv6 address: \"%s\"", __func__, legacyAddress.c_str());
1229*ec779b8eSAndroid Build Coastguard Worker                     return unexpected(BAD_VALUE);
1230*ec779b8eSAndroid Build Coastguard Worker                 }
1231*ec779b8eSAndroid Build Coastguard Worker                 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::ipv6>(std::move(ipv6));
1232*ec779b8eSAndroid Build Coastguard Worker             } break;
1233*ec779b8eSAndroid Build Coastguard Worker             case Tag::alsa: {
1234*ec779b8eSAndroid Build Coastguard Worker                 std::vector<int32_t> alsa(2);
1235*ec779b8eSAndroid Build Coastguard Worker                 int status = sscanf(legacyAddress.c_str(), "card=%d;device=%d", &alsa[0], &alsa[1]);
1236*ec779b8eSAndroid Build Coastguard Worker                 if (status != alsa.size()) {
1237*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("%s: malformed ALSA address: \"%s\"", __func__, legacyAddress.c_str());
1238*ec779b8eSAndroid Build Coastguard Worker                     return unexpected(BAD_VALUE);
1239*ec779b8eSAndroid Build Coastguard Worker                 }
1240*ec779b8eSAndroid Build Coastguard Worker                 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::alsa>(std::move(alsa));
1241*ec779b8eSAndroid Build Coastguard Worker             } break;
1242*ec779b8eSAndroid Build Coastguard Worker             case Tag::id: {
1243*ec779b8eSAndroid Build Coastguard Worker                 aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(legacyAddress);
1244*ec779b8eSAndroid Build Coastguard Worker             } break;
1245*ec779b8eSAndroid Build Coastguard Worker         }
1246*ec779b8eSAndroid Build Coastguard Worker     } else {
1247*ec779b8eSAndroid Build Coastguard Worker         aidl.address = AudioDeviceAddress::make<AudioDeviceAddress::id>(legacyAddress);
1248*ec779b8eSAndroid Build Coastguard Worker     }
1249*ec779b8eSAndroid Build Coastguard Worker     return aidl;
1250*ec779b8eSAndroid Build Coastguard Worker }
1251*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioFormatDescription_audio_format_t(const AudioFormatDescription & aidl)1252*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_format_t> aidl2legacy_AudioFormatDescription_audio_format_t(
1253*ec779b8eSAndroid Build Coastguard Worker         const AudioFormatDescription& aidl) {
1254*ec779b8eSAndroid Build Coastguard Worker     static const std::map<AudioFormatDescription, audio_format_t> m =
1255*ec779b8eSAndroid Build Coastguard Worker             make_ReverseMap(getAudioFormatPairs());
1256*ec779b8eSAndroid Build Coastguard Worker     if (auto it = m.find(aidl); it != m.end()) {
1257*ec779b8eSAndroid Build Coastguard Worker         return it->second;
1258*ec779b8eSAndroid Build Coastguard Worker     } else {
1259*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: no legacy audio_format_t found for %s", __func__, aidl.toString().c_str());
1260*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1261*ec779b8eSAndroid Build Coastguard Worker     }
1262*ec779b8eSAndroid Build Coastguard Worker }
1263*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_format_t_AudioFormatDescription(audio_format_t legacy)1264*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioFormatDescription> legacy2aidl_audio_format_t_AudioFormatDescription(
1265*ec779b8eSAndroid Build Coastguard Worker         audio_format_t legacy) {
1266*ec779b8eSAndroid Build Coastguard Worker     static const std::map<audio_format_t, AudioFormatDescription> m =
1267*ec779b8eSAndroid Build Coastguard Worker             make_DirectMap(getAudioFormatPairs());
1268*ec779b8eSAndroid Build Coastguard Worker     if (auto it = m.find(legacy); it != m.end()) {
1269*ec779b8eSAndroid Build Coastguard Worker         return it->second;
1270*ec779b8eSAndroid Build Coastguard Worker     } else {
1271*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: no AudioFormatDescription found for legacy audio_format_t value 0x%x",
1272*ec779b8eSAndroid Build Coastguard Worker                 __func__, legacy);
1273*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1274*ec779b8eSAndroid Build Coastguard Worker     }
1275*ec779b8eSAndroid Build Coastguard Worker }
1276*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioGainMode_audio_gain_mode_t(AudioGainMode aidl)1277*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_gain_mode_t> aidl2legacy_AudioGainMode_audio_gain_mode_t(
1278*ec779b8eSAndroid Build Coastguard Worker         AudioGainMode aidl) {
1279*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1280*ec779b8eSAndroid Build Coastguard Worker         case AudioGainMode::JOINT:
1281*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_GAIN_MODE_JOINT;
1282*ec779b8eSAndroid Build Coastguard Worker         case AudioGainMode::CHANNELS:
1283*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_GAIN_MODE_CHANNELS;
1284*ec779b8eSAndroid Build Coastguard Worker         case AudioGainMode::RAMP:
1285*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_GAIN_MODE_RAMP;
1286*ec779b8eSAndroid Build Coastguard Worker     }
1287*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1288*ec779b8eSAndroid Build Coastguard Worker }
1289*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_gain_mode_t_AudioGainMode(audio_gain_mode_t legacy)1290*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioGainMode> legacy2aidl_audio_gain_mode_t_AudioGainMode(
1291*ec779b8eSAndroid Build Coastguard Worker         audio_gain_mode_t legacy) {
1292*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1293*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_GAIN_MODE_JOINT:
1294*ec779b8eSAndroid Build Coastguard Worker             return AudioGainMode::JOINT;
1295*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_GAIN_MODE_CHANNELS:
1296*ec779b8eSAndroid Build Coastguard Worker             return AudioGainMode::CHANNELS;
1297*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_GAIN_MODE_RAMP:
1298*ec779b8eSAndroid Build Coastguard Worker             return AudioGainMode::RAMP;
1299*ec779b8eSAndroid Build Coastguard Worker     }
1300*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1301*ec779b8eSAndroid Build Coastguard Worker }
1302*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl)1303*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_gain_mode_t> aidl2legacy_int32_t_audio_gain_mode_t_mask(int32_t aidl) {
1304*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<audio_gain_mode_t, int32_t, audio_gain_mode_t, AudioGainMode>(
1305*ec779b8eSAndroid Build Coastguard Worker             aidl, aidl2legacy_AudioGainMode_audio_gain_mode_t,
1306*ec779b8eSAndroid Build Coastguard Worker             // AudioGainMode is index-based.
1307*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<AudioGainMode>,
1308*ec779b8eSAndroid Build Coastguard Worker             // AUDIO_GAIN_MODE_* constants are mask-based.
1309*ec779b8eSAndroid Build Coastguard Worker             enumToMask_bitmask<audio_gain_mode_t, audio_gain_mode_t>);
1310*ec779b8eSAndroid Build Coastguard Worker }
1311*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy)1312*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_gain_mode_t_int32_t_mask(audio_gain_mode_t legacy) {
1313*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t, audio_gain_mode_t, AudioGainMode, audio_gain_mode_t>(
1314*ec779b8eSAndroid Build Coastguard Worker             legacy, legacy2aidl_audio_gain_mode_t_AudioGainMode,
1315*ec779b8eSAndroid Build Coastguard Worker             // AUDIO_GAIN_MODE_* constants are mask-based.
1316*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_bitmask<audio_gain_mode_t>,
1317*ec779b8eSAndroid Build Coastguard Worker             // AudioGainMode is index-based.
1318*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<int32_t, AudioGainMode>);
1319*ec779b8eSAndroid Build Coastguard Worker }
1320*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioGainConfig_audio_gain_config(const AudioGainConfig & aidl,bool isInput)1321*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_gain_config> aidl2legacy_AudioGainConfig_audio_gain_config(
1322*ec779b8eSAndroid Build Coastguard Worker         const AudioGainConfig& aidl, bool isInput) {
1323*ec779b8eSAndroid Build Coastguard Worker     audio_gain_config legacy;
1324*ec779b8eSAndroid Build Coastguard Worker     legacy.index = VALUE_OR_RETURN(convertIntegral<int>(aidl.index));
1325*ec779b8eSAndroid Build Coastguard Worker     legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
1326*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = VALUE_OR_RETURN(
1327*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
1328*ec779b8eSAndroid Build Coastguard Worker     const bool isJoint = bitmaskIsSet(aidl.mode, AudioGainMode::JOINT);
1329*ec779b8eSAndroid Build Coastguard Worker     size_t numValues = isJoint ? 1
1330*ec779b8eSAndroid Build Coastguard Worker                                : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1331*ec779b8eSAndroid Build Coastguard Worker                                          : audio_channel_count_from_out_mask(legacy.channel_mask);
1332*ec779b8eSAndroid Build Coastguard Worker     if (aidl.values.size() != numValues || aidl.values.size() > std::size(legacy.values)) {
1333*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
1334*ec779b8eSAndroid Build Coastguard Worker     }
1335*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < numValues; ++i) {
1336*ec779b8eSAndroid Build Coastguard Worker         legacy.values[i] = VALUE_OR_RETURN(convertIntegral<int>(aidl.values[i]));
1337*ec779b8eSAndroid Build Coastguard Worker     }
1338*ec779b8eSAndroid Build Coastguard Worker     legacy.ramp_duration_ms = VALUE_OR_RETURN(convertIntegral<int>(aidl.rampDurationMs));
1339*ec779b8eSAndroid Build Coastguard Worker     return legacy;
1340*ec779b8eSAndroid Build Coastguard Worker }
1341*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_gain_config_AudioGainConfig(const audio_gain_config & legacy,bool isInput)1342*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioGainConfig> legacy2aidl_audio_gain_config_AudioGainConfig(
1343*ec779b8eSAndroid Build Coastguard Worker         const audio_gain_config& legacy, bool isInput) {
1344*ec779b8eSAndroid Build Coastguard Worker     AudioGainConfig aidl;
1345*ec779b8eSAndroid Build Coastguard Worker     aidl.index = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.index));
1346*ec779b8eSAndroid Build Coastguard Worker     aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
1347*ec779b8eSAndroid Build Coastguard Worker     aidl.channelMask = VALUE_OR_RETURN(
1348*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
1349*ec779b8eSAndroid Build Coastguard Worker     const bool isJoint = (legacy.mode & AUDIO_GAIN_MODE_JOINT) != 0;
1350*ec779b8eSAndroid Build Coastguard Worker     size_t numValues = isJoint ? 1
1351*ec779b8eSAndroid Build Coastguard Worker                                : isInput ? audio_channel_count_from_in_mask(legacy.channel_mask)
1352*ec779b8eSAndroid Build Coastguard Worker                                          : audio_channel_count_from_out_mask(legacy.channel_mask);
1353*ec779b8eSAndroid Build Coastguard Worker     aidl.values.resize(numValues);
1354*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < numValues; ++i) {
1355*ec779b8eSAndroid Build Coastguard Worker         aidl.values[i] = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.values[i]));
1356*ec779b8eSAndroid Build Coastguard Worker     }
1357*ec779b8eSAndroid Build Coastguard Worker     aidl.rampDurationMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.ramp_duration_ms));
1358*ec779b8eSAndroid Build Coastguard Worker     return aidl;
1359*ec779b8eSAndroid Build Coastguard Worker }
1360*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioInputFlags_audio_input_flags_t(AudioInputFlags aidl)1361*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_input_flags_t> aidl2legacy_AudioInputFlags_audio_input_flags_t(
1362*ec779b8eSAndroid Build Coastguard Worker         AudioInputFlags aidl) {
1363*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1364*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::FAST:
1365*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_FAST;
1366*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::HW_HOTWORD:
1367*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_HW_HOTWORD;
1368*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::RAW:
1369*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_RAW;
1370*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::SYNC:
1371*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_SYNC;
1372*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::MMAP_NOIRQ:
1373*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_MMAP_NOIRQ;
1374*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::VOIP_TX:
1375*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_VOIP_TX;
1376*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::HW_AV_SYNC:
1377*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_HW_AV_SYNC;
1378*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::DIRECT:
1379*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_DIRECT;
1380*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::ULTRASOUND:
1381*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_ULTRASOUND;
1382*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::HOTWORD_TAP:
1383*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_HOTWORD_TAP;
1384*ec779b8eSAndroid Build Coastguard Worker         case AudioInputFlags::HW_LOOKBACK:
1385*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_INPUT_FLAG_HW_LOOKBACK;
1386*ec779b8eSAndroid Build Coastguard Worker     }
1387*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1388*ec779b8eSAndroid Build Coastguard Worker }
1389*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_input_flags_t_AudioInputFlags(audio_input_flags_t legacy)1390*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioInputFlags> legacy2aidl_audio_input_flags_t_AudioInputFlags(
1391*ec779b8eSAndroid Build Coastguard Worker         audio_input_flags_t legacy) {
1392*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1393*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_NONE:
1394*ec779b8eSAndroid Build Coastguard Worker             break; // shouldn't get here. must be listed  -Werror,-Wswitch
1395*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_FAST:
1396*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::FAST;
1397*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_HW_HOTWORD:
1398*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::HW_HOTWORD;
1399*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_RAW:
1400*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::RAW;
1401*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_SYNC:
1402*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::SYNC;
1403*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_MMAP_NOIRQ:
1404*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::MMAP_NOIRQ;
1405*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_VOIP_TX:
1406*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::VOIP_TX;
1407*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_HW_AV_SYNC:
1408*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::HW_AV_SYNC;
1409*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_DIRECT:
1410*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::DIRECT;
1411*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_ULTRASOUND:
1412*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::ULTRASOUND;
1413*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_HOTWORD_TAP:
1414*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::HOTWORD_TAP;
1415*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_INPUT_FLAG_HW_LOOKBACK:
1416*ec779b8eSAndroid Build Coastguard Worker             return AudioInputFlags::HW_LOOKBACK;
1417*ec779b8eSAndroid Build Coastguard Worker     }
1418*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1419*ec779b8eSAndroid Build Coastguard Worker }
1420*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioOutputFlags_audio_output_flags_t(AudioOutputFlags aidl)1421*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_output_flags_t> aidl2legacy_AudioOutputFlags_audio_output_flags_t(
1422*ec779b8eSAndroid Build Coastguard Worker         AudioOutputFlags aidl) {
1423*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1424*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::DIRECT:
1425*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_DIRECT;
1426*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::PRIMARY:
1427*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_PRIMARY;
1428*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::FAST:
1429*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_FAST;
1430*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::DEEP_BUFFER:
1431*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
1432*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::COMPRESS_OFFLOAD:
1433*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
1434*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::NON_BLOCKING:
1435*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_NON_BLOCKING;
1436*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::HW_AV_SYNC:
1437*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_HW_AV_SYNC;
1438*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::TTS:
1439*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_TTS;
1440*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::RAW:
1441*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_RAW;
1442*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::SYNC:
1443*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_SYNC;
1444*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::IEC958_NONAUDIO:
1445*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
1446*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::DIRECT_PCM:
1447*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_DIRECT_PCM;
1448*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::MMAP_NOIRQ:
1449*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_MMAP_NOIRQ;
1450*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::VOIP_RX:
1451*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_VOIP_RX;
1452*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::INCALL_MUSIC:
1453*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_INCALL_MUSIC;
1454*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::GAPLESS_OFFLOAD:
1455*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD;
1456*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::ULTRASOUND:
1457*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_ULTRASOUND;
1458*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::SPATIALIZER:
1459*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_SPATIALIZER;
1460*ec779b8eSAndroid Build Coastguard Worker         case AudioOutputFlags::BIT_PERFECT:
1461*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_OUTPUT_FLAG_BIT_PERFECT;
1462*ec779b8eSAndroid Build Coastguard Worker     }
1463*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1464*ec779b8eSAndroid Build Coastguard Worker }
1465*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_output_flags_t_AudioOutputFlags(audio_output_flags_t legacy)1466*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioOutputFlags> legacy2aidl_audio_output_flags_t_AudioOutputFlags(
1467*ec779b8eSAndroid Build Coastguard Worker         audio_output_flags_t legacy) {
1468*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1469*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_NONE:
1470*ec779b8eSAndroid Build Coastguard Worker             break; // shouldn't get here. must be listed  -Werror,-Wswitch
1471*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_DIRECT:
1472*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::DIRECT;
1473*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_PRIMARY:
1474*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::PRIMARY;
1475*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_FAST:
1476*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::FAST;
1477*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_DEEP_BUFFER:
1478*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::DEEP_BUFFER;
1479*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD:
1480*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::COMPRESS_OFFLOAD;
1481*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_NON_BLOCKING:
1482*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::NON_BLOCKING;
1483*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_HW_AV_SYNC:
1484*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::HW_AV_SYNC;
1485*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_TTS:
1486*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::TTS;
1487*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_RAW:
1488*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::RAW;
1489*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_SYNC:
1490*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::SYNC;
1491*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO:
1492*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::IEC958_NONAUDIO;
1493*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_DIRECT_PCM:
1494*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::DIRECT_PCM;
1495*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_MMAP_NOIRQ:
1496*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::MMAP_NOIRQ;
1497*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_VOIP_RX:
1498*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::VOIP_RX;
1499*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_INCALL_MUSIC:
1500*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::INCALL_MUSIC;
1501*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD:
1502*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::GAPLESS_OFFLOAD;
1503*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_ULTRASOUND:
1504*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::ULTRASOUND;
1505*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_SPATIALIZER:
1506*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::SPATIALIZER;
1507*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_OUTPUT_FLAG_BIT_PERFECT:
1508*ec779b8eSAndroid Build Coastguard Worker             return AudioOutputFlags::BIT_PERFECT;
1509*ec779b8eSAndroid Build Coastguard Worker     }
1510*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1511*ec779b8eSAndroid Build Coastguard Worker }
1512*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_input_flags_t_mask(int32_t aidl)1513*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_input_flags_t> aidl2legacy_int32_t_audio_input_flags_t_mask(
1514*ec779b8eSAndroid Build Coastguard Worker         int32_t aidl) {
1515*ec779b8eSAndroid Build Coastguard Worker     using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1516*ec779b8eSAndroid Build Coastguard Worker 
1517*ec779b8eSAndroid Build Coastguard Worker     LegacyMask converted = VALUE_OR_RETURN(
1518*ec779b8eSAndroid Build Coastguard Worker             (convertBitmask<LegacyMask, int32_t, audio_input_flags_t, AudioInputFlags>(
1519*ec779b8eSAndroid Build Coastguard Worker                     aidl, aidl2legacy_AudioInputFlags_audio_input_flags_t,
1520*ec779b8eSAndroid Build Coastguard Worker                     indexToEnum_index<AudioInputFlags>,
1521*ec779b8eSAndroid Build Coastguard Worker                     enumToMask_bitmask<LegacyMask, audio_input_flags_t>)));
1522*ec779b8eSAndroid Build Coastguard Worker     return static_cast<audio_input_flags_t>(converted);
1523*ec779b8eSAndroid Build Coastguard Worker }
1524*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_input_flags_t_int32_t_mask(audio_input_flags_t legacy)1525*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_input_flags_t_int32_t_mask(
1526*ec779b8eSAndroid Build Coastguard Worker         audio_input_flags_t legacy) {
1527*ec779b8eSAndroid Build Coastguard Worker     using LegacyMask = std::underlying_type_t<audio_input_flags_t>;
1528*ec779b8eSAndroid Build Coastguard Worker 
1529*ec779b8eSAndroid Build Coastguard Worker     LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1530*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t, LegacyMask, AudioInputFlags, audio_input_flags_t>(
1531*ec779b8eSAndroid Build Coastguard Worker             legacyMask, legacy2aidl_audio_input_flags_t_AudioInputFlags,
1532*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_bitmask<audio_input_flags_t>,
1533*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<int32_t, AudioInputFlags>);
1534*ec779b8eSAndroid Build Coastguard Worker }
1535*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_output_flags_t_mask(int32_t aidl)1536*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_output_flags_t> aidl2legacy_int32_t_audio_output_flags_t_mask(
1537*ec779b8eSAndroid Build Coastguard Worker         int32_t aidl) {
1538*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<audio_output_flags_t,
1539*ec779b8eSAndroid Build Coastguard Worker             int32_t,
1540*ec779b8eSAndroid Build Coastguard Worker             audio_output_flags_t,
1541*ec779b8eSAndroid Build Coastguard Worker             AudioOutputFlags>(
1542*ec779b8eSAndroid Build Coastguard Worker             aidl, aidl2legacy_AudioOutputFlags_audio_output_flags_t,
1543*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<AudioOutputFlags>,
1544*ec779b8eSAndroid Build Coastguard Worker             enumToMask_bitmask<audio_output_flags_t, audio_output_flags_t>);
1545*ec779b8eSAndroid Build Coastguard Worker }
1546*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_output_flags_t_int32_t_mask(audio_output_flags_t legacy)1547*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_output_flags_t_int32_t_mask(
1548*ec779b8eSAndroid Build Coastguard Worker         audio_output_flags_t legacy) {
1549*ec779b8eSAndroid Build Coastguard Worker     using LegacyMask = std::underlying_type_t<audio_output_flags_t>;
1550*ec779b8eSAndroid Build Coastguard Worker 
1551*ec779b8eSAndroid Build Coastguard Worker     LegacyMask legacyMask = static_cast<LegacyMask>(legacy);
1552*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t, LegacyMask, AudioOutputFlags, audio_output_flags_t>(
1553*ec779b8eSAndroid Build Coastguard Worker             legacyMask, legacy2aidl_audio_output_flags_t_AudioOutputFlags,
1554*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_bitmask<audio_output_flags_t>,
1555*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<int32_t, AudioOutputFlags>);
1556*ec779b8eSAndroid Build Coastguard Worker }
1557*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioIoFlags_audio_io_flags(const AudioIoFlags & aidl,bool isInput)1558*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_io_flags> aidl2legacy_AudioIoFlags_audio_io_flags(
1559*ec779b8eSAndroid Build Coastguard Worker         const AudioIoFlags& aidl, bool isInput) {
1560*ec779b8eSAndroid Build Coastguard Worker     audio_io_flags legacy;
1561*ec779b8eSAndroid Build Coastguard Worker     if (isInput) {
1562*ec779b8eSAndroid Build Coastguard Worker         legacy.input = VALUE_OR_RETURN(
1563*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_int32_t_audio_input_flags_t_mask(
1564*ec779b8eSAndroid Build Coastguard Worker                         VALUE_OR_RETURN(UNION_GET(aidl, input))));
1565*ec779b8eSAndroid Build Coastguard Worker     } else {
1566*ec779b8eSAndroid Build Coastguard Worker         legacy.output = VALUE_OR_RETURN(
1567*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_int32_t_audio_output_flags_t_mask(
1568*ec779b8eSAndroid Build Coastguard Worker                         VALUE_OR_RETURN(UNION_GET(aidl, output))));
1569*ec779b8eSAndroid Build Coastguard Worker     }
1570*ec779b8eSAndroid Build Coastguard Worker     return legacy;
1571*ec779b8eSAndroid Build Coastguard Worker }
1572*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_io_flags_AudioIoFlags(const audio_io_flags & legacy,bool isInput)1573*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioIoFlags> legacy2aidl_audio_io_flags_AudioIoFlags(
1574*ec779b8eSAndroid Build Coastguard Worker         const audio_io_flags& legacy, bool isInput) {
1575*ec779b8eSAndroid Build Coastguard Worker     AudioIoFlags aidl;
1576*ec779b8eSAndroid Build Coastguard Worker     if (isInput) {
1577*ec779b8eSAndroid Build Coastguard Worker         UNION_SET(aidl, input,
1578*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(legacy.input)));
1579*ec779b8eSAndroid Build Coastguard Worker     } else {
1580*ec779b8eSAndroid Build Coastguard Worker         UNION_SET(aidl, output,
1581*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(legacy.output)));
1582*ec779b8eSAndroid Build Coastguard Worker     }
1583*ec779b8eSAndroid Build Coastguard Worker     return aidl;
1584*ec779b8eSAndroid Build Coastguard Worker }
1585*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioStreamType_audio_stream_type_t(AudioStreamType aidl)1586*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_stream_type_t> aidl2legacy_AudioStreamType_audio_stream_type_t(
1587*ec779b8eSAndroid Build Coastguard Worker         AudioStreamType aidl) {
1588*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1589*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::INVALID:
1590*ec779b8eSAndroid Build Coastguard Worker             break;  // return error
1591*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::SYS_RESERVED_DEFAULT:
1592*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_DEFAULT;
1593*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::VOICE_CALL:
1594*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_VOICE_CALL;
1595*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::SYSTEM:
1596*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_SYSTEM;
1597*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::RING:
1598*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_RING;
1599*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::MUSIC:
1600*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_MUSIC;
1601*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::ALARM:
1602*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_ALARM;
1603*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::NOTIFICATION:
1604*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_NOTIFICATION;
1605*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::BLUETOOTH_SCO:
1606*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_BLUETOOTH_SCO;
1607*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::ENFORCED_AUDIBLE:
1608*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_ENFORCED_AUDIBLE;
1609*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::DTMF:
1610*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_DTMF;
1611*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::TTS:
1612*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_TTS;
1613*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::ACCESSIBILITY:
1614*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_ACCESSIBILITY;
1615*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::ASSISTANT:
1616*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_ASSISTANT;
1617*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::SYS_RESERVED_REROUTING:
1618*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_REROUTING;
1619*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::SYS_RESERVED_PATCH:
1620*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_PATCH;
1621*ec779b8eSAndroid Build Coastguard Worker         case AudioStreamType::CALL_ASSISTANT:
1622*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STREAM_CALL_ASSISTANT;
1623*ec779b8eSAndroid Build Coastguard Worker     }
1624*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1625*ec779b8eSAndroid Build Coastguard Worker }
1626*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_stream_type_t_AudioStreamType(audio_stream_type_t legacy)1627*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioStreamType> legacy2aidl_audio_stream_type_t_AudioStreamType(
1628*ec779b8eSAndroid Build Coastguard Worker         audio_stream_type_t legacy) {
1629*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1630*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_DEFAULT:
1631*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::SYS_RESERVED_DEFAULT;
1632*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_VOICE_CALL:
1633*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::VOICE_CALL;
1634*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_SYSTEM:
1635*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::SYSTEM;
1636*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_RING:
1637*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::RING;
1638*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_MUSIC:
1639*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::MUSIC;
1640*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_ALARM:
1641*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::ALARM;
1642*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_NOTIFICATION:
1643*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::NOTIFICATION;
1644*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_BLUETOOTH_SCO:
1645*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::BLUETOOTH_SCO;
1646*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_ENFORCED_AUDIBLE:
1647*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::ENFORCED_AUDIBLE;
1648*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_DTMF:
1649*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::DTMF;
1650*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_TTS:
1651*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::TTS;
1652*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_ACCESSIBILITY:
1653*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::ACCESSIBILITY;
1654*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_ASSISTANT:
1655*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::ASSISTANT;
1656*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_REROUTING:
1657*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::SYS_RESERVED_REROUTING;
1658*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_PATCH:
1659*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::SYS_RESERVED_PATCH;
1660*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STREAM_CALL_ASSISTANT:
1661*ec779b8eSAndroid Build Coastguard Worker             return AudioStreamType::CALL_ASSISTANT;
1662*ec779b8eSAndroid Build Coastguard Worker     }
1663*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1664*ec779b8eSAndroid Build Coastguard Worker }
1665*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioSource_audio_source_t(AudioSource aidl)1666*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_source_t> aidl2legacy_AudioSource_audio_source_t(
1667*ec779b8eSAndroid Build Coastguard Worker         AudioSource aidl) {
1668*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1669*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::SYS_RESERVED_INVALID:
1670*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_INVALID;
1671*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::DEFAULT:
1672*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_DEFAULT;
1673*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::MIC:
1674*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_MIC;
1675*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_UPLINK:
1676*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_UPLINK;
1677*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_DOWNLINK:
1678*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_DOWNLINK;
1679*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_CALL:
1680*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_CALL;
1681*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::CAMCORDER:
1682*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_CAMCORDER;
1683*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_RECOGNITION:
1684*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_RECOGNITION;
1685*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_COMMUNICATION:
1686*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_COMMUNICATION;
1687*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::REMOTE_SUBMIX:
1688*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_REMOTE_SUBMIX;
1689*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::UNPROCESSED:
1690*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_UNPROCESSED;
1691*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_PERFORMANCE:
1692*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_VOICE_PERFORMANCE;
1693*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::ULTRASOUND:
1694*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_ULTRASOUND;
1695*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::ECHO_REFERENCE:
1696*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_ECHO_REFERENCE;
1697*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::FM_TUNER:
1698*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_FM_TUNER;
1699*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::HOTWORD:
1700*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_SOURCE_HOTWORD;
1701*ec779b8eSAndroid Build Coastguard Worker     }
1702*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1703*ec779b8eSAndroid Build Coastguard Worker }
1704*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_source_t_AudioSource(audio_source_t legacy)1705*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioSource> legacy2aidl_audio_source_t_AudioSource(
1706*ec779b8eSAndroid Build Coastguard Worker         audio_source_t legacy) {
1707*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1708*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_INVALID:
1709*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::SYS_RESERVED_INVALID;
1710*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_DEFAULT:
1711*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::DEFAULT;
1712*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_MIC:
1713*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::MIC;
1714*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_UPLINK:
1715*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_UPLINK;
1716*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_DOWNLINK:
1717*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_DOWNLINK;
1718*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_CALL:
1719*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_CALL;
1720*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_CAMCORDER:
1721*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::CAMCORDER;
1722*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_RECOGNITION:
1723*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_RECOGNITION;
1724*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_COMMUNICATION:
1725*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_COMMUNICATION;
1726*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_REMOTE_SUBMIX:
1727*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::REMOTE_SUBMIX;
1728*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_UNPROCESSED:
1729*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::UNPROCESSED;
1730*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_VOICE_PERFORMANCE:
1731*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::VOICE_PERFORMANCE;
1732*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_ULTRASOUND:
1733*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::ULTRASOUND;
1734*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_ECHO_REFERENCE:
1735*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::ECHO_REFERENCE;
1736*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_FM_TUNER:
1737*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::FM_TUNER;
1738*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_SOURCE_HOTWORD:
1739*ec779b8eSAndroid Build Coastguard Worker             return AudioSource::HOTWORD;
1740*ec779b8eSAndroid Build Coastguard Worker     }
1741*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1742*ec779b8eSAndroid Build Coastguard Worker }
1743*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_session_t(int32_t aidl)1744*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_session_t> aidl2legacy_int32_t_audio_session_t(int32_t aidl) {
1745*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_session_t>(aidl);
1746*ec779b8eSAndroid Build Coastguard Worker }
1747*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_session_t_int32_t(audio_session_t legacy)1748*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_session_t_int32_t(audio_session_t legacy) {
1749*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
1750*ec779b8eSAndroid Build Coastguard Worker }
1751*ec779b8eSAndroid Build Coastguard Worker 
1752*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_content_type_t>
aidl2legacy_AudioContentType_audio_content_type_t(AudioContentType aidl)1753*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioContentType_audio_content_type_t(AudioContentType aidl) {
1754*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1755*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::UNKNOWN:
1756*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_UNKNOWN;
1757*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::SPEECH:
1758*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_SPEECH;
1759*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::MUSIC:
1760*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_MUSIC;
1761*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::MOVIE:
1762*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_MOVIE;
1763*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::SONIFICATION:
1764*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_SONIFICATION;
1765*ec779b8eSAndroid Build Coastguard Worker         case AudioContentType::ULTRASOUND:
1766*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_CONTENT_TYPE_ULTRASOUND;
1767*ec779b8eSAndroid Build Coastguard Worker     }
1768*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1769*ec779b8eSAndroid Build Coastguard Worker }
1770*ec779b8eSAndroid Build Coastguard Worker 
1771*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioContentType>
legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy)1772*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_content_type_t_AudioContentType(audio_content_type_t legacy) {
1773*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1774*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_UNKNOWN:
1775*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::UNKNOWN;
1776*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_SPEECH:
1777*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::SPEECH;
1778*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_MUSIC:
1779*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::MUSIC;
1780*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_MOVIE:
1781*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::MOVIE;
1782*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_SONIFICATION:
1783*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::SONIFICATION;
1784*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_CONTENT_TYPE_ULTRASOUND:
1785*ec779b8eSAndroid Build Coastguard Worker             return AudioContentType::ULTRASOUND;
1786*ec779b8eSAndroid Build Coastguard Worker     }
1787*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1788*ec779b8eSAndroid Build Coastguard Worker }
1789*ec779b8eSAndroid Build Coastguard Worker 
1790*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_usage_t>
aidl2legacy_AudioUsage_audio_usage_t(AudioUsage aidl)1791*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioUsage_audio_usage_t(AudioUsage aidl) {
1792*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1793*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::INVALID:
1794*ec779b8eSAndroid Build Coastguard Worker             break;  // return error
1795*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::UNKNOWN:
1796*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_UNKNOWN;
1797*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::MEDIA:
1798*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_MEDIA;
1799*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::VOICE_COMMUNICATION:
1800*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_VOICE_COMMUNICATION;
1801*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::VOICE_COMMUNICATION_SIGNALLING:
1802*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;
1803*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ALARM:
1804*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ALARM;
1805*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::NOTIFICATION:
1806*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION;
1807*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE:
1808*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
1809*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST:
1810*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST;
1811*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT:
1812*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT;
1813*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED:
1814*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED;
1815*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::NOTIFICATION_EVENT:
1816*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_NOTIFICATION_EVENT;
1817*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ASSISTANCE_ACCESSIBILITY:
1818*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;
1819*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE:
1820*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;
1821*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ASSISTANCE_SONIFICATION:
1822*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ASSISTANCE_SONIFICATION;
1823*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::GAME:
1824*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_GAME;
1825*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::VIRTUAL_SOURCE:
1826*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_VIRTUAL_SOURCE;
1827*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ASSISTANT:
1828*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ASSISTANT;
1829*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::CALL_ASSISTANT:
1830*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_CALL_ASSISTANT;
1831*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::EMERGENCY:
1832*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_EMERGENCY;
1833*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::SAFETY:
1834*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_SAFETY;
1835*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::VEHICLE_STATUS:
1836*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_VEHICLE_STATUS;
1837*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::ANNOUNCEMENT:
1838*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_ANNOUNCEMENT;
1839*ec779b8eSAndroid Build Coastguard Worker         case AudioUsage::SPEAKER_CLEANUP:
1840*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_USAGE_SPEAKER_CLEANUP;
1841*ec779b8eSAndroid Build Coastguard Worker     }
1842*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1843*ec779b8eSAndroid Build Coastguard Worker }
1844*ec779b8eSAndroid Build Coastguard Worker 
1845*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioUsage>
legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy)1846*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_usage_t_AudioUsage(audio_usage_t legacy) {
1847*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1848*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_UNKNOWN:
1849*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::UNKNOWN;
1850*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_MEDIA:
1851*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::MEDIA;
1852*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_VOICE_COMMUNICATION:
1853*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::VOICE_COMMUNICATION;
1854*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING:
1855*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::VOICE_COMMUNICATION_SIGNALLING;
1856*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ALARM:
1857*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ALARM;
1858*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION:
1859*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::NOTIFICATION;
1860*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE:
1861*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::NOTIFICATION_TELEPHONY_RINGTONE;
1862*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
1863*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_REQUEST;
1864*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
1865*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_INSTANT;
1866*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
1867*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::SYS_RESERVED_NOTIFICATION_COMMUNICATION_DELAYED;
1868*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_NOTIFICATION_EVENT:
1869*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::NOTIFICATION_EVENT;
1870*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY:
1871*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ASSISTANCE_ACCESSIBILITY;
1872*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
1873*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ASSISTANCE_NAVIGATION_GUIDANCE;
1874*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ASSISTANCE_SONIFICATION:
1875*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ASSISTANCE_SONIFICATION;
1876*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_GAME:
1877*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::GAME;
1878*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_VIRTUAL_SOURCE:
1879*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::VIRTUAL_SOURCE;
1880*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ASSISTANT:
1881*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ASSISTANT;
1882*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_CALL_ASSISTANT:
1883*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::CALL_ASSISTANT;
1884*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_EMERGENCY:
1885*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::EMERGENCY;
1886*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_SAFETY:
1887*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::SAFETY;
1888*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_VEHICLE_STATUS:
1889*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::VEHICLE_STATUS;
1890*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_ANNOUNCEMENT:
1891*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::ANNOUNCEMENT;
1892*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_USAGE_SPEAKER_CLEANUP:
1893*ec779b8eSAndroid Build Coastguard Worker             return AudioUsage::SPEAKER_CLEANUP;
1894*ec779b8eSAndroid Build Coastguard Worker     }
1895*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1896*ec779b8eSAndroid Build Coastguard Worker }
1897*ec779b8eSAndroid Build Coastguard Worker 
1898*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_flags_mask_t>
aidl2legacy_AudioFlag_audio_flags_mask_t(AudioFlag aidl)1899*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioFlag_audio_flags_mask_t(AudioFlag aidl) {
1900*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
1901*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::NONE:
1902*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_NONE;
1903*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::AUDIBILITY_ENFORCED:
1904*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_AUDIBILITY_ENFORCED;
1905*ec779b8eSAndroid Build Coastguard Worker         // The is no AudioFlag::SECURE, see the comment in the AudioFlag.aidl
1906*ec779b8eSAndroid Build Coastguard Worker         //  return AUDIO_FLAG_SECURE;
1907*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::SCO:
1908*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_SCO;
1909*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::BEACON:
1910*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_BEACON;
1911*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::HW_AV_SYNC:
1912*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_HW_AV_SYNC;
1913*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::HW_HOTWORD:
1914*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_HW_HOTWORD;
1915*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::BYPASS_INTERRUPTION_POLICY:
1916*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY;
1917*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::BYPASS_MUTE:
1918*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_BYPASS_MUTE;
1919*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::LOW_LATENCY:
1920*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_LOW_LATENCY;
1921*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::DEEP_BUFFER:
1922*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_DEEP_BUFFER;
1923*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::NO_MEDIA_PROJECTION:
1924*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_NO_MEDIA_PROJECTION;
1925*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::MUTE_HAPTIC:
1926*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_MUTE_HAPTIC;
1927*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::NO_SYSTEM_CAPTURE:
1928*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_NO_SYSTEM_CAPTURE;
1929*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::CAPTURE_PRIVATE:
1930*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_CAPTURE_PRIVATE;
1931*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::CONTENT_SPATIALIZED:
1932*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_CONTENT_SPATIALIZED;
1933*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::NEVER_SPATIALIZE:
1934*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_NEVER_SPATIALIZE;
1935*ec779b8eSAndroid Build Coastguard Worker         case AudioFlag::CALL_REDIRECTION:
1936*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_FLAG_CALL_REDIRECTION;
1937*ec779b8eSAndroid Build Coastguard Worker     }
1938*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1939*ec779b8eSAndroid Build Coastguard Worker }
1940*ec779b8eSAndroid Build Coastguard Worker 
1941*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioFlag>
legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy)1942*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_flags_mask_t_AudioFlag(audio_flags_mask_t legacy) {
1943*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
1944*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_NONE:
1945*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::NONE;
1946*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_AUDIBILITY_ENFORCED:
1947*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::AUDIBILITY_ENFORCED;
1948*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_SECURE:
1949*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
1950*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_SCO:
1951*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::SCO;
1952*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_BEACON:
1953*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::BEACON;
1954*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_HW_AV_SYNC:
1955*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::HW_AV_SYNC;
1956*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_HW_HOTWORD:
1957*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::HW_HOTWORD;
1958*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY:
1959*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::BYPASS_INTERRUPTION_POLICY;
1960*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_BYPASS_MUTE:
1961*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::BYPASS_MUTE;
1962*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_LOW_LATENCY:
1963*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::LOW_LATENCY;
1964*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_DEEP_BUFFER:
1965*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::DEEP_BUFFER;
1966*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_NO_MEDIA_PROJECTION:
1967*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::NO_MEDIA_PROJECTION;
1968*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_MUTE_HAPTIC:
1969*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::MUTE_HAPTIC;
1970*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_NO_SYSTEM_CAPTURE:
1971*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::NO_SYSTEM_CAPTURE;
1972*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_CAPTURE_PRIVATE:
1973*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::CAPTURE_PRIVATE;
1974*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_CONTENT_SPATIALIZED:
1975*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::CONTENT_SPATIALIZED;
1976*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_NEVER_SPATIALIZE:
1977*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::NEVER_SPATIALIZE;
1978*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_FLAG_CALL_REDIRECTION:
1979*ec779b8eSAndroid Build Coastguard Worker             return AudioFlag::CALL_REDIRECTION;
1980*ec779b8eSAndroid Build Coastguard Worker     }
1981*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
1982*ec779b8eSAndroid Build Coastguard Worker }
1983*ec779b8eSAndroid Build Coastguard Worker 
1984*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_flags_mask_t>
aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl)1985*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_int32_t_audio_flags_mask_t_mask(int32_t aidl) {
1986*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<audio_flags_mask_t, int32_t, audio_flags_mask_t, AudioFlag>(
1987*ec779b8eSAndroid Build Coastguard Worker             aidl, aidl2legacy_AudioFlag_audio_flags_mask_t, indexToEnum_bitmask<AudioFlag>,
1988*ec779b8eSAndroid Build Coastguard Worker             enumToMask_bitmask<audio_flags_mask_t, audio_flags_mask_t>);
1989*ec779b8eSAndroid Build Coastguard Worker }
1990*ec779b8eSAndroid Build Coastguard Worker 
1991*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t>
legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy)1992*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_flags_mask_t_int32_t_mask(audio_flags_mask_t legacy) {
1993*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t, audio_flags_mask_t, AudioFlag, audio_flags_mask_t>(
1994*ec779b8eSAndroid Build Coastguard Worker             legacy, legacy2aidl_audio_flags_mask_t_AudioFlag,
1995*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_bitmask<audio_flags_mask_t>,
1996*ec779b8eSAndroid Build Coastguard Worker             enumToMask_bitmask<int32_t, AudioFlag>);
1997*ec779b8eSAndroid Build Coastguard Worker }
1998*ec779b8eSAndroid Build Coastguard Worker 
1999*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::string>
aidl2legacy_AudioTags_string(const std::vector<std::string> & aidl)2000*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioTags_string(const std::vector<std::string>& aidl) {
2001*ec779b8eSAndroid Build Coastguard Worker     std::ostringstream tagsBuffer;
2002*ec779b8eSAndroid Build Coastguard Worker     bool hasValue = false;
2003*ec779b8eSAndroid Build Coastguard Worker     for (const auto& tag : aidl) {
2004*ec779b8eSAndroid Build Coastguard Worker         if (hasValue) {
2005*ec779b8eSAndroid Build Coastguard Worker             tagsBuffer << AUDIO_ATTRIBUTES_TAGS_SEPARATOR;
2006*ec779b8eSAndroid Build Coastguard Worker         }
2007*ec779b8eSAndroid Build Coastguard Worker         if (strchr(tag.c_str(), AUDIO_ATTRIBUTES_TAGS_SEPARATOR) == nullptr) {
2008*ec779b8eSAndroid Build Coastguard Worker             tagsBuffer << tag;
2009*ec779b8eSAndroid Build Coastguard Worker             hasValue = true;
2010*ec779b8eSAndroid Build Coastguard Worker         } else {
2011*ec779b8eSAndroid Build Coastguard Worker             ALOGE("Tag is ill-formed: \"%s\"", tag.c_str());
2012*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
2013*ec779b8eSAndroid Build Coastguard Worker         }
2014*ec779b8eSAndroid Build Coastguard Worker     }
2015*ec779b8eSAndroid Build Coastguard Worker     return tagsBuffer.str();
2016*ec779b8eSAndroid Build Coastguard Worker }
2017*ec779b8eSAndroid Build Coastguard Worker 
2018*ec779b8eSAndroid Build Coastguard Worker ConversionResult<std::vector<std::string>>
legacy2aidl_string_AudioTags(const std::string & legacy)2019*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_string_AudioTags(const std::string& legacy) {
2020*ec779b8eSAndroid Build Coastguard Worker     return splitString(legacy, AUDIO_ATTRIBUTES_TAGS_SEPARATOR);
2021*ec779b8eSAndroid Build Coastguard Worker }
2022*ec779b8eSAndroid Build Coastguard Worker 
2023*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_attributes_t>
aidl2legacy_AudioAttributes_audio_attributes_t(const AudioAttributes & aidl)2024*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioAttributes_audio_attributes_t(const AudioAttributes& aidl) {
2025*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t legacy;
2026*ec779b8eSAndroid Build Coastguard Worker     legacy.content_type = VALUE_OR_RETURN(
2027*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioContentType_audio_content_type_t(aidl.contentType));
2028*ec779b8eSAndroid Build Coastguard Worker     legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
2029*ec779b8eSAndroid Build Coastguard Worker     legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(aidl.source));
2030*ec779b8eSAndroid Build Coastguard Worker     legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_flags_mask_t_mask(aidl.flags));
2031*ec779b8eSAndroid Build Coastguard Worker     auto tagsString = VALUE_OR_RETURN(aidl2legacy_AudioTags_string(aidl.tags));
2032*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_string(tagsString, legacy.tags, sizeof(legacy.tags)));
2033*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2034*ec779b8eSAndroid Build Coastguard Worker }
2035*ec779b8eSAndroid Build Coastguard Worker 
2036*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioAttributes>
legacy2aidl_audio_attributes_t_AudioAttributes(const audio_attributes_t & legacy)2037*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_attributes_t_AudioAttributes(const audio_attributes_t& legacy) {
2038*ec779b8eSAndroid Build Coastguard Worker     AudioAttributes aidl;
2039*ec779b8eSAndroid Build Coastguard Worker     aidl.contentType = VALUE_OR_RETURN(
2040*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_content_type_t_AudioContentType(legacy.content_type));
2041*ec779b8eSAndroid Build Coastguard Worker     aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
2042*ec779b8eSAndroid Build Coastguard Worker     aidl.source = VALUE_OR_RETURN(legacy2aidl_audio_source_t_AudioSource(legacy.source));
2043*ec779b8eSAndroid Build Coastguard Worker     aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_flags_mask_t_int32_t_mask(legacy.flags));
2044*ec779b8eSAndroid Build Coastguard Worker     auto tagsString = VALUE_OR_RETURN(legacy2aidl_string(legacy.tags, sizeof(legacy.tags)));
2045*ec779b8eSAndroid Build Coastguard Worker     aidl.tags = VALUE_OR_RETURN(legacy2aidl_string_AudioTags(tagsString));
2046*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2047*ec779b8eSAndroid Build Coastguard Worker }
2048*ec779b8eSAndroid Build Coastguard Worker 
2049*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_encapsulation_mode_t>
aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(AudioEncapsulationMode aidl)2050*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(AudioEncapsulationMode aidl) {
2051*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2052*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMode::INVALID:
2053*ec779b8eSAndroid Build Coastguard Worker             break;  // return error
2054*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMode::NONE:
2055*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_MODE_NONE;
2056*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMode::ELEMENTARY_STREAM:
2057*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM;
2058*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMode::HANDLE:
2059*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_MODE_HANDLE;
2060*ec779b8eSAndroid Build Coastguard Worker     }
2061*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2062*ec779b8eSAndroid Build Coastguard Worker }
2063*ec779b8eSAndroid Build Coastguard Worker 
2064*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioEncapsulationMode>
legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy)2065*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(audio_encapsulation_mode_t legacy) {
2066*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2067*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_MODE_NONE:
2068*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMode::NONE;
2069*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_MODE_ELEMENTARY_STREAM:
2070*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMode::ELEMENTARY_STREAM;
2071*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_MODE_HANDLE:
2072*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMode::HANDLE;
2073*ec779b8eSAndroid Build Coastguard Worker     }
2074*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2075*ec779b8eSAndroid Build Coastguard Worker }
2076*ec779b8eSAndroid Build Coastguard Worker 
2077*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_offload_info_t>
aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const AudioOffloadInfo & aidl)2078*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioOffloadInfo_audio_offload_info_t(const AudioOffloadInfo& aidl) {
2079*ec779b8eSAndroid Build Coastguard Worker     audio_offload_info_t legacy = AUDIO_INFO_INITIALIZER;
2080*ec779b8eSAndroid Build Coastguard Worker     audio_config_base_t base = VALUE_OR_RETURN(
2081*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, false /*isInput*/));
2082*ec779b8eSAndroid Build Coastguard Worker     legacy.sample_rate = base.sample_rate;
2083*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = base.channel_mask;
2084*ec779b8eSAndroid Build Coastguard Worker     legacy.format = base.format;
2085*ec779b8eSAndroid Build Coastguard Worker     legacy.stream_type = VALUE_OR_RETURN(
2086*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(aidl.streamType));
2087*ec779b8eSAndroid Build Coastguard Worker     legacy.bit_rate = VALUE_OR_RETURN(convertIntegral<int32_t>(aidl.bitRatePerSecond));
2088*ec779b8eSAndroid Build Coastguard Worker     legacy.duration_us = VALUE_OR_RETURN(convertIntegral<int64_t>(aidl.durationUs));
2089*ec779b8eSAndroid Build Coastguard Worker     legacy.has_video = aidl.hasVideo;
2090*ec779b8eSAndroid Build Coastguard Worker     legacy.is_streaming = aidl.isStreaming;
2091*ec779b8eSAndroid Build Coastguard Worker     legacy.bit_width = VALUE_OR_RETURN(convertIntegral<int32_t>(aidl.bitWidth));
2092*ec779b8eSAndroid Build Coastguard Worker     legacy.offload_buffer_size = VALUE_OR_RETURN(convertIntegral<int32_t>(aidl.offloadBufferSize));
2093*ec779b8eSAndroid Build Coastguard Worker     legacy.usage = VALUE_OR_RETURN(aidl2legacy_AudioUsage_audio_usage_t(aidl.usage));
2094*ec779b8eSAndroid Build Coastguard Worker     legacy.encapsulation_mode = VALUE_OR_RETURN(
2095*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t(aidl.encapsulationMode));
2096*ec779b8eSAndroid Build Coastguard Worker     legacy.content_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.contentId));
2097*ec779b8eSAndroid Build Coastguard Worker     legacy.sync_id = VALUE_OR_RETURN(convertReinterpret<int32_t>(aidl.syncId));
2098*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2099*ec779b8eSAndroid Build Coastguard Worker }
2100*ec779b8eSAndroid Build Coastguard Worker 
2101*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioOffloadInfo>
legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t & legacy)2102*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_offload_info_t_AudioOffloadInfo(const audio_offload_info_t& legacy) {
2103*ec779b8eSAndroid Build Coastguard Worker     AudioOffloadInfo aidl;
2104*ec779b8eSAndroid Build Coastguard Worker     // Version 0.1 fields.
2105*ec779b8eSAndroid Build Coastguard Worker     if (legacy.size < offsetof(audio_offload_info_t, usage) + sizeof(audio_offload_info_t::usage)) {
2106*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2107*ec779b8eSAndroid Build Coastguard Worker     }
2108*ec779b8eSAndroid Build Coastguard Worker     const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2109*ec779b8eSAndroid Build Coastguard Worker         .channel_mask = legacy.channel_mask, .format = legacy.format };
2110*ec779b8eSAndroid Build Coastguard Worker     aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(
2111*ec779b8eSAndroid Build Coastguard Worker                     base, false /*isInput*/));
2112*ec779b8eSAndroid Build Coastguard Worker     aidl.streamType = VALUE_OR_RETURN(
2113*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream_type));
2114*ec779b8eSAndroid Build Coastguard Worker     aidl.bitRatePerSecond = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_rate));
2115*ec779b8eSAndroid Build Coastguard Worker     aidl.durationUs = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.duration_us));
2116*ec779b8eSAndroid Build Coastguard Worker     aidl.hasVideo = legacy.has_video;
2117*ec779b8eSAndroid Build Coastguard Worker     aidl.isStreaming = legacy.is_streaming;
2118*ec779b8eSAndroid Build Coastguard Worker     aidl.bitWidth = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.bit_width));
2119*ec779b8eSAndroid Build Coastguard Worker     aidl.offloadBufferSize = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.offload_buffer_size));
2120*ec779b8eSAndroid Build Coastguard Worker     aidl.usage = VALUE_OR_RETURN(legacy2aidl_audio_usage_t_AudioUsage(legacy.usage));
2121*ec779b8eSAndroid Build Coastguard Worker 
2122*ec779b8eSAndroid Build Coastguard Worker     // Version 0.2 fields.
2123*ec779b8eSAndroid Build Coastguard Worker     if (legacy.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) {
2124*ec779b8eSAndroid Build Coastguard Worker         if (legacy.size <
2125*ec779b8eSAndroid Build Coastguard Worker             offsetof(audio_offload_info_t, sync_id) + sizeof(audio_offload_info_t::sync_id)) {
2126*ec779b8eSAndroid Build Coastguard Worker             return unexpected(BAD_VALUE);
2127*ec779b8eSAndroid Build Coastguard Worker         }
2128*ec779b8eSAndroid Build Coastguard Worker         aidl.encapsulationMode = VALUE_OR_RETURN(
2129*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode(
2130*ec779b8eSAndroid Build Coastguard Worker                         legacy.encapsulation_mode));
2131*ec779b8eSAndroid Build Coastguard Worker         aidl.contentId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.content_id));
2132*ec779b8eSAndroid Build Coastguard Worker         aidl.syncId = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.sync_id));
2133*ec779b8eSAndroid Build Coastguard Worker     }
2134*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2135*ec779b8eSAndroid Build Coastguard Worker }
2136*ec779b8eSAndroid Build Coastguard Worker 
portDirection(audio_port_role_t role,audio_port_type_t type)2137*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortDirection> portDirection(audio_port_role_t role, audio_port_type_t type) {
2138*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
2139*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_NONE:
2140*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
2141*ec779b8eSAndroid Build Coastguard Worker             break;  // must be listed  -Werror,-Wswitch
2142*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE:
2143*ec779b8eSAndroid Build Coastguard Worker             switch (role) {
2144*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_NONE:
2145*ec779b8eSAndroid Build Coastguard Worker                      break;  // must be listed  -Werror,-Wswitch
2146*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_SOURCE:
2147*ec779b8eSAndroid Build Coastguard Worker                     return AudioPortDirection::INPUT;
2148*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_SINK:
2149*ec779b8eSAndroid Build Coastguard Worker                     return AudioPortDirection::OUTPUT;
2150*ec779b8eSAndroid Build Coastguard Worker             }
2151*ec779b8eSAndroid Build Coastguard Worker             break;
2152*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX:
2153*ec779b8eSAndroid Build Coastguard Worker             switch (role) {
2154*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_NONE:
2155*ec779b8eSAndroid Build Coastguard Worker                      break;  // must be listed  -Werror,-Wswitch
2156*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_SOURCE:
2157*ec779b8eSAndroid Build Coastguard Worker                     return AudioPortDirection::OUTPUT;
2158*ec779b8eSAndroid Build Coastguard Worker                 case AUDIO_PORT_ROLE_SINK:
2159*ec779b8eSAndroid Build Coastguard Worker                     return AudioPortDirection::INPUT;
2160*ec779b8eSAndroid Build Coastguard Worker             }
2161*ec779b8eSAndroid Build Coastguard Worker             break;
2162*ec779b8eSAndroid Build Coastguard Worker     }
2163*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2164*ec779b8eSAndroid Build Coastguard Worker }
2165*ec779b8eSAndroid Build Coastguard Worker 
portRole(AudioPortDirection direction,audio_port_type_t type)2166*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_role_t> portRole(AudioPortDirection direction, audio_port_type_t type) {
2167*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
2168*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_NONE:
2169*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
2170*ec779b8eSAndroid Build Coastguard Worker             break;  // must be listed  -Werror,-Wswitch
2171*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE:
2172*ec779b8eSAndroid Build Coastguard Worker             switch (direction) {
2173*ec779b8eSAndroid Build Coastguard Worker                 case AudioPortDirection::INPUT:
2174*ec779b8eSAndroid Build Coastguard Worker                     return AUDIO_PORT_ROLE_SOURCE;
2175*ec779b8eSAndroid Build Coastguard Worker                 case AudioPortDirection::OUTPUT:
2176*ec779b8eSAndroid Build Coastguard Worker                     return AUDIO_PORT_ROLE_SINK;
2177*ec779b8eSAndroid Build Coastguard Worker             }
2178*ec779b8eSAndroid Build Coastguard Worker             break;
2179*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX:
2180*ec779b8eSAndroid Build Coastguard Worker             switch (direction) {
2181*ec779b8eSAndroid Build Coastguard Worker                 case AudioPortDirection::OUTPUT:
2182*ec779b8eSAndroid Build Coastguard Worker                     return AUDIO_PORT_ROLE_SOURCE;
2183*ec779b8eSAndroid Build Coastguard Worker                 case AudioPortDirection::INPUT:
2184*ec779b8eSAndroid Build Coastguard Worker                     return AUDIO_PORT_ROLE_SINK;
2185*ec779b8eSAndroid Build Coastguard Worker             }
2186*ec779b8eSAndroid Build Coastguard Worker             break;
2187*ec779b8eSAndroid Build Coastguard Worker     }
2188*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2189*ec779b8eSAndroid Build Coastguard Worker }
2190*ec779b8eSAndroid Build Coastguard Worker 
2191*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_config_t>
aidl2legacy_AudioConfig_audio_config_t(const AudioConfig & aidl,bool isInput)2192*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioConfig_audio_config_t(const AudioConfig& aidl, bool isInput) {
2193*ec779b8eSAndroid Build Coastguard Worker     const audio_config_base_t legacyBase = VALUE_OR_RETURN(
2194*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.base, isInput));
2195*ec779b8eSAndroid Build Coastguard Worker     audio_config_t legacy = AUDIO_CONFIG_INITIALIZER;
2196*ec779b8eSAndroid Build Coastguard Worker     legacy.sample_rate = legacyBase.sample_rate;
2197*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = legacyBase.channel_mask;
2198*ec779b8eSAndroid Build Coastguard Worker     legacy.format = legacyBase.format;
2199*ec779b8eSAndroid Build Coastguard Worker     legacy.offload_info = VALUE_OR_RETURN(
2200*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioOffloadInfo_audio_offload_info_t(aidl.offloadInfo));
2201*ec779b8eSAndroid Build Coastguard Worker     legacy.frame_count = VALUE_OR_RETURN(convertIntegral<uint32_t>(aidl.frameCount));
2202*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2203*ec779b8eSAndroid Build Coastguard Worker }
2204*ec779b8eSAndroid Build Coastguard Worker 
2205*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioConfig>
legacy2aidl_audio_config_t_AudioConfig(const audio_config_t & legacy,bool isInput)2206*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_t_AudioConfig(const audio_config_t& legacy, bool isInput) {
2207*ec779b8eSAndroid Build Coastguard Worker     const audio_config_base_t base = { .sample_rate = legacy.sample_rate,
2208*ec779b8eSAndroid Build Coastguard Worker         .channel_mask = legacy.channel_mask, .format = legacy.format };
2209*ec779b8eSAndroid Build Coastguard Worker     AudioConfig aidl;
2210*ec779b8eSAndroid Build Coastguard Worker     aidl.base = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(base, isInput));
2211*ec779b8eSAndroid Build Coastguard Worker     aidl.offloadInfo = VALUE_OR_RETURN(
2212*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_offload_info_t_AudioOffloadInfo(legacy.offload_info));
2213*ec779b8eSAndroid Build Coastguard Worker     aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(legacy.frame_count));
2214*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2215*ec779b8eSAndroid Build Coastguard Worker }
2216*ec779b8eSAndroid Build Coastguard Worker 
2217*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_config_base_t>
aidl2legacy_AudioConfigBase_audio_config_base_t(const AudioConfigBase & aidl,bool isInput)2218*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioConfigBase_audio_config_base_t(const AudioConfigBase& aidl, bool isInput) {
2219*ec779b8eSAndroid Build Coastguard Worker     audio_config_base_t legacy;
2220*ec779b8eSAndroid Build Coastguard Worker     legacy.sample_rate = VALUE_OR_RETURN(convertIntegral<int>(aidl.sampleRate));
2221*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = VALUE_OR_RETURN(
2222*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioChannelLayout_audio_channel_mask_t(aidl.channelMask, isInput));
2223*ec779b8eSAndroid Build Coastguard Worker     legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
2224*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2225*ec779b8eSAndroid Build Coastguard Worker }
2226*ec779b8eSAndroid Build Coastguard Worker 
2227*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioConfigBase>
legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t & legacy,bool isInput)2228*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_config_base_t_AudioConfigBase(const audio_config_base_t& legacy, bool isInput) {
2229*ec779b8eSAndroid Build Coastguard Worker     AudioConfigBase aidl;
2230*ec779b8eSAndroid Build Coastguard Worker     aidl.sampleRate = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
2231*ec779b8eSAndroid Build Coastguard Worker     aidl.channelMask = VALUE_OR_RETURN(
2232*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
2233*ec779b8eSAndroid Build Coastguard Worker     aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
2234*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2235*ec779b8eSAndroid Build Coastguard Worker }
2236*ec779b8eSAndroid Build Coastguard Worker 
2237*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_uuid_t>
aidl2legacy_AudioUuid_audio_uuid_t(const AudioUuid & aidl)2238*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioUuid_audio_uuid_t(const AudioUuid& aidl) {
2239*ec779b8eSAndroid Build Coastguard Worker     audio_uuid_t legacy;
2240*ec779b8eSAndroid Build Coastguard Worker     legacy.timeLow = VALUE_OR_RETURN(convertReinterpret<uint32_t>(aidl.timeLow));
2241*ec779b8eSAndroid Build Coastguard Worker     legacy.timeMid = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeMid));
2242*ec779b8eSAndroid Build Coastguard Worker     legacy.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.timeHiAndVersion));
2243*ec779b8eSAndroid Build Coastguard Worker     legacy.clockSeq = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.clockSeq));
2244*ec779b8eSAndroid Build Coastguard Worker     if (aidl.node.size() != std::size(legacy.node)) {
2245*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2246*ec779b8eSAndroid Build Coastguard Worker     }
2247*ec779b8eSAndroid Build Coastguard Worker     std::copy(aidl.node.begin(), aidl.node.end(), legacy.node);
2248*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2249*ec779b8eSAndroid Build Coastguard Worker }
2250*ec779b8eSAndroid Build Coastguard Worker 
2251*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioUuid>
legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t & legacy)2252*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_uuid_t_AudioUuid(const audio_uuid_t& legacy) {
2253*ec779b8eSAndroid Build Coastguard Worker     AudioUuid aidl;
2254*ec779b8eSAndroid Build Coastguard Worker     aidl.timeLow = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy.timeLow));
2255*ec779b8eSAndroid Build Coastguard Worker     aidl.timeMid = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeMid));
2256*ec779b8eSAndroid Build Coastguard Worker     aidl.timeHiAndVersion = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.timeHiAndVersion));
2257*ec779b8eSAndroid Build Coastguard Worker     aidl.clockSeq = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.clockSeq));
2258*ec779b8eSAndroid Build Coastguard Worker     std::copy(legacy.node, legacy.node + std::size(legacy.node), std::back_inserter(aidl.node));
2259*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2260*ec779b8eSAndroid Build Coastguard Worker }
2261*ec779b8eSAndroid Build Coastguard Worker 
2262*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_encapsulation_metadata_type_t>
aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(AudioEncapsulationMetadataType aidl)2263*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t(
2264*ec779b8eSAndroid Build Coastguard Worker         AudioEncapsulationMetadataType aidl) {
2265*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2266*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMetadataType::NONE:
2267*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_METADATA_TYPE_NONE;
2268*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMetadataType::FRAMEWORK_TUNER:
2269*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER;
2270*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR:
2271*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR;
2272*ec779b8eSAndroid Build Coastguard Worker     }
2273*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2274*ec779b8eSAndroid Build Coastguard Worker }
2275*ec779b8eSAndroid Build Coastguard Worker 
2276*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioEncapsulationMetadataType>
legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(audio_encapsulation_metadata_type_t legacy)2277*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType(
2278*ec779b8eSAndroid Build Coastguard Worker         audio_encapsulation_metadata_type_t legacy) {
2279*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2280*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_METADATA_TYPE_NONE:
2281*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMetadataType::NONE;
2282*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER:
2283*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMetadataType::FRAMEWORK_TUNER;
2284*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR:
2285*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationMetadataType::DVB_AD_DESCRIPTOR;
2286*ec779b8eSAndroid Build Coastguard Worker     }
2287*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2288*ec779b8eSAndroid Build Coastguard Worker }
2289*ec779b8eSAndroid Build Coastguard Worker 
2290*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t>
aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl)2291*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioEncapsulationMode_mask(int32_t aidl) {
2292*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<uint32_t,
2293*ec779b8eSAndroid Build Coastguard Worker             int32_t,
2294*ec779b8eSAndroid Build Coastguard Worker             audio_encapsulation_mode_t,
2295*ec779b8eSAndroid Build Coastguard Worker             AudioEncapsulationMode>(
2296*ec779b8eSAndroid Build Coastguard Worker             aidl, aidl2legacy_AudioEncapsulationMode_audio_encapsulation_mode_t,
2297*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<AudioEncapsulationMode>,
2298*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<uint32_t, audio_encapsulation_mode_t>);
2299*ec779b8eSAndroid Build Coastguard Worker }
2300*ec779b8eSAndroid Build Coastguard Worker 
2301*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t>
legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy)2302*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioEncapsulationMode_mask(uint32_t legacy) {
2303*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t,
2304*ec779b8eSAndroid Build Coastguard Worker             uint32_t,
2305*ec779b8eSAndroid Build Coastguard Worker             AudioEncapsulationMode,
2306*ec779b8eSAndroid Build Coastguard Worker             audio_encapsulation_mode_t>(
2307*ec779b8eSAndroid Build Coastguard Worker             legacy, legacy2aidl_audio_encapsulation_mode_t_AudioEncapsulationMode,
2308*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<audio_encapsulation_mode_t>,
2309*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<int32_t, AudioEncapsulationMode>);
2310*ec779b8eSAndroid Build Coastguard Worker }
2311*ec779b8eSAndroid Build Coastguard Worker 
2312*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t>
aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl)2313*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioEncapsulationMetadataType_mask(int32_t aidl) {
2314*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<uint32_t,
2315*ec779b8eSAndroid Build Coastguard Worker             int32_t,
2316*ec779b8eSAndroid Build Coastguard Worker             audio_encapsulation_metadata_type_t,
2317*ec779b8eSAndroid Build Coastguard Worker             AudioEncapsulationMetadataType>(
2318*ec779b8eSAndroid Build Coastguard Worker             aidl, aidl2legacy_AudioEncapsulationMetadataType_audio_encapsulation_metadata_type_t,
2319*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<AudioEncapsulationMetadataType>,
2320*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<uint32_t, audio_encapsulation_metadata_type_t>);
2321*ec779b8eSAndroid Build Coastguard Worker }
2322*ec779b8eSAndroid Build Coastguard Worker 
2323*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t>
legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy)2324*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_AudioEncapsulationMetadataType_mask(uint32_t legacy) {
2325*ec779b8eSAndroid Build Coastguard Worker     return convertBitmask<int32_t,
2326*ec779b8eSAndroid Build Coastguard Worker             uint32_t,
2327*ec779b8eSAndroid Build Coastguard Worker             AudioEncapsulationMetadataType,
2328*ec779b8eSAndroid Build Coastguard Worker             audio_encapsulation_metadata_type_t>(
2329*ec779b8eSAndroid Build Coastguard Worker             legacy, legacy2aidl_audio_encapsulation_metadata_type_t_AudioEncapsulationMetadataType,
2330*ec779b8eSAndroid Build Coastguard Worker             indexToEnum_index<audio_encapsulation_metadata_type_t>,
2331*ec779b8eSAndroid Build Coastguard Worker             enumToMask_index<int32_t, AudioEncapsulationMetadataType>);
2332*ec779b8eSAndroid Build Coastguard Worker }
2333*ec779b8eSAndroid Build Coastguard Worker 
2334*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_config_mix_ext_usecase>
aidl2legacy_AudioPortMixExtUseCase_audio_port_config_mix_ext_usecase(const AudioPortMixExtUseCase & aidl,bool isInput)2335*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPortMixExtUseCase_audio_port_config_mix_ext_usecase(
2336*ec779b8eSAndroid Build Coastguard Worker         const AudioPortMixExtUseCase& aidl, bool isInput) {
2337*ec779b8eSAndroid Build Coastguard Worker     audio_port_config_mix_ext_usecase legacy{};
2338*ec779b8eSAndroid Build Coastguard Worker     if (aidl.getTag() != AudioPortMixExtUseCase::Tag::unspecified) {
2339*ec779b8eSAndroid Build Coastguard Worker         if (!isInput) {
2340*ec779b8eSAndroid Build Coastguard Worker             legacy.stream = VALUE_OR_RETURN(aidl2legacy_AudioStreamType_audio_stream_type_t(
2341*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN(UNION_GET(aidl, stream))));
2342*ec779b8eSAndroid Build Coastguard Worker         } else {
2343*ec779b8eSAndroid Build Coastguard Worker             legacy.source = VALUE_OR_RETURN(aidl2legacy_AudioSource_audio_source_t(
2344*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN(UNION_GET(aidl, source))));
2345*ec779b8eSAndroid Build Coastguard Worker         }
2346*ec779b8eSAndroid Build Coastguard Worker     }
2347*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2348*ec779b8eSAndroid Build Coastguard Worker }
2349*ec779b8eSAndroid Build Coastguard Worker 
2350*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortMixExtUseCase>
legacy2aidl_audio_port_config_mix_ext_usecase_AudioPortMixExtUseCase(const audio_port_config_mix_ext_usecase & legacy,bool isInput)2351*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_config_mix_ext_usecase_AudioPortMixExtUseCase(
2352*ec779b8eSAndroid Build Coastguard Worker         const audio_port_config_mix_ext_usecase& legacy, bool isInput) {
2353*ec779b8eSAndroid Build Coastguard Worker     AudioPortMixExtUseCase aidl;
2354*ec779b8eSAndroid Build Coastguard Worker     if (!isInput) {
2355*ec779b8eSAndroid Build Coastguard Worker         UNION_SET(aidl, stream, VALUE_OR_RETURN(
2356*ec779b8eSAndroid Build Coastguard Worker                         legacy2aidl_audio_stream_type_t_AudioStreamType(legacy.stream)));
2357*ec779b8eSAndroid Build Coastguard Worker     } else {
2358*ec779b8eSAndroid Build Coastguard Worker         UNION_SET(aidl, source, VALUE_OR_RETURN(
2359*ec779b8eSAndroid Build Coastguard Worker                         legacy2aidl_audio_source_t_AudioSource(legacy.source)));
2360*ec779b8eSAndroid Build Coastguard Worker     }
2361*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2362*ec779b8eSAndroid Build Coastguard Worker }
2363*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioPortMixExt_audio_port_config_mix_ext(const AudioPortMixExt & aidl,bool isInput)2364*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_config_mix_ext> aidl2legacy_AudioPortMixExt_audio_port_config_mix_ext(
2365*ec779b8eSAndroid Build Coastguard Worker         const AudioPortMixExt& aidl, bool isInput) {
2366*ec779b8eSAndroid Build Coastguard Worker     audio_port_config_mix_ext legacy{};
2367*ec779b8eSAndroid Build Coastguard Worker     legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
2368*ec779b8eSAndroid Build Coastguard Worker     legacy.usecase = VALUE_OR_RETURN(
2369*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPortMixExtUseCase_audio_port_config_mix_ext_usecase(
2370*ec779b8eSAndroid Build Coastguard Worker                     aidl.usecase, isInput));
2371*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2372*ec779b8eSAndroid Build Coastguard Worker }
2373*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_config_mix_ext_AudioPortMixExt(const audio_port_config_mix_ext & legacy,bool isInput)2374*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortMixExt> legacy2aidl_audio_port_config_mix_ext_AudioPortMixExt(
2375*ec779b8eSAndroid Build Coastguard Worker         const audio_port_config_mix_ext& legacy, bool isInput) {
2376*ec779b8eSAndroid Build Coastguard Worker     AudioPortMixExt aidl;
2377*ec779b8eSAndroid Build Coastguard Worker     aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
2378*ec779b8eSAndroid Build Coastguard Worker     aidl.usecase = VALUE_OR_RETURN(
2379*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_port_config_mix_ext_usecase_AudioPortMixExtUseCase(
2380*ec779b8eSAndroid Build Coastguard Worker                     legacy.usecase, isInput));
2381*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2382*ec779b8eSAndroid Build Coastguard Worker }
2383*ec779b8eSAndroid Build Coastguard Worker 
2384*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_config_device_ext>
aidl2legacy_AudioPortDeviceExt_audio_port_config_device_ext(const AudioPortDeviceExt & aidl)2385*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPortDeviceExt_audio_port_config_device_ext(const AudioPortDeviceExt& aidl) {
2386*ec779b8eSAndroid Build Coastguard Worker     audio_port_config_device_ext legacy{};
2387*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
2388*ec779b8eSAndroid Build Coastguard Worker                     aidl.device, &legacy.type, legacy.address));
2389*ec779b8eSAndroid Build Coastguard Worker     const bool isInput = false;  // speaker_layout_channel_mask only represents output.
2390*ec779b8eSAndroid Build Coastguard Worker     if (aidl.speakerLayout.has_value()) {
2391*ec779b8eSAndroid Build Coastguard Worker         legacy.speaker_layout_channel_mask =
2392*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
2393*ec779b8eSAndroid Build Coastguard Worker                         aidl.speakerLayout.value(), isInput));
2394*ec779b8eSAndroid Build Coastguard Worker     } else {
2395*ec779b8eSAndroid Build Coastguard Worker         // Default to none when the field is null in the AIDL.
2396*ec779b8eSAndroid Build Coastguard Worker         legacy.speaker_layout_channel_mask = AUDIO_CHANNEL_NONE;
2397*ec779b8eSAndroid Build Coastguard Worker     }
2398*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2399*ec779b8eSAndroid Build Coastguard Worker }
2400*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_config_device_ext_AudioPortDeviceExt(const audio_port_config_device_ext & legacy)2401*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortDeviceExt> legacy2aidl_audio_port_config_device_ext_AudioPortDeviceExt(
2402*ec779b8eSAndroid Build Coastguard Worker         const audio_port_config_device_ext& legacy) {
2403*ec779b8eSAndroid Build Coastguard Worker     AudioPortDeviceExt aidl;
2404*ec779b8eSAndroid Build Coastguard Worker     aidl.device = VALUE_OR_RETURN(
2405*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
2406*ec779b8eSAndroid Build Coastguard Worker     const bool isInput = false;  // speaker_layout_channel_mask only represents output.
2407*ec779b8eSAndroid Build Coastguard Worker     // The AIDL speakerLayout is nullable and if set, can only be a layoutMask.
2408*ec779b8eSAndroid Build Coastguard Worker     if (audio_channel_mask_is_valid(legacy.speaker_layout_channel_mask) &&
2409*ec779b8eSAndroid Build Coastguard Worker         audio_channel_mask_get_representation(legacy.speaker_layout_channel_mask) ==
2410*ec779b8eSAndroid Build Coastguard Worker                 AUDIO_CHANNEL_REPRESENTATION_POSITION) {
2411*ec779b8eSAndroid Build Coastguard Worker         aidl.speakerLayout = VALUE_OR_RETURN(legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
2412*ec779b8eSAndroid Build Coastguard Worker                 legacy.speaker_layout_channel_mask, isInput));
2413*ec779b8eSAndroid Build Coastguard Worker     }
2414*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2415*ec779b8eSAndroid Build Coastguard Worker }
2416*ec779b8eSAndroid Build Coastguard Worker 
2417*ec779b8eSAndroid Build Coastguard Worker // This type is unnamed in the original definition, thus we name it here.
2418*ec779b8eSAndroid Build Coastguard Worker using audio_port_config_ext = decltype(audio_port_config::ext);
2419*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioPortExt_audio_port_config_ext(const AudioPortExt & aidl,bool isInput,audio_port_config_ext * legacy,audio_port_type_t * type)2420*ec779b8eSAndroid Build Coastguard Worker status_t aidl2legacy_AudioPortExt_audio_port_config_ext(
2421*ec779b8eSAndroid Build Coastguard Worker         const AudioPortExt& aidl, bool isInput,
2422*ec779b8eSAndroid Build Coastguard Worker         audio_port_config_ext* legacy, audio_port_type_t* type) {
2423*ec779b8eSAndroid Build Coastguard Worker     switch (aidl.getTag()) {
2424*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::unspecified:
2425*ec779b8eSAndroid Build Coastguard Worker             // Just verify that the union is empty.
2426*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, unspecified));
2427*ec779b8eSAndroid Build Coastguard Worker             *legacy = {};
2428*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_NONE;
2429*ec779b8eSAndroid Build Coastguard Worker             return OK;
2430*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::device:
2431*ec779b8eSAndroid Build Coastguard Worker             legacy->device = VALUE_OR_RETURN_STATUS(
2432*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_AudioPortDeviceExt_audio_port_config_device_ext(
2433*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, device))));
2434*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_DEVICE;
2435*ec779b8eSAndroid Build Coastguard Worker             return OK;
2436*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::mix:
2437*ec779b8eSAndroid Build Coastguard Worker             legacy->mix = VALUE_OR_RETURN_STATUS(
2438*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_AudioPortMixExt_audio_port_config_mix_ext(
2439*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, mix)), isInput));
2440*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_MIX;
2441*ec779b8eSAndroid Build Coastguard Worker             return OK;
2442*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::session:
2443*ec779b8eSAndroid Build Coastguard Worker             // This variant is not used in the HAL scenario.
2444*ec779b8eSAndroid Build Coastguard Worker             legacy->session.session = AUDIO_SESSION_NONE;
2445*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_SESSION;
2446*ec779b8eSAndroid Build Coastguard Worker             return OK;
2447*ec779b8eSAndroid Build Coastguard Worker 
2448*ec779b8eSAndroid Build Coastguard Worker     }
2449*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
2450*ec779b8eSAndroid Build Coastguard Worker }
2451*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_config_ext_AudioPortExt(const audio_port_config_ext & legacy,audio_port_type_t type,bool isInput)2452*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortExt> legacy2aidl_audio_port_config_ext_AudioPortExt(
2453*ec779b8eSAndroid Build Coastguard Worker         const audio_port_config_ext& legacy, audio_port_type_t type, bool isInput) {
2454*ec779b8eSAndroid Build Coastguard Worker     AudioPortExt aidl;
2455*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
2456*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_NONE:
2457*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, unspecified, false);
2458*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2459*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE: {
2460*ec779b8eSAndroid Build Coastguard Worker             AudioPortDeviceExt device = VALUE_OR_RETURN(
2461*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_port_config_device_ext_AudioPortDeviceExt(legacy.device));
2462*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, device, device);
2463*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2464*ec779b8eSAndroid Build Coastguard Worker         }
2465*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX: {
2466*ec779b8eSAndroid Build Coastguard Worker             AudioPortMixExt mix = VALUE_OR_RETURN(
2467*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_port_config_mix_ext_AudioPortMixExt(legacy.mix, isInput));
2468*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, mix, mix);
2469*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2470*ec779b8eSAndroid Build Coastguard Worker         }
2471*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
2472*ec779b8eSAndroid Build Coastguard Worker             // This variant is not used in the HAL scenario.
2473*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, unspecified, false);
2474*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2475*ec779b8eSAndroid Build Coastguard Worker     }
2476*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
2477*ec779b8eSAndroid Build Coastguard Worker }
2478*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioPortConfig_audio_port_config(const AudioPortConfig & aidl,bool isInput,audio_port_config * legacy,int32_t * portId)2479*ec779b8eSAndroid Build Coastguard Worker status_t aidl2legacy_AudioPortConfig_audio_port_config(
2480*ec779b8eSAndroid Build Coastguard Worker         const AudioPortConfig& aidl, bool isInput, audio_port_config* legacy, int32_t* portId) {
2481*ec779b8eSAndroid Build Coastguard Worker     legacy->id = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2482*ec779b8eSAndroid Build Coastguard Worker     *portId = aidl.portId;
2483*ec779b8eSAndroid Build Coastguard Worker     if (aidl.sampleRate.has_value()) {
2484*ec779b8eSAndroid Build Coastguard Worker         legacy->sample_rate = VALUE_OR_RETURN_STATUS(
2485*ec779b8eSAndroid Build Coastguard Worker                 convertIntegral<unsigned int>(aidl.sampleRate.value().value));
2486*ec779b8eSAndroid Build Coastguard Worker         legacy->config_mask |= AUDIO_PORT_CONFIG_SAMPLE_RATE;
2487*ec779b8eSAndroid Build Coastguard Worker     }
2488*ec779b8eSAndroid Build Coastguard Worker     if (aidl.channelMask.has_value()) {
2489*ec779b8eSAndroid Build Coastguard Worker         legacy->channel_mask =
2490*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_RETURN_STATUS(
2491*ec779b8eSAndroid Build Coastguard Worker                         aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
2492*ec779b8eSAndroid Build Coastguard Worker                                 aidl.channelMask.value(), isInput));
2493*ec779b8eSAndroid Build Coastguard Worker         legacy->config_mask |= AUDIO_PORT_CONFIG_CHANNEL_MASK;
2494*ec779b8eSAndroid Build Coastguard Worker     }
2495*ec779b8eSAndroid Build Coastguard Worker     if (aidl.format.has_value()) {
2496*ec779b8eSAndroid Build Coastguard Worker         legacy->format = VALUE_OR_RETURN_STATUS(
2497*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format.value()));
2498*ec779b8eSAndroid Build Coastguard Worker         legacy->config_mask |= AUDIO_PORT_CONFIG_FORMAT;
2499*ec779b8eSAndroid Build Coastguard Worker     }
2500*ec779b8eSAndroid Build Coastguard Worker     if (aidl.gain.has_value()) {
2501*ec779b8eSAndroid Build Coastguard Worker         legacy->gain = VALUE_OR_RETURN_STATUS(aidl2legacy_AudioGainConfig_audio_gain_config(
2502*ec779b8eSAndroid Build Coastguard Worker                         aidl.gain.value(), isInput));
2503*ec779b8eSAndroid Build Coastguard Worker         legacy->config_mask |= AUDIO_PORT_CONFIG_GAIN;
2504*ec779b8eSAndroid Build Coastguard Worker     }
2505*ec779b8eSAndroid Build Coastguard Worker     if (aidl.flags.has_value()) {
2506*ec779b8eSAndroid Build Coastguard Worker         legacy->flags = VALUE_OR_RETURN_STATUS(
2507*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_AudioIoFlags_audio_io_flags(aidl.flags.value(), isInput));
2508*ec779b8eSAndroid Build Coastguard Worker         legacy->config_mask |= AUDIO_PORT_CONFIG_FLAGS;
2509*ec779b8eSAndroid Build Coastguard Worker     }
2510*ec779b8eSAndroid Build Coastguard Worker     RETURN_STATUS_IF_ERROR(aidl2legacy_AudioPortExt_audio_port_config_ext(
2511*ec779b8eSAndroid Build Coastguard Worker                     aidl.ext, isInput, &legacy->ext, &legacy->type));
2512*ec779b8eSAndroid Build Coastguard Worker     legacy->role = VALUE_OR_RETURN_STATUS(portRole(isInput ?
2513*ec779b8eSAndroid Build Coastguard Worker                     AudioPortDirection::INPUT : AudioPortDirection::OUTPUT, legacy->type));
2514*ec779b8eSAndroid Build Coastguard Worker     return OK;
2515*ec779b8eSAndroid Build Coastguard Worker }
2516*ec779b8eSAndroid Build Coastguard Worker 
2517*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortConfig>
legacy2aidl_audio_port_config_AudioPortConfig(const audio_port_config & legacy,bool isInput,int32_t portId)2518*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_config_AudioPortConfig(
2519*ec779b8eSAndroid Build Coastguard Worker         const audio_port_config& legacy, bool isInput, int32_t portId) {
2520*ec779b8eSAndroid Build Coastguard Worker     AudioPortConfig aidl;
2521*ec779b8eSAndroid Build Coastguard Worker     aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2522*ec779b8eSAndroid Build Coastguard Worker     aidl.portId = portId;
2523*ec779b8eSAndroid Build Coastguard Worker     if (legacy.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) {
2524*ec779b8eSAndroid Build Coastguard Worker         Int aidl_sampleRate;
2525*ec779b8eSAndroid Build Coastguard Worker         aidl_sampleRate.value = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.sample_rate));
2526*ec779b8eSAndroid Build Coastguard Worker         aidl.sampleRate = aidl_sampleRate;
2527*ec779b8eSAndroid Build Coastguard Worker     }
2528*ec779b8eSAndroid Build Coastguard Worker     if (legacy.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) {
2529*ec779b8eSAndroid Build Coastguard Worker         aidl.channelMask = VALUE_OR_RETURN(
2530*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
2531*ec779b8eSAndroid Build Coastguard Worker     }
2532*ec779b8eSAndroid Build Coastguard Worker     if (legacy.config_mask & AUDIO_PORT_CONFIG_FORMAT) {
2533*ec779b8eSAndroid Build Coastguard Worker         aidl.format = VALUE_OR_RETURN(
2534*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
2535*ec779b8eSAndroid Build Coastguard Worker     }
2536*ec779b8eSAndroid Build Coastguard Worker     if (legacy.config_mask & AUDIO_PORT_CONFIG_GAIN) {
2537*ec779b8eSAndroid Build Coastguard Worker         aidl.gain = VALUE_OR_RETURN(
2538*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_gain_config_AudioGainConfig(legacy.gain, isInput));
2539*ec779b8eSAndroid Build Coastguard Worker     }
2540*ec779b8eSAndroid Build Coastguard Worker     if (legacy.config_mask & AUDIO_PORT_CONFIG_FLAGS) {
2541*ec779b8eSAndroid Build Coastguard Worker         aidl.flags = VALUE_OR_RETURN(
2542*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_io_flags_AudioIoFlags(legacy.flags, isInput));
2543*ec779b8eSAndroid Build Coastguard Worker     }
2544*ec779b8eSAndroid Build Coastguard Worker     aidl.ext = VALUE_OR_RETURN(
2545*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_port_config_ext_AudioPortExt(legacy.ext, legacy.type, isInput));
2546*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2547*ec779b8eSAndroid Build Coastguard Worker }
2548*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioPortMixExt_audio_port_mix_ext(const AudioPortMixExt & aidl)2549*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_mix_ext> aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
2550*ec779b8eSAndroid Build Coastguard Worker         const AudioPortMixExt& aidl) {
2551*ec779b8eSAndroid Build Coastguard Worker     audio_port_mix_ext legacy{};
2552*ec779b8eSAndroid Build Coastguard Worker     legacy.handle = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_io_handle_t(aidl.handle));
2553*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2554*ec779b8eSAndroid Build Coastguard Worker }
2555*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_mix_ext_AudioPortMixExt(const audio_port_mix_ext & legacy)2556*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortMixExt> legacy2aidl_audio_port_mix_ext_AudioPortMixExt(
2557*ec779b8eSAndroid Build Coastguard Worker         const audio_port_mix_ext& legacy) {
2558*ec779b8eSAndroid Build Coastguard Worker     AudioPortMixExt aidl;
2559*ec779b8eSAndroid Build Coastguard Worker     aidl.handle = VALUE_OR_RETURN(legacy2aidl_audio_io_handle_t_int32_t(legacy.handle));
2560*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2561*ec779b8eSAndroid Build Coastguard Worker }
2562*ec779b8eSAndroid Build Coastguard Worker 
2563*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_device_ext>
aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const AudioPortDeviceExt & aidl)2564*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(const AudioPortDeviceExt& aidl) {
2565*ec779b8eSAndroid Build Coastguard Worker     audio_port_device_ext legacy{};
2566*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
2567*ec779b8eSAndroid Build Coastguard Worker                     aidl.device, &legacy.type, legacy.address));
2568*ec779b8eSAndroid Build Coastguard Worker     legacy.encapsulation_modes = VALUE_OR_RETURN(
2569*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioEncapsulationMode_mask(aidl.encapsulationModes));
2570*ec779b8eSAndroid Build Coastguard Worker     legacy.encapsulation_metadata_types = VALUE_OR_RETURN(
2571*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioEncapsulationMetadataType_mask(
2572*ec779b8eSAndroid Build Coastguard Worker                     aidl.encapsulationMetadataTypes));
2573*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2574*ec779b8eSAndroid Build Coastguard Worker }
2575*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(const audio_port_device_ext & legacy)2576*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortDeviceExt> legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(
2577*ec779b8eSAndroid Build Coastguard Worker         const audio_port_device_ext& legacy) {
2578*ec779b8eSAndroid Build Coastguard Worker     AudioPortDeviceExt aidl;
2579*ec779b8eSAndroid Build Coastguard Worker     aidl.device = VALUE_OR_RETURN(
2580*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_device_AudioDevice(legacy.type, legacy.address));
2581*ec779b8eSAndroid Build Coastguard Worker     aidl.encapsulationModes = VALUE_OR_RETURN(
2582*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_AudioEncapsulationMode_mask(legacy.encapsulation_modes));
2583*ec779b8eSAndroid Build Coastguard Worker     aidl.encapsulationMetadataTypes = VALUE_OR_RETURN(
2584*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_AudioEncapsulationMetadataType_mask(legacy.encapsulation_metadata_types));
2585*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2586*ec779b8eSAndroid Build Coastguard Worker }
2587*ec779b8eSAndroid Build Coastguard Worker 
2588*ec779b8eSAndroid Build Coastguard Worker // This type is unnamed in the original definition, thus we name it here.
2589*ec779b8eSAndroid Build Coastguard Worker using audio_port_v7_ext = decltype(audio_port_v7::ext);
2590*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_AudioPortExt_audio_port_v7_ext(const AudioPortExt & aidl,audio_port_v7_ext * legacy,audio_port_type_t * type)2591*ec779b8eSAndroid Build Coastguard Worker status_t aidl2legacy_AudioPortExt_audio_port_v7_ext(
2592*ec779b8eSAndroid Build Coastguard Worker         const AudioPortExt& aidl, audio_port_v7_ext* legacy, audio_port_type_t* type) {
2593*ec779b8eSAndroid Build Coastguard Worker     switch (aidl.getTag()) {
2594*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::unspecified:
2595*ec779b8eSAndroid Build Coastguard Worker             // Just verify that the union is empty.
2596*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, unspecified));
2597*ec779b8eSAndroid Build Coastguard Worker             *legacy = {};
2598*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_NONE;
2599*ec779b8eSAndroid Build Coastguard Worker             return OK;
2600*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::device:
2601*ec779b8eSAndroid Build Coastguard Worker             legacy->device = VALUE_OR_RETURN_STATUS(
2602*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_AudioPortDeviceExt_audio_port_device_ext(
2603*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, device))));
2604*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_DEVICE;
2605*ec779b8eSAndroid Build Coastguard Worker             return OK;
2606*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::mix:
2607*ec779b8eSAndroid Build Coastguard Worker             legacy->mix = VALUE_OR_RETURN_STATUS(
2608*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_AudioPortMixExt_audio_port_mix_ext(
2609*ec779b8eSAndroid Build Coastguard Worker                             VALUE_OR_RETURN_STATUS(UNION_GET(aidl, mix))));
2610*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_MIX;
2611*ec779b8eSAndroid Build Coastguard Worker             return OK;
2612*ec779b8eSAndroid Build Coastguard Worker         case AudioPortExt::Tag::session:
2613*ec779b8eSAndroid Build Coastguard Worker             // This variant is not used in the HAL scenario.
2614*ec779b8eSAndroid Build Coastguard Worker             legacy->session.session = AUDIO_SESSION_NONE;
2615*ec779b8eSAndroid Build Coastguard Worker             *type = AUDIO_PORT_TYPE_SESSION;
2616*ec779b8eSAndroid Build Coastguard Worker             return OK;
2617*ec779b8eSAndroid Build Coastguard Worker 
2618*ec779b8eSAndroid Build Coastguard Worker     }
2619*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
2620*ec779b8eSAndroid Build Coastguard Worker }
2621*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_port_v7_ext_AudioPortExt(const audio_port_v7_ext & legacy,audio_port_type_t type)2622*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPortExt> legacy2aidl_audio_port_v7_ext_AudioPortExt(
2623*ec779b8eSAndroid Build Coastguard Worker         const audio_port_v7_ext& legacy, audio_port_type_t type) {
2624*ec779b8eSAndroid Build Coastguard Worker     AudioPortExt aidl;
2625*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
2626*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_NONE:
2627*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, unspecified, false);
2628*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2629*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_DEVICE: {
2630*ec779b8eSAndroid Build Coastguard Worker             AudioPortDeviceExt device = VALUE_OR_RETURN(
2631*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_port_device_ext_AudioPortDeviceExt(legacy.device));
2632*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, device, device);
2633*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2634*ec779b8eSAndroid Build Coastguard Worker         }
2635*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_MIX: {
2636*ec779b8eSAndroid Build Coastguard Worker             AudioPortMixExt mix = VALUE_OR_RETURN(
2637*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_port_mix_ext_AudioPortMixExt(legacy.mix));
2638*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, mix, mix);
2639*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2640*ec779b8eSAndroid Build Coastguard Worker         }
2641*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_PORT_TYPE_SESSION:
2642*ec779b8eSAndroid Build Coastguard Worker             // This variant is not used in the HAL scenario.
2643*ec779b8eSAndroid Build Coastguard Worker             UNION_SET(aidl, unspecified, false);
2644*ec779b8eSAndroid Build Coastguard Worker             return aidl;
2645*ec779b8eSAndroid Build Coastguard Worker     }
2646*ec779b8eSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL("Shouldn't get here"); // with -Werror,-Wswitch may compile-time fail
2647*ec779b8eSAndroid Build Coastguard Worker }
2648*ec779b8eSAndroid Build Coastguard Worker 
2649*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_port_v7>
aidl2legacy_AudioPort_audio_port_v7(const AudioPort & aidl,bool isInput)2650*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPort_audio_port_v7(const AudioPort& aidl, bool isInput) {
2651*ec779b8eSAndroid Build Coastguard Worker     audio_port_v7 legacy;
2652*ec779b8eSAndroid Build Coastguard Worker     legacy.id = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_port_handle_t(aidl.id));
2653*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_string(aidl.name, legacy.name, sizeof(legacy.name)));
2654*ec779b8eSAndroid Build Coastguard Worker 
2655*ec779b8eSAndroid Build Coastguard Worker     if (aidl.profiles.size() > std::size(legacy.audio_profiles)) {
2656*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2657*ec779b8eSAndroid Build Coastguard Worker     }
2658*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(convertRange(
2659*ec779b8eSAndroid Build Coastguard Worker                     aidl.profiles.begin(), aidl.profiles.end(), legacy.audio_profiles,
2660*ec779b8eSAndroid Build Coastguard Worker                     [isInput](const AudioProfile& p) {
2661*ec779b8eSAndroid Build Coastguard Worker                         return aidl2legacy_AudioProfile_audio_profile(p, isInput);
2662*ec779b8eSAndroid Build Coastguard Worker                     }));
2663*ec779b8eSAndroid Build Coastguard Worker     legacy.num_audio_profiles = aidl.profiles.size();
2664*ec779b8eSAndroid Build Coastguard Worker 
2665*ec779b8eSAndroid Build Coastguard Worker     if (aidl.extraAudioDescriptors.size() > std::size(legacy.extra_audio_descriptors)) {
2666*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2667*ec779b8eSAndroid Build Coastguard Worker     }
2668*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2669*ec779b8eSAndroid Build Coastguard Worker             convertRange(
2670*ec779b8eSAndroid Build Coastguard Worker                     aidl.extraAudioDescriptors.begin(), aidl.extraAudioDescriptors.end(),
2671*ec779b8eSAndroid Build Coastguard Worker                     legacy.extra_audio_descriptors,
2672*ec779b8eSAndroid Build Coastguard Worker                     aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor));
2673*ec779b8eSAndroid Build Coastguard Worker     legacy.num_extra_audio_descriptors = aidl.extraAudioDescriptors.size();
2674*ec779b8eSAndroid Build Coastguard Worker 
2675*ec779b8eSAndroid Build Coastguard Worker     if (aidl.gains.size() > std::size(legacy.gains)) {
2676*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2677*ec779b8eSAndroid Build Coastguard Worker     }
2678*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(convertRange(aidl.gains.begin(), aidl.gains.end(), legacy.gains,
2679*ec779b8eSAndroid Build Coastguard Worker                                  [isInput](const AudioGain& g) {
2680*ec779b8eSAndroid Build Coastguard Worker                                      return aidl2legacy_AudioGain_audio_gain(g, isInput);
2681*ec779b8eSAndroid Build Coastguard Worker                                  }));
2682*ec779b8eSAndroid Build Coastguard Worker     legacy.num_gains = aidl.gains.size();
2683*ec779b8eSAndroid Build Coastguard Worker 
2684*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioPortExt_audio_port_v7_ext(
2685*ec779b8eSAndroid Build Coastguard Worker                     aidl.ext, &legacy.ext, &legacy.type));
2686*ec779b8eSAndroid Build Coastguard Worker     legacy.role = VALUE_OR_RETURN(portRole(
2687*ec779b8eSAndroid Build Coastguard Worker                     isInput ? AudioPortDirection::INPUT : AudioPortDirection::OUTPUT, legacy.type));
2688*ec779b8eSAndroid Build Coastguard Worker 
2689*ec779b8eSAndroid Build Coastguard Worker     AudioPortConfig aidlPortConfig;
2690*ec779b8eSAndroid Build Coastguard Worker     int32_t portId;
2691*ec779b8eSAndroid Build Coastguard Worker     aidlPortConfig.flags = aidl.flags;
2692*ec779b8eSAndroid Build Coastguard Worker     aidlPortConfig.ext = aidl.ext;
2693*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioPortConfig_audio_port_config(
2694*ec779b8eSAndroid Build Coastguard Worker                     aidlPortConfig, isInput, &legacy.active_config, &portId));
2695*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2696*ec779b8eSAndroid Build Coastguard Worker }
2697*ec779b8eSAndroid Build Coastguard Worker 
2698*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPort>
legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7 & legacy,bool isInput)2699*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_port_v7_AudioPort(const audio_port_v7& legacy, bool isInput) {
2700*ec779b8eSAndroid Build Coastguard Worker     AudioPort aidl;
2701*ec779b8eSAndroid Build Coastguard Worker     aidl.id = VALUE_OR_RETURN(legacy2aidl_audio_port_handle_t_int32_t(legacy.id));
2702*ec779b8eSAndroid Build Coastguard Worker     aidl.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
2703*ec779b8eSAndroid Build Coastguard Worker 
2704*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_audio_profiles > std::size(legacy.audio_profiles)) {
2705*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2706*ec779b8eSAndroid Build Coastguard Worker     }
2707*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2708*ec779b8eSAndroid Build Coastguard Worker             convertRange(legacy.audio_profiles, legacy.audio_profiles + legacy.num_audio_profiles,
2709*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(aidl.profiles),
2710*ec779b8eSAndroid Build Coastguard Worker                          [isInput](const audio_profile& p) {
2711*ec779b8eSAndroid Build Coastguard Worker                              return legacy2aidl_audio_profile_AudioProfile(p, isInput);
2712*ec779b8eSAndroid Build Coastguard Worker                          }));
2713*ec779b8eSAndroid Build Coastguard Worker 
2714*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_extra_audio_descriptors > std::size(legacy.extra_audio_descriptors)) {
2715*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2716*ec779b8eSAndroid Build Coastguard Worker     }
2717*ec779b8eSAndroid Build Coastguard Worker     aidl.profiles.resize(legacy.num_audio_profiles);
2718*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2719*ec779b8eSAndroid Build Coastguard Worker             convertRange(legacy.extra_audio_descriptors,
2720*ec779b8eSAndroid Build Coastguard Worker                     legacy.extra_audio_descriptors + legacy.num_extra_audio_descriptors,
2721*ec779b8eSAndroid Build Coastguard Worker                     std::back_inserter(aidl.extraAudioDescriptors),
2722*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor));
2723*ec779b8eSAndroid Build Coastguard Worker 
2724*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_gains > std::size(legacy.gains)) {
2725*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2726*ec779b8eSAndroid Build Coastguard Worker     }
2727*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2728*ec779b8eSAndroid Build Coastguard Worker             convertRange(legacy.gains, legacy.gains + legacy.num_gains,
2729*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(aidl.gains),
2730*ec779b8eSAndroid Build Coastguard Worker                          [isInput](const audio_gain& g) {
2731*ec779b8eSAndroid Build Coastguard Worker                              return legacy2aidl_audio_gain_AudioGain(g, isInput);
2732*ec779b8eSAndroid Build Coastguard Worker                          }));
2733*ec779b8eSAndroid Build Coastguard Worker     aidl.gains.resize(legacy.num_gains);
2734*ec779b8eSAndroid Build Coastguard Worker 
2735*ec779b8eSAndroid Build Coastguard Worker     aidl.ext = VALUE_OR_RETURN(
2736*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_port_v7_ext_AudioPortExt(legacy.ext, legacy.type));
2737*ec779b8eSAndroid Build Coastguard Worker 
2738*ec779b8eSAndroid Build Coastguard Worker     AudioPortConfig aidlPortConfig = VALUE_OR_RETURN(legacy2aidl_audio_port_config_AudioPortConfig(
2739*ec779b8eSAndroid Build Coastguard Worker                     legacy.active_config, isInput, aidl.id));
2740*ec779b8eSAndroid Build Coastguard Worker     if (aidlPortConfig.flags.has_value()) {
2741*ec779b8eSAndroid Build Coastguard Worker         aidl.flags = aidlPortConfig.flags.value();
2742*ec779b8eSAndroid Build Coastguard Worker     } else {
2743*ec779b8eSAndroid Build Coastguard Worker         aidl.flags = isInput ?
2744*ec779b8eSAndroid Build Coastguard Worker                 AudioIoFlags::make<AudioIoFlags::Tag::input>(0) :
2745*ec779b8eSAndroid Build Coastguard Worker                 AudioIoFlags::make<AudioIoFlags::Tag::output>(0);
2746*ec779b8eSAndroid Build Coastguard Worker     }
2747*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2748*ec779b8eSAndroid Build Coastguard Worker }
2749*ec779b8eSAndroid Build Coastguard Worker 
2750*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_profile>
aidl2legacy_AudioProfile_audio_profile(const AudioProfile & aidl,bool isInput)2751*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioProfile_audio_profile(const AudioProfile& aidl, bool isInput) {
2752*ec779b8eSAndroid Build Coastguard Worker     audio_profile legacy;
2753*ec779b8eSAndroid Build Coastguard Worker     legacy.format = VALUE_OR_RETURN(aidl2legacy_AudioFormatDescription_audio_format_t(aidl.format));
2754*ec779b8eSAndroid Build Coastguard Worker 
2755*ec779b8eSAndroid Build Coastguard Worker     if (aidl.sampleRates.size() > std::size(legacy.sample_rates)) {
2756*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2757*ec779b8eSAndroid Build Coastguard Worker     }
2758*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2759*ec779b8eSAndroid Build Coastguard Worker             convertRange(aidl.sampleRates.begin(), aidl.sampleRates.end(), legacy.sample_rates,
2760*ec779b8eSAndroid Build Coastguard Worker                          convertIntegral<int32_t, unsigned int>));
2761*ec779b8eSAndroid Build Coastguard Worker     legacy.num_sample_rates = aidl.sampleRates.size();
2762*ec779b8eSAndroid Build Coastguard Worker 
2763*ec779b8eSAndroid Build Coastguard Worker     if (aidl.channelMasks.size() > std::size(legacy.channel_masks)) {
2764*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2765*ec779b8eSAndroid Build Coastguard Worker     }
2766*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2767*ec779b8eSAndroid Build Coastguard Worker             convertRange(aidl.channelMasks.begin(), aidl.channelMasks.end(), legacy.channel_masks,
2768*ec779b8eSAndroid Build Coastguard Worker                     [isInput](const AudioChannelLayout& l) {
2769*ec779b8eSAndroid Build Coastguard Worker                         return aidl2legacy_AudioChannelLayout_audio_channel_mask_t(l, isInput);
2770*ec779b8eSAndroid Build Coastguard Worker                     }));
2771*ec779b8eSAndroid Build Coastguard Worker     legacy.num_channel_masks = aidl.channelMasks.size();
2772*ec779b8eSAndroid Build Coastguard Worker 
2773*ec779b8eSAndroid Build Coastguard Worker     legacy.encapsulation_type = VALUE_OR_RETURN(
2774*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(aidl.encapsulationType));
2775*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2776*ec779b8eSAndroid Build Coastguard Worker }
2777*ec779b8eSAndroid Build Coastguard Worker 
2778*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioProfile>
legacy2aidl_audio_profile_AudioProfile(const audio_profile & legacy,bool isInput)2779*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_profile_AudioProfile(const audio_profile& legacy, bool isInput) {
2780*ec779b8eSAndroid Build Coastguard Worker     AudioProfile aidl;
2781*ec779b8eSAndroid Build Coastguard Worker     aidl.format = VALUE_OR_RETURN(legacy2aidl_audio_format_t_AudioFormatDescription(legacy.format));
2782*ec779b8eSAndroid Build Coastguard Worker 
2783*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_sample_rates > std::size(legacy.sample_rates)) {
2784*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2785*ec779b8eSAndroid Build Coastguard Worker     }
2786*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2787*ec779b8eSAndroid Build Coastguard Worker             convertRange(legacy.sample_rates, legacy.sample_rates + legacy.num_sample_rates,
2788*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(aidl.sampleRates),
2789*ec779b8eSAndroid Build Coastguard Worker                          convertIntegral<unsigned int, int32_t>));
2790*ec779b8eSAndroid Build Coastguard Worker 
2791*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_channel_masks > std::size(legacy.channel_masks)) {
2792*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2793*ec779b8eSAndroid Build Coastguard Worker     }
2794*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(
2795*ec779b8eSAndroid Build Coastguard Worker             convertRange(legacy.channel_masks, legacy.channel_masks + legacy.num_channel_masks,
2796*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(aidl.channelMasks),
2797*ec779b8eSAndroid Build Coastguard Worker                     [isInput](audio_channel_mask_t m) {
2798*ec779b8eSAndroid Build Coastguard Worker                         return legacy2aidl_audio_channel_mask_t_AudioChannelLayout(m, isInput);
2799*ec779b8eSAndroid Build Coastguard Worker                     }));
2800*ec779b8eSAndroid Build Coastguard Worker 
2801*ec779b8eSAndroid Build Coastguard Worker     aidl.encapsulationType = VALUE_OR_RETURN(
2802*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2803*ec779b8eSAndroid Build Coastguard Worker                     legacy.encapsulation_type));
2804*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2805*ec779b8eSAndroid Build Coastguard Worker }
2806*ec779b8eSAndroid Build Coastguard Worker 
2807*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_gain>
aidl2legacy_AudioGain_audio_gain(const AudioGain & aidl,bool isInput)2808*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioGain_audio_gain(const AudioGain& aidl, bool isInput) {
2809*ec779b8eSAndroid Build Coastguard Worker     audio_gain legacy;
2810*ec779b8eSAndroid Build Coastguard Worker     legacy.mode = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_gain_mode_t_mask(aidl.mode));
2811*ec779b8eSAndroid Build Coastguard Worker     legacy.channel_mask = VALUE_OR_RETURN(aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
2812*ec779b8eSAndroid Build Coastguard Worker                     aidl.channelMask, isInput));
2813*ec779b8eSAndroid Build Coastguard Worker     legacy.min_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.minValue));
2814*ec779b8eSAndroid Build Coastguard Worker     legacy.max_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.maxValue));
2815*ec779b8eSAndroid Build Coastguard Worker     legacy.default_value = VALUE_OR_RETURN(convertIntegral<int>(aidl.defaultValue));
2816*ec779b8eSAndroid Build Coastguard Worker     legacy.step_value = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.stepValue));
2817*ec779b8eSAndroid Build Coastguard Worker     legacy.min_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.minRampMs));
2818*ec779b8eSAndroid Build Coastguard Worker     legacy.max_ramp_ms = VALUE_OR_RETURN(convertIntegral<unsigned int>(aidl.maxRampMs));
2819*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2820*ec779b8eSAndroid Build Coastguard Worker }
2821*ec779b8eSAndroid Build Coastguard Worker 
2822*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioGain>
legacy2aidl_audio_gain_AudioGain(const audio_gain & legacy,bool isInput)2823*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_gain_AudioGain(const audio_gain& legacy, bool isInput) {
2824*ec779b8eSAndroid Build Coastguard Worker     AudioGain aidl;
2825*ec779b8eSAndroid Build Coastguard Worker     aidl.mode = VALUE_OR_RETURN(legacy2aidl_audio_gain_mode_t_int32_t_mask(legacy.mode));
2826*ec779b8eSAndroid Build Coastguard Worker     aidl.channelMask = VALUE_OR_RETURN(
2827*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_channel_mask_t_AudioChannelLayout(legacy.channel_mask, isInput));
2828*ec779b8eSAndroid Build Coastguard Worker     aidl.minValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_value));
2829*ec779b8eSAndroid Build Coastguard Worker     aidl.maxValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_value));
2830*ec779b8eSAndroid Build Coastguard Worker     aidl.defaultValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.default_value));
2831*ec779b8eSAndroid Build Coastguard Worker     aidl.stepValue = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.step_value));
2832*ec779b8eSAndroid Build Coastguard Worker     aidl.minRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.min_ramp_ms));
2833*ec779b8eSAndroid Build Coastguard Worker     aidl.maxRampMs = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.max_ramp_ms));
2834*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2835*ec779b8eSAndroid Build Coastguard Worker }
2836*ec779b8eSAndroid Build Coastguard Worker 
2837*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_mode_t>
aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl)2838*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioMode_audio_mode_t(AudioMode aidl) {
2839*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2840*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::SYS_RESERVED_INVALID:
2841*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_INVALID;
2842*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::SYS_RESERVED_CURRENT:
2843*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_CURRENT;
2844*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::NORMAL:
2845*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_NORMAL;
2846*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::RINGTONE:
2847*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_RINGTONE;
2848*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::IN_CALL:
2849*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_IN_CALL;
2850*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::IN_COMMUNICATION:
2851*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_IN_COMMUNICATION;
2852*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::CALL_SCREEN:
2853*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_CALL_SCREEN;
2854*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::SYS_RESERVED_CALL_REDIRECT:
2855*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_CALL_REDIRECT;
2856*ec779b8eSAndroid Build Coastguard Worker         case AudioMode::SYS_RESERVED_COMMUNICATION_REDIRECT:
2857*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MODE_COMMUNICATION_REDIRECT;
2858*ec779b8eSAndroid Build Coastguard Worker     }
2859*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2860*ec779b8eSAndroid Build Coastguard Worker }
2861*ec779b8eSAndroid Build Coastguard Worker 
2862*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioMode>
legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy)2863*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_mode_t_AudioMode(audio_mode_t legacy) {
2864*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2865*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_INVALID:
2866*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::SYS_RESERVED_INVALID;
2867*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_CURRENT:
2868*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::SYS_RESERVED_CURRENT;
2869*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_NORMAL:
2870*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::NORMAL;
2871*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_RINGTONE:
2872*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::RINGTONE;
2873*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_IN_CALL:
2874*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::IN_CALL;
2875*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_IN_COMMUNICATION:
2876*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::IN_COMMUNICATION;
2877*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_CALL_SCREEN:
2878*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::CALL_SCREEN;
2879*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_CALL_REDIRECT:
2880*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::SYS_RESERVED_CALL_REDIRECT;
2881*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_COMMUNICATION_REDIRECT:
2882*ec779b8eSAndroid Build Coastguard Worker             return AudioMode::SYS_RESERVED_COMMUNICATION_REDIRECT;
2883*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MODE_CNT:
2884*ec779b8eSAndroid Build Coastguard Worker             break;
2885*ec779b8eSAndroid Build Coastguard Worker     }
2886*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2887*ec779b8eSAndroid Build Coastguard Worker }
2888*ec779b8eSAndroid Build Coastguard Worker 
2889*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_standard_t>
aidl2legacy_AudioStandard_audio_standard_t(AudioStandard aidl)2890*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioStandard_audio_standard_t(AudioStandard aidl) {
2891*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2892*ec779b8eSAndroid Build Coastguard Worker         case AudioStandard::NONE:
2893*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STANDARD_NONE;
2894*ec779b8eSAndroid Build Coastguard Worker         case AudioStandard::EDID:
2895*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STANDARD_EDID;
2896*ec779b8eSAndroid Build Coastguard Worker         case AudioStandard::SADB:
2897*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STANDARD_SADB;
2898*ec779b8eSAndroid Build Coastguard Worker         case AudioStandard::VSADB:
2899*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_STANDARD_VSADB;
2900*ec779b8eSAndroid Build Coastguard Worker     }
2901*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2902*ec779b8eSAndroid Build Coastguard Worker }
2903*ec779b8eSAndroid Build Coastguard Worker 
2904*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioStandard>
legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy)2905*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_standard_t_AudioStandard(audio_standard_t legacy) {
2906*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2907*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STANDARD_NONE:
2908*ec779b8eSAndroid Build Coastguard Worker             return AudioStandard::NONE;
2909*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STANDARD_EDID:
2910*ec779b8eSAndroid Build Coastguard Worker             return AudioStandard::EDID;
2911*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STANDARD_SADB:
2912*ec779b8eSAndroid Build Coastguard Worker             return AudioStandard::SADB;
2913*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_STANDARD_VSADB:
2914*ec779b8eSAndroid Build Coastguard Worker             return AudioStandard::VSADB;
2915*ec779b8eSAndroid Build Coastguard Worker     }
2916*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2917*ec779b8eSAndroid Build Coastguard Worker }
2918*ec779b8eSAndroid Build Coastguard Worker 
2919*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_extra_audio_descriptor>
aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(const ExtraAudioDescriptor & aidl)2920*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_ExtraAudioDescriptor_audio_extra_audio_descriptor(
2921*ec779b8eSAndroid Build Coastguard Worker         const ExtraAudioDescriptor& aidl) {
2922*ec779b8eSAndroid Build Coastguard Worker     audio_extra_audio_descriptor legacy;
2923*ec779b8eSAndroid Build Coastguard Worker     legacy.standard = VALUE_OR_RETURN(aidl2legacy_AudioStandard_audio_standard_t(aidl.standard));
2924*ec779b8eSAndroid Build Coastguard Worker     if (aidl.audioDescriptor.size() > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
2925*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2926*ec779b8eSAndroid Build Coastguard Worker     }
2927*ec779b8eSAndroid Build Coastguard Worker     legacy.descriptor_length = aidl.audioDescriptor.size();
2928*ec779b8eSAndroid Build Coastguard Worker     std::copy(aidl.audioDescriptor.begin(), aidl.audioDescriptor.end(),
2929*ec779b8eSAndroid Build Coastguard Worker               std::begin(legacy.descriptor));
2930*ec779b8eSAndroid Build Coastguard Worker     legacy.encapsulation_type =
2931*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN(aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
2932*ec779b8eSAndroid Build Coastguard Worker                     aidl.encapsulationType));
2933*ec779b8eSAndroid Build Coastguard Worker     return legacy;
2934*ec779b8eSAndroid Build Coastguard Worker }
2935*ec779b8eSAndroid Build Coastguard Worker 
2936*ec779b8eSAndroid Build Coastguard Worker ConversionResult<ExtraAudioDescriptor>
legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(const audio_extra_audio_descriptor & legacy)2937*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_extra_audio_descriptor_ExtraAudioDescriptor(
2938*ec779b8eSAndroid Build Coastguard Worker         const audio_extra_audio_descriptor& legacy) {
2939*ec779b8eSAndroid Build Coastguard Worker     ExtraAudioDescriptor aidl;
2940*ec779b8eSAndroid Build Coastguard Worker     aidl.standard = VALUE_OR_RETURN(legacy2aidl_audio_standard_t_AudioStandard(legacy.standard));
2941*ec779b8eSAndroid Build Coastguard Worker     if (legacy.descriptor_length > EXTRA_AUDIO_DESCRIPTOR_SIZE) {
2942*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
2943*ec779b8eSAndroid Build Coastguard Worker     }
2944*ec779b8eSAndroid Build Coastguard Worker     aidl.audioDescriptor.resize(legacy.descriptor_length);
2945*ec779b8eSAndroid Build Coastguard Worker     std::copy(legacy.descriptor, legacy.descriptor + legacy.descriptor_length,
2946*ec779b8eSAndroid Build Coastguard Worker               aidl.audioDescriptor.begin());
2947*ec779b8eSAndroid Build Coastguard Worker     aidl.encapsulationType =
2948*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN(legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2949*ec779b8eSAndroid Build Coastguard Worker                     legacy.encapsulation_type));
2950*ec779b8eSAndroid Build Coastguard Worker     return aidl;
2951*ec779b8eSAndroid Build Coastguard Worker }
2952*ec779b8eSAndroid Build Coastguard Worker 
2953*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_encapsulation_type_t>
aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(const AudioEncapsulationType & aidl)2954*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioEncapsulationType_audio_encapsulation_type_t(
2955*ec779b8eSAndroid Build Coastguard Worker         const AudioEncapsulationType& aidl) {
2956*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2957*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationType::NONE:
2958*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_TYPE_NONE;
2959*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationType::IEC61937:
2960*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_TYPE_IEC61937;
2961*ec779b8eSAndroid Build Coastguard Worker         case AudioEncapsulationType::PCM:
2962*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_ENCAPSULATION_TYPE_PCM;
2963*ec779b8eSAndroid Build Coastguard Worker     }
2964*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2965*ec779b8eSAndroid Build Coastguard Worker }
2966*ec779b8eSAndroid Build Coastguard Worker 
2967*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioEncapsulationType>
legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(const audio_encapsulation_type_t & legacy)2968*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_encapsulation_type_t_AudioEncapsulationType(
2969*ec779b8eSAndroid Build Coastguard Worker         const audio_encapsulation_type_t & legacy) {
2970*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2971*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_TYPE_NONE:
2972*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationType::NONE;
2973*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_TYPE_IEC61937:
2974*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationType::IEC61937;
2975*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_ENCAPSULATION_TYPE_PCM:
2976*ec779b8eSAndroid Build Coastguard Worker             return AudioEncapsulationType::PCM;
2977*ec779b8eSAndroid Build Coastguard Worker     }
2978*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2979*ec779b8eSAndroid Build Coastguard Worker }
2980*ec779b8eSAndroid Build Coastguard Worker 
2981*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_dual_mono_mode_t>
aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(AudioDualMonoMode aidl)2982*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(AudioDualMonoMode aidl) {
2983*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
2984*ec779b8eSAndroid Build Coastguard Worker         case AudioDualMonoMode::OFF:
2985*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_DUAL_MONO_MODE_OFF;
2986*ec779b8eSAndroid Build Coastguard Worker         case AudioDualMonoMode::LR:
2987*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_DUAL_MONO_MODE_LR;
2988*ec779b8eSAndroid Build Coastguard Worker         case AudioDualMonoMode::LL:
2989*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_DUAL_MONO_MODE_LL;
2990*ec779b8eSAndroid Build Coastguard Worker         case AudioDualMonoMode::RR:
2991*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_DUAL_MONO_MODE_RR;
2992*ec779b8eSAndroid Build Coastguard Worker     }
2993*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
2994*ec779b8eSAndroid Build Coastguard Worker }
2995*ec779b8eSAndroid Build Coastguard Worker 
2996*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioDualMonoMode>
legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(audio_dual_mono_mode_t legacy)2997*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(audio_dual_mono_mode_t legacy) {
2998*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
2999*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_DUAL_MONO_MODE_OFF:
3000*ec779b8eSAndroid Build Coastguard Worker             return AudioDualMonoMode::OFF;
3001*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_DUAL_MONO_MODE_LR:
3002*ec779b8eSAndroid Build Coastguard Worker             return AudioDualMonoMode::LR;
3003*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_DUAL_MONO_MODE_LL:
3004*ec779b8eSAndroid Build Coastguard Worker             return AudioDualMonoMode::LL;
3005*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_DUAL_MONO_MODE_RR:
3006*ec779b8eSAndroid Build Coastguard Worker             return AudioDualMonoMode::RR;
3007*ec779b8eSAndroid Build Coastguard Worker     }
3008*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3009*ec779b8eSAndroid Build Coastguard Worker }
3010*ec779b8eSAndroid Build Coastguard Worker 
3011*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_timestretch_fallback_mode_t>
aidl2legacy_TimestretchFallbackMode_audio_timestretch_fallback_mode_t(AudioPlaybackRate::TimestretchFallbackMode aidl)3012*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_TimestretchFallbackMode_audio_timestretch_fallback_mode_t(
3013*ec779b8eSAndroid Build Coastguard Worker         AudioPlaybackRate::TimestretchFallbackMode aidl) {
3014*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3015*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchFallbackMode::SYS_RESERVED_CUT_REPEAT:
3016*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_FALLBACK_CUT_REPEAT;
3017*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchFallbackMode::SYS_RESERVED_DEFAULT:
3018*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_FALLBACK_DEFAULT;
3019*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchFallbackMode::MUTE:
3020*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_FALLBACK_MUTE;
3021*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchFallbackMode::FAIL:
3022*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_FALLBACK_FAIL;
3023*ec779b8eSAndroid Build Coastguard Worker     }
3024*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3025*ec779b8eSAndroid Build Coastguard Worker }
3026*ec779b8eSAndroid Build Coastguard Worker 
3027*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPlaybackRate::TimestretchFallbackMode>
legacy2aidl_audio_timestretch_fallback_mode_t_TimestretchFallbackMode(audio_timestretch_fallback_mode_t legacy)3028*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_timestretch_fallback_mode_t_TimestretchFallbackMode(
3029*ec779b8eSAndroid Build Coastguard Worker         audio_timestretch_fallback_mode_t legacy) {
3030*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3031*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_FALLBACK_CUT_REPEAT:
3032*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchFallbackMode::SYS_RESERVED_CUT_REPEAT;
3033*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_FALLBACK_DEFAULT:
3034*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchFallbackMode::SYS_RESERVED_DEFAULT;
3035*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_FALLBACK_MUTE:
3036*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchFallbackMode::MUTE;
3037*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_FALLBACK_FAIL:
3038*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchFallbackMode::FAIL;
3039*ec779b8eSAndroid Build Coastguard Worker     }
3040*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3041*ec779b8eSAndroid Build Coastguard Worker }
3042*ec779b8eSAndroid Build Coastguard Worker 
3043*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_timestretch_stretch_mode_t>
aidl2legacy_TimestretchMode_audio_timestretch_stretch_mode_t(AudioPlaybackRate::TimestretchMode aidl)3044*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_TimestretchMode_audio_timestretch_stretch_mode_t(
3045*ec779b8eSAndroid Build Coastguard Worker         AudioPlaybackRate::TimestretchMode aidl) {
3046*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3047*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchMode::DEFAULT:
3048*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_STRETCH_DEFAULT;
3049*ec779b8eSAndroid Build Coastguard Worker         case AudioPlaybackRate::TimestretchMode::VOICE:
3050*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_TIMESTRETCH_STRETCH_VOICE;
3051*ec779b8eSAndroid Build Coastguard Worker     }
3052*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3053*ec779b8eSAndroid Build Coastguard Worker }
3054*ec779b8eSAndroid Build Coastguard Worker 
3055*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPlaybackRate::TimestretchMode>
legacy2aidl_audio_timestretch_stretch_mode_t_TimestretchMode(audio_timestretch_stretch_mode_t legacy)3056*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_timestretch_stretch_mode_t_TimestretchMode(
3057*ec779b8eSAndroid Build Coastguard Worker         audio_timestretch_stretch_mode_t legacy) {
3058*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3059*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_STRETCH_DEFAULT:
3060*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchMode::DEFAULT;
3061*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_TIMESTRETCH_STRETCH_VOICE:
3062*ec779b8eSAndroid Build Coastguard Worker             return AudioPlaybackRate::TimestretchMode::VOICE;
3063*ec779b8eSAndroid Build Coastguard Worker     }
3064*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3065*ec779b8eSAndroid Build Coastguard Worker }
3066*ec779b8eSAndroid Build Coastguard Worker 
3067*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_playback_rate_t>
aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(const AudioPlaybackRate & aidl)3068*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(const AudioPlaybackRate& aidl) {
3069*ec779b8eSAndroid Build Coastguard Worker     audio_playback_rate_t legacy;
3070*ec779b8eSAndroid Build Coastguard Worker     legacy.mSpeed = aidl.speed;
3071*ec779b8eSAndroid Build Coastguard Worker     legacy.mPitch = aidl.pitch;
3072*ec779b8eSAndroid Build Coastguard Worker     legacy.mFallbackMode = VALUE_OR_RETURN(
3073*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_TimestretchFallbackMode_audio_timestretch_fallback_mode_t(
3074*ec779b8eSAndroid Build Coastguard Worker                     aidl.fallbackMode));
3075*ec779b8eSAndroid Build Coastguard Worker     legacy.mStretchMode = VALUE_OR_RETURN(
3076*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_TimestretchMode_audio_timestretch_stretch_mode_t(aidl.timestretchMode));
3077*ec779b8eSAndroid Build Coastguard Worker     return legacy;
3078*ec779b8eSAndroid Build Coastguard Worker }
3079*ec779b8eSAndroid Build Coastguard Worker 
3080*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioPlaybackRate>
legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t & legacy)3081*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(const audio_playback_rate_t& legacy) {
3082*ec779b8eSAndroid Build Coastguard Worker     AudioPlaybackRate aidl;
3083*ec779b8eSAndroid Build Coastguard Worker     aidl.speed = legacy.mSpeed;
3084*ec779b8eSAndroid Build Coastguard Worker     aidl.pitch = legacy.mPitch;
3085*ec779b8eSAndroid Build Coastguard Worker     aidl.fallbackMode = VALUE_OR_RETURN(
3086*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_timestretch_fallback_mode_t_TimestretchFallbackMode(
3087*ec779b8eSAndroid Build Coastguard Worker                     legacy.mFallbackMode));
3088*ec779b8eSAndroid Build Coastguard Worker     aidl.timestretchMode = VALUE_OR_RETURN(
3089*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_timestretch_stretch_mode_t_TimestretchMode(legacy.mStretchMode));
3090*ec779b8eSAndroid Build Coastguard Worker     return aidl;
3091*ec779b8eSAndroid Build Coastguard Worker }
3092*ec779b8eSAndroid Build Coastguard Worker 
3093*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_latency_mode_t>
aidl2legacy_AudioLatencyMode_audio_latency_mode_t(AudioLatencyMode aidl)3094*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_AudioLatencyMode_audio_latency_mode_t(AudioLatencyMode aidl) {
3095*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3096*ec779b8eSAndroid Build Coastguard Worker         case AudioLatencyMode::FREE:
3097*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_LATENCY_MODE_FREE;
3098*ec779b8eSAndroid Build Coastguard Worker         case AudioLatencyMode::LOW:
3099*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_LATENCY_MODE_LOW;
3100*ec779b8eSAndroid Build Coastguard Worker         case AudioLatencyMode::DYNAMIC_SPATIAL_AUDIO_SOFTWARE:
3101*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_LATENCY_MODE_DYNAMIC_SPATIAL_AUDIO_SOFTWARE;
3102*ec779b8eSAndroid Build Coastguard Worker         case AudioLatencyMode::DYNAMIC_SPATIAL_AUDIO_HARDWARE:
3103*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_LATENCY_MODE_DYNAMIC_SPATIAL_AUDIO_HARDWARE;
3104*ec779b8eSAndroid Build Coastguard Worker     }
3105*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3106*ec779b8eSAndroid Build Coastguard Worker }
3107*ec779b8eSAndroid Build Coastguard Worker ConversionResult<AudioLatencyMode>
legacy2aidl_audio_latency_mode_t_AudioLatencyMode(audio_latency_mode_t legacy)3108*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_latency_mode_t_AudioLatencyMode(audio_latency_mode_t legacy) {
3109*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3110*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_LATENCY_MODE_FREE:
3111*ec779b8eSAndroid Build Coastguard Worker             return AudioLatencyMode::FREE;
3112*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_LATENCY_MODE_LOW:
3113*ec779b8eSAndroid Build Coastguard Worker             return AudioLatencyMode::LOW;
3114*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_LATENCY_MODE_DYNAMIC_SPATIAL_AUDIO_SOFTWARE:
3115*ec779b8eSAndroid Build Coastguard Worker             return AudioLatencyMode::DYNAMIC_SPATIAL_AUDIO_SOFTWARE;
3116*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_LATENCY_MODE_DYNAMIC_SPATIAL_AUDIO_HARDWARE:
3117*ec779b8eSAndroid Build Coastguard Worker             return AudioLatencyMode::DYNAMIC_SPATIAL_AUDIO_HARDWARE;
3118*ec779b8eSAndroid Build Coastguard Worker     }
3119*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3120*ec779b8eSAndroid Build Coastguard Worker }
3121*ec779b8eSAndroid Build Coastguard Worker 
3122*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_location_t>
aidl2legacy_MicrophoneInfoLocation_audio_microphone_location_t(MicrophoneInfo::Location aidl)3123*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_MicrophoneInfoLocation_audio_microphone_location_t(MicrophoneInfo::Location aidl) {
3124*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3125*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Location::UNKNOWN:
3126*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_LOCATION_UNKNOWN;
3127*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Location::MAINBODY:
3128*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_LOCATION_MAINBODY;
3129*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Location::MAINBODY_MOVABLE:
3130*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_LOCATION_MAINBODY_MOVABLE;
3131*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Location::PERIPHERAL:
3132*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_LOCATION_PERIPHERAL;
3133*ec779b8eSAndroid Build Coastguard Worker     }
3134*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3135*ec779b8eSAndroid Build Coastguard Worker }
3136*ec779b8eSAndroid Build Coastguard Worker ConversionResult<MicrophoneInfo::Location>
legacy2aidl_audio_microphone_location_t_MicrophoneInfoLocation(audio_microphone_location_t legacy)3137*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_microphone_location_t_MicrophoneInfoLocation(audio_microphone_location_t legacy) {
3138*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3139*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_LOCATION_UNKNOWN:
3140*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Location::UNKNOWN;
3141*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_LOCATION_MAINBODY:
3142*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Location::MAINBODY;
3143*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_LOCATION_MAINBODY_MOVABLE:
3144*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Location::MAINBODY_MOVABLE;
3145*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_LOCATION_PERIPHERAL:
3146*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Location::PERIPHERAL;
3147*ec779b8eSAndroid Build Coastguard Worker     }
3148*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3149*ec779b8eSAndroid Build Coastguard Worker }
3150*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_int32_t_audio_microphone_group_t(int32_t aidl)3151*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_group_t> aidl2legacy_int32_t_audio_microphone_group_t(
3152*ec779b8eSAndroid Build Coastguard Worker         int32_t aidl) {
3153*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<audio_microphone_group_t>(aidl);
3154*ec779b8eSAndroid Build Coastguard Worker }
3155*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_audio_microphone_group_t_int32_t(audio_microphone_group_t legacy)3156*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> legacy2aidl_audio_microphone_group_t_int32_t(
3157*ec779b8eSAndroid Build Coastguard Worker         audio_microphone_group_t legacy) {
3158*ec779b8eSAndroid Build Coastguard Worker     return convertReinterpret<int32_t>(legacy);
3159*ec779b8eSAndroid Build Coastguard Worker }
3160*ec779b8eSAndroid Build Coastguard Worker 
3161*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_directionality_t>
aidl2legacy_MicrophoneInfoDirectionality_audio_microphone_directionality_t(MicrophoneInfo::Directionality aidl)3162*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_MicrophoneInfoDirectionality_audio_microphone_directionality_t(
3163*ec779b8eSAndroid Build Coastguard Worker         MicrophoneInfo::Directionality aidl) {
3164*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3165*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::UNKNOWN:
3166*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_UNKNOWN;
3167*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::OMNI:
3168*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_OMNI;
3169*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::BI_DIRECTIONAL:
3170*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_BI_DIRECTIONAL;
3171*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::CARDIOID:
3172*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_CARDIOID;
3173*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::HYPER_CARDIOID:
3174*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_HYPER_CARDIOID;
3175*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneInfo::Directionality::SUPER_CARDIOID:
3176*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_DIRECTIONALITY_SUPER_CARDIOID;
3177*ec779b8eSAndroid Build Coastguard Worker     }
3178*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3179*ec779b8eSAndroid Build Coastguard Worker }
3180*ec779b8eSAndroid Build Coastguard Worker ConversionResult<MicrophoneInfo::Directionality>
legacy2aidl_audio_microphone_directionality_t_MicrophoneInfoDirectionality(audio_microphone_directionality_t legacy)3181*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_microphone_directionality_t_MicrophoneInfoDirectionality(
3182*ec779b8eSAndroid Build Coastguard Worker         audio_microphone_directionality_t legacy) {
3183*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3184*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_UNKNOWN:
3185*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::UNKNOWN;
3186*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_OMNI:
3187*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::OMNI;
3188*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_BI_DIRECTIONAL:
3189*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::BI_DIRECTIONAL;
3190*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_CARDIOID:
3191*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::CARDIOID;
3192*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_HYPER_CARDIOID:
3193*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::HYPER_CARDIOID;
3194*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_DIRECTIONALITY_SUPER_CARDIOID:
3195*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneInfo::Directionality::SUPER_CARDIOID;
3196*ec779b8eSAndroid Build Coastguard Worker     }
3197*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3198*ec779b8eSAndroid Build Coastguard Worker }
3199*ec779b8eSAndroid Build Coastguard Worker 
3200*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_coordinate>
aidl2legacy_MicrophoneInfoCoordinate_audio_microphone_coordinate(const MicrophoneInfo::Coordinate & aidl)3201*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_MicrophoneInfoCoordinate_audio_microphone_coordinate(
3202*ec779b8eSAndroid Build Coastguard Worker         const MicrophoneInfo::Coordinate& aidl) {
3203*ec779b8eSAndroid Build Coastguard Worker     audio_microphone_coordinate legacy;
3204*ec779b8eSAndroid Build Coastguard Worker     legacy.x = aidl.x;
3205*ec779b8eSAndroid Build Coastguard Worker     legacy.y = aidl.y;
3206*ec779b8eSAndroid Build Coastguard Worker     legacy.z = aidl.z;
3207*ec779b8eSAndroid Build Coastguard Worker     return legacy;
3208*ec779b8eSAndroid Build Coastguard Worker }
3209*ec779b8eSAndroid Build Coastguard Worker ConversionResult<MicrophoneInfo::Coordinate>
legacy2aidl_audio_microphone_coordinate_MicrophoneInfoCoordinate(const audio_microphone_coordinate & legacy)3210*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_microphone_coordinate_MicrophoneInfoCoordinate(
3211*ec779b8eSAndroid Build Coastguard Worker         const audio_microphone_coordinate& legacy) {
3212*ec779b8eSAndroid Build Coastguard Worker     MicrophoneInfo::Coordinate aidl;
3213*ec779b8eSAndroid Build Coastguard Worker     aidl.x = legacy.x;
3214*ec779b8eSAndroid Build Coastguard Worker     aidl.y = legacy.y;
3215*ec779b8eSAndroid Build Coastguard Worker     aidl.z = legacy.z;
3216*ec779b8eSAndroid Build Coastguard Worker     return aidl;
3217*ec779b8eSAndroid Build Coastguard Worker }
3218*ec779b8eSAndroid Build Coastguard Worker 
3219*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_channel_mapping_t>
aidl2legacy_MicrophoneDynamicInfoChannelMapping_audio_microphone_channel_mapping_t(MicrophoneDynamicInfo::ChannelMapping aidl)3220*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_MicrophoneDynamicInfoChannelMapping_audio_microphone_channel_mapping_t(
3221*ec779b8eSAndroid Build Coastguard Worker         MicrophoneDynamicInfo::ChannelMapping aidl) {
3222*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
3223*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneDynamicInfo::ChannelMapping::UNUSED:
3224*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED;
3225*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneDynamicInfo::ChannelMapping::DIRECT:
3226*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_CHANNEL_MAPPING_DIRECT;
3227*ec779b8eSAndroid Build Coastguard Worker         case MicrophoneDynamicInfo::ChannelMapping::PROCESSED:
3228*ec779b8eSAndroid Build Coastguard Worker             return AUDIO_MICROPHONE_CHANNEL_MAPPING_PROCESSED;
3229*ec779b8eSAndroid Build Coastguard Worker     }
3230*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3231*ec779b8eSAndroid Build Coastguard Worker }
3232*ec779b8eSAndroid Build Coastguard Worker ConversionResult<MicrophoneDynamicInfo::ChannelMapping>
legacy2aidl_audio_microphone_channel_mapping_t_MicrophoneDynamicInfoChannelMapping(audio_microphone_channel_mapping_t legacy)3233*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_microphone_channel_mapping_t_MicrophoneDynamicInfoChannelMapping(
3234*ec779b8eSAndroid Build Coastguard Worker         audio_microphone_channel_mapping_t legacy) {
3235*ec779b8eSAndroid Build Coastguard Worker     switch (legacy) {
3236*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED:
3237*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneDynamicInfo::ChannelMapping::UNUSED;
3238*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_CHANNEL_MAPPING_DIRECT:
3239*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneDynamicInfo::ChannelMapping::DIRECT;
3240*ec779b8eSAndroid Build Coastguard Worker         case AUDIO_MICROPHONE_CHANNEL_MAPPING_PROCESSED:
3241*ec779b8eSAndroid Build Coastguard Worker             return MicrophoneDynamicInfo::ChannelMapping::PROCESSED;
3242*ec779b8eSAndroid Build Coastguard Worker     }
3243*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
3244*ec779b8eSAndroid Build Coastguard Worker }
3245*ec779b8eSAndroid Build Coastguard Worker 
3246*ec779b8eSAndroid Build Coastguard Worker ConversionResult<audio_microphone_characteristic_t>
aidl2legacy_MicrophoneInfos_audio_microphone_characteristic_t(const MicrophoneInfo & aidlInfo,const MicrophoneDynamicInfo & aidlDynamic)3247*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_MicrophoneInfos_audio_microphone_characteristic_t(
3248*ec779b8eSAndroid Build Coastguard Worker         const MicrophoneInfo& aidlInfo, const MicrophoneDynamicInfo& aidlDynamic) {
3249*ec779b8eSAndroid Build Coastguard Worker     static const audio_microphone_coordinate kCoordinateUnknown = {
3250*ec779b8eSAndroid Build Coastguard Worker         AUDIO_MICROPHONE_COORDINATE_UNKNOWN, AUDIO_MICROPHONE_COORDINATE_UNKNOWN,
3251*ec779b8eSAndroid Build Coastguard Worker         AUDIO_MICROPHONE_COORDINATE_UNKNOWN };
3252*ec779b8eSAndroid Build Coastguard Worker     audio_microphone_characteristic_t legacy{};
3253*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.id != aidlDynamic.id) {
3254*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
3255*ec779b8eSAndroid Build Coastguard Worker     }
3256*ec779b8eSAndroid Build Coastguard Worker     // Note: in the legacy structure, 'device_id' is the mic's ID, 'id' is APM port id.
3257*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_string(aidlInfo.id, legacy.device_id, AUDIO_MICROPHONE_ID_MAX_LEN));
3258*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_AudioDevice_audio_device(
3259*ec779b8eSAndroid Build Coastguard Worker                     aidlInfo.device, &legacy.device, legacy.address));
3260*ec779b8eSAndroid Build Coastguard Worker     legacy.location = VALUE_OR_RETURN(
3261*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_MicrophoneInfoLocation_audio_microphone_location_t(aidlInfo.location));
3262*ec779b8eSAndroid Build Coastguard Worker     legacy.group = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_microphone_group_t(aidlInfo.group));
3263*ec779b8eSAndroid Build Coastguard Worker     // For some reason, the legacy field is unsigned, however in the SDK layer it is signed,
3264*ec779b8eSAndroid Build Coastguard Worker     // as it is in AIDL. So, use UINT_MAX for INDEX_IN_THE_GROUP_UNKNOWN which is -1.
3265*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.indexInTheGroup != MicrophoneInfo::INDEX_IN_THE_GROUP_UNKNOWN) {
3266*ec779b8eSAndroid Build Coastguard Worker         legacy.index_in_the_group = VALUE_OR_RETURN(
3267*ec779b8eSAndroid Build Coastguard Worker                 convertReinterpret<unsigned int>(aidlInfo.indexInTheGroup));
3268*ec779b8eSAndroid Build Coastguard Worker     } else {
3269*ec779b8eSAndroid Build Coastguard Worker         legacy.index_in_the_group = UINT_MAX;
3270*ec779b8eSAndroid Build Coastguard Worker     }
3271*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.sensitivity.has_value()) {
3272*ec779b8eSAndroid Build Coastguard Worker         legacy.sensitivity = aidlInfo.sensitivity.value().leveldBFS;
3273*ec779b8eSAndroid Build Coastguard Worker         legacy.max_spl = aidlInfo.sensitivity.value().maxSpldB;
3274*ec779b8eSAndroid Build Coastguard Worker         legacy.min_spl = aidlInfo.sensitivity.value().minSpldB;
3275*ec779b8eSAndroid Build Coastguard Worker     } else {
3276*ec779b8eSAndroid Build Coastguard Worker         legacy.sensitivity = AUDIO_MICROPHONE_SENSITIVITY_UNKNOWN;
3277*ec779b8eSAndroid Build Coastguard Worker         legacy.max_spl = AUDIO_MICROPHONE_SPL_UNKNOWN;
3278*ec779b8eSAndroid Build Coastguard Worker         legacy.min_spl = AUDIO_MICROPHONE_SPL_UNKNOWN;
3279*ec779b8eSAndroid Build Coastguard Worker     }
3280*ec779b8eSAndroid Build Coastguard Worker     legacy.directionality = VALUE_OR_RETURN(
3281*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_MicrophoneInfoDirectionality_audio_microphone_directionality_t(
3282*ec779b8eSAndroid Build Coastguard Worker                     aidlInfo.directionality));
3283*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.frequencyResponse.size() > AUDIO_MICROPHONE_MAX_FREQUENCY_RESPONSES) {
3284*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
3285*ec779b8eSAndroid Build Coastguard Worker     }
3286*ec779b8eSAndroid Build Coastguard Worker     legacy.num_frequency_responses = 0;
3287*ec779b8eSAndroid Build Coastguard Worker     for (const auto& p: aidlInfo.frequencyResponse) {
3288*ec779b8eSAndroid Build Coastguard Worker         legacy.frequency_responses[0][legacy.num_frequency_responses] = p.frequencyHz;
3289*ec779b8eSAndroid Build Coastguard Worker         legacy.frequency_responses[1][legacy.num_frequency_responses++] = p.leveldB;
3290*ec779b8eSAndroid Build Coastguard Worker     }
3291*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.position.has_value()) {
3292*ec779b8eSAndroid Build Coastguard Worker         legacy.geometric_location = VALUE_OR_RETURN(
3293*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_MicrophoneInfoCoordinate_audio_microphone_coordinate(
3294*ec779b8eSAndroid Build Coastguard Worker                         aidlInfo.position.value()));
3295*ec779b8eSAndroid Build Coastguard Worker     } else {
3296*ec779b8eSAndroid Build Coastguard Worker         legacy.geometric_location = kCoordinateUnknown;
3297*ec779b8eSAndroid Build Coastguard Worker     }
3298*ec779b8eSAndroid Build Coastguard Worker     if (aidlInfo.orientation.has_value()) {
3299*ec779b8eSAndroid Build Coastguard Worker         legacy.orientation = VALUE_OR_RETURN(
3300*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_MicrophoneInfoCoordinate_audio_microphone_coordinate(
3301*ec779b8eSAndroid Build Coastguard Worker                         aidlInfo.orientation.value()));
3302*ec779b8eSAndroid Build Coastguard Worker     } else {
3303*ec779b8eSAndroid Build Coastguard Worker         legacy.orientation = kCoordinateUnknown;
3304*ec779b8eSAndroid Build Coastguard Worker     }
3305*ec779b8eSAndroid Build Coastguard Worker     if (aidlDynamic.channelMapping.size() > AUDIO_CHANNEL_COUNT_MAX) {
3306*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
3307*ec779b8eSAndroid Build Coastguard Worker     }
3308*ec779b8eSAndroid Build Coastguard Worker     size_t i = 0;
3309*ec779b8eSAndroid Build Coastguard Worker     for (; i < aidlDynamic.channelMapping.size(); ++i) {
3310*ec779b8eSAndroid Build Coastguard Worker         legacy.channel_mapping[i] = VALUE_OR_RETURN(
3311*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_MicrophoneDynamicInfoChannelMapping_audio_microphone_channel_mapping_t(
3312*ec779b8eSAndroid Build Coastguard Worker                         aidlDynamic.channelMapping[i]));
3313*ec779b8eSAndroid Build Coastguard Worker     }
3314*ec779b8eSAndroid Build Coastguard Worker     for (; i < AUDIO_CHANNEL_COUNT_MAX; ++i) {
3315*ec779b8eSAndroid Build Coastguard Worker         legacy.channel_mapping[i] = AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED;
3316*ec779b8eSAndroid Build Coastguard Worker     }
3317*ec779b8eSAndroid Build Coastguard Worker     return legacy;
3318*ec779b8eSAndroid Build Coastguard Worker }
3319*ec779b8eSAndroid Build Coastguard Worker 
3320*ec779b8eSAndroid Build Coastguard Worker status_t
legacy2aidl_audio_microphone_characteristic_t_MicrophoneInfos(const audio_microphone_characteristic_t & legacy,MicrophoneInfo * aidlInfo,MicrophoneDynamicInfo * aidlDynamic)3321*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_audio_microphone_characteristic_t_MicrophoneInfos(
3322*ec779b8eSAndroid Build Coastguard Worker         const audio_microphone_characteristic_t& legacy,
3323*ec779b8eSAndroid Build Coastguard Worker         MicrophoneInfo* aidlInfo, MicrophoneDynamicInfo* aidlDynamic) {
3324*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->id = VALUE_OR_RETURN_STATUS(
3325*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_string(legacy.device_id, AUDIO_MICROPHONE_ID_MAX_LEN));
3326*ec779b8eSAndroid Build Coastguard Worker     aidlDynamic->id = aidlInfo->id;
3327*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->device = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_device_AudioDevice(
3328*ec779b8eSAndroid Build Coastguard Worker                     legacy.device, legacy.address));
3329*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->location = VALUE_OR_RETURN_STATUS(
3330*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_microphone_location_t_MicrophoneInfoLocation(legacy.location));
3331*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->group = VALUE_OR_RETURN_STATUS(
3332*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_microphone_group_t_int32_t(legacy.group));
3333*ec779b8eSAndroid Build Coastguard Worker     // For some reason, the legacy field is unsigned, however in the SDK layer it is signed,
3334*ec779b8eSAndroid Build Coastguard Worker     // as it is in AIDL. So, use UINT_MAX for INDEX_IN_THE_GROUP_UNKNOWN which is -1.
3335*ec779b8eSAndroid Build Coastguard Worker     if (legacy.index_in_the_group != UINT_MAX) {
3336*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->indexInTheGroup = VALUE_OR_RETURN_STATUS(
3337*ec779b8eSAndroid Build Coastguard Worker                 convertReinterpret<int32_t>(legacy.index_in_the_group));
3338*ec779b8eSAndroid Build Coastguard Worker     } else {
3339*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->indexInTheGroup = MicrophoneInfo::INDEX_IN_THE_GROUP_UNKNOWN;
3340*ec779b8eSAndroid Build Coastguard Worker     }
3341*ec779b8eSAndroid Build Coastguard Worker     if (legacy.sensitivity != AUDIO_MICROPHONE_SENSITIVITY_UNKNOWN &&
3342*ec779b8eSAndroid Build Coastguard Worker             legacy.max_spl != AUDIO_MICROPHONE_SPL_UNKNOWN &&
3343*ec779b8eSAndroid Build Coastguard Worker             legacy.min_spl != AUDIO_MICROPHONE_SPL_UNKNOWN) {
3344*ec779b8eSAndroid Build Coastguard Worker         MicrophoneInfo::Sensitivity sensitivity;
3345*ec779b8eSAndroid Build Coastguard Worker         sensitivity.leveldBFS = legacy.sensitivity;
3346*ec779b8eSAndroid Build Coastguard Worker         sensitivity.maxSpldB = legacy.max_spl;
3347*ec779b8eSAndroid Build Coastguard Worker         sensitivity.minSpldB = legacy.min_spl;
3348*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->sensitivity = std::move(sensitivity);
3349*ec779b8eSAndroid Build Coastguard Worker     } else {
3350*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->sensitivity = {};
3351*ec779b8eSAndroid Build Coastguard Worker     }
3352*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->directionality = VALUE_OR_RETURN_STATUS(
3353*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_microphone_directionality_t_MicrophoneInfoDirectionality(
3354*ec779b8eSAndroid Build Coastguard Worker                     legacy.directionality));
3355*ec779b8eSAndroid Build Coastguard Worker     if (legacy.num_frequency_responses > AUDIO_MICROPHONE_MAX_FREQUENCY_RESPONSES) {
3356*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
3357*ec779b8eSAndroid Build Coastguard Worker     }
3358*ec779b8eSAndroid Build Coastguard Worker     aidlInfo->frequencyResponse.resize(legacy.num_frequency_responses);
3359*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < legacy.num_frequency_responses; ++i) {
3360*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->frequencyResponse[i].frequencyHz = legacy.frequency_responses[0][i];
3361*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->frequencyResponse[i].leveldB = legacy.frequency_responses[1][i];
3362*ec779b8eSAndroid Build Coastguard Worker     }
3363*ec779b8eSAndroid Build Coastguard Worker     if (legacy.geometric_location.x != AUDIO_MICROPHONE_COORDINATE_UNKNOWN &&
3364*ec779b8eSAndroid Build Coastguard Worker             legacy.geometric_location.y != AUDIO_MICROPHONE_COORDINATE_UNKNOWN &&
3365*ec779b8eSAndroid Build Coastguard Worker             legacy.geometric_location.z != AUDIO_MICROPHONE_COORDINATE_UNKNOWN) {
3366*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->position = VALUE_OR_RETURN_STATUS(
3367*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_microphone_coordinate_MicrophoneInfoCoordinate(
3368*ec779b8eSAndroid Build Coastguard Worker                         legacy.geometric_location));
3369*ec779b8eSAndroid Build Coastguard Worker     } else {
3370*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->position = {};
3371*ec779b8eSAndroid Build Coastguard Worker     }
3372*ec779b8eSAndroid Build Coastguard Worker     if (legacy.orientation.x != AUDIO_MICROPHONE_COORDINATE_UNKNOWN &&
3373*ec779b8eSAndroid Build Coastguard Worker             legacy.orientation.y != AUDIO_MICROPHONE_COORDINATE_UNKNOWN &&
3374*ec779b8eSAndroid Build Coastguard Worker             legacy.orientation.z != AUDIO_MICROPHONE_COORDINATE_UNKNOWN) {
3375*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->orientation = VALUE_OR_RETURN_STATUS(
3376*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_microphone_coordinate_MicrophoneInfoCoordinate(
3377*ec779b8eSAndroid Build Coastguard Worker                         legacy.orientation));
3378*ec779b8eSAndroid Build Coastguard Worker     } else {
3379*ec779b8eSAndroid Build Coastguard Worker         aidlInfo->orientation = {};
3380*ec779b8eSAndroid Build Coastguard Worker     }
3381*ec779b8eSAndroid Build Coastguard Worker     size_t channelsUsed = AUDIO_CHANNEL_COUNT_MAX;
3382*ec779b8eSAndroid Build Coastguard Worker     while (channelsUsed != 0 &&
3383*ec779b8eSAndroid Build Coastguard Worker             legacy.channel_mapping[--channelsUsed] == AUDIO_MICROPHONE_CHANNEL_MAPPING_UNUSED) {}
3384*ec779b8eSAndroid Build Coastguard Worker     // Doing an increment is correct even when channel 0 is 'UNUSED',
3385*ec779b8eSAndroid Build Coastguard Worker     // that's because AIDL requires to have at least 1 element in the mapping.
3386*ec779b8eSAndroid Build Coastguard Worker     ++channelsUsed;
3387*ec779b8eSAndroid Build Coastguard Worker     aidlDynamic->channelMapping.resize(channelsUsed);
3388*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < channelsUsed; ++i) {
3389*ec779b8eSAndroid Build Coastguard Worker         aidlDynamic->channelMapping[i] = VALUE_OR_RETURN_STATUS(
3390*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_microphone_channel_mapping_t_MicrophoneDynamicInfoChannelMapping(
3391*ec779b8eSAndroid Build Coastguard Worker                         legacy.channel_mapping[i]));
3392*ec779b8eSAndroid Build Coastguard Worker     }
3393*ec779b8eSAndroid Build Coastguard Worker     return OK;
3394*ec779b8eSAndroid Build Coastguard Worker }
3395*ec779b8eSAndroid Build Coastguard Worker 
3396*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
3397*ec779b8eSAndroid Build Coastguard Worker 
3398*ec779b8eSAndroid Build Coastguard Worker #undef GET_DEVICE_DESC_CONNECTION
3399*ec779b8eSAndroid Build Coastguard Worker 
3400*ec779b8eSAndroid Build Coastguard Worker #if defined(BACKEND_NDK)
3401*ec779b8eSAndroid Build Coastguard Worker }  // aidl
3402*ec779b8eSAndroid Build Coastguard Worker #endif
3403