xref: /aosp_15_r20/frameworks/av/media/audioaidlconversion/AidlConversionEffect.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 <cstdint>
18*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
19*ec779b8eSAndroid Build Coastguard Worker #include <utility>
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AidlConversionEffect"
22*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/DefaultExtension.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/audio/effect/VendorExtension.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionCppNdk.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionEffect.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////
31*ec779b8eSAndroid Build Coastguard Worker // AIDL NDK backend to legacy audio data structure conversion utilities.
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
34*ec779b8eSAndroid Build Coastguard Worker namespace android {
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::AcousticEchoCanceler;
37*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::AutomaticGainControlV2;
38*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::BassBoost;
39*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::DefaultExtension;
40*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::Descriptor;
41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::Downmix;
42*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::DynamicsProcessing;
43*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::Flags;
44*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::Parameter;
45*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::PresetReverb;
46*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::VendorExtension;
47*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::audio::effect::Visualizer;
48*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::audio::common::AudioDeviceDescription;
49*ec779b8eSAndroid Build Coastguard Worker 
50*ec779b8eSAndroid Build Coastguard Worker using ::android::BAD_VALUE;
51*ec779b8eSAndroid Build Coastguard Worker using ::android::OK;
52*ec779b8eSAndroid Build Coastguard Worker using ::android::status_t;
53*ec779b8eSAndroid Build Coastguard Worker using ::android::base::unexpected;
54*ec779b8eSAndroid Build Coastguard Worker using ::android::effect::utils::EffectParamReader;
55*ec779b8eSAndroid Build Coastguard Worker using ::android::effect::utils::EffectParamWrapper;
56*ec779b8eSAndroid Build Coastguard Worker using ::android::effect::utils::EffectParamWriter;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////////////////////////
59*ec779b8eSAndroid Build Coastguard Worker // Converters
60*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Flags_Type_uint32(Flags::Type type)61*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Flags_Type_uint32(Flags::Type type) {
62*ec779b8eSAndroid Build Coastguard Worker     switch (type) {
63*ec779b8eSAndroid Build Coastguard Worker         case Flags::Type::INSERT:
64*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_TYPE_INSERT;
65*ec779b8eSAndroid Build Coastguard Worker         case Flags::Type::AUXILIARY:
66*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_TYPE_AUXILIARY;
67*ec779b8eSAndroid Build Coastguard Worker         case Flags::Type::REPLACE:
68*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_TYPE_REPLACE;
69*ec779b8eSAndroid Build Coastguard Worker         case Flags::Type::PRE_PROC:
70*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_TYPE_PRE_PROC;
71*ec779b8eSAndroid Build Coastguard Worker         case Flags::Type::POST_PROC:
72*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_TYPE_POST_PROC;
73*ec779b8eSAndroid Build Coastguard Worker     }
74*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
75*ec779b8eSAndroid Build Coastguard Worker }
76*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_Flags_Type(uint32_t legacy)77*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Flags::Type> legacy2aidl_uint32_Flags_Type(uint32_t legacy) {
78*ec779b8eSAndroid Build Coastguard Worker     switch (legacy & EFFECT_FLAG_TYPE_MASK) {
79*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_TYPE_INSERT:
80*ec779b8eSAndroid Build Coastguard Worker             return Flags::Type::INSERT;
81*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_TYPE_AUXILIARY:
82*ec779b8eSAndroid Build Coastguard Worker             return Flags::Type::AUXILIARY;
83*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_TYPE_REPLACE:
84*ec779b8eSAndroid Build Coastguard Worker             return Flags::Type::REPLACE;
85*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_TYPE_PRE_PROC:
86*ec779b8eSAndroid Build Coastguard Worker             return Flags::Type::PRE_PROC;
87*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_TYPE_POST_PROC:
88*ec779b8eSAndroid Build Coastguard Worker             return Flags::Type::POST_PROC;
89*ec779b8eSAndroid Build Coastguard Worker     }
90*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
91*ec779b8eSAndroid Build Coastguard Worker }
92*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Flags_Insert_uint32(Flags::Insert insert)93*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Flags_Insert_uint32(Flags::Insert insert) {
94*ec779b8eSAndroid Build Coastguard Worker     switch (insert) {
95*ec779b8eSAndroid Build Coastguard Worker         case Flags::Insert::ANY:
96*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_INSERT_ANY;
97*ec779b8eSAndroid Build Coastguard Worker         case Flags::Insert::FIRST:
98*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_INSERT_FIRST;
99*ec779b8eSAndroid Build Coastguard Worker         case Flags::Insert::LAST:
100*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_INSERT_LAST;
101*ec779b8eSAndroid Build Coastguard Worker         case Flags::Insert::EXCLUSIVE:
102*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_INSERT_EXCLUSIVE;
103*ec779b8eSAndroid Build Coastguard Worker     }
104*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
105*ec779b8eSAndroid Build Coastguard Worker }
106*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_Flags_Insert(uint32_t legacy)107*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Flags::Insert> legacy2aidl_uint32_Flags_Insert(uint32_t legacy) {
108*ec779b8eSAndroid Build Coastguard Worker     switch (legacy & EFFECT_FLAG_INSERT_MASK) {
109*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_INSERT_ANY:
110*ec779b8eSAndroid Build Coastguard Worker             return Flags::Insert::ANY;
111*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_INSERT_FIRST:
112*ec779b8eSAndroid Build Coastguard Worker             return Flags::Insert::FIRST;
113*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_INSERT_LAST:
114*ec779b8eSAndroid Build Coastguard Worker             return Flags::Insert::LAST;
115*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_INSERT_EXCLUSIVE:
116*ec779b8eSAndroid Build Coastguard Worker             return Flags::Insert::EXCLUSIVE;
117*ec779b8eSAndroid Build Coastguard Worker     }
118*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
119*ec779b8eSAndroid Build Coastguard Worker }
120*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Flags_Volume_uint32(Flags::Volume volume)121*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Flags_Volume_uint32(Flags::Volume volume) {
122*ec779b8eSAndroid Build Coastguard Worker     switch (volume) {
123*ec779b8eSAndroid Build Coastguard Worker         case Flags::Volume::NONE:
124*ec779b8eSAndroid Build Coastguard Worker             return 0;
125*ec779b8eSAndroid Build Coastguard Worker         case Flags::Volume::CTRL:
126*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_VOLUME_CTRL;
127*ec779b8eSAndroid Build Coastguard Worker         case Flags::Volume::IND:
128*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_VOLUME_IND;
129*ec779b8eSAndroid Build Coastguard Worker         case Flags::Volume::MONITOR:
130*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_VOLUME_MONITOR;
131*ec779b8eSAndroid Build Coastguard Worker     }
132*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
133*ec779b8eSAndroid Build Coastguard Worker }
134*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_Flags_Volume(uint32_t legacy)135*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Flags::Volume> legacy2aidl_uint32_Flags_Volume(uint32_t legacy) {
136*ec779b8eSAndroid Build Coastguard Worker     switch (legacy & EFFECT_FLAG_VOLUME_MASK) {
137*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_VOLUME_CTRL:
138*ec779b8eSAndroid Build Coastguard Worker             return Flags::Volume::CTRL;
139*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_VOLUME_IND:
140*ec779b8eSAndroid Build Coastguard Worker             return Flags::Volume::IND;
141*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_VOLUME_MONITOR:
142*ec779b8eSAndroid Build Coastguard Worker             return Flags::Volume::MONITOR;
143*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_VOLUME_NONE:
144*ec779b8eSAndroid Build Coastguard Worker             return Flags::Volume::NONE;
145*ec779b8eSAndroid Build Coastguard Worker     }
146*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Flags_uint32(Flags aidl)149*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Flags_uint32(Flags aidl) {
150*ec779b8eSAndroid Build Coastguard Worker     uint32_t legacy = 0;
151*ec779b8eSAndroid Build Coastguard Worker     legacy |= VALUE_OR_RETURN(aidl2legacy_Flags_Type_uint32(aidl.type));
152*ec779b8eSAndroid Build Coastguard Worker     legacy |= VALUE_OR_RETURN(aidl2legacy_Flags_Insert_uint32(aidl.insert));
153*ec779b8eSAndroid Build Coastguard Worker     legacy |= VALUE_OR_RETURN(aidl2legacy_Flags_Volume_uint32(aidl.volume));
154*ec779b8eSAndroid Build Coastguard Worker     legacy |= VALUE_OR_RETURN(aidl2legacy_Flags_HardwareAccelerator_uint32(aidl.hwAcceleratorMode));
155*ec779b8eSAndroid Build Coastguard Worker 
156*ec779b8eSAndroid Build Coastguard Worker     if (aidl.offloadIndication) {
157*ec779b8eSAndroid Build Coastguard Worker         legacy |= EFFECT_FLAG_OFFLOAD_SUPPORTED;
158*ec779b8eSAndroid Build Coastguard Worker     }
159*ec779b8eSAndroid Build Coastguard Worker     if (aidl.deviceIndication) {
160*ec779b8eSAndroid Build Coastguard Worker         legacy |= EFFECT_FLAG_DEVICE_IND;
161*ec779b8eSAndroid Build Coastguard Worker     }
162*ec779b8eSAndroid Build Coastguard Worker     if (aidl.audioModeIndication) {
163*ec779b8eSAndroid Build Coastguard Worker         legacy |= EFFECT_FLAG_AUDIO_MODE_IND;
164*ec779b8eSAndroid Build Coastguard Worker     }
165*ec779b8eSAndroid Build Coastguard Worker     if (aidl.audioSourceIndication) {
166*ec779b8eSAndroid Build Coastguard Worker         legacy |= EFFECT_FLAG_AUDIO_SOURCE_IND;
167*ec779b8eSAndroid Build Coastguard Worker     }
168*ec779b8eSAndroid Build Coastguard Worker     if (aidl.bypass) {
169*ec779b8eSAndroid Build Coastguard Worker         legacy |= EFFECT_FLAG_NO_PROCESS;
170*ec779b8eSAndroid Build Coastguard Worker     }
171*ec779b8eSAndroid Build Coastguard Worker     return legacy;
172*ec779b8eSAndroid Build Coastguard Worker }
173*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_Flags(uint32_t legacy)174*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Flags> legacy2aidl_uint32_Flags(uint32_t legacy) {
175*ec779b8eSAndroid Build Coastguard Worker     Flags aidl;
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker     aidl.type = VALUE_OR_RETURN(legacy2aidl_uint32_Flags_Type(legacy));
178*ec779b8eSAndroid Build Coastguard Worker     aidl.insert = VALUE_OR_RETURN(legacy2aidl_uint32_Flags_Insert(legacy));
179*ec779b8eSAndroid Build Coastguard Worker     aidl.volume = VALUE_OR_RETURN(legacy2aidl_uint32_Flags_Volume(legacy));
180*ec779b8eSAndroid Build Coastguard Worker     aidl.hwAcceleratorMode = VALUE_OR_RETURN(legacy2aidl_uint32_Flags_HardwareAccelerator(legacy));
181*ec779b8eSAndroid Build Coastguard Worker     aidl.offloadIndication = (legacy & EFFECT_FLAG_OFFLOAD_SUPPORTED);
182*ec779b8eSAndroid Build Coastguard Worker     aidl.deviceIndication = (legacy & EFFECT_FLAG_DEVICE_IND);
183*ec779b8eSAndroid Build Coastguard Worker     aidl.audioModeIndication = (legacy & EFFECT_FLAG_AUDIO_MODE_IND);
184*ec779b8eSAndroid Build Coastguard Worker     aidl.audioSourceIndication = (legacy & EFFECT_FLAG_AUDIO_SOURCE_IND);
185*ec779b8eSAndroid Build Coastguard Worker     aidl.bypass = (legacy & EFFECT_FLAG_NO_PROCESS);
186*ec779b8eSAndroid Build Coastguard Worker     return aidl;
187*ec779b8eSAndroid Build Coastguard Worker }
188*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Flags_HardwareAccelerator_uint32(Flags::HardwareAccelerator hwAcceleratorMode)189*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Flags_HardwareAccelerator_uint32(
190*ec779b8eSAndroid Build Coastguard Worker         Flags::HardwareAccelerator hwAcceleratorMode) {
191*ec779b8eSAndroid Build Coastguard Worker     switch (hwAcceleratorMode) {
192*ec779b8eSAndroid Build Coastguard Worker         case Flags::HardwareAccelerator::NONE:
193*ec779b8eSAndroid Build Coastguard Worker             return 0;
194*ec779b8eSAndroid Build Coastguard Worker         case Flags::HardwareAccelerator::SIMPLE:
195*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_HW_ACC_SIMPLE;
196*ec779b8eSAndroid Build Coastguard Worker         case Flags::HardwareAccelerator::TUNNEL:
197*ec779b8eSAndroid Build Coastguard Worker             return EFFECT_FLAG_HW_ACC_TUNNEL;
198*ec779b8eSAndroid Build Coastguard Worker     }
199*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
200*ec779b8eSAndroid Build Coastguard Worker }
201*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_Flags_HardwareAccelerator(uint32_t legacy)202*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Flags::HardwareAccelerator> legacy2aidl_uint32_Flags_HardwareAccelerator(
203*ec779b8eSAndroid Build Coastguard Worker         uint32_t legacy) {
204*ec779b8eSAndroid Build Coastguard Worker     switch (legacy & EFFECT_FLAG_HW_ACC_MASK) {
205*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_HW_ACC_SIMPLE:
206*ec779b8eSAndroid Build Coastguard Worker             return Flags::HardwareAccelerator::SIMPLE;
207*ec779b8eSAndroid Build Coastguard Worker         case EFFECT_FLAG_HW_ACC_TUNNEL:
208*ec779b8eSAndroid Build Coastguard Worker             return Flags::HardwareAccelerator::TUNNEL;
209*ec779b8eSAndroid Build Coastguard Worker         case 0:
210*ec779b8eSAndroid Build Coastguard Worker             return Flags::HardwareAccelerator::NONE;
211*ec779b8eSAndroid Build Coastguard Worker     }
212*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
213*ec779b8eSAndroid Build Coastguard Worker }
214*ec779b8eSAndroid Build Coastguard Worker 
215*ec779b8eSAndroid Build Coastguard Worker ConversionResult<effect_descriptor_t>
aidl2legacy_Descriptor_effect_descriptor(const Descriptor & aidl)216*ec779b8eSAndroid Build Coastguard Worker aidl2legacy_Descriptor_effect_descriptor(const Descriptor& aidl) {
217*ec779b8eSAndroid Build Coastguard Worker     effect_descriptor_t legacy;
218*ec779b8eSAndroid Build Coastguard Worker     legacy.type = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.common.id.type));
219*ec779b8eSAndroid Build Coastguard Worker     legacy.uuid = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.common.id.uuid));
220*ec779b8eSAndroid Build Coastguard Worker     // legacy descriptor doesn't have proxy information
221*ec779b8eSAndroid Build Coastguard Worker     // proxy = VALUE_OR_RETURN(aidl2legacy_AudioUuid_audio_uuid_t(aidl.proxy));
222*ec779b8eSAndroid Build Coastguard Worker     legacy.apiVersion = EFFECT_CONTROL_API_VERSION;
223*ec779b8eSAndroid Build Coastguard Worker     legacy.flags = VALUE_OR_RETURN(aidl2legacy_Flags_uint32(aidl.common.flags));
224*ec779b8eSAndroid Build Coastguard Worker     legacy.cpuLoad = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.common.cpuLoad));
225*ec779b8eSAndroid Build Coastguard Worker     legacy.memoryUsage = VALUE_OR_RETURN(convertIntegral<uint16_t>(aidl.common.memoryUsage));
226*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_string(aidl.common.name, legacy.name, sizeof(legacy.name)));
227*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(aidl2legacy_string(aidl.common.implementor, legacy.implementor,
228*ec779b8eSAndroid Build Coastguard Worker                                         sizeof(legacy.implementor)));
229*ec779b8eSAndroid Build Coastguard Worker     return legacy;
230*ec779b8eSAndroid Build Coastguard Worker }
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Descriptor>
legacy2aidl_effect_descriptor_Descriptor(const effect_descriptor_t & legacy)233*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_effect_descriptor_Descriptor(const effect_descriptor_t& legacy) {
234*ec779b8eSAndroid Build Coastguard Worker     Descriptor aidl;
235*ec779b8eSAndroid Build Coastguard Worker     aidl.common.id.type = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.type));
236*ec779b8eSAndroid Build Coastguard Worker     aidl.common.id.uuid = VALUE_OR_RETURN(legacy2aidl_audio_uuid_t_AudioUuid(legacy.uuid));
237*ec779b8eSAndroid Build Coastguard Worker     // legacy descriptor doesn't have proxy information
238*ec779b8eSAndroid Build Coastguard Worker     // aidl.common.id.proxy
239*ec779b8eSAndroid Build Coastguard Worker     aidl.common.flags = VALUE_OR_RETURN(legacy2aidl_uint32_Flags(legacy.flags));
240*ec779b8eSAndroid Build Coastguard Worker     aidl.common.cpuLoad = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.cpuLoad));
241*ec779b8eSAndroid Build Coastguard Worker     aidl.common.memoryUsage = VALUE_OR_RETURN(convertIntegral<int32_t>(legacy.memoryUsage));
242*ec779b8eSAndroid Build Coastguard Worker     aidl.common.name = VALUE_OR_RETURN(legacy2aidl_string(legacy.name, sizeof(legacy.name)));
243*ec779b8eSAndroid Build Coastguard Worker     aidl.common.implementor =
244*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN(legacy2aidl_string(legacy.implementor, sizeof(legacy.implementor)));
245*ec779b8eSAndroid Build Coastguard Worker     return aidl;
246*ec779b8eSAndroid Build Coastguard Worker }
247*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_aec_uint32_echoDelay(const Parameter & aidl)248*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_aec_uint32_echoDelay(const Parameter& aidl) {
249*ec779b8eSAndroid Build Coastguard Worker     int echoDelay = VALUE_OR_RETURN(
250*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, AcousticEchoCanceler, acousticEchoCanceler,
251*ec779b8eSAndroid Build Coastguard Worker                                          AcousticEchoCanceler::echoDelayUs, int));
252*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertReinterpret<uint32_t>(echoDelay));
253*ec779b8eSAndroid Build Coastguard Worker }
254*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_echoDelay_Parameter_aec(uint32_t legacy)255*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint32_echoDelay_Parameter_aec(uint32_t legacy) {
256*ec779b8eSAndroid Build Coastguard Worker     int delay = VALUE_OR_RETURN(convertReinterpret<int32_t>(legacy));
257*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(AcousticEchoCanceler, acousticEchoCanceler, echoDelayUs, delay);
258*ec779b8eSAndroid Build Coastguard Worker }
259*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_aec_uint32_mobileMode(const Parameter & aidl)260*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_aec_uint32_mobileMode(const Parameter& aidl) {
261*ec779b8eSAndroid Build Coastguard Worker     bool mobileMode = VALUE_OR_RETURN(
262*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, AcousticEchoCanceler, acousticEchoCanceler,
263*ec779b8eSAndroid Build Coastguard Worker                                          AcousticEchoCanceler::mobileMode, bool));
264*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertIntegral<uint32_t>(mobileMode));
265*ec779b8eSAndroid Build Coastguard Worker }
266*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_mobileMode_Parameter_aec(uint32_t legacy)267*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint32_mobileMode_Parameter_aec(uint32_t legacy) {
268*ec779b8eSAndroid Build Coastguard Worker     bool mode = VALUE_OR_RETURN(convertIntegral<bool>(legacy));
269*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(AcousticEchoCanceler, acousticEchoCanceler, mobileMode, mode);
270*ec779b8eSAndroid Build Coastguard Worker }
271*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_agc_uint32_fixedDigitalGain(const Parameter & aidl)272*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_agc_uint32_fixedDigitalGain(
273*ec779b8eSAndroid Build Coastguard Worker         const Parameter& aidl) {
274*ec779b8eSAndroid Build Coastguard Worker     int gain = VALUE_OR_RETURN(
275*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, AutomaticGainControlV2, automaticGainControlV2,
276*ec779b8eSAndroid Build Coastguard Worker                                          AutomaticGainControlV2::fixedDigitalGainMb, int));
277*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertReinterpret<uint32_t>(gain));
278*ec779b8eSAndroid Build Coastguard Worker }
279*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_fixedDigitalGain_Parameter_agc(uint32_t legacy)280*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint32_fixedDigitalGain_Parameter_agc(uint32_t legacy) {
281*ec779b8eSAndroid Build Coastguard Worker     int gain = VALUE_OR_RETURN(convertReinterpret<int>(legacy));
282*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV2, automaticGainControlV2,
283*ec779b8eSAndroid Build Coastguard Worker                                    fixedDigitalGainMb, gain);
284*ec779b8eSAndroid Build Coastguard Worker }
285*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_agc_uint32_levelEstimator(const Parameter & aidl)286*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_agc_uint32_levelEstimator(
287*ec779b8eSAndroid Build Coastguard Worker         const Parameter& aidl) {
288*ec779b8eSAndroid Build Coastguard Worker     const auto& le = VALUE_OR_RETURN(GET_PARAMETER_SPECIFIC_FIELD(
289*ec779b8eSAndroid Build Coastguard Worker             aidl, AutomaticGainControlV2, automaticGainControlV2,
290*ec779b8eSAndroid Build Coastguard Worker             AutomaticGainControlV2::levelEstimator, AutomaticGainControlV2::LevelEstimator));
291*ec779b8eSAndroid Build Coastguard Worker     return static_cast<uint32_t>(le);
292*ec779b8eSAndroid Build Coastguard Worker }
293*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_levelEstimator_Parameter_agc(uint32_t legacy)294*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint32_levelEstimator_Parameter_agc(uint32_t legacy) {
295*ec779b8eSAndroid Build Coastguard Worker     if (legacy > (uint32_t)AutomaticGainControlV2::LevelEstimator::PEAK) {
296*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
297*ec779b8eSAndroid Build Coastguard Worker     }
298*ec779b8eSAndroid Build Coastguard Worker     AutomaticGainControlV2::LevelEstimator le =
299*ec779b8eSAndroid Build Coastguard Worker             static_cast<AutomaticGainControlV2::LevelEstimator>(legacy);
300*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV2, automaticGainControlV2, levelEstimator,
301*ec779b8eSAndroid Build Coastguard Worker                                    le);
302*ec779b8eSAndroid Build Coastguard Worker }
303*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_agc_uint32_saturationMargin(const Parameter & aidl)304*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_agc_uint32_saturationMargin(
305*ec779b8eSAndroid Build Coastguard Worker         const Parameter& aidl) {
306*ec779b8eSAndroid Build Coastguard Worker     int saturationMargin = VALUE_OR_RETURN(
307*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, AutomaticGainControlV2, automaticGainControlV2,
308*ec779b8eSAndroid Build Coastguard Worker                                          AutomaticGainControlV2::saturationMarginMb, int));
309*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertIntegral<uint32_t>(saturationMargin));
310*ec779b8eSAndroid Build Coastguard Worker }
311*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint32_saturationMargin_Parameter_agc(uint32_t legacy)312*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint32_saturationMargin_Parameter_agc(uint32_t legacy) {
313*ec779b8eSAndroid Build Coastguard Worker     int saturationMargin = VALUE_OR_RETURN(convertIntegral<int>(legacy));
314*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(AutomaticGainControlV2, automaticGainControlV2,
315*ec779b8eSAndroid Build Coastguard Worker                                    saturationMarginMb, saturationMargin);
316*ec779b8eSAndroid Build Coastguard Worker }
317*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_BassBoost_uint16_strengthPm(const Parameter & aidl)318*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint16_t> aidl2legacy_Parameter_BassBoost_uint16_strengthPm(
319*ec779b8eSAndroid Build Coastguard Worker         const Parameter& aidl) {
320*ec779b8eSAndroid Build Coastguard Worker     int strength = VALUE_OR_RETURN(
321*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, BassBoost, bassBoost, BassBoost::strengthPm, int));
322*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertIntegral<uint16_t>(strength));
323*ec779b8eSAndroid Build Coastguard Worker }
324*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_uint16_strengthPm_Parameter_BassBoost(uint16_t legacy)325*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_uint16_strengthPm_Parameter_BassBoost(uint16_t legacy) {
326*ec779b8eSAndroid Build Coastguard Worker     int strength = VALUE_OR_RETURN(convertIntegral<int>(legacy));
327*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(BassBoost, bassBoost, strengthPm, strength);
328*ec779b8eSAndroid Build Coastguard Worker }
329*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_Downmix_int16_type(const Parameter & aidl)330*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int16_t> aidl2legacy_Parameter_Downmix_int16_type(const Parameter& aidl) {
331*ec779b8eSAndroid Build Coastguard Worker     Downmix::Type aidlType = VALUE_OR_RETURN(
332*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, Downmix, downmix, Downmix::type, Downmix::Type));
333*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertIntegral<int16_t>(static_cast<uint32_t>(aidlType)));
334*ec779b8eSAndroid Build Coastguard Worker }
335*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_int16_type_Parameter_Downmix(int16_t legacy)336*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_int16_type_Parameter_Downmix(int16_t legacy) {
337*ec779b8eSAndroid Build Coastguard Worker     if (legacy > (uint32_t) Downmix::Type::FOLD) {
338*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
339*ec779b8eSAndroid Build Coastguard Worker     }
340*ec779b8eSAndroid Build Coastguard Worker     Downmix::Type aidlType = static_cast<Downmix::Type>(legacy);
341*ec779b8eSAndroid Build Coastguard Worker     return MAKE_SPECIFIC_PARAMETER(Downmix, downmix, type, aidlType);
342*ec779b8eSAndroid Build Coastguard Worker }
343*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_DynamicsProcessing_ResolutionPreference_uint32_(const Parameter & aidl)344*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int16_t> aidl2legacy_DynamicsProcessing_ResolutionPreference_uint32_(
345*ec779b8eSAndroid Build Coastguard Worker         const Parameter& aidl) {
346*ec779b8eSAndroid Build Coastguard Worker     Downmix::Type aidlType = VALUE_OR_RETURN(
347*ec779b8eSAndroid Build Coastguard Worker             GET_PARAMETER_SPECIFIC_FIELD(aidl, Downmix, downmix, Downmix::type, Downmix::Type));
348*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN(convertIntegral<int16_t>(static_cast<uint32_t>(aidlType)));
349*ec779b8eSAndroid Build Coastguard Worker }
350*ec779b8eSAndroid Build Coastguard Worker 
351*ec779b8eSAndroid Build Coastguard Worker ConversionResult<DynamicsProcessing::ResolutionPreference>
legacy2aidl_int32_DynamicsProcessing_ResolutionPreference(int32_t legacy)352*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_int32_DynamicsProcessing_ResolutionPreference(int32_t legacy) {
353*ec779b8eSAndroid Build Coastguard Worker     if (legacy > (int32_t)DynamicsProcessing::ResolutionPreference::FAVOR_TIME_RESOLUTION) {
354*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
355*ec779b8eSAndroid Build Coastguard Worker     }
356*ec779b8eSAndroid Build Coastguard Worker     return static_cast<DynamicsProcessing::ResolutionPreference>(legacy);
357*ec779b8eSAndroid Build Coastguard Worker }
358*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_DynamicsProcessing_ResolutionPreference_int32(DynamicsProcessing::ResolutionPreference aidl)359*ec779b8eSAndroid Build Coastguard Worker ConversionResult<int32_t> aidl2legacy_DynamicsProcessing_ResolutionPreference_int32(
360*ec779b8eSAndroid Build Coastguard Worker         DynamicsProcessing::ResolutionPreference aidl) {
361*ec779b8eSAndroid Build Coastguard Worker     return static_cast<int32_t>(aidl);
362*ec779b8eSAndroid Build Coastguard Worker }
363*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_Visualizer_ScalingMode_uint32(Visualizer::ScalingMode aidl)364*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_Visualizer_ScalingMode_uint32(
365*ec779b8eSAndroid Build Coastguard Worker         Visualizer::ScalingMode aidl) {
366*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
367*ec779b8eSAndroid Build Coastguard Worker         case Visualizer::ScalingMode::NORMALIZED: {
368*ec779b8eSAndroid Build Coastguard Worker             return 0;
369*ec779b8eSAndroid Build Coastguard Worker         }
370*ec779b8eSAndroid Build Coastguard Worker         case Visualizer::ScalingMode::AS_PLAYED: {
371*ec779b8eSAndroid Build Coastguard Worker             return 1;
372*ec779b8eSAndroid Build Coastguard Worker         }
373*ec779b8eSAndroid Build Coastguard Worker     }
374*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
375*ec779b8eSAndroid Build Coastguard Worker }
376*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_Parameter_Visualizer_uint32_ScalingMode(uint32_t legacy)377*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Visualizer::ScalingMode> legacy2aidl_Parameter_Visualizer_uint32_ScalingMode(
378*ec779b8eSAndroid Build Coastguard Worker         uint32_t legacy) {
379*ec779b8eSAndroid Build Coastguard Worker     if (legacy == 0) {
380*ec779b8eSAndroid Build Coastguard Worker         return Visualizer::ScalingMode::NORMALIZED;
381*ec779b8eSAndroid Build Coastguard Worker     } else if (legacy == 1) {
382*ec779b8eSAndroid Build Coastguard Worker         return Visualizer::ScalingMode::AS_PLAYED;
383*ec779b8eSAndroid Build Coastguard Worker     } else {
384*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
385*ec779b8eSAndroid Build Coastguard Worker     }
386*ec779b8eSAndroid Build Coastguard Worker }
387*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_Visualizer_MeasurementMode_uint32(Visualizer::MeasurementMode aidl)388*ec779b8eSAndroid Build Coastguard Worker ConversionResult<uint32_t> aidl2legacy_Parameter_Visualizer_MeasurementMode_uint32(
389*ec779b8eSAndroid Build Coastguard Worker         Visualizer::MeasurementMode aidl) {
390*ec779b8eSAndroid Build Coastguard Worker     switch (aidl) {
391*ec779b8eSAndroid Build Coastguard Worker         case Visualizer::MeasurementMode::NONE: {
392*ec779b8eSAndroid Build Coastguard Worker             return 0;
393*ec779b8eSAndroid Build Coastguard Worker         }
394*ec779b8eSAndroid Build Coastguard Worker         case Visualizer::MeasurementMode::PEAK_RMS: {
395*ec779b8eSAndroid Build Coastguard Worker             return 1;
396*ec779b8eSAndroid Build Coastguard Worker         }
397*ec779b8eSAndroid Build Coastguard Worker     }
398*ec779b8eSAndroid Build Coastguard Worker     return unexpected(BAD_VALUE);
399*ec779b8eSAndroid Build Coastguard Worker }
400*ec779b8eSAndroid Build Coastguard Worker 
401*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Visualizer::MeasurementMode>
legacy2aidl_Parameter_Visualizer_uint32_MeasurementMode(uint32_t legacy)402*ec779b8eSAndroid Build Coastguard Worker legacy2aidl_Parameter_Visualizer_uint32_MeasurementMode(uint32_t legacy) {
403*ec779b8eSAndroid Build Coastguard Worker     if (legacy == 0) {
404*ec779b8eSAndroid Build Coastguard Worker         return Visualizer::MeasurementMode::NONE;
405*ec779b8eSAndroid Build Coastguard Worker     } else if (legacy == 1) {
406*ec779b8eSAndroid Build Coastguard Worker         return Visualizer::MeasurementMode::PEAK_RMS;
407*ec779b8eSAndroid Build Coastguard Worker     } else {
408*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
409*ec779b8eSAndroid Build Coastguard Worker     }
410*ec779b8eSAndroid Build Coastguard Worker }
411*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_VendorExtension_EffectParameterWriter(EffectParamWriter & param,VendorExtension ext)412*ec779b8eSAndroid Build Coastguard Worker ConversionResult<status_t> aidl2legacy_VendorExtension_EffectParameterWriter(
413*ec779b8eSAndroid Build Coastguard Worker         EffectParamWriter& param, VendorExtension ext) {
414*ec779b8eSAndroid Build Coastguard Worker     std::optional<DefaultExtension> defaultExt;
415*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(ext.extension.getParcelable(&defaultExt));
416*ec779b8eSAndroid Build Coastguard Worker     if (!defaultExt.has_value()) {
417*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
418*ec779b8eSAndroid Build Coastguard Worker     }
419*ec779b8eSAndroid Build Coastguard Worker 
420*ec779b8eSAndroid Build Coastguard Worker     // DefaultExtension defaultValue = defaultExt->get();
421*ec779b8eSAndroid Build Coastguard Worker     if (defaultExt->bytes.size() < sizeof(effect_param_t)) {
422*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
423*ec779b8eSAndroid Build Coastguard Worker     }
424*ec779b8eSAndroid Build Coastguard Worker     // verify data length with EffectParamWrapper, DefaultExtension array size should not smaller
425*ec779b8eSAndroid Build Coastguard Worker     // than (sizeof(effect_param_t) + paddedPSize + vSize)
426*ec779b8eSAndroid Build Coastguard Worker     EffectParamWrapper wrapper(*(effect_param_t*)defaultExt->bytes.data());
427*ec779b8eSAndroid Build Coastguard Worker     if (sizeof(effect_param_t) + wrapper.getPaddedParameterSize() + wrapper.getValueSize() >
428*ec779b8eSAndroid Build Coastguard Worker         defaultExt->bytes.size()) {
429*ec779b8eSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
430*ec779b8eSAndroid Build Coastguard Worker     }
431*ec779b8eSAndroid Build Coastguard Worker 
432*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_ERROR(param.overwrite(wrapper.getEffectParam()));
433*ec779b8eSAndroid Build Coastguard Worker     return OK;
434*ec779b8eSAndroid Build Coastguard Worker }
435*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_EffectParameterReader_VendorExtension(EffectParamReader & param)436*ec779b8eSAndroid Build Coastguard Worker ConversionResult<VendorExtension> legacy2aidl_EffectParameterReader_VendorExtension(
437*ec779b8eSAndroid Build Coastguard Worker         EffectParamReader& param) {
438*ec779b8eSAndroid Build Coastguard Worker     size_t len = param.getTotalSize();
439*ec779b8eSAndroid Build Coastguard Worker     DefaultExtension defaultExt;
440*ec779b8eSAndroid Build Coastguard Worker     defaultExt.bytes.resize(len);
441*ec779b8eSAndroid Build Coastguard Worker 
442*ec779b8eSAndroid Build Coastguard Worker     std::memcpy(defaultExt.bytes.data(), (void *)&param.getEffectParam(), len);
443*ec779b8eSAndroid Build Coastguard Worker 
444*ec779b8eSAndroid Build Coastguard Worker     VendorExtension ext;
445*ec779b8eSAndroid Build Coastguard Worker     ext.extension.setParcelable(defaultExt);
446*ec779b8eSAndroid Build Coastguard Worker     return ext;
447*ec779b8eSAndroid Build Coastguard Worker }
448*ec779b8eSAndroid Build Coastguard Worker 
aidl2legacy_Parameter_EffectParameterWriter(const::aidl::android::hardware::audio::effect::Parameter & aidl,EffectParamWriter & legacy)449*ec779b8eSAndroid Build Coastguard Worker ConversionResult<::android::status_t> aidl2legacy_Parameter_EffectParameterWriter(
450*ec779b8eSAndroid Build Coastguard Worker         const ::aidl::android::hardware::audio::effect::Parameter& aidl,
451*ec779b8eSAndroid Build Coastguard Worker         EffectParamWriter& legacy) {
452*ec779b8eSAndroid Build Coastguard Worker     VendorExtension ext = VALUE_OR_RETURN(
453*ec779b8eSAndroid Build Coastguard Worker             (::aidl::android::getParameterSpecific<Parameter, VendorExtension,
454*ec779b8eSAndroid Build Coastguard Worker                                                    Parameter::Specific::vendorEffect>(aidl)));
455*ec779b8eSAndroid Build Coastguard Worker     return VALUE_OR_RETURN_STATUS(aidl2legacy_VendorExtension_EffectParameterWriter(legacy, ext));
456*ec779b8eSAndroid Build Coastguard Worker }
457*ec779b8eSAndroid Build Coastguard Worker 
legacy2aidl_EffectParameterReader_Parameter(EffectParamReader & param)458*ec779b8eSAndroid Build Coastguard Worker ConversionResult<Parameter> legacy2aidl_EffectParameterReader_Parameter(EffectParamReader& param) {
459*ec779b8eSAndroid Build Coastguard Worker     VendorExtension ext = VALUE_OR_RETURN(legacy2aidl_EffectParameterReader_VendorExtension(param));
460*ec779b8eSAndroid Build Coastguard Worker     return UNION_MAKE(Parameter, specific, UNION_MAKE(Parameter::Specific, vendorEffect, ext));
461*ec779b8eSAndroid Build Coastguard Worker }
462*ec779b8eSAndroid Build Coastguard Worker 
463*ec779b8eSAndroid Build Coastguard Worker }  // namespace android
464*ec779b8eSAndroid Build Coastguard Worker }  // aidl
465