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
diff --git a/audio/aidl/default/XsdcConversion.cpp b/audio/aidl/default/XsdcConversion.cpp
index ba6110d..b42d7f5 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 <inttypes.h>
#include <unordered_set>
@@ -5,6 +21,7 @@
#define LOG_TAG "AHAL_Config"
#include <android-base/logging.h>
#include <android-base/strings.h>
+#include <android/binder_enums.h>
#include <aidl/android/media/audio/common/AudioPort.h>
#include <aidl/android/media/audio/common/AudioPortConfig.h>
@@ -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::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::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 @@
return result;
}
-ConversionResult<AudioPolicyForcedConfig> 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<AudioMode> convertTelephonyModeToAidl(const std::string& xsdcModeCriterionType) {
const auto it = std::find_if(kValidAudioModes.begin(), kValidAudioModes.end(),
[&xsdcModeCriterionType](const auto& mode) {
@@ -637,6 +640,16 @@
return aidlDeviceAddresses;
}
+ConversionResult<AudioMode> convertAudioModeToAidl(const std::string& xsdcAudioModeType) {
+ const auto it = std::find_if(enum_range<AudioMode>().begin(), enum_range<AudioMode>().end(),
+ [&](const auto v) { return toString(v) == xsdcAudioModeType; });
+ if (it == enum_range<AudioMode>().end()) {
+ LOG(ERROR) << __func__ << " invalid audio mode " << xsdcAudioModeType;
+ return unexpected(BAD_VALUE);
+ }
+ return *it;
+}
+
ConversionResult<std::vector<AudioMode>> convertTelephonyModesToAidl(
const eng_xsd::CriterionTypeType& xsdcTelephonyModeCriterionType) {
if (xsdcTelephonyModeCriterionType.getValues().empty()) {
@@ -647,71 +660,97 @@
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<std::vector<AudioPolicyForcedConfig>> convertForcedConfigsToAidl(
+ConversionResult<std::vector<AudioPolicyForceUse>> 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<AudioPolicyForcedConfig> aidlForcedConfigs;
+ std::vector<AudioPolicyForceUse> 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<AudioPolicyForceUse> convertForceUseCriterionToAidl(
- const std::string& xsdcCriterionName) {
+template <typename T>
+ConversionResult<T> convertForceUseForcedConfigToAidl(
+ const std::string& xsdcForcedConfigCriterionType) {
+ const auto it = std::find_if(enum_range<T>().begin(), enum_range<T>().end(), [&](const auto v) {
+ return toString(v) == xsdcForcedConfigCriterionType;
+ });
+ if (it == enum_range<T>().end()) {
+ LOG(ERROR) << __func__ << " invalid forced config " << xsdcForcedConfigCriterionType;
+ return unexpected(BAD_VALUE);
+ }
+ return *it;
+}
+
+ConversionResult<AudioPolicyForceUse> convertForceUseToAidl(const std::string& xsdcCriterionName,
+ const std::string& xsdcCriterionValue) {
if (!fastcmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForCommunication,
- strlen(kXsdcForceConfigForCommunication))) {
- return AudioPolicyForceUse::COMMUNICATION;
+ strlen(kXsdcForceConfigForCommunication))) {
+ const auto deviceCategory = VALUE_OR_RETURN(
+ convertForceUseForcedConfigToAidl<AudioPolicyForceUse::CommunicationDeviceCategory>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::forCommunication>(deviceCategory);
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForMedia,
strlen(kXsdcForceConfigForMedia))) {
- return AudioPolicyForceUse::MEDIA;
+ const auto deviceCategory = VALUE_OR_RETURN(
+ convertForceUseForcedConfigToAidl<AudioPolicyForceUse::MediaDeviceCategory>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::forMedia>(deviceCategory);
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForRecord,
strlen(kXsdcForceConfigForRecord))) {
- return AudioPolicyForceUse::RECORD;
+ const auto deviceCategory = VALUE_OR_RETURN(
+ convertForceUseForcedConfigToAidl<AudioPolicyForceUse::CommunicationDeviceCategory>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::forRecord>(deviceCategory);
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForDock,
- strlen(kXsdcForceConfigForDock))) {
- return AudioPolicyForceUse::DOCK;
+ strlen(kXsdcForceConfigForDock))) {
+ const auto dockType =
+ VALUE_OR_RETURN(convertForceUseForcedConfigToAidl<AudioPolicyForceUse::DockType>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::dock>(dockType);
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForSystem,
strlen(kXsdcForceConfigForSystem))) {
- return AudioPolicyForceUse::SYSTEM;
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::systemSounds>(xsdcCriterionValue ==
+ "SYSTEM_ENFORCED");
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForHdmiSystemAudio,
strlen(kXsdcForceConfigForHdmiSystemAudio))) {
- return AudioPolicyForceUse::HDMI_SYSTEM_AUDIO;
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::hdmiSystemAudio>(
+ xsdcCriterionValue == "HDMI_SYSTEM_AUDIO_ENFORCED");
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForEncodedSurround,
strlen(kXsdcForceConfigForEncodedSurround))) {
- return AudioPolicyForceUse::ENCODED_SURROUND;
+ const auto encodedSurround = VALUE_OR_RETURN(
+ convertForceUseForcedConfigToAidl<AudioPolicyForceUse::EncodedSurroundConfig>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::encodedSurround>(encodedSurround);
}
if (!fasticmp<strncmp>(xsdcCriterionName.c_str(), kXsdcForceConfigForVibrateRinging,
strlen(kXsdcForceConfigForVibrateRinging))) {
- return AudioPolicyForceUse::VIBRATE_RINGING;
+ const auto deviceCategory = VALUE_OR_RETURN(
+ convertForceUseForcedConfigToAidl<AudioPolicyForceUse::CommunicationDeviceCategory>(
+ xsdcCriterionValue));
+ return AudioPolicyForceUse::make<AudioPolicyForceUse::forVibrateRinging>(deviceCategory);
}
LOG(ERROR) << __func__ << " unrecognized force use " << xsdcCriterionName;
return unexpected(BAD_VALUE);
@@ -747,9 +786,8 @@
}
if (!fastcmp<strncmp>(xsdcCriterion.getName().c_str(), kXsdcForceConfigForUse,
strlen(kXsdcForceConfigForUse))) {
- return AudioHalCapCriterionV2::make<Tag::forceConfigForUse>(
- VALUE_OR_RETURN(convertForceUseCriterionToAidl(xsdcCriterion.getName())),
- VALUE_OR_RETURN(convertForcedConfigsToAidl(xsdcCriterionType)));
+ return AudioHalCapCriterionV2::make<Tag::forceConfigForUse>(VALUE_OR_RETURN(
+ convertForceUseConfigsToAidl(xsdcCriterion.getName(), xsdcCriterionType)));
}
LOG(ERROR) << __func__ << " unrecognized criterion " << xsdcCriterion.getName();
return unexpected(BAD_VALUE);