audio: Add VTS for configurable engine

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 <francois.gaffie@renault.com>
Signed-off-by: Mikhail Naganov <mnaganov@google.com>
This commit is contained in:
François Gaffie 2019-12-13 13:31:36 -08:00 committed by Mikhail Naganov
parent f282171776
commit b449cdb228
10 changed files with 807 additions and 0 deletions

View file

@ -0,0 +1,2 @@
elaurent@google.com
mnaganov@google.com

View file

@ -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",
],
}

View file

@ -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 <gtest/gtest.h>
#include <unistd.h>
#include <string>
#include "utility/ValidateXml.h"
static const std::vector<const char*> 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());
}

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2020 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.
-->
<configuration description="Runs VtsHalAudioPolicyV1_0TargetTest.">
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-native" />
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
<option name="cleanup" value="true" />
<option name="push" value="VtsHalAudioPolicyV1_0TargetTest->/data/local/tmp/VtsHalAudioPolicyV1_0TargetTest" />
<option name="push" value="audio_policy_engine_conf_V1_0.xsd->/data/local/tmp/audio_policy_engine_configuration_V1_0.xsd" />
</target_preparer>
<test class="com.android.tradefed.testtype.GTest" >
<option name="native-test-device-path" value="/data/local/tmp" />
<option name="module-name" value="VtsHalAudioPolicyV1_0TargetTest" />
</test>
</configuration>

View file

@ -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",
}

View file

@ -0,0 +1,294 @@
// Signature format: 2.0
package audio.policy.V1_0 {
public class AttributesGroup {
ctor public AttributesGroup();
method public java.util.List<audio.policy.V1_0.AttributesType> 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<audio.policy.V1_0.AttributesRefType> 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<audio.policy.V1_0.AttributesRef> getAttributesRef();
method public java.util.List<audio.policy.V1_0.CriteriaType> getCriteria();
method public java.util.List<audio.policy.V1_0.CriterionTypesType> getCriterion_types();
method public java.util.List<audio.policy.V1_0.ProductStrategies> getProductStrategies();
method public audio.policy.V1_0.Version getVersion();
method public java.util.List<audio.policy.V1_0.VolumeGroupsType> getVolumeGroups();
method public java.util.List<audio.policy.V1_0.VolumesType> 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<audio.policy.V1_0.CriterionType> 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<audio.policy.V1_0.CriterionTypeType> 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<audio.policy.V1_0.FlagType> getValue();
method public void setValue(java.util.List<audio.policy.V1_0.FlagType>);
}
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<audio.policy.V1_0.ProductStrategies.ProductStrategy> getProductStrategy();
}
public static class ProductStrategies.ProductStrategy {
ctor public ProductStrategies.ProductStrategy();
method public java.util.List<audio.policy.V1_0.AttributesGroup> 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<audio.policy.V1_0.ValueType> 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<java.lang.String> 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<audio.policy.V1_0.VolumeGroupsType.VolumeGroup> 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<audio.policy.V1_0.Volume> 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<java.lang.String> getPoint();
method public void setName(String);
}
public class VolumesType {
ctor public VolumesType();
method public java.util.List<audio.policy.V1_0.VolumeRef> 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;
}
}

View file

@ -0,0 +1 @@
// Signature format: 2.0

View file

