diff --git a/audio/aidl/common/include/Utils.h b/audio/aidl/common/include/Utils.h index b9f4176a2c..ce29635088 100644 --- a/audio/aidl/common/include/Utils.h +++ b/audio/aidl/common/include/Utils.h @@ -63,6 +63,31 @@ 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()); @@ -143,6 +168,12 @@ 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 20fbca4ac1..a6e78b938e 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.values.emplace_back( - VALUE_OR_RETURN(convertForceUseToAidl(criterionName, criterionValue))); + value.forceUse = VALUE_OR_RETURN(convertForceUseCriterionToAidl(criterionName)); + value.values.emplace_back(VALUE_OR_RETURN(convertForcedConfigToAidl(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 4282085a69..ba6110d39c 100644 --- a/audio/aidl/default/XsdcConversion.cpp +++ b/audio/aidl/default/XsdcConversion.cpp @@ -1,19 +1,3 @@ -/* - * 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 @@ -21,7 +5,6 @@ #define LOG_TAG "AHAL_Config" #include #include -#include #include #include @@ -37,7 +20,9 @@ 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; @@ -64,10 +49,9 @@ 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 ndk::enum_range; +using ::android::BAD_VALUE; +using ::android::base::unexpected; +using ::android::utilities::convertTo; namespace ap_xsd = android::audio::policy::configuration; namespace eng_xsd = android::audio::policy::engine::configuration; @@ -547,6 +531,18 @@ 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) { @@ -641,16 +637,6 @@ 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()) { @@ -661,97 +647,71 @@ ConversionResult> convertTelephonyModesToAidl( for (eng_xsd::ValuesType xsdcValues : xsdcTelephonyModeCriterionType.getValues()) { aidlAudioModes.reserve(xsdcValues.getValue().size()); for (const eng_xsd::ValueType& xsdcValue : xsdcValues.getValue()) { - aidlAudioModes.push_back( - VALUE_OR_RETURN(convertAudioModeToAidl(xsdcValue.getLiteral()))); + int integerValue = xsdcValue.getNumerical(); + if (!isValidAudioMode(AudioMode(integerValue))) { + LOG(ERROR) << __func__ << " invalid audio mode " << integerValue; + return unexpected(BAD_VALUE); + } + aidlAudioModes.push_back(AudioMode(integerValue)); } } return aidlAudioModes; } -ConversionResult> convertForceUseConfigsToAidl( - const std::string& criterionValue, +ConversionResult> convertForcedConfigsToAidl( 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()) { - aidlForcedConfigs.push_back( - VALUE_OR_RETURN(convertForceUseToAidl(criterionValue, xsdcValue.getLiteral()))); + 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)); } } return aidlForcedConfigs; } -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) { +ConversionResult convertForceUseCriterionToAidl( + const std::string& xsdcCriterionName) { if (!fastcmp(xsdcCriterionName.c_str(), kXsdcForceConfigForCommunication, - strlen(kXsdcForceConfigForCommunication))) { - const auto deviceCategory = VALUE_OR_RETURN( - convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(deviceCategory); + strlen(kXsdcForceConfigForCommunication))) { + return AudioPolicyForceUse::COMMUNICATION; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForMedia, strlen(kXsdcForceConfigForMedia))) { - const auto deviceCategory = VALUE_OR_RETURN( - convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(deviceCategory); + return AudioPolicyForceUse::MEDIA; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForRecord, strlen(kXsdcForceConfigForRecord))) { - const auto deviceCategory = VALUE_OR_RETURN( - convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(deviceCategory); + return AudioPolicyForceUse::RECORD; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForDock, - strlen(kXsdcForceConfigForDock))) { - const auto dockType = - VALUE_OR_RETURN(convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(dockType); + strlen(kXsdcForceConfigForDock))) { + return AudioPolicyForceUse::DOCK; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForSystem, strlen(kXsdcForceConfigForSystem))) { - return AudioPolicyForceUse::make(xsdcCriterionValue == - "SYSTEM_ENFORCED"); + return AudioPolicyForceUse::SYSTEM; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForHdmiSystemAudio, strlen(kXsdcForceConfigForHdmiSystemAudio))) { - return AudioPolicyForceUse::make( - xsdcCriterionValue == "HDMI_SYSTEM_AUDIO_ENFORCED"); + return AudioPolicyForceUse::HDMI_SYSTEM_AUDIO; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForEncodedSurround, strlen(kXsdcForceConfigForEncodedSurround))) { - const auto encodedSurround = VALUE_OR_RETURN( - convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(encodedSurround); + return AudioPolicyForceUse::ENCODED_SURROUND; } if (!fasticmp(xsdcCriterionName.c_str(), kXsdcForceConfigForVibrateRinging, strlen(kXsdcForceConfigForVibrateRinging))) { - const auto deviceCategory = VALUE_OR_RETURN( - convertForceUseForcedConfigToAidl( - xsdcCriterionValue)); - return AudioPolicyForceUse::make(deviceCategory); + return AudioPolicyForceUse::VIBRATE_RINGING; } LOG(ERROR) << __func__ << " unrecognized force use " << xsdcCriterionName; return unexpected(BAD_VALUE); @@ -787,8 +747,9 @@ ConversionResult convertCapCriterionV2ToAidl( } if (!fastcmp(xsdcCriterion.getName().c_str(), kXsdcForceConfigForUse, strlen(kXsdcForceConfigForUse))) { - return AudioHalCapCriterionV2::make(VALUE_OR_RETURN( - convertForceUseConfigsToAidl(xsdcCriterion.getName(), xsdcCriterionType))); + return AudioHalCapCriterionV2::make( + VALUE_OR_RETURN(convertForceUseCriterionToAidl(xsdcCriterion.getName())), + VALUE_OR_RETURN(convertForcedConfigsToAidl(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 017362fded..8e0e9a232d 100644 --- a/audio/aidl/default/config/audioPolicy/engine/api/current.txt +++ b/audio/aidl/default/config/audioPolicy/engine/api/current.txt @@ -148,45 +148,6 @@ 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; @@ -283,8 +244,10 @@ 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 c16e366933..e2508ead6a 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,9 +191,10 @@ - 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. + 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. 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. @@ -202,6 +203,7 @@ + @@ -407,49 +409,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/audio/aidl/default/include/core-impl/XsdcConversion.h b/audio/aidl/default/include/core-impl/XsdcConversion.h index f00206b1ea..e855a3efe4 100644 --- a/audio/aidl/default/include/core-impl/XsdcConversion.h +++ b/audio/aidl/default/include/core-impl/XsdcConversion.h @@ -1,20 +1,6 @@ -/* - * 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 @@ -35,8 +21,10 @@ namespace aidlaudiocommon = ::aidl::android::media::audio::common; static constexpr const char kXsdcForceConfigForUse[] = "ForceUseFor"; -ConversionResult convertForceUseToAidl( - const std::string& xsdcCriterionName, const std::string& xsdcCriterionValue); +ConversionResult convertForceUseCriterionToAidl( + const std::string& xsdcCriterionName); +ConversionResult convertForcedConfigToAidl( + const std::string& xsdcForcedConfigCriterionType); ConversionResult convertDeviceAddressToAidl( const std::string& xsdcAddress); ConversionResult convertTelephonyModeToAidl( diff --git a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp index 8e53996f4a..583143c5c5 100644 --- a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp @@ -577,7 +577,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,9 +585,7 @@ class AudioCoreConfig : public testing::TestWithParam { } else { auto forceUseCriterion = criterion.value().get(); - ASSERT_FALSE(forceUseCriterion.values.empty()); - EXPECT_TRUE(forceUseCriterionUseSet.insert(forceUseCriterion.values[0].getTag()) - .second); + EXPECT_TRUE(forceUseCriterionUseSet.insert(forceUseCriterion.forceUse).second); } EXPECT_NO_FATAL_FAILURE(ValidateAudioHalCapCriterion(criterion.value())); }