From 206ad4d1f3f38ab5d7f235ba217a958f88ded5ac Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Wed, 20 Nov 2024 21:17:52 +0000 Subject: [PATCH] Revert^2 "Audio CAP: Address ANAPIC comments, Part 3." Refactor the stable version of parcelables `AudioPolicyForceUse` and `AudioPolicyForcedConfig` for better structure. The tag of the `AudioPolicyForceUse` union is equivalent to the old enum with the same name. The value of the union replaces the old `AudioPolicyForcedConfig` enum. The list of allowed values has been moved into the XSD schema 'audio_policy_engine_configuration.xsd'. Bug: 364310317 Test: atest VtsHalAudioCoreTargetTest Change-Id: I85f58f3310842679b9bf80cad3ac2494c4527ea2 --- audio/aidl/common/include/Utils.h | 32 ----- .../default/CapEngineConfigXmlConverter.cpp | 4 +- audio/aidl/default/XsdcConversion.cpp | 132 +++++++++++------- .../config/audioPolicy/engine/api/current.txt | 41 +++++- .../audio_policy_engine_configuration.xsd | 51 ++++++- .../include/core-impl/XsdcConversion.h | 24 +++- .../vts/VtsHalAudioCoreConfigTargetTest.cpp | 7 +- 7 files changed, 194 insertions(+), 97 deletions(-) diff --git a/audio/aidl/common/include/Utils.h b/audio/aidl/common/include/Utils.h index ce29635088..52ae936a05 100644 --- a/audio/aidl/common/include/Utils.h +++ b/audio/aidl/common/include/Utils.h @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -63,31 +62,6 @@ constexpr std::array<::aidl::android::media::audio::common::AudioMode, 5> kValid ::aidl::android::media::audio::common::AudioMode::CALL_SCREEN, }; -constexpr std::array<::aidl::android::media::audio::common::AudioPolicyForcedConfig, 17> - kValidAudioPolicyForcedConfig = { - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::NONE, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::SPEAKER, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::HEADPHONES, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::BT_SCO, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::BT_A2DP, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::WIRED_ACCESSORY, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::BT_CAR_DOCK, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::BT_DESK_DOCK, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::ANALOG_DOCK, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::DIGITAL_DOCK, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::NO_BT_A2DP, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::SYSTEM_ENFORCED, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig:: - HDMI_SYSTEM_AUDIO_ENFORCED, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig:: - ENCODED_SURROUND_NEVER, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig:: - ENCODED_SURROUND_ALWAYS, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig:: - ENCODED_SURROUND_MANUAL, - ::aidl::android::media::audio::common::AudioPolicyForcedConfig::BT_BLE, -}; - constexpr bool iequals(const std::string& str1, const std::string& str2) { return str1.length() == str2.length() && !fasticmp(str1.c_str(), str2.c_str(), str1.length()); @@ -168,12 +142,6 @@ constexpr bool isValidAudioMode(::aidl::android::media::audio::common::AudioMode kValidAudioModes.end(); } -constexpr bool isValidAudioPolicyForcedConfig( - ::aidl::android::media::audio::common::AudioPolicyForcedConfig config) { - return std::find(kValidAudioPolicyForcedConfig.begin(), kValidAudioPolicyForcedConfig.end(), - config) != kValidAudioPolicyForcedConfig.end(); -} - static inline bool maybeVendorExtension(const std::string& s) { // Only checks whether the string starts with the "vendor prefix". static const std::string vendorPrefix = "VX_"; diff --git a/audio/aidl/default/CapEngineConfigXmlConverter.cpp b/audio/aidl/default/CapEngineConfigXmlConverter.cpp index a6e78b938e..20fbca4ac1 100644 --- a/audio/aidl/default/CapEngineConfigXmlConverter.cpp +++ b/audio/aidl/default/CapEngineConfigXmlConverter.cpp @@ -96,8 +96,8 @@ ConversionResult convertCriterionRuleToAidl( } else if (!fastcmp(criterionName.c_str(), kXsdcForceConfigForUse, strlen(kXsdcForceConfigForUse))) { AudioHalCapCriterionV2::ForceConfigForUse value; - value.forceUse = VALUE_OR_RETURN(convertForceUseCriterionToAidl(criterionName)); - value.values.emplace_back(VALUE_OR_RETURN(convertForcedConfigToAidl(criterionValue))); + value.values.emplace_back( + VALUE_OR_RETURN(convertForceUseToAidl(criterionName, criterionValue))); rule.criterionAndValue = AudioHalCapCriterionV2::make(value); } else { LOG(ERROR) << __func__ << " unrecognized criterion " << criterionName; diff --git a/audio/aidl/default/XsdcConversion.cpp b/audio/aidl/default/XsdcConversion.cpp index ba6110d39c..b42d7f55ca 100644 --- a/audio/aidl/default/XsdcConversion.cpp +++ b/audio/aidl/default/XsdcConversion.cpp @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include #include @@ -5,6 +21,7 @@ #define LOG_TAG "AHAL_Config" #include #include +#include #include #include @@ -20,9 +37,7 @@ using aidl::android::hardware::audio::common::iequals; using aidl::android::hardware::audio::common::isValidAudioMode; -using aidl::android::hardware::audio::common::isValidAudioPolicyForcedConfig; using aidl::android::hardware::audio::common::kValidAudioModes; -using aidl::android::hardware::audio::common::kValidAudioPolicyForcedConfig; using aidl::android::media::audio::common::AudioChannelLayout; using aidl::android::media::audio::common::AudioContentType; using aidl::android::media::audio::common::AudioDevice; @@ -38,7 +53,6 @@ using aidl::android::media::audio::common::AudioHalCapCriterionV2; using aidl::android::media::audio::common::AudioHalVolumeCurve; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioMode; -using aidl::android::media::audio::common::AudioPolicyForcedConfig; using aidl::android::media::audio::common::AudioPolicyForceUse; using aidl::android::media::audio::common::AudioPort; using aidl::android::media::audio::common::AudioPortConfig; @@ -49,9 +63,10 @@ using aidl::android::media::audio::common::AudioProfile; using aidl::android::media::audio::common::AudioSource; using aidl::android::media::audio::common::AudioStreamType; using aidl::android::media::audio::common::AudioUsage; -using ::android::BAD_VALUE; -using ::android::base::unexpected; -using ::android::utilities::convertTo; +using android::BAD_VALUE; +using android::base::unexpected; +using android::utilities::convertTo; +using ndk::enum_range; namespace ap_xsd = android::audio::policy::configuration; namespace eng_xsd = android::audio::policy::engine::configuration; @@ -531,18 +546,6 @@ ConversionResult> convertModuleConfigToAi return result; } -ConversionResult convertForcedConfigToAidl( - const std::string& xsdcForcedConfigCriterionType) { - const auto it = std::find_if( - kValidAudioPolicyForcedConfig.begin(), kValidAudioPolicyForcedConfig.end(), - [&](const auto& config) { return toString(config) == xsdcForcedConfigCriterionType; }); - if (it == kValidAudioPolicyForcedConfig.end()) { - LOG(ERROR) << __func__ << " invalid forced config " << xsdcForcedConfigCriterionType; - return unexpected(BAD_VALUE); - } - return *it; -} - ConversionResult convertTelephonyModeToAidl(const std::string& xsdcModeCriterionType) { const auto it = std::find_if(kValidAudioModes.begin(), kValidAudioModes.end(), [&xsdcModeCriterionType](const auto& mode) { @@ -637,6 +640,16 @@ ConversionResult> convertDeviceAddressesToAidl( return aidlDeviceAddresses; } +ConversionResult convertAudioModeToAidl(const std::string& xsdcAudioModeType) { + const auto it = std::find_if(enum_range().begin(), enum_range().end(), + [&](const auto v) { return toString(v) == xsdcAudioModeType; }); + if (it == enum_range().end()) { + LOG(ERROR) << __func__ << " invalid audio mode " << xsdcAudioModeType; + return unexpected(BAD_VALUE); + } + return *it; +} + ConversionResult> convertTelephonyModesToAidl( const eng_xsd::CriterionTypeType& xsdcTelephonyModeCriterionType) { if (xsdcTelephonyModeCriterionType.getValues().empty()) { @@ -647,71 +660,97 @@ ConversionResult> convertTelephonyModesToAidl( for (eng_xsd::ValuesType xsdcValues : xsdcTelephonyModeCriterionType.getValues()) { aidlAudioModes.reserve(xsdcValues.getValue().size()); for (const eng_xsd::ValueType& xsdcValue : xsdcValues.getValue()) { - int integerValue = xsdcValue.getNumerical(); - if (!isValidAudioMode(AudioMode(integerValue))) { - LOG(ERROR) << __func__ << " invalid audio mode " << integerValue; - return unexpected(BAD_VALUE); - } - aidlAudioModes.push_back(AudioMode(integerValue)); + aidlAudioModes.push_back( + VALUE_OR_RETURN(convertAudioModeToAidl(xsdcValue.getLiteral()))); } } return aidlAudioModes; } -ConversionResult> convertForcedConfigsToAidl( +ConversionResult> convertForceUseConfigsToAidl( + const std::string& criterionValue, const eng_xsd::CriterionTypeType& xsdcForcedConfigCriterionType) { if (xsdcForcedConfigCriterionType.getValues().empty()) { LOG(ERROR) << __func__ << " no values provided"; return unexpected(BAD_VALUE); } - std::vector aidlForcedConfigs; + std::vector aidlForcedConfigs; for (eng_xsd::ValuesType xsdcValues : xsdcForcedConfigCriterionType.getValues()) { aidlForcedConfigs.reserve(xsdcValues.getValue().size()); for (const eng_xsd::ValueType& xsdcValue : xsdcValues.getValue()) { - int integerValue = xsdcValue.getNumerical(); - if (!isValidAudioPolicyForcedConfig(AudioPolicyForcedConfig(integerValue))) { - LOG(ERROR) << __func__ << " invalid forced config mode " << integerValue; - return unexpected(BAD_VALUE); - } - aidlForcedConfigs.push_back(AudioPolicyForcedConfig(integerValue)); + aidlForcedConfigs.push_back( + VALUE_OR_RETURN(convertForceUseToAidl(criterionValue, xsdcValue.getLiteral()))); } } return aidlForcedConfigs; } -ConversionResult convertForceUseCriterionToAidl( - const std::string& xsdcCriterionName) { +template +ConversionResult convertForceUseForcedConfigToAidl( + const std::string& xsdcForcedConfigCriterionType) { + const auto it = std::find_if(enum_range().begin(), enum_range().end(), [&](const auto v) { + return toString(v) == xsdcForcedConfigCriterionType; + }); + if (it == enum_range().end()) { + LOG(ERROR) << __func__ << " invalid forced config " << xsdcForcedConfigCriterionType; + return unexpected(BAD_VALUE); + } + return *it; +} + +ConversionResult convertForceUseToAidl(const std::string& xsdcCriterionName, + const std::string& xsdcCriterionValue) { if (!fastcmp(xsdcCriterionName.c_str(), kXsdcForceConfigForCommunication, - strlen(kXsdcForceConfigForCommunication))) { - return AudioPolicyForceUse::COMMUNICATION; + strlen(kXsdcForceConfigForCommunication))) { + const auto deviceCategory = VALUE_OR_RETURN( + convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(deviceCategory); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForMedia, strlen(kXsdcForceConfigForMedia))) { - return AudioPolicyForceUse::MEDIA; + const auto deviceCategory = VALUE_OR_RETURN( + convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(deviceCategory); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForRecord, strlen(kXsdcForceConfigForRecord))) { - return AudioPolicyForceUse::RECORD; + const auto deviceCategory = VALUE_OR_RETURN( + convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(deviceCategory); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForDock, - strlen(kXsdcForceConfigForDock))) { - return AudioPolicyForceUse::DOCK; + strlen(kXsdcForceConfigForDock))) { + const auto dockType = + VALUE_OR_RETURN(convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(dockType); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForSystem, strlen(kXsdcForceConfigForSystem))) { - return AudioPolicyForceUse::SYSTEM; + return AudioPolicyForceUse::make(xsdcCriterionValue == + "SYSTEM_ENFORCED"); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForHdmiSystemAudio, strlen(kXsdcForceConfigForHdmiSystemAudio))) { - return AudioPolicyForceUse::HDMI_SYSTEM_AUDIO; + return AudioPolicyForceUse::make( + xsdcCriterionValue == "HDMI_SYSTEM_AUDIO_ENFORCED"); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForEncodedSurround, strlen(kXsdcForceConfigForEncodedSurround))) { - return AudioPolicyForceUse::ENCODED_SURROUND; + const auto encodedSurround = VALUE_OR_RETURN( + convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(encodedSurround); } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForVibrateRinging, strlen(kXsdcForceConfigForVibrateRinging))) { - return AudioPolicyForceUse::VIBRATE_RINGING; + const auto deviceCategory = VALUE_OR_RETURN( + convertForceUseForcedConfigToAidl( + xsdcCriterionValue)); + return AudioPolicyForceUse::make(deviceCategory); } LOG(ERROR) << __func__ << " unrecognized force use " << xsdcCriterionName; return unexpected(BAD_VALUE); @@ -747,9 +786,8 @@ ConversionResult convertCapCriterionV2ToAidl( } if (!fastcmp(xsdcCriterion.getName().c_str(), kXsdcForceConfigForUse, strlen(kXsdcForceConfigForUse))) { - return AudioHalCapCriterionV2::make( - VALUE_OR_RETURN(convertForceUseCriterionToAidl(xsdcCriterion.getName())), - VALUE_OR_RETURN(convertForcedConfigsToAidl(xsdcCriterionType))); + return AudioHalCapCriterionV2::make(VALUE_OR_RETURN( + convertForceUseConfigsToAidl(xsdcCriterion.getName(), xsdcCriterionType))); } LOG(ERROR) << __func__ << " unrecognized criterion " << xsdcCriterion.getName(); return unexpected(BAD_VALUE); diff --git a/audio/aidl/default/config/audioPolicy/engine/api/current.txt b/audio/aidl/default/config/audioPolicy/engine/api/current.txt index 8e0e9a232d..017362fded 100644 --- a/audio/aidl/default/config/audioPolicy/engine/api/current.txt +++ b/audio/aidl/default/config/audioPolicy/engine/api/current.txt @@ -148,6 +148,45 @@ package android.audio.policy.engine.configuration { method public void setValue(@Nullable java.util.List); } + public enum ForcedConfigCommunicationDeviceType { + method @NonNull public String getRawName(); + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigCommunicationDeviceType BT_BLE; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigCommunicationDeviceType BT_SCO; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigCommunicationDeviceType NONE; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigCommunicationDeviceType SPEAKER; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigCommunicationDeviceType WIRED_ACCESSORY; + } + + public enum ForcedConfigDockType { + method @NonNull public String getRawName(); + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType ANALOG_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType BT_CAR_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType BT_DESK_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType DIGITAL_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType NONE; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigDockType WIRED_ACCESSORY; + } + + public enum ForcedConfigMediaDeviceType { + method @NonNull public String getRawName(); + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType ANALOG_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType BT_A2DP; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType DIGITAL_DOCK; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType HEADPHONES; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType NONE; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType NO_BT_A2DP; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType SPEAKER; + enum_constant public static final android.audio.policy.engine.configuration.ForcedConfigMediaDeviceType WIRED_ACCESSORY; + } + + public enum ForcedEncodingSourroundConfigType { + method @NonNull public String getRawName(); + enum_constant public static final android.audio.policy.engine.configuration.ForcedEncodingSourroundConfigType ALWAYS; + enum_constant public static final android.audio.policy.engine.configuration.ForcedEncodingSourroundConfigType MANUAL; + enum_constant public static final android.audio.policy.engine.configuration.ForcedEncodingSourroundConfigType NEVER; + enum_constant public static final android.audio.policy.engine.configuration.ForcedEncodingSourroundConfigType UNSPECIFIED; + } + public enum PfwCriterionTypeEnum { method @NonNull public String getRawName(); enum_constant public static final android.audio.policy.engine.configuration.PfwCriterionTypeEnum exclusive; @@ -244,10 +283,8 @@ package android.audio.policy.engine.configuration { ctor public ValueType(); method @Nullable public String getAndroid_type(); method @Nullable public String getLiteral(); - method @Nullable public long getNumerical(); method public void setAndroid_type(@Nullable String); method public void setLiteral(@Nullable String); - method public void setNumerical(@Nullable long); } public class ValuesType { diff --git a/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd b/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd index e2508ead6a..c16e366933 100644 --- a/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd +++ b/audio/aidl/default/config/audioPolicy/engine/audio_policy_engine_configuration.xsd @@ -191,10 +191,9 @@ - Criterion type is provided as a tuple of 'human readable' string (referred as the - literal part, that will allow to express 'human readable' rules, numerical value - associated in order to improve performances of the parameter framework library used, - and an optional android type. + Criterion type is provided as a pair of 'human readable' string (referred as the + literal part, that will allow to express 'human readable' rules and an optional + android type. This android type is reserved for device type mapping with parameter framework representation on a bitfield (Only one bit is expected to represent a device) and android representation of a type that may use several bits. @@ -203,7 +202,6 @@ - @@ -409,6 +407,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/audio/aidl/default/include/core-impl/XsdcConversion.h b/audio/aidl/default/include/core-impl/XsdcConversion.h index e855a3efe4..f00206b1ea 100644 --- a/audio/aidl/default/include/core-impl/XsdcConversion.h +++ b/audio/aidl/default/include/core-impl/XsdcConversion.h @@ -1,6 +1,20 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #include -#include -#include #include #include @@ -21,10 +35,8 @@ namespace aidlaudiocommon = ::aidl::android::media::audio::common; static constexpr const char kXsdcForceConfigForUse[] = "ForceUseFor"; -ConversionResult convertForceUseCriterionToAidl( - const std::string& xsdcCriterionName); -ConversionResult convertForcedConfigToAidl( - const std::string& xsdcForcedConfigCriterionType); +ConversionResult convertForceUseToAidl( + const std::string& xsdcCriterionName, const std::string& xsdcCriterionValue); ConversionResult convertDeviceAddressToAidl( const std::string& xsdcAddress); ConversionResult convertTelephonyModeToAidl( diff --git a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp index 583143c5c5..eaec88be34 100644 --- a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp @@ -55,7 +55,6 @@ using aidl::android::media::audio::common::AudioHalVolumeCurve; using aidl::android::media::audio::common::AudioHalVolumeGroup; using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::AudioPolicyForceUse; -using aidl::android::media::audio::common::AudioPolicyForcedConfig; using aidl::android::media::audio::common::AudioProductStrategyType; using aidl::android::media::audio::common::AudioSource; using aidl::android::media::audio::common::AudioStreamType; @@ -577,7 +576,7 @@ class AudioCoreConfig : public testing::TestWithParam { void ValidateCapSpecificConfig(const AudioHalEngineConfig::CapSpecificConfig& capCfg) { EXPECT_TRUE(capCfg.criteriaV2.has_value()); std::unordered_set criterionTagSet; - std::unordered_set forceUseCriterionUseSet; + std::unordered_set forceUseCriterionUseSet; for (const auto& criterion : capCfg.criteriaV2.value()) { EXPECT_TRUE(criterion.has_value()); if (criterion.value().getTag() != AudioHalCapCriterionV2::forceConfigForUse) { @@ -585,7 +584,9 @@ class AudioCoreConfig : public testing::TestWithParam { } else { auto forceUseCriterion = criterion.value().get(); - EXPECT_TRUE(forceUseCriterionUseSet.insert(forceUseCriterion.forceUse).second); + ASSERT_FALSE(forceUseCriterion.values.empty()); + EXPECT_TRUE(forceUseCriterionUseSet.insert(forceUseCriterion.values[0].getTag()) + .second); } EXPECT_NO_FATAL_FAILURE(ValidateAudioHalCapCriterion(criterion.value())); }