@ -0,0 +1,400 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 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.
-->
<xs:schema version="2.0"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- List the config versions supported by audio policy engine. -->
<xs:simpleType name="version">
<xs:restriction base="xs:decimal">
<xs:enumeration value="1.0"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="configuration">
<xs:complexType>
<xs:sequence>
<xs:element name="ProductStrategies" type="ProductStrategies" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="criterion_types" type="criterionTypesType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="criteria" type="criteriaType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="volumeGroups" type="volumeGroupsType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="volumes" type="volumesType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="attributesRef" type="attributesRef" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="version" type="version" use="required"/>
</xs:complexType>
<xs:key name="volumeCurveNameKey">
<xs:selector xpath="volumes/reference"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="volumeCurveRef" refer="volumeCurveNameKey">
<xs:selector xpath="volumeGroups/volumeGroup"/>
<xs:field xpath="@ref"/>
</xs:keyref>
<xs:key name="attributesRefNameKey">
<xs:selector xpath="attributesRef/reference"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="volumeGroupAttributesRef" refer="attributesRefNameKey">
<xs:selector xpath="volumeGroups/volumeGroup/volume"/>
<xs:field xpath="@attributesRef"/>
</xs:keyref>
<xs:keyref name="ProductStrategyAttributesRef" refer="attributesRefNameKey">
<xs:selector xpath="ProductStrategies/ProductStrategy/Attributes"/>
<xs:field xpath="@attributesRef"/>
</xs:keyref>
<xs:unique name="productStrategyNameUniqueness">
<xs:selector xpath="ProductStrategies/ProductStrategy"/>
<xs:field xpath="@name"/>
</xs:unique>
<!-- ensure validity of volume group referred in product strategy-->
<xs:key name="volumeGroupKey">
<xs:selector xpath="volumeGroups/volumeGroup/name"/>
<xs:field xpath="."/>
</xs:key>
<xs:keyref name="volumeGroupRef" refer="volumeGroupKey">
<xs:selector xpath="ProductStrategies/ProductStrategy/AttributesGroup"/>
<xs:field xpath="@volumeGroup"/>
</xs:keyref>
<xs:unique name="volumeTargetUniqueness">
<xs:selector xpath="volumeGroups/volumeGroup"/>
<xs:field xpath="@name"/>
<xs:field xpath="@deviceCategory"/>
</xs:unique>
<!-- ensure validity of criterion type referred in criterion-->
<xs:key name="criterionTypeKey">
<xs:selector xpath="criterion_types/criterion_type"/>
<xs:field xpath="@name"/>
</xs:key>
<xs:keyref name="criterionTypeKeyRef" refer="criterionTypeKey">
<xs:selector xpath="criteria/criterion"/>
<xs:field xpath="@type"/>
</xs:keyref>
</xs:element>
<xs:complexType name="ProductStrategies">
<xs:annotation>
<xs:documentation xml:lang="en">
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="ProductStrategy" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="AttributesGroup" type="AttributesGroup" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AttributesGroup">
<xs:sequence>
<xs:choice minOccurs="0">
<xs:element name="Attributes" type="AttributesType" minOccurs="1" maxOccurs="unbounded"/>
<xs:sequence>
<xs:element name="ContentType" type="ContentTypeType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Usage" type="UsageType" minOccurs="1" maxOccurs="1"/>
<xs:element name="Source" type="SourceType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Flags" type="FlagsType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Bundle" type="BundleType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
<xs:attribute name="streamType" type="stream" use="optional"/>
<xs:attribute name="volumeGroup" type="xs:string" use="optional"/>
</xs:complexType>
<xs:complexType name="volumeGroupsType">
<xs:sequence>
<xs:element name="volumeGroup" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:token"/>
<xs:element name="indexMin" type="xs:int" minOccurs="0" maxOccurs="1"/>
<xs:element name="indexMax" type="xs:int" minOccurs="0" maxOccurs="1"/>
<xs:element name="volume" type="volume" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="volumeAttributesUniqueness">
<xs:selector xpath="volume"/>
<xs:field xpath="deviceCategory"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="volumesType">
<xs:sequence>
<xs:element name="reference" type="volumeRef" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="attributesRef">
<xs:sequence>
<xs:element name="reference" type="attributesRefType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="criteriaType">
<xs:sequence>
<xs:element name="criterion" type="criterionType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="criterionType">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="default" type="xs:string" use="optional"/>
</xs:complexType>
<xs:complexType name="criterionTypesType">
<xs:sequence>
<xs:element name="criterion_type" type="criterionTypeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="criterionTypeType">
<xs:sequence>
<xs:element name="values" type="valuesType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" type="xs:token" use="required"/>
<xs:attribute name="type" type="pfwCriterionTypeEnum" use="required"/>
</xs:complexType>
<xs:complexType name="valuesType">
<xs:sequence>
<xs:element name="value" type="valueType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="valueType">
<xs:attribute name="literal" type="xs:string" use="required"/>
<xs:attribute name="numerical" type="xs:int" use="required"/>
</xs:complexType>
<xs:complexType name="attributesRefType">
<xs:sequence>
<xs:element name="Attributes" type="AttributesType" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" type="xs:token" use="required"/>
</xs:complexType>
<xs:complexType name="AttributesType">
<xs:sequence>
<xs:element name="ContentType" type="ContentTypeType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Usage" type="UsageType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Source" type="SourceType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Flags" type="FlagsType" minOccurs="0" maxOccurs="1"/>
<xs:element name="Bundle" type="BundleType" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="attributesRef" type="xs:token" use="optional"/>
<!-- with xsd 1.1, it is impossible to make choice on either attributes or element...-->
</xs:complexType>
<xs:complexType name="ContentTypeType">
<xs:attribute name="value" type="contentType" use="required"/>
</xs:complexType>
<xs:complexType name="UsageType">
<xs:attribute name="value" type="usageEnumType" use="required"/>
</xs:complexType>
<xs:complexType name="SourceType">
<xs:attribute name="value" type="sourceEnumType" use="required"/>
</xs:complexType>
<xs:complexType name="FlagsType">
<xs:attribute name="value" type="flagsEnumType" use="required"/>
</xs:complexType>
<xs:complexType name="BundleType">
<xs:attribute name="key" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="volume">
<xs:annotation>
<xs:documentation xml:lang="en">
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.
<volume deviceCategory="DEVICE_CATEGORY_SPEAKER">
<point>0,-9600</point>
<point>100,0</point>
</volume>
It may also reference a reference/@name to avoid duplicating curves.
<volume deviceCategory="DEVICE_CATEGORY_SPEAKER" ref="DEFAULT_MEDIA_VOLUME_CURVE"/>
<reference name="DEFAULT_MEDIA_VOLUME_CURVE">
<point>0,-9600</point>
<point>100,0</point>
</reference>
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="point" type="volumePoint" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="deviceCategory" type="deviceCategory"/>
<xs:attribute name="ref" type="xs:token" use="optional"/>
</xs:complexType>
<xs:complexType name="volumeRef">
<xs:sequence>
<xs:element name="point" type="volumePoint" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:token" use="required"/>
</xs:complexType>
<xs:simpleType name="volumePoint">
<xs:annotation>
<xs:documentation xml:lang="en">
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="([0-9]{1,2}|100),-?[0-9]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="streamsCsv">
<xs:list>
<xs:simpleType>
<xs:restriction base="stream">
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
<!-- Enum values of audio_stream_type_t in audio-base.h
TODO: avoid manual sync. -->
<xs:simpleType name="stream">
<xs:restriction base="xs:NMTOKEN">
<!--xs:pattern value="\c+(,\c+)*"/-->
<xs:enumeration value="AUDIO_STREAM_DEFAULT"/>
<xs:enumeration value="AUDIO_STREAM_VOICE_CALL"/>
<xs:enumeration value="AUDIO_STREAM_SYSTEM"/>
<xs:enumeration value="AUDIO_STREAM_RING"/>
<xs:enumeration value="AUDIO_STREAM_MUSIC"/>
<xs:enumeration value="AUDIO_STREAM_ALARM"/>
<xs:enumeration value="AUDIO_STREAM_NOTIFICATION"/>
<xs:enumeration value="AUDIO_STREAM_BLUETOOTH_SCO"/>
<xs:enumeration value="AUDIO_STREAM_ENFORCED_AUDIBLE"/>
<xs:enumeration value="AUDIO_STREAM_DTMF"/>
<xs:enumeration value="AUDIO_STREAM_TTS"/>
<xs:enumeration value="AUDIO_STREAM_ACCESSIBILITY"/>
<xs:enumeration value="AUDIO_STREAM_ASSISTANT"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="deviceCategory">
<xs:restriction base="xs:string">
<xs:enumeration value="DEVICE_CATEGORY_HEADSET"/>
<xs:enumeration value="DEVICE_CATEGORY_SPEAKER"/>
<xs:enumeration value="DEVICE_CATEGORY_EARPIECE"/>
<xs:enumeration value="DEVICE_CATEGORY_EXT_MEDIA"/>
<xs:enumeration value="DEVICE_CATEGORY_HEARING_AID"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="contentType">
<xs:restriction base="xs:string">
<xs:enumeration value="AUDIO_CONTENT_TYPE_UNKNOWN"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_SPEECH"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_MUSIC"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_MOVIE"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_SONIFICATION"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="usageEnumType">
<xs:restriction base="xs:string">
<xs:enumeration value="AUDIO_USAGE_UNKNOWN"/>
<xs:enumeration value="AUDIO_USAGE_MEDIA"/>
<xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION"/>
<xs:enumeration value="AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING"/>
<xs:enumeration value="AUDIO_USAGE_ALARM"/>
<xs:enumeration value="AUDIO_USAGE_NOTIFICATION"/>
<xs:enumeration value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE"/>
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY"/>
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"/>
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_SONIFICATION"/>
<xs:enumeration value="AUDIO_USAGE_GAME"/>
<xs:enumeration value="AUDIO_USAGE_VIRTUAL_SOURCE"/>
<xs:enumeration value="AUDIO_USAGE_ASSISTANT"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="flagsEnumType">
<xs:list>
<xs:simpleType>
<xs:restriction base="flagType">
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>
<xs:simpleType name="flagType">
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="AUDIO_FLAG_NONE"/>
<xs:enumeration value="AUDIO_FLAG_AUDIBILITY_ENFORCED"/>
<xs:enumeration value="AUDIO_FLAG_SECURE"/>
<xs:enumeration value="AUDIO_FLAG_SCO"/>
<xs:enumeration value="AUDIO_FLAG_BEACON"/>
<xs:enumeration value="AUDIO_FLAG_HW_AV_SYNC"/>
<xs:enumeration value="AUDIO_FLAG_HW_HOTWORD"/>
<xs:enumeration value="AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY"/>
<xs:enumeration value="AUDIO_FLAG_BYPASS_MUTE"/>
<xs:enumeration value="AUDIO_FLAG_LOW_LATENCY"/>
<xs:enumeration value="AUDIO_FLAG_DEEP_BUFFER"/>
<xs:enumeration value="AUDIO_FLAG_NO_MEDIA_PROJECTION"/>
<xs:enumeration value="AUDIO_FLAG_MUTE_HAPTIC"/>
<xs:enumeration value="AUDIO_FLAG_NO_SYSTEM_CAPTURE"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sourceEnumType">
<xs:restriction base="xs:string">
<xs:enumeration value="AUDIO_SOURCE_DEFAULT"/>
<xs:enumeration value="AUDIO_SOURCE_MIC"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_UPLINK"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_DOWNLINK"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_CALL"/>
<xs:enumeration value="AUDIO_SOURCE_CAMCORDER"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_RECOGNITION"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_COMMUNICATION"/>
<xs:enumeration value="AUDIO_SOURCE_REMOTE_SUBMIX"/>
<xs:enumeration value="AUDIO_SOURCE_UNPROCESSED"/>
<xs:enumeration value="AUDIO_SOURCE_VOICE_PERFORMANCE"/>
<xs:enumeration value="AUDIO_SOURCE_ECHO_REFERENCE"/>
<xs:enumeration value="AUDIO_SOURCE_FM_TUNER"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="pfwCriterionTypeEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="inclusive"/>
<xs:enumeration value="exclusive"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>