From b449cdb22869db36882c6c2b094a7b9315a839bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Gaffie?= Date: Fri, 13 Dec 2019 13:31:36 -0800 Subject: [PATCH] audio: Add VTS for configurable engine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds VTS tests for engine configuration. Test: atest VtsHalAudioPolicyV1_0TargetTest Bug: 141989952 Change-Id: Ied37edc5bba29ef461f6b68fa21781d5721b75bf Merged-In: Ied37edc5bba29ef461f6b68fa21781d5721b75bf Signed-off-by: François Gaffie Signed-off-by: Mikhail Naganov --- audio/policy/1.0/vts/OWNERS | 2 + audio/policy/1.0/vts/functional/Android.bp | 31 ++ .../ValidateEngineConfiguration.cpp | 38 ++ .../VtsHalAudioPolicyV1_0TargetTest.xml | 36 ++ audio/policy/1.0/xml/Android.bp | 5 + audio/policy/1.0/xml/api/current.txt | 294 +++++++++++++ audio/policy/1.0/xml/api/last_current.txt | 0 audio/policy/1.0/xml/api/last_removed.txt | 0 audio/policy/1.0/xml/api/removed.txt | 1 + .../xml/audio_policy_engine_configuration.xsd | 400 ++++++++++++++++++ 10 files changed, 807 insertions(+) create mode 100644 audio/policy/1.0/vts/OWNERS create mode 100644 audio/policy/1.0/vts/functional/Android.bp create mode 100644 audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp create mode 100644 audio/policy/1.0/vts/functional/VtsHalAudioPolicyV1_0TargetTest.xml create mode 100644 audio/policy/1.0/xml/Android.bp create mode 100644 audio/policy/1.0/xml/api/current.txt create mode 100644 audio/policy/1.0/xml/api/last_current.txt create mode 100644 audio/policy/1.0/xml/api/last_removed.txt create mode 100644 audio/policy/1.0/xml/api/removed.txt create mode 100644 audio/policy/1.0/xml/audio_policy_engine_configuration.xsd diff --git a/audio/policy/1.0/vts/OWNERS b/audio/policy/1.0/vts/OWNERS new file mode 100644 index 0000000000..24071af220 --- /dev/null +++ b/audio/policy/1.0/vts/OWNERS @@ -0,0 +1,2 @@ +elaurent@google.com +mnaganov@google.com diff --git a/audio/policy/1.0/vts/functional/Android.bp b/audio/policy/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..f668a25fcf --- /dev/null +++ b/audio/policy/1.0/vts/functional/Android.bp @@ -0,0 +1,31 @@ +cc_test { + name: "VtsHalAudioPolicyV1_0TargetTest", + defaults: ["vts_target_tests_defaults"], + srcs: [ + "ValidateEngineConfiguration.cpp", + ], + static_libs: [ + "android.hardware.audio.common.test.utility", + "libxml2", + "liblog", + ], + // Use test_config for vts-core suite. + // TODO(b/146104851): Add auto-gen rules and remove it. + test_config: "VtsHalAudioPolicyV1_0TargetTest.xml", + cflags: [ + "-DXSD_DIR=\"/data/local/tmp\"", + "-Wall", + "-Werror", + "-Wno-unused-function", + "-O0", + "-g", + ], + data: [ + ":audio_policy_engine_conf_V1_0", + ], + gtest: true, + test_suites: [ + "general-tests", + "vts-core", + ], +} diff --git a/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp b/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp new file mode 100644 index 0000000000..1eb39f95c0 --- /dev/null +++ b/audio/policy/1.0/vts/functional/ValidateEngineConfiguration.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2019 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 "utility/ValidateXml.h" + +static const std::vector locations = {"/odm/etc", "/vendor/etc", "/system/etc"}; +static const std::string config = "audio_policy_engine_configuration.xml"; +static const std::string schema = + std::string(XSD_DIR) + "/audio_policy_engine_configuration_V1_0.xsd"; + +/** + * @brief TEST to ensure the audio policy engine configuration file is validating schemas. + * Note: this configuration file is not mandatory, an hardcoded fallback is provided, so + * it does not fail if not found. + */ +TEST(ValidateConfiguration, audioPolicyEngineConfiguration) { + RecordProperty("description", + "Verify that the audio policy engine configuration file " + "is valid according to the schemas"); + EXPECT_VALID_XML_MULTIPLE_LOCATIONS(config.c_str(), locations, schema.c_str()); +} diff --git a/audio/policy/1.0/vts/functional/VtsHalAudioPolicyV1_0TargetTest.xml b/audio/policy/1.0/vts/functional/VtsHalAudioPolicyV1_0TargetTest.xml new file mode 100644 index 0000000000..4318e926e3 --- /dev/null +++ b/audio/policy/1.0/vts/functional/VtsHalAudioPolicyV1_0TargetTest.xml @@ -0,0 +1,36 @@ + + + + diff --git a/audio/policy/1.0/xml/Android.bp b/audio/policy/1.0/xml/Android.bp new file mode 100644 index 0000000000..6da7b5a3e5 --- /dev/null +++ b/audio/policy/1.0/xml/Android.bp @@ -0,0 +1,5 @@ +xsd_config { + name: "audio_policy_engine_conf_V1_0", + srcs: ["audio_policy_engine_configuration.xsd"], + package_name: "audio.policy.V1_0", +} diff --git a/audio/policy/1.0/xml/api/current.txt b/audio/policy/1.0/xml/api/current.txt new file mode 100644 index 0000000000..ccbc828c37 --- /dev/null +++ b/audio/policy/1.0/xml/api/current.txt @@ -0,0 +1,294 @@ +// Signature format: 2.0 +package audio.policy.V1_0 { + + public class AttributesGroup { + ctor public AttributesGroup(); + method public java.util.List getAttributes_optional(); + method public audio.policy.V1_0.BundleType getBundle_optional(); + method public audio.policy.V1_0.ContentTypeType getContentType_optional(); + method public audio.policy.V1_0.FlagsType getFlags_optional(); + method public audio.policy.V1_0.SourceType getSource_optional(); + method public audio.policy.V1_0.Stream getStreamType(); + method public audio.policy.V1_0.UsageType getUsage_optional(); + method public String getVolumeGroup(); + method public void setBundle_optional(audio.policy.V1_0.BundleType); + method public void setContentType_optional(audio.policy.V1_0.ContentTypeType); + method public void setFlags_optional(audio.policy.V1_0.FlagsType); + method public void setSource_optional(audio.policy.V1_0.SourceType); + method public void setStreamType(audio.policy.V1_0.Stream); + method public void setUsage_optional(audio.policy.V1_0.UsageType); + method public void setVolumeGroup(String); + } + + public class AttributesRef { + ctor public AttributesRef(); + method public java.util.List getReference(); + } + + public class AttributesRefType { + ctor public AttributesRefType(); + method public audio.policy.V1_0.AttributesType getAttributes(); + method public String getName(); + method public void setAttributes(audio.policy.V1_0.AttributesType); + method public void setName(String); + } + + public class AttributesType { + ctor public AttributesType(); + method public String getAttributesRef(); + method public audio.policy.V1_0.BundleType getBundle(); + method public audio.policy.V1_0.ContentTypeType getContentType(); + method public audio.policy.V1_0.FlagsType getFlags(); + method public audio.policy.V1_0.SourceType getSource(); + method public audio.policy.V1_0.UsageType getUsage(); + method public void setAttributesRef(String); + method public void setBundle(audio.policy.V1_0.BundleType); + method public void setContentType(audio.policy.V1_0.ContentTypeType); + method public void setFlags(audio.policy.V1_0.FlagsType); + method public void setSource(audio.policy.V1_0.SourceType); + method public void setUsage(audio.policy.V1_0.UsageType); + } + + public class BundleType { + ctor public BundleType(); + method public String getKey(); + method public String getValue(); + method public void setKey(String); + method public void setValue(String); + } + + public class Configuration { + ctor public Configuration(); + method public java.util.List getAttributesRef(); + method public java.util.List getCriteria(); + method public java.util.List getCriterion_types(); + method public java.util.List getProductStrategies(); + method public audio.policy.V1_0.Version getVersion(); + method public java.util.List getVolumeGroups(); + method public java.util.List getVolumes(); + method public void setVersion(audio.policy.V1_0.Version); + } + + public enum ContentType { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.ContentType AUDIO_CONTENT_TYPE_MOVIE; + enum_constant public static final audio.policy.V1_0.ContentType AUDIO_CONTENT_TYPE_MUSIC; + enum_constant public static final audio.policy.V1_0.ContentType AUDIO_CONTENT_TYPE_SONIFICATION; + enum_constant public static final audio.policy.V1_0.ContentType AUDIO_CONTENT_TYPE_SPEECH; + enum_constant public static final audio.policy.V1_0.ContentType AUDIO_CONTENT_TYPE_UNKNOWN; + } + + public class ContentTypeType { + ctor public ContentTypeType(); + method public audio.policy.V1_0.ContentType getValue(); + method public void setValue(audio.policy.V1_0.ContentType); + } + + public class CriteriaType { + ctor public CriteriaType(); + method public java.util.List getCriterion(); + } + + public class CriterionType { + ctor public CriterionType(); + method public String getName(); + method public String getType(); + method public String get_default(); + method public void setName(String); + method public void setType(String); + method public void set_default(String); + } + + public class CriterionTypeType { + ctor public CriterionTypeType(); + method public String getName(); + method public audio.policy.V1_0.PfwCriterionTypeEnum getType(); + method public audio.policy.V1_0.ValuesType getValues(); + method public void setName(String); + method public void setType(audio.policy.V1_0.PfwCriterionTypeEnum); + method public void setValues(audio.policy.V1_0.ValuesType); + } + + public class CriterionTypesType { + ctor public CriterionTypesType(); + method public java.util.List getCriterion_type(); + } + + public enum DeviceCategory { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.DeviceCategory DEVICE_CATEGORY_EARPIECE; + enum_constant public static final audio.policy.V1_0.DeviceCategory DEVICE_CATEGORY_EXT_MEDIA; + enum_constant public static final audio.policy.V1_0.DeviceCategory DEVICE_CATEGORY_HEADSET; + enum_constant public static final audio.policy.V1_0.DeviceCategory DEVICE_CATEGORY_HEARING_AID; + enum_constant public static final audio.policy.V1_0.DeviceCategory DEVICE_CATEGORY_SPEAKER; + } + + public enum FlagType { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_AUDIBILITY_ENFORCED; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_BEACON; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_BYPASS_MUTE; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_DEEP_BUFFER; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_HW_AV_SYNC; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_HW_HOTWORD; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_LOW_LATENCY; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_MUTE_HAPTIC; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_NONE; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_NO_MEDIA_PROJECTION; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_NO_SYSTEM_CAPTURE; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_SCO; + enum_constant public static final audio.policy.V1_0.FlagType AUDIO_FLAG_SECURE; + } + + public class FlagsType { + ctor public FlagsType(); + method public java.util.List getValue(); + method public void setValue(java.util.List); + } + + public enum PfwCriterionTypeEnum { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.PfwCriterionTypeEnum exclusive; + enum_constant public static final audio.policy.V1_0.PfwCriterionTypeEnum inclusive; + } + + public class ProductStrategies { + ctor public ProductStrategies(); + method public java.util.List getProductStrategy(); + } + + public static class ProductStrategies.ProductStrategy { + ctor public ProductStrategies.ProductStrategy(); + method public java.util.List getAttributesGroup(); + method public String getName(); + method public void setName(String); + } + + public enum SourceEnumType { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_CAMCORDER; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_DEFAULT; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_ECHO_REFERENCE; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_FM_TUNER; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_MIC; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_REMOTE_SUBMIX; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_UNPROCESSED; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_CALL; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_COMMUNICATION; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_DOWNLINK; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_PERFORMANCE; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_RECOGNITION; + enum_constant public static final audio.policy.V1_0.SourceEnumType AUDIO_SOURCE_VOICE_UPLINK; + } + + public class SourceType { + ctor public SourceType(); + method public audio.policy.V1_0.SourceEnumType getValue(); + method public void setValue(audio.policy.V1_0.SourceEnumType); + } + + public enum Stream { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_ACCESSIBILITY; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_ALARM; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_ASSISTANT; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_BLUETOOTH_SCO; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_DEFAULT; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_DTMF; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_ENFORCED_AUDIBLE; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_MUSIC; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_NOTIFICATION; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_RING; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_SYSTEM; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_TTS; + enum_constant public static final audio.policy.V1_0.Stream AUDIO_STREAM_VOICE_CALL; + } + + public enum UsageEnumType { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_ALARM; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_ASSISTANCE_SONIFICATION; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_ASSISTANT; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_GAME; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_MEDIA; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_NOTIFICATION; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_UNKNOWN; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_VIRTUAL_SOURCE; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION; + enum_constant public static final audio.policy.V1_0.UsageEnumType AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING; + } + + public class UsageType { + ctor public UsageType(); + method public audio.policy.V1_0.UsageEnumType getValue(); + method public void setValue(audio.policy.V1_0.UsageEnumType); + } + + public class ValueType { + ctor public ValueType(); + method public String getLiteral(); + method public int getNumerical(); + method public void setLiteral(String); + method public void setNumerical(int); + } + + public class ValuesType { + ctor public ValuesType(); + method public java.util.List getValue(); + } + + public enum Version { + method public String getRawName(); + enum_constant public static final audio.policy.V1_0.Version _1_0; + } + + public class Volume { + ctor public Volume(); + method public audio.policy.V1_0.DeviceCategory getDeviceCategory(); + method public java.util.List getPoint(); + method public String getRef(); + method public void setDeviceCategory(audio.policy.V1_0.DeviceCategory); + method public void setRef(String); + } + + public class VolumeGroupsType { + ctor public VolumeGroupsType(); + method public java.util.List getVolumeGroup(); + } + + public static class VolumeGroupsType.VolumeGroup { + ctor public VolumeGroupsType.VolumeGroup(); + method public int getIndexMax(); + method public int getIndexMin(); + method public String getName(); + method public java.util.List getVolume(); + method public void setIndexMax(int); + method public void setIndexMin(int); + method public void setName(String); + } + + public class VolumeRef { + ctor public VolumeRef(); + method public String getName(); + method public java.util.List getPoint(); + method public void setName(String); + } + + public class VolumesType { + ctor public VolumesType(); + method public java.util.List getReference(); + } + + public class XmlParser { + ctor public XmlParser(); + method public static audio.policy.V1_0.Configuration read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + } + +} + diff --git a/audio/policy/1.0/xml/api/last_current.txt b/audio/policy/1.0/xml/api/last_current.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/audio/policy/1.0/xml/api/last_removed.txt b/audio/policy/1.0/xml/api/last_removed.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/audio/policy/1.0/xml/api/removed.txt b/audio/policy/1.0/xml/api/removed.txt new file mode 100644 index 0000000000..d802177e24 --- /dev/null +++ b/audio/policy/1.0/xml/api/removed.txt @@ -0,0 +1 @@ +// Signature format: 2.0 diff --git a/audio/policy/1.0/xml/audio_policy_engine_configuration.xsd b/audio/policy/1.0/xml/audio_policy_engine_configuration.xsd new file mode 100644 index 0000000000..a23d9a8049 --- /dev/null +++ b/audio/policy/1.0/xml/audio_policy_engine_configuration.xsd @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Volume section defines a volume curve for a given use case and device category. + It contains a list of points of this curve expressing the attenuation in Millibels + for a given volume index from 0 to 100. + + 0,-9600 + 100,0 + + + It may also reference a reference/@name to avoid duplicating curves. + + + 0,-9600 + 100,0 + + + + + + + + + + + + + + + + + + + + + Comma separated pair of number. + The fist one is the framework level (between 0 and 100). + The second one is the volume to send to the HAL. + The framework will interpolate volumes not specified. + Their MUST be at least 2 points specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +