xref: /aosp_15_r20/hardware/interfaces/audio/aidl/default/EngineConfigXmlConverter.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include <fcntl.h>
18*4d7e907cSAndroid Build Coastguard Worker #include <inttypes.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <unistd.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <functional>
21*4d7e907cSAndroid Build Coastguard Worker #include <unordered_map>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "AHAL_Config"
24*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioFlag.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioHalEngineConfig.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/media/audio/common/AudioProductStrategyType.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
28*4d7e907cSAndroid Build Coastguard Worker 
29*4d7e907cSAndroid Build Coastguard Worker #include "core-impl/CapEngineConfigXmlConverter.h"
30*4d7e907cSAndroid Build Coastguard Worker #include "core-impl/EngineConfigXmlConverter.h"
31*4d7e907cSAndroid Build Coastguard Worker #include "core-impl/XsdcConversion.h"
32*4d7e907cSAndroid Build Coastguard Worker 
33*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::audio::core::internal::CapEngineConfigXmlConverter;
34*4d7e907cSAndroid Build Coastguard Worker using aidl::android::hardware::audio::core::internal::convertAudioUsageToAidl;
35*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioAttributes;
36*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioContentType;
37*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioFlag;
38*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalAttributesGroup;
39*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalCapCriterion;
40*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalCapCriterionType;
41*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalCapCriterionV2;
42*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalEngineConfig;
43*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalProductStrategy;
44*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalVolumeCurve;
45*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioHalVolumeGroup;
46*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioProductStrategyType;
47*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioSource;
48*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioStreamType;
49*4d7e907cSAndroid Build Coastguard Worker using aidl::android::media::audio::common::AudioUsage;
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker using ::android::BAD_VALUE;
52*4d7e907cSAndroid Build Coastguard Worker using ::android::base::unexpected;
53*4d7e907cSAndroid Build Coastguard Worker 
54*4d7e907cSAndroid Build Coastguard Worker namespace eng_xsd = android::audio::policy::engine::configuration;
55*4d7e907cSAndroid Build Coastguard Worker 
56*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::audio::core::internal {
57*4d7e907cSAndroid Build Coastguard Worker 
58*4d7e907cSAndroid Build Coastguard Worker /** Default path of audio policy cap engine configuration file. */
59*4d7e907cSAndroid Build Coastguard Worker static constexpr char kCapEngineConfigFileName[] =
60*4d7e907cSAndroid Build Coastguard Worker         "/parameter-framework/Settings/Policy/PolicyConfigurableDomains.xml";
61*4d7e907cSAndroid Build Coastguard Worker 
initProductStrategyMap()62*4d7e907cSAndroid Build Coastguard Worker void EngineConfigXmlConverter::initProductStrategyMap() {
63*4d7e907cSAndroid Build Coastguard Worker #define STRATEGY_ENTRY(name) {"STRATEGY_" #name, static_cast<int>(AudioProductStrategyType::name)}
64*4d7e907cSAndroid Build Coastguard Worker 
65*4d7e907cSAndroid Build Coastguard Worker     mProductStrategyMap = {STRATEGY_ENTRY(MEDIA),
66*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(PHONE),
67*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(SONIFICATION),
68*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(SONIFICATION_RESPECTFUL),
69*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(DTMF),
70*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(ENFORCED_AUDIBLE),
71*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(TRANSMITTED_THROUGH_SPEAKER),
72*4d7e907cSAndroid Build Coastguard Worker                            STRATEGY_ENTRY(ACCESSIBILITY)};
73*4d7e907cSAndroid Build Coastguard Worker #undef STRATEGY_ENTRY
74*4d7e907cSAndroid Build Coastguard Worker }
75*4d7e907cSAndroid Build Coastguard Worker 
convertProductStrategyNameToAidl(const std::string & xsdcProductStrategyName)76*4d7e907cSAndroid Build Coastguard Worker ConversionResult<int> EngineConfigXmlConverter::convertProductStrategyNameToAidl(
77*4d7e907cSAndroid Build Coastguard Worker         const std::string& xsdcProductStrategyName) {
78*4d7e907cSAndroid Build Coastguard Worker     const auto [it, success] = mProductStrategyMap.insert(
79*4d7e907cSAndroid Build Coastguard Worker             std::make_pair(xsdcProductStrategyName, mNextVendorStrategy));
80*4d7e907cSAndroid Build Coastguard Worker     if (success) {
81*4d7e907cSAndroid Build Coastguard Worker         mNextVendorStrategy++;
82*4d7e907cSAndroid Build Coastguard Worker     }
83*4d7e907cSAndroid Build Coastguard Worker     return it->second;
84*4d7e907cSAndroid Build Coastguard Worker }
85*4d7e907cSAndroid Build Coastguard Worker 
convertProductStrategyIdToAidl(int xsdcId)86*4d7e907cSAndroid Build Coastguard Worker ConversionResult<int> EngineConfigXmlConverter::convertProductStrategyIdToAidl(int xsdcId) {
87*4d7e907cSAndroid Build Coastguard Worker     if (xsdcId < AudioHalProductStrategy::VENDOR_STRATEGY_ID_START) {
88*4d7e907cSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
89*4d7e907cSAndroid Build Coastguard Worker     }
90*4d7e907cSAndroid Build Coastguard Worker     return xsdcId;
91*4d7e907cSAndroid Build Coastguard Worker }
92*4d7e907cSAndroid Build Coastguard Worker 
isDefaultAudioAttributes(const AudioAttributes & attributes)93*4d7e907cSAndroid Build Coastguard Worker bool isDefaultAudioAttributes(const AudioAttributes& attributes) {
94*4d7e907cSAndroid Build Coastguard Worker     return ((attributes.contentType == AudioContentType::UNKNOWN) &&
95*4d7e907cSAndroid Build Coastguard Worker             (attributes.usage == AudioUsage::UNKNOWN) &&
96*4d7e907cSAndroid Build Coastguard Worker             (attributes.source == AudioSource::DEFAULT) && (attributes.flags == 0) &&
97*4d7e907cSAndroid Build Coastguard Worker             (attributes.tags.empty()));
98*4d7e907cSAndroid Build Coastguard Worker }
99*4d7e907cSAndroid Build Coastguard Worker 
convertAudioAttributesToAidl(const eng_xsd::AttributesType & xsdcAudioAttributes)100*4d7e907cSAndroid Build Coastguard Worker ConversionResult<AudioAttributes> EngineConfigXmlConverter::convertAudioAttributesToAidl(
101*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::AttributesType& xsdcAudioAttributes) {
102*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasAttributesRef()) {
103*4d7e907cSAndroid Build Coastguard Worker         if (mAttributesReferenceMap.empty()) {
104*4d7e907cSAndroid Build Coastguard Worker             mAttributesReferenceMap =
105*4d7e907cSAndroid Build Coastguard Worker                     generateReferenceMap<eng_xsd::AttributesRef, eng_xsd::AttributesRefType>(
106*4d7e907cSAndroid Build Coastguard Worker                             getXsdcConfig()->getAttributesRef());
107*4d7e907cSAndroid Build Coastguard Worker         }
108*4d7e907cSAndroid Build Coastguard Worker         return convertAudioAttributesToAidl(
109*4d7e907cSAndroid Build Coastguard Worker                 *(mAttributesReferenceMap.at(xsdcAudioAttributes.getAttributesRef())
110*4d7e907cSAndroid Build Coastguard Worker                           .getFirstAttributes()));
111*4d7e907cSAndroid Build Coastguard Worker     }
112*4d7e907cSAndroid Build Coastguard Worker     AudioAttributes aidlAudioAttributes;
113*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasContentType()) {
114*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.contentType = VALUE_OR_FATAL(convertAudioContentTypeToAidl(
115*4d7e907cSAndroid Build Coastguard Worker                 xsdcAudioAttributes.getFirstContentType()->getValue()));
116*4d7e907cSAndroid Build Coastguard Worker     }
117*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasUsage()) {
118*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.usage = VALUE_OR_FATAL(
119*4d7e907cSAndroid Build Coastguard Worker                 convertAudioUsageToAidl(xsdcAudioAttributes.getFirstUsage()->getValue()));
120*4d7e907cSAndroid Build Coastguard Worker     }
121*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasSource()) {
122*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.source = VALUE_OR_FATAL(
123*4d7e907cSAndroid Build Coastguard Worker                 convertAudioSourceToAidl(xsdcAudioAttributes.getFirstSource()->getValue()));
124*4d7e907cSAndroid Build Coastguard Worker     }
125*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasFlags()) {
126*4d7e907cSAndroid Build Coastguard Worker         std::vector<eng_xsd::FlagType> xsdcFlagTypeVec =
127*4d7e907cSAndroid Build Coastguard Worker                 xsdcAudioAttributes.getFirstFlags()->getValue();
128*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.flags = VALUE_OR_FATAL(convertAudioFlagsToAidl(xsdcFlagTypeVec));
129*4d7e907cSAndroid Build Coastguard Worker     }
130*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAudioAttributes.hasBundle()) {
131*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::BundleType* xsdcBundle = xsdcAudioAttributes.getFirstBundle();
132*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.tags.reserve(1);
133*4d7e907cSAndroid Build Coastguard Worker         aidlAudioAttributes.tags.push_back(xsdcBundle->getKey() + "_" + xsdcBundle->getValue());
134*4d7e907cSAndroid Build Coastguard Worker     }
135*4d7e907cSAndroid Build Coastguard Worker     if (isDefaultAudioAttributes(aidlAudioAttributes)) {
136*4d7e907cSAndroid Build Coastguard Worker         mDefaultProductStrategyId = std::optional<int>{-1};
137*4d7e907cSAndroid Build Coastguard Worker     }
138*4d7e907cSAndroid Build Coastguard Worker     return aidlAudioAttributes;
139*4d7e907cSAndroid Build Coastguard Worker }
140*4d7e907cSAndroid Build Coastguard Worker 
convertAttributesGroupToAidl(const eng_xsd::AttributesGroup & xsdcAttributesGroup)141*4d7e907cSAndroid Build Coastguard Worker ConversionResult<AudioHalAttributesGroup> EngineConfigXmlConverter::convertAttributesGroupToAidl(
142*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::AttributesGroup& xsdcAttributesGroup) {
143*4d7e907cSAndroid Build Coastguard Worker     AudioHalAttributesGroup aidlAttributesGroup;
144*4d7e907cSAndroid Build Coastguard Worker     static const int kStreamTypeEnumOffset =
145*4d7e907cSAndroid Build Coastguard Worker             static_cast<int>(eng_xsd::Stream::AUDIO_STREAM_VOICE_CALL) -
146*4d7e907cSAndroid Build Coastguard Worker             static_cast<int>(AudioStreamType::VOICE_CALL);
147*4d7e907cSAndroid Build Coastguard Worker     aidlAttributesGroup.streamType = xsdcAttributesGroup.hasStreamType()
148*4d7e907cSAndroid Build Coastguard Worker                                              ? VALUE_OR_FATAL(convertAudioStreamTypeToAidl(
149*4d7e907cSAndroid Build Coastguard Worker                                                        xsdcAttributesGroup.getStreamType()))
150*4d7e907cSAndroid Build Coastguard Worker                                              : AudioStreamType::INVALID;
151*4d7e907cSAndroid Build Coastguard Worker     aidlAttributesGroup.volumeGroupName = xsdcAttributesGroup.getVolumeGroup();
152*4d7e907cSAndroid Build Coastguard Worker     if (xsdcAttributesGroup.hasAttributes_optional()) {
153*4d7e907cSAndroid Build Coastguard Worker         aidlAttributesGroup.attributes =
154*4d7e907cSAndroid Build Coastguard Worker                 VALUE_OR_FATAL((convertCollectionToAidl<eng_xsd::AttributesType, AudioAttributes>(
155*4d7e907cSAndroid Build Coastguard Worker                         xsdcAttributesGroup.getAttributes_optional(),
156*4d7e907cSAndroid Build Coastguard Worker                         std::bind(&EngineConfigXmlConverter::convertAudioAttributesToAidl, this,
157*4d7e907cSAndroid Build Coastguard Worker                                   std::placeholders::_1))));
158*4d7e907cSAndroid Build Coastguard Worker     } else if (xsdcAttributesGroup.hasContentType_optional() ||
159*4d7e907cSAndroid Build Coastguard Worker                xsdcAttributesGroup.hasUsage_optional() ||
160*4d7e907cSAndroid Build Coastguard Worker                xsdcAttributesGroup.hasSource_optional() ||
161*4d7e907cSAndroid Build Coastguard Worker                xsdcAttributesGroup.hasFlags_optional() ||
162*4d7e907cSAndroid Build Coastguard Worker                xsdcAttributesGroup.hasBundle_optional()) {
163*4d7e907cSAndroid Build Coastguard Worker         aidlAttributesGroup.attributes.push_back(VALUE_OR_FATAL(convertAudioAttributesToAidl(
164*4d7e907cSAndroid Build Coastguard Worker                 eng_xsd::AttributesType(xsdcAttributesGroup.getContentType_optional(),
165*4d7e907cSAndroid Build Coastguard Worker                                         xsdcAttributesGroup.getUsage_optional(),
166*4d7e907cSAndroid Build Coastguard Worker                                         xsdcAttributesGroup.getSource_optional(),
167*4d7e907cSAndroid Build Coastguard Worker                                         xsdcAttributesGroup.getFlags_optional(),
168*4d7e907cSAndroid Build Coastguard Worker                                         xsdcAttributesGroup.getBundle_optional(), std::nullopt))));
169*4d7e907cSAndroid Build Coastguard Worker 
170*4d7e907cSAndroid Build Coastguard Worker     } else {
171*4d7e907cSAndroid Build Coastguard Worker         LOG(ERROR) << __func__ << " Review Audio Policy config: no audio attributes provided for "
172*4d7e907cSAndroid Build Coastguard Worker                    << aidlAttributesGroup.toString();
173*4d7e907cSAndroid Build Coastguard Worker         return unexpected(BAD_VALUE);
174*4d7e907cSAndroid Build Coastguard Worker     }
175*4d7e907cSAndroid Build Coastguard Worker     return aidlAttributesGroup;
176*4d7e907cSAndroid Build Coastguard Worker }
177*4d7e907cSAndroid Build Coastguard Worker 
convertProductStrategyToAidl(const eng_xsd::ProductStrategies::ProductStrategy & xsdcProductStrategy)178*4d7e907cSAndroid Build Coastguard Worker ConversionResult<AudioHalProductStrategy> EngineConfigXmlConverter::convertProductStrategyToAidl(
179*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::ProductStrategies::ProductStrategy& xsdcProductStrategy) {
180*4d7e907cSAndroid Build Coastguard Worker     AudioHalProductStrategy aidlProductStrategy;
181*4d7e907cSAndroid Build Coastguard Worker 
182*4d7e907cSAndroid Build Coastguard Worker     aidlProductStrategy.id =
183*4d7e907cSAndroid Build Coastguard Worker             VALUE_OR_FATAL(convertProductStrategyIdToAidl(xsdcProductStrategy.getId()));
184*4d7e907cSAndroid Build Coastguard Worker     aidlProductStrategy.name = xsdcProductStrategy.getName();
185*4d7e907cSAndroid Build Coastguard Worker 
186*4d7e907cSAndroid Build Coastguard Worker     if (xsdcProductStrategy.hasAttributesGroup()) {
187*4d7e907cSAndroid Build Coastguard Worker         aidlProductStrategy.attributesGroups = VALUE_OR_FATAL(
188*4d7e907cSAndroid Build Coastguard Worker                 (convertCollectionToAidl<eng_xsd::AttributesGroup, AudioHalAttributesGroup>(
189*4d7e907cSAndroid Build Coastguard Worker                         xsdcProductStrategy.getAttributesGroup(),
190*4d7e907cSAndroid Build Coastguard Worker                         std::bind(&EngineConfigXmlConverter::convertAttributesGroupToAidl, this,
191*4d7e907cSAndroid Build Coastguard Worker                                   std::placeholders::_1))));
192*4d7e907cSAndroid Build Coastguard Worker     }
193*4d7e907cSAndroid Build Coastguard Worker     if ((mDefaultProductStrategyId != std::nullopt) && (mDefaultProductStrategyId.value() == -1)) {
194*4d7e907cSAndroid Build Coastguard Worker         mDefaultProductStrategyId = aidlProductStrategy.id;
195*4d7e907cSAndroid Build Coastguard Worker     }
196*4d7e907cSAndroid Build Coastguard Worker     return aidlProductStrategy;
197*4d7e907cSAndroid Build Coastguard Worker }
198*4d7e907cSAndroid Build Coastguard Worker 
convertVolumeCurveToAidl(const eng_xsd::Volume & xsdcVolumeCurve)199*4d7e907cSAndroid Build Coastguard Worker ConversionResult<AudioHalVolumeCurve> EngineConfigXmlConverter::convertVolumeCurveToAidl(
200*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::Volume& xsdcVolumeCurve) {
201*4d7e907cSAndroid Build Coastguard Worker     AudioHalVolumeCurve aidlVolumeCurve;
202*4d7e907cSAndroid Build Coastguard Worker     aidlVolumeCurve.deviceCategory =
203*4d7e907cSAndroid Build Coastguard Worker             static_cast<AudioHalVolumeCurve::DeviceCategory>(xsdcVolumeCurve.getDeviceCategory());
204*4d7e907cSAndroid Build Coastguard Worker     if (xsdcVolumeCurve.hasRef()) {
205*4d7e907cSAndroid Build Coastguard Worker         if (mVolumesReferenceMap.empty()) {
206*4d7e907cSAndroid Build Coastguard Worker             mVolumesReferenceMap = generateReferenceMap<eng_xsd::VolumesType, eng_xsd::VolumeRef>(
207*4d7e907cSAndroid Build Coastguard Worker                     getXsdcConfig()->getVolumes());
208*4d7e907cSAndroid Build Coastguard Worker         }
209*4d7e907cSAndroid Build Coastguard Worker         aidlVolumeCurve.curvePoints = VALUE_OR_FATAL(
210*4d7e907cSAndroid Build Coastguard Worker                 (convertCollectionToAidl<std::string, AudioHalVolumeCurve::CurvePoint>(
211*4d7e907cSAndroid Build Coastguard Worker                         mVolumesReferenceMap.at(xsdcVolumeCurve.getRef()).getPoint(),
212*4d7e907cSAndroid Build Coastguard Worker                         &convertCurvePointToAidl)));
213*4d7e907cSAndroid Build Coastguard Worker     } else {
214*4d7e907cSAndroid Build Coastguard Worker         aidlVolumeCurve.curvePoints = VALUE_OR_FATAL(
215*4d7e907cSAndroid Build Coastguard Worker                 (convertCollectionToAidl<std::string, AudioHalVolumeCurve::CurvePoint>(
216*4d7e907cSAndroid Build Coastguard Worker                         xsdcVolumeCurve.getPoint(), &convertCurvePointToAidl)));
217*4d7e907cSAndroid Build Coastguard Worker     }
218*4d7e907cSAndroid Build Coastguard Worker     return aidlVolumeCurve;
219*4d7e907cSAndroid Build Coastguard Worker }
220*4d7e907cSAndroid Build Coastguard Worker 
convertVolumeGroupToAidl(const eng_xsd::VolumeGroupsType::VolumeGroup & xsdcVolumeGroup)221*4d7e907cSAndroid Build Coastguard Worker ConversionResult<AudioHalVolumeGroup> EngineConfigXmlConverter::convertVolumeGroupToAidl(
222*4d7e907cSAndroid Build Coastguard Worker         const eng_xsd::VolumeGroupsType::VolumeGroup& xsdcVolumeGroup) {
223*4d7e907cSAndroid Build Coastguard Worker     AudioHalVolumeGroup aidlVolumeGroup;
224*4d7e907cSAndroid Build Coastguard Worker     aidlVolumeGroup.name = xsdcVolumeGroup.getName();
225*4d7e907cSAndroid Build Coastguard Worker     aidlVolumeGroup.minIndex = xsdcVolumeGroup.getIndexMin();
226*4d7e907cSAndroid Build Coastguard Worker     aidlVolumeGroup.maxIndex = xsdcVolumeGroup.getIndexMax();
227*4d7e907cSAndroid Build Coastguard Worker     aidlVolumeGroup.volumeCurves =
228*4d7e907cSAndroid Build Coastguard Worker             VALUE_OR_FATAL((convertCollectionToAidl<eng_xsd::Volume, AudioHalVolumeCurve>(
229*4d7e907cSAndroid Build Coastguard Worker                     xsdcVolumeGroup.getVolume(),
230*4d7e907cSAndroid Build Coastguard Worker                     std::bind(&EngineConfigXmlConverter::convertVolumeCurveToAidl, this,
231*4d7e907cSAndroid Build Coastguard Worker                               std::placeholders::_1))));
232*4d7e907cSAndroid Build Coastguard Worker     return aidlVolumeGroup;
233*4d7e907cSAndroid Build Coastguard Worker }
234*4d7e907cSAndroid Build Coastguard Worker 
getAidlEngineConfig()235*4d7e907cSAndroid Build Coastguard Worker AudioHalEngineConfig& EngineConfigXmlConverter::getAidlEngineConfig() {
236*4d7e907cSAndroid Build Coastguard Worker     return mAidlEngineConfig;
237*4d7e907cSAndroid Build Coastguard Worker }
238*4d7e907cSAndroid Build Coastguard Worker 
init()239*4d7e907cSAndroid Build Coastguard Worker void EngineConfigXmlConverter::init() {
240*4d7e907cSAndroid Build Coastguard Worker     initProductStrategyMap();
241*4d7e907cSAndroid Build Coastguard Worker     if (getXsdcConfig()->hasProductStrategies()) {
242*4d7e907cSAndroid Build Coastguard Worker         mAidlEngineConfig.productStrategies = VALUE_OR_FATAL(
243*4d7e907cSAndroid Build Coastguard Worker                 (convertWrappedCollectionToAidl<eng_xsd::ProductStrategies,
244*4d7e907cSAndroid Build Coastguard Worker                                                 eng_xsd::ProductStrategies::ProductStrategy,
245*4d7e907cSAndroid Build Coastguard Worker                                                 AudioHalProductStrategy>(
246*4d7e907cSAndroid Build Coastguard Worker                         getXsdcConfig()->getProductStrategies(),
247*4d7e907cSAndroid Build Coastguard Worker                         &eng_xsd::ProductStrategies::getProductStrategy,
248*4d7e907cSAndroid Build Coastguard Worker                         std::bind(&EngineConfigXmlConverter::convertProductStrategyToAidl, this,
249*4d7e907cSAndroid Build Coastguard Worker                                   std::placeholders::_1))));
250*4d7e907cSAndroid Build Coastguard Worker         if (mDefaultProductStrategyId) {
251*4d7e907cSAndroid Build Coastguard Worker             mAidlEngineConfig.defaultProductStrategyId = mDefaultProductStrategyId.value();
252*4d7e907cSAndroid Build Coastguard Worker         }
253*4d7e907cSAndroid Build Coastguard Worker     }
254*4d7e907cSAndroid Build Coastguard Worker     if (getXsdcConfig()->hasVolumeGroups()) {
255*4d7e907cSAndroid Build Coastguard Worker         mAidlEngineConfig.volumeGroups = VALUE_OR_FATAL(
256*4d7e907cSAndroid Build Coastguard Worker                 (convertWrappedCollectionToAidl<eng_xsd::VolumeGroupsType,
257*4d7e907cSAndroid Build Coastguard Worker                                                 eng_xsd::VolumeGroupsType::VolumeGroup,
258*4d7e907cSAndroid Build Coastguard Worker                                                 AudioHalVolumeGroup>(
259*4d7e907cSAndroid Build Coastguard Worker                         getXsdcConfig()->getVolumeGroups(),
260*4d7e907cSAndroid Build Coastguard Worker                         &eng_xsd::VolumeGroupsType::getVolumeGroup,
261*4d7e907cSAndroid Build Coastguard Worker                         std::bind(&EngineConfigXmlConverter::convertVolumeGroupToAidl, this,
262*4d7e907cSAndroid Build Coastguard Worker                                   std::placeholders::_1))));
263*4d7e907cSAndroid Build Coastguard Worker     }
264*4d7e907cSAndroid Build Coastguard Worker     if (getXsdcConfig()->hasCriteria() && getXsdcConfig()->hasCriterion_types()) {
265*4d7e907cSAndroid Build Coastguard Worker         AudioHalEngineConfig::CapSpecificConfig capSpecificConfig;
266*4d7e907cSAndroid Build Coastguard Worker         capSpecificConfig.criteriaV2 =
267*4d7e907cSAndroid Build Coastguard Worker                 std::make_optional<>(VALUE_OR_FATAL((convertCapCriteriaCollectionToAidl(
268*4d7e907cSAndroid Build Coastguard Worker                         getXsdcConfig()->getCriteria(), getXsdcConfig()->getCriterion_types()))));
269*4d7e907cSAndroid Build Coastguard Worker         internal::CapEngineConfigXmlConverter capEngConfigConverter{
270*4d7e907cSAndroid Build Coastguard Worker                 ::android::audio_find_readable_configuration_file(kCapEngineConfigFileName)};
271*4d7e907cSAndroid Build Coastguard Worker         if (capEngConfigConverter.getStatus() == ::android::OK) {
272*4d7e907cSAndroid Build Coastguard Worker             capSpecificConfig.domains = std::move(capEngConfigConverter.getAidlCapEngineConfig());
273*4d7e907cSAndroid Build Coastguard Worker         }
274*4d7e907cSAndroid Build Coastguard Worker         mAidlEngineConfig.capSpecificConfig = capSpecificConfig;
275*4d7e907cSAndroid Build Coastguard Worker     }
276*4d7e907cSAndroid Build Coastguard Worker }
277*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl::android::hardware::audio::core::internal
278