summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorFrançois Gaffie <francois.gaffie@intel.com>2015-03-24 09:01:14 +0100
committerEric Laurent <elaurent@google.com>2015-04-24 14:57:55 -0700
commit65c3781db3443531deacecfbda5c7e7e82868a34 (patch)
tree5560072d1f61a9d76e437ef311ef282976fc253d /services
parent21db57282da8b3daba1549f3a8e41c4fbaf80059 (diff)
downloadframeworks_av-65c3781db3443531deacecfbda5c7e7e82868a34.zip
frameworks_av-65c3781db3443531deacecfbda5c7e7e82868a34.tar.gz
frameworks_av-65c3781db3443531deacecfbda5c7e7e82868a34.tar.bz2
Add a configurable version of the policy engine based on PFW
This patch adds a configurable version of the policy engine based on the parameter framework. This configurable engine shall be activated with a flag USE_CONFIGURABLE_AUDIO_POLICY within BoardConfig.mk This patch provides the generic configuration as an example. This configuration provides the same user experience as the default policy engine. Change-Id: Ic8217333ae370b89bfdd2ad11320c5f14ea4da34 Signed-off-by: François Gaffie <francois.gaffie@intel.com>
Diffstat (limited to 'services')
-rw-r--r--services/audiopolicy/Android.mk15
-rwxr-xr-xservices/audiopolicy/engine/interface/AudioPolicyManagerInterface.h4
-rwxr-xr-xservices/audiopolicy/engineconfigurable/Android.mk59
-rwxr-xr-xservices/audiopolicy/engineconfigurable/include/AudioPolicyEngineInstance.h81
-rwxr-xr-xservices/audiopolicy/engineconfigurable/include/EngineDefinition.h22
-rwxr-xr-xservices/audiopolicy/engineconfigurable/interface/AudioPolicyPluginInterface.h147
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/Android.mk7
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Android.mk104
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/ParameterFrameworkConfigurationPolicy.xml15
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/README.md11
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_input_source.pfw515
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_accessibility.pfw302
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_dtmf.pfw637
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_enforced_audible.pfw358
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_media.pfw331
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_phone.pfw485
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_rerouting.pfw297
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification.pfw485
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification_respectful.pfw545
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_transmitted_through_speaker.pfw40
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_stream.pfw20
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_usage.pfw39
-rw-r--r--services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/volumes.pfw545
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicyClass.xml5
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-CommonTypes.xml170
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-Volume.xml26
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem.xml137
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/example/policy_criteria.txt14
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Android.mk40
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.cpp53
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.h49
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicyMappingKeys.h32
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp105
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.h60
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystemBuilder.cpp29
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.cpp54
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.h49
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.cpp56
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.h49
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.cpp56
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.h49
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.cpp75
-rwxr-xr-xservices/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.h64
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Collection.h163
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Element.h99
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Engine.cpp281
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Engine.h225
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/EngineInstance.cpp63
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/InputSource.cpp69
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/InputSource.h88
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Strategy.cpp68
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Strategy.h89
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Stream.cpp158
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Stream.h115
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Usage.cpp57
-rwxr-xr-xservices/audiopolicy/engineconfigurable/src/Usage.h88
-rw-r--r--services/audiopolicy/engineconfigurable/wrapper/Android.mk42
-rwxr-xr-xservices/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp434
-rwxr-xr-xservices/audiopolicy/engineconfigurable/wrapper/audio_policy_criteria_conf.h71
-rwxr-xr-xservices/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf192
-rwxr-xr-xservices/audiopolicy/engineconfigurable/wrapper/include/ParameterManagerWrapper.h286
-rw-r--r--services/audiopolicy/utilities/Android.mk7
-rwxr-xr-xservices/audiopolicy/utilities/convert/Android.mk30
-rw-r--r--services/audiopolicy/utilities/convert/convert.h383
64 files changed, 9242 insertions, 2 deletions
diff --git a/services/audiopolicy/Android.mk b/services/audiopolicy/Android.mk
index d4ce86a..5b38e1c 100644
--- a/services/audiopolicy/Android.mk
+++ b/services/audiopolicy/Android.mk
@@ -64,8 +64,23 @@ LOCAL_SHARED_LIBRARIES := \
liblog \
libsoundtrigger
+ifeq ($(USE_CONFIGURABLE_AUDIO_POLICY), 1)
+
+LOCAL_REQUIRED_MODULES := \
+ parameter-framework.policy \
+ audio_policy_criteria.conf \
+
+LOCAL_C_INCLUDES += \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/include \
+
+LOCAL_SHARED_LIBRARIES += libaudiopolicyengineconfigurable
+
+else
+
LOCAL_SHARED_LIBRARIES += libaudiopolicyenginedefault
+endif
+
LOCAL_C_INCLUDES += \
$(TOPDIR)frameworks/av/services/audiopolicy/common/include \
$(TOPDIR)frameworks/av/services/audiopolicy/engine/interface \
diff --git a/services/audiopolicy/engine/interface/AudioPolicyManagerInterface.h b/services/audiopolicy/engine/interface/AudioPolicyManagerInterface.h
index db0573f..e73e543 100755
--- a/services/audiopolicy/engine/interface/AudioPolicyManagerInterface.h
+++ b/services/audiopolicy/engine/interface/AudioPolicyManagerInterface.h
@@ -107,8 +107,8 @@ public:
* @param[in] usage for which a configuration shall be forced.
* @param[in] config wished to be forced for the given usage.
*
- * @return NO_ERROR if the Force Use config was set correctly, error code otherwise (e.g. config not
- * allowed a given usage...)
+ * @return NO_ERROR if the Force Use config was set correctly, error code otherwise (e.g. config
+ * not allowed a given usage...)
*/
virtual status_t setForceUse(audio_policy_force_use_t usage,
audio_policy_forced_cfg_t config) = 0;
diff --git a/services/audiopolicy/engineconfigurable/Android.mk b/services/audiopolicy/engineconfigurable/Android.mk
new file mode 100755
index 0000000..0b13085
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/Android.mk
@@ -0,0 +1,59 @@
+
+LOCAL_PATH := $(call my-dir)
+
+# Component build
+#######################################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+ src/Engine.cpp \
+ src/EngineInstance.cpp \
+ src/Stream.cpp \
+ src/Strategy.cpp \
+ src/Usage.cpp \
+ src/InputSource.cpp \
+
+audio_policy_engine_includes_common := \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/include \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/interface \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engine/interface
+
+LOCAL_CFLAGS += \
+ -Wall \
+ -Werror \
+ -Wextra \
+
+LOCAL_EXPORT_C_INCLUDE_DIRS := \
+ $(audio_policy_engine_includes_common)
+
+LOCAL_C_INCLUDES := \
+ $(audio_policy_engine_includes_common) \
+ $(TARGET_OUT_HEADERS)/hw \
+ $(call include-path-for, frameworks-av) \
+ $(call include-path-for, audio-utils) \
+ $(call include-path-for, bionic) \
+ $(TOPDIR)frameworks/av/services/audiopolicy/common/include
+
+
+LOCAL_MODULE := libaudiopolicyengineconfigurable
+LOCAL_MODULE_TAGS := optional
+LOCAL_STATIC_LIBRARIES := \
+ libmedia_helper \
+ libaudiopolicypfwwrapper \
+ libaudiopolicycomponents
+
+LOCAL_SHARED_LIBRARIES += \
+ libcutils \
+ libutils \
+ libaudioutils \
+ libparameter
+
+include external/stlport/libstlport.mk
+
+include $(BUILD_SHARED_LIBRARY)
+
+#######################################################################
+# Recursive call sub-folder Android.mk
+#
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/services/audiopolicy/engineconfigurable/include/AudioPolicyEngineInstance.h b/services/audiopolicy/engineconfigurable/include/AudioPolicyEngineInstance.h
new file mode 100755
index 0000000..6c4be2c
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/include/AudioPolicyEngineInstance.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+class AudioPolicyManagerInterface;
+class AudioPolicyPluginInterface;
+
+namespace android
+{
+namespace audio_policy
+{
+
+class Engine;
+
+class EngineInstance
+{
+protected:
+ EngineInstance();
+
+public:
+ virtual ~EngineInstance();
+
+ /**
+ * Get Audio Policy Engine instance.
+ *
+ * @return pointer to Route Manager Instance object.
+ */
+ static EngineInstance *getInstance();
+
+ /**
+ * Interface query.
+ * The first client of an interface of the policy engine will start the singleton.
+ *
+ * @tparam RequestedInterface: interface that the client is wishing to retrieve.
+ *
+ * @return interface handle.
+ */
+ template <class RequestedInterface>
+ RequestedInterface *queryInterface() const;
+
+protected:
+ /**
+ * Get Audio Policy Engine instance.
+ *
+ * @return Audio Policy Engine singleton.
+ */
+ Engine *getEngine() const;
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ EngineInstance(const EngineInstance &object);
+ EngineInstance &operator=(const EngineInstance &object);
+};
+
+/**
+ * Limit template instantation to supported type interfaces.
+ * Compile time error will claim if invalid interface is requested.
+ */
+template <>
+AudioPolicyManagerInterface *EngineInstance::queryInterface() const;
+
+template <>
+AudioPolicyPluginInterface *EngineInstance::queryInterface() const;
+
+}; // namespace audio_policy
+
+}; // namespace android
diff --git a/services/audiopolicy/engineconfigurable/include/EngineDefinition.h b/services/audiopolicy/engineconfigurable/include/EngineDefinition.h
new file mode 100755
index 0000000..54d8db5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/include/EngineDefinition.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <Volume.h>
+#include <vector>
+
+typedef std::vector<VolumeCurvePoint> VolumeCurvePoints;
diff --git a/services/audiopolicy/engineconfigurable/interface/AudioPolicyPluginInterface.h b/services/audiopolicy/engineconfigurable/interface/AudioPolicyPluginInterface.h
new file mode 100755
index 0000000..74daba5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/interface/AudioPolicyPluginInterface.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <RoutingStrategy.h>
+#include <EngineDefinition.h>
+#include <Volume.h>
+#include <system/audio.h>
+#include <utils/Errors.h>
+#include <string>
+#include <vector>
+
+namespace android {
+
+/**
+ * This interface allows the parameter plugin to:
+ * - instantiate all the members of the policy engine (strategies, input sources, usages, profiles)
+ * - keep up to date the attributes of these policy members ( i.e. devices to be used for a
+ * strategy, strategy to be followed by a usage or a stream, ...)
+ */
+class AudioPolicyPluginInterface
+{
+public:
+ /**
+ * Add a strategy to the engine
+ *
+ * @param[in] name of the strategy to add
+ * @param[in] identifier: the numerical value associated to this member. It MUST match either
+ * system/audio.h or system/audio_policy.h enumration value in order to link the
+ * parameter controled by the PFW and the policy manager component.
+ *
+ * @return NO_ERROR if the strategy has been added successfully, error code otherwise.
+ *
+ */
+ virtual android::status_t addStrategy(const std::string &name, routing_strategy id) = 0;
+
+ /**
+ * Add a streams to the engine.
+ *
+ * @param[in] name of the stream to add
+ * @param[in] identifier: the numerical value associated to this member. It MUST match either
+ * system/audio.h or system/audio_policy.h enumration value in order to link the
+ * parameter controled by the PFW and the policy manager component.
+ *
+ * @return NO_ERROR if the stream has been added successfully, error code otherwise.
+ *
+ */
+ virtual android::status_t addStream(const std::string &name, audio_stream_type_t id) = 0;
+
+ /**
+ * Add a usage to the engine
+ *
+ * @param[in] name of the usage to add
+ * @param[in] identifier: the numerical value associated to this member. It MUST match either
+ * system/audio.h or system/audio_policy.h enumration value in order to link the
+ * parameter controled by the PFW and the policy manager component.
+ *
+ * @return NO_ERROR if the usage has been added successfully, error code otherwise.
+ *
+ */
+ virtual android::status_t addUsage(const std::string &name, audio_usage_t id) = 0;
+
+ /**
+ * Add an input source to the engine
+ *
+ * @param[in] name of the input source to add
+ * @param[in] identifier: the numerical value associated to this member. It MUST match either
+ * system/audio.h or system/audio_policy.h enumration value in order to link the
+ * parameter controled by the PFW and the policy manager component.
+ *
+ * @return NO_ERROR if the input source has been added successfully, error code otherwise.
+ *
+ */
+ virtual android::status_t addInputSource(const std::string &name, audio_source_t id) = 0;
+
+ /**
+ * Set the device to be used by a strategy.
+ *
+ * @param[in] strategy: name of the strategy for which the device to use has to be set
+ * @param[in] devices; mask of devices to be used for the given strategy.
+ *
+ * @return true if the devices were set correclty for this strategy, false otherwise.
+ */
+ virtual bool setDeviceForStrategy(const routing_strategy &strategy, audio_devices_t devices) = 0;
+
+ /**
+ * Set the strategy to be followed by a stream.
+ *
+ * @param[in] stream: name of the stream for which the strategy to use has to be set
+ * @param[in] strategy to follow for the given stream.
+ *
+ * @return true if the strategy were set correclty for this stream, false otherwise.
+ */
+ virtual bool setStrategyForStream(const audio_stream_type_t &stream, routing_strategy strategy) = 0;
+
+ /**
+ * Set the strategy to be followed by a stream.
+ *
+ * @param[in] stream: name of the stream for which the strategy to use has to be set
+ * @param[in] strategy to follow for the given stream.
+ *
+ * @return true if the strategy were set correclty for this stream, false otherwise.
+ */
+ virtual bool setVolumeProfileForStream(const audio_stream_type_t &stream,
+ Volume::device_category category,
+ const VolumeCurvePoints &points) = 0;
+
+ /**
+ * Set the strategy to be followed by a usage.
+ *
+ * @param[in] usage: name of the usage for which the strategy to use has to be set
+ * @param[in] strategy to follow for the given usage.
+ *
+ * @return true if the strategy were set correclty for this usage, false otherwise.
+ */
+ virtual bool setStrategyForUsage(const audio_usage_t &usage, routing_strategy strategy) = 0;
+
+ /**
+ * Set the input device to be used by an input source.
+ *
+ * @param[in] inputSource: name of the input source for which the device to use has to be set
+ * @param[in] devices; mask of devices to be used for the given input source.
+ *
+ * @return true if the devices were set correclty for this input source, false otherwise.
+ */
+ virtual bool setDeviceForInputSource(const audio_source_t &inputSource,
+ audio_devices_t device) = 0;
+
+protected:
+ virtual ~AudioPolicyPluginInterface() {}
+};
+
+}; // namespace android
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk b/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk
new file mode 100644
index 0000000..c402fd5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+#######################################################################
+# Recursive call sub-folder Android.mk
+#######################################################################
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Android.mk b/services/audiopolicy/engineconfigurable/parameter-framework/example/Android.mk
new file mode 100644
index 0000000..98b7152
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Android.mk
@@ -0,0 +1,104 @@
+################################################################################################
+#
+# @NOTE:
+# Audio Policy Engine configurable example for generic device build
+#
+# Any vendor shall have its own configuration within the corresponding device folder
+#
+################################################################################################
+
+
+LOCAL_PATH := $(call my-dir)
+
+##################################################################
+# CONFIGURATION FILES
+##################################################################
+######### Policy PFW top level file #########
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := ParameterFrameworkConfigurationPolicy.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+
+########## Policy PFW Structures #########
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := PolicyClass.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework/Structure/Policy
+LOCAL_SRC_FILES := Structure/$(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := PolicySubsystem.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_REQUIRED_MODULES := \
+ PolicySubsystem-CommonTypes.xml \
+ PolicySubsystem-Volume.xml \
+ libpolicy-subsystem \
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework/Structure/Policy
+LOCAL_SRC_FILES := Structure/$(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := PolicySubsystem-CommonTypes.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework/Structure/Policy
+LOCAL_SRC_FILES := Structure/$(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := PolicySubsystem-Volume.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework/Structure/Policy
+LOCAL_SRC_FILES := Structure/$(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
+
+######### Policy PFW Settings #########
+
+######## Generate routing domains file ########
+include $(CLEAR_VARS)
+LOCAL_MODULE := parameter-framework.policy
+LOCAL_MODULE_STEM := PolicyConfigurableDomains.xml
+LOCAL_MODULE_TAGS := optional
+LOCAL_REQUIRED_MODULES := \
+ PolicyClass.xml \
+ PolicySubsystem.xml \
+ ParameterFrameworkConfigurationPolicy.xml
+
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/parameter-framework/Settings/Policy
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): MY_TOOL := $(HOST_OUT_EXECUTABLES)/hostDomainGenerator.sh
+$(LOCAL_BUILT_MODULE): $(HOST_OUT_EXECUTABLES)/hostDomainGenerator.sh
+$(LOCAL_BUILT_MODULE): MY_SRC_FILES := \
+ $(TARGET_OUT_ETC)/parameter-framework/ParameterFrameworkConfigurationPolicy.xml \
+ $(LOCAL_PATH)/policy_criteria.txt \
+ /dev/null \
+ $(LOCAL_PATH)/Settings/device_for_strategy_media.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_phone.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_sonification.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_sonification_respectful.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_dtmf.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_enforced_audible.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_transmitted_through_speaker.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_accessibility.pfw \
+ $(LOCAL_PATH)/Settings/device_for_strategy_rerouting.pfw \
+ $(LOCAL_PATH)/Settings/strategy_for_stream.pfw \
+ $(LOCAL_PATH)/Settings/strategy_for_usage.pfw \
+ $(LOCAL_PATH)/Settings/device_for_input_source.pfw \
+ $(LOCAL_PATH)/Settings/volumes.pfw \
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_REQUIRED_MODULES)
+ $(hide) mkdir -p $(dir $@)
+ bash --debug $(MY_TOOL) --nonverbose --validate $(MY_SRC_FILES) > $@
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/ParameterFrameworkConfigurationPolicy.xml b/services/audiopolicy/engineconfigurable/parameter-framework/example/ParameterFrameworkConfigurationPolicy.xml
new file mode 100755
index 0000000..6905201
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/ParameterFrameworkConfigurationPolicy.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ParameterFrameworkConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="Schemas/ParameterFrameworkConfiguration.xsd"
+ SystemClassName="Policy" ServerPort="5019" TuningAllowed="true">
+
+ <SubsystemPlugins>
+ <Location Folder="">
+ <Plugin Name="libpolicy-subsystem.so"/>
+ </Location>
+ </SubsystemPlugins>
+ <StructureDescriptionFileLocation Path="Structure/Policy/PolicyClass.xml"/>
+ <SettingsConfiguration>
+ <ConfigurableDomainsFileLocation Path="Settings/Policy/PolicyConfigurableDomains.xml"/>
+ </SettingsConfiguration>
+</ParameterFrameworkConfiguration>
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/README.md b/services/audiopolicy/engineconfigurable/parameter-framework/example/README.md
new file mode 100644
index 0000000..92668e1
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/README.md
@@ -0,0 +1,11 @@
+Configurable Policy Engine Example
+================================
+
+This folder exposes a generic functional configurable policy engine configuration files
+to provide to have a product following the nexus experience.
+
+A vendor wishing to customize the behavior shall provides its own set of configuration files
+within the device folder for the product to customize.
+
+For any question about the parameter framework and configuration files,
+See [the wiki on github](https://github.com/01org/parameter-framework/wiki).
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_input_source.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_input_source.pfw
new file mode 100644
index 0000000..d4bc370
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_input_source.pfw
@@ -0,0 +1,515 @@
+supDomain: DeviceForInputSource
+ domain: Calibration
+ conf: Calibration
+ #
+ # Note that ALL input devices must have the sign bit set to 1.
+ # As the devices is a mask, use the "in" bit as a direction indicator.
+ #
+ component: /Policy/policy/input_sources/default/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ hdmi = 0
+ telephony_rx = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/mic/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ hdmi = 0
+ telephony_rx = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/voice_downlink/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ hdmi = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/voice_call/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ hdmi = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/voice_uplink/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ hdmi = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/camcorder/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ hdmi = 0
+ telephony_rx = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/voice_recognition/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ hdmi = 0
+ telephony_rx = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ hdmi = 0
+ telephony_rx = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/remote_submix/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ hdmi = 0
+ telephony_rx = 0
+ back_mic = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/hotword/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ hdmi = 0
+ telephony_rx = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+ component: /Policy/policy/input_sources/fm_tuner/applicable_input_device/mask
+ in = 1
+ communication = 0
+ ambient = 0
+ bluetooth_sco_headset = 0
+ hdmi = 0
+ telephony_rx = 0
+ builtin_mic = 0
+ wired_headset = 0
+ back_mic = 0
+ remote_submix = 0
+ anlg_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ fm_tuner = 0
+ tv_tuner = 0
+ line = 0
+ spdif = 0
+ bluetooth_a2dp = 0
+ loopback = 0
+
+ domain: DefaultAndMic
+ conf: A2dp
+ AvailableInputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 1
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 1
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+
+ conf: Sco
+ AvailableInputDevices Includes BluetoothScoHeadset
+ ForceUseForRecord Is ForceBtSco
+
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 1
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 1
+
+ conf: WiredHeadset
+ AvailableInputDevices Includes WiredHeadset
+
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+
+ conf: UsbDevice
+ AvailableInputDevices Includes UsbDevice
+
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 1
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 1
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+
+ conf: BuiltinMic
+ AvailableInputDevices Includes BuiltinMic
+
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 1
+ bluetooth_sco_headset = 0
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 1
+ bluetooth_sco_headset = 0
+
+ conf: Default
+ component: /Policy/policy/input_sources
+ component: default/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+ component: mic/applicable_input_device/mask/
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ bluetooth_sco_headset = 0
+
+ domain: VoiceUplinkAndVoiceDownlinkAndVoiceCall
+ conf: VoiceCall
+ AvailableInputDevices Includes TelephonyRx
+
+ component: /Policy/policy/input_sources
+ voice_downlink/applicable_input_device/mask/telephony_rx = 1
+ voice_call/applicable_input_device/mask/telephony_rx = 1
+ voice_uplink/applicable_input_device/mask/telephony_rx = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources
+ voice_downlink/applicable_input_device/mask/telephony_rx = 0
+ voice_call/applicable_input_device/mask/telephony_rx = 0
+ voice_uplink/applicable_input_device/mask/telephony_rx = 0
+
+ domain: Camcorder
+ conf: BackMic
+ AvailableInputDevices Includes BackMic
+
+ component: /Policy/policy/input_sources/camcorder/applicable_input_device/mask
+ back_mic = 1
+ builtin_mic = 0
+
+ conf: BuiltinMic
+ AvailableInputDevices Includes BuiltinMic
+
+ component: /Policy/policy/input_sources/camcorder/applicable_input_device/mask
+ back_mic = 0
+ builtin_mic = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources/camcorder/applicable_input_device/mask
+ back_mic = 0
+ builtin_mic = 0
+
+ domain: VoiceRecognitionAndHotword
+ conf: ScoHeadset
+ ForceUseForRecord Is ForceBtSco
+ AvailableInputDevices Includes BluetoothScoHeadset
+
+ component: /Policy/policy/input_sources
+ component: voice_recognition/applicable_input_device/mask
+ bluetooth_sco_headset = 1
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ component: hotword/applicable_input_device/mask
+ bluetooth_sco_headset = 1
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+
+ conf: WiredHeadset
+ AvailableInputDevices Includes WiredHeadset
+
+ component: /Policy/policy/input_sources
+ component: voice_recognition/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+ component: hotword/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+
+ conf: UsbDevice
+ AvailableInputDevices Includes UsbDevice
+
+ component: /Policy/policy/input_sources
+ component: voice_recognition/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 1
+ builtin_mic = 0
+ component: hotword/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 1
+ builtin_mic = 0
+
+ conf: BuiltinMic
+ AvailableInputDevices Includes BuiltinMic
+
+ component: /Policy/policy/input_sources
+ component: voice_recognition/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 1
+ component: hotword/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources
+ component: voice_recognition/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ component: hotword/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+
+ domain: VoiceCommunication
+ conf: ScoHeadset
+ #
+ # SCO device may be requested but no SCO device is available
+ #
+ ForceUseForCommunication Is ForceBtSco
+ AvailableInputDevices Includes BluetoothScoHeadset
+
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 1
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ back_mic = 0
+
+ conf: WiredHeadset
+ ForceUseForCommunication Is ForceNone
+ AvailableInputDevices Includes WiredHeadset
+
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 1
+ usb_device = 0
+ builtin_mic = 0
+ back_mic = 0
+
+ conf: UsbDevice
+ ForceUseForCommunication Is ForceNone
+ AvailableInputDevices Includes UsbDevice
+
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 1
+ builtin_mic = 0
+ back_mic = 0
+
+ conf: BuiltinMic
+ AvailableInputDevices Includes BuiltinMic
+ ANY
+ ForceUseForCommunication Is ForceNone
+ ALL
+ ForceUseForCommunication Is ForceSpeaker
+ AvailableInputDevices Excludes BackMic
+
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 1
+ back_mic = 0
+
+ conf: BackMic
+ ForceUseForCommunication Is ForceSpeaker
+ AvailableInputDevices Includes BackMic
+
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ back_mic = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources/voice_communication/applicable_input_device/mask
+ bluetooth_sco_headset = 0
+ wired_headset = 0
+ usb_device = 0
+ builtin_mic = 0
+ back_mic = 0
+
+ domain: RemoteSubmix
+ conf: RemoteSubmix
+ AvailableInputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/input_sources/remote_submix/applicable_input_device/mask
+ remote_submix = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources/remote_submix/applicable_input_device/mask
+ remote_submix = 0
+
+ domain: FmTuner
+ conf: FmTuner
+ AvailableInputDevices Includes FmTuner
+
+ component: /Policy/policy/input_sources/fm_tuner/applicable_input_device/mask
+ fm_tuner = 1
+
+ conf: Default
+ component: /Policy/policy/input_sources/fm_tuner/applicable_input_device/mask
+ fm_tuner = 0
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_accessibility.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_accessibility.pfw
new file mode 100644
index 0000000..e8ab33b
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_accessibility.pfw
@@ -0,0 +1,302 @@
+supDomain: DeviceForStrategy
+
+ supDomain: Accessibility
+ #
+ # @FIXME: STRATEGY_ACCESSIBILITY follows STRATEGY_MEDIA for now
+ #
+ # @FIXME: How to disable HDMI if !audio_is_linear_pcm other than programmatically???
+ #
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ hdmi_arc = 0
+ spdif = 0
+ aux_line = 0
+ fm = 0
+ speaker_safe = 0
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ telephony_tx = 0
+
+ domain: Device2
+ conf: RemoteSubmix
+ AvailableOutputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 1
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dp
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpHeadphone
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpSpeaker
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: ForceSpeaker
+ ForceUseForMedia Is ForceSpeaker
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 1
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadphone
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 1
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Line
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadset
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 1
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: UsbAccessory
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ hdmi = 0
+
+ conf: UsbDevice
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ hdmi = 0
+
+ conf: DgtlDockHeadset
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: AuxDigital
+ #
+ # Do not route accessibility prompts to a digital output currently configured with a
+ # compressed format as they would likely not be mixed and dropped.
+ #
+ # @TODO How to translate the following condition(???)
+ # desc->isActive() && !audio_is_linear_pcm(desc->mFormat) && devices != AUDIO_DEVICE_NONE
+ #
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 1
+
+ conf: AnlgDockHeadset
+ AvailableOutputDevices Includes AnlgDockHeadset
+ ForceUseForDock Is ForceAnalogDock
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Speaker
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 1
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Default
+ component: /Policy/policy/strategies/accessibility/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_dtmf.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_dtmf.pfw
new file mode 100644
index 0000000..85273b2
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_dtmf.pfw
@@ -0,0 +1,637 @@
+supDomain: DeviceForStrategy
+
+ supDomain: Dtmf
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ fm = 0
+ speaker_safe = 0
+ bluetooth_sco_carkit = 0
+
+ domain: Device2
+ conf: RemoteSubmix
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 1
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dp
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dpHeadphones
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dpSpeaker
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: ForceSpeakerWhenNotInCall
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia Is ForceSpeaker
+ ForceUseForHdmiSystemAudio IsNot ForceHdmiSystemEnforced
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 1
+
+ conf: BluetoothScoHeadset
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Includes BluetoothScoHeadset
+ ForceUseForCommunication Is ForceBtSco
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 1
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothSco
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Includes BluetoothSco
+ ForceUseForCommunication Is ForceBtSco
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 1
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: WiredHeadphone
+ ANY
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 1
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: LineWhenFollowingMedia
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 1
+ speaker = 0
+
+ conf: WiredHeadset
+ ANY
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: UsbDevice
+ ANY
+ #
+ # DTMF falls through Phone strategy if in call (widely speaking)
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ #
+ # DTMF follows Media strategy if not in call
+ # Media strategy inverts the priority of USB device vs accessory
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Excludes UsbAccessory
+ ForceUseForCommunication Is ForceSpeaker
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: UsbAccessory
+ #
+ # DTMF falls through Phone strategy if in call (widely speaking)
+ # but USB accessory not reachable in call
+ #
+ # DTMF follows Media strategy if not in call
+ # Media strategy inverts the priority of USB device vs accessory
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: DgtlDockHeadset
+ #
+ # DTMF falls through Phone strategy if in call (widely speaking)
+ # but DgtlDockHeadset not reachable in call
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: Hdmi
+ #
+ # DTMF falls through Phone strategy if in call (widely speaking)
+ # but Hdmi not reachable in call
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: AnlgDockHeadset
+ #
+ # DTMF falls through Phone strategy if in call (widely speaking)
+ # but AnlgDockHeadset not reachable in call
+ #
+ # DTMF follows Media strategy if not in call
+ # Media strategy inverts the priority of USB device vs accessory
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForDock Is ForceAnalogDock
+ AvailableOutputDevices Includes AnlgDockHeadset
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: Earpiece
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Includes Earpiece
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 1
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: LineWhenFallThroughPhone
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Includes Line
+ ForceUseForCommunication Is ForceSpeaker
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 1
+ speaker = 0
+
+ conf: Speaker
+ ANY
+ #
+ # DTMF falls through Phone strategy if in call
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceSpeaker
+ #
+ # DTMF follows Media strategy if not in call
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForHdmiSystemAudio IsNot ForceHdmiSystemEnforced
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 1
+
+ conf: Default
+ component: /Policy/policy/strategies/dtmf/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ domain: Arc
+ #
+ # DTMF strategy follows media strategy if not in call
+ # these following domains consists in device(s) that can co-exist with others
+ # e.g. ARC, SPDIF, AUX_LINE
+ #
+ conf: Selected
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes HdmiArc
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/hdmi_arc = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/hdmi_arc = 0
+
+ domain: Spdif
+ #
+ # DTMF strategy follows media strategy if not in call
+ # these following domains consists in device(s) that can co-exist with others
+ # e.g. ARC, SPDIF, AUX_LINE
+ #
+ conf: Selected
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes Spdif
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/spdif = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/spdif = 0
+
+ domain: AuxLine
+ #
+ # DTMF strategy follows media strategy if not in call
+ # these following domains consists in device(s) that can co-exist with others
+ # e.g. ARC, SPDIF, AUX_LINE
+ #
+ conf: Selected
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes AuxLine
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/aux_line = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/aux_line = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_enforced_audible.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_enforced_audible.pfw
new file mode 100644
index 0000000..d714743
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_enforced_audible.pfw
@@ -0,0 +1,358 @@
+supDomain: DeviceForStrategy
+
+ supDomain: EnforcedAudible
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ # no enforced_audible on remote submix (e.g. WFD)
+ remote_submix = 0
+ hdmi_arc = 0
+ spdif = 0
+ aux_line = 0
+ speaker_safe = 0
+
+ domain: Speaker
+ conf: Selected
+ #
+ # strategy STRATEGY_ENFORCED_AUDIBLE uses same routing policy as STRATEGY_SONIFICATION
+ # except:
+ # - when in call where it doesn't default to STRATEGY_PHONE behavior
+ # - in countries where not enforced in which case it follows STRATEGY_MEDIA
+ #
+ AvailableOutputDevices Includes Speaker
+ ANY
+ ForceUseForSystem Is ForceSystemEnforced
+ ALL
+ ForceUseForMedia Is ForceSpeaker
+ AvailableOutputDevices Excludes RemoteSubmix
+ ANY
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Excludes BluetoothA2dp
+ AvailableOutputDevices Excludes BluetoothA2dpHeadphones
+ AvailableOutputDevices Excludes BluetoothA2dpSpeaker
+ #
+ # Speaker is also the fallback device if any of the device from Device2 domain
+ # is selected.
+ #
+ ALL
+ AvailableOutputDevices Excludes RemoteSubmix
+ AvailableOutputDevices Excludes WiredHeadphone
+ AvailableOutputDevices Excludes Line
+ AvailableOutputDevices Excludes WiredHeadset
+ AvailableOutputDevices Excludes UsbAccessory
+ AvailableOutputDevices Excludes UsbDevice
+ AvailableOutputDevices Excludes DgtlDockHeadset
+ AvailableOutputDevices Excludes Hdmi
+ ANY
+ AvailableOutputDevices Excludes AnlgDockHeadset
+ ForceUseForDock IsNot ForceAnalogDock
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ speaker = 1
+
+ conf: NotSelected
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ speaker = 0
+
+ domain: Device2
+ conf: RemoteSubmix
+ AvailableOutputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 1
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: BluetoothA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: BluetoothA2dpHeadphones
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: BluetoothA2dpSpeaker
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: WiredHeadphone
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 1
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: Line
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 1
+ fm = 0
+ speaker_safe = 0
+
+ conf: WiredHeadset
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: UsbAccessory
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: UsbDevice
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: DgtlDockHeadset
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: Hdmi
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
+ conf: AnlgDockHeadset
+ ForceUseForMedia IsNot ForceSpeaker
+ ForceUseForDock Is ForceAnalogDock
+ AvailableOutputDevices Includes AnlgDockHeadset
+
+ component: /Policy/policy/strategies/enforced_audible/selected_output_devices/mask
+ remote_submix = 0
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ fm = 0
+ speaker_safe = 0
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_media.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_media.pfw
new file mode 100644
index 0000000..38bede5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_media.pfw
@@ -0,0 +1,331 @@
+domainGroup: DeviceForStrategy
+
+ domainGroup: Media
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ fm = 0
+ speaker_safe = 0
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ telephony_tx = 0
+
+ domain: Device2
+ conf: RemoteSubmix
+ AvailableOutputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 1
+ line = 0
+
+ conf: BluetoothA2dp
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 1
+ remote_submix = 0
+ line = 0
+
+ conf: BluetoothA2dpHeadphone
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: BluetoothA2dpSpeaker
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: ForceSpeaker
+ ForceUseForMedia Is ForceSpeaker
+ AvailableOutputDevices Includes Speaker
+ #
+ # If hdmi system audio mode is on, remove speaker out of output list.
+ #
+ ForceUseForHdmiSystemAudio IsNot ForceHdmiSystemEnforced
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 1
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: WiredHeadphone
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 1
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: Line
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 1
+
+ conf: WiredHeadset
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: UsbAccessory
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 1
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: UsbDevice
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 1
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: DgtlDockHeadset
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 1
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: AuxDigital
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 1
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: AnlgDockHeadset
+ AvailableOutputDevices Includes AnlgDockHeadset
+ ForceUseForDock Is ForceAnalogDock
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 1
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: Speaker
+ AvailableOutputDevices Includes Speaker
+ #
+ # If hdmi system audio mode is on, remove speaker out of output list.
+ #
+ ForceUseForHdmiSystemAudio IsNot ForceHdmiSystemEnforced
+
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 1
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ conf: Default
+ component: /Policy/policy/strategies/media/selected_output_devices/mask
+ speaker = 0
+ hdmi = 0
+ dgtl_dock_headset = 0
+ angl_dock_headset = 0
+ usb_device = 0
+ usb_accessory = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp = 0
+ remote_submix = 0
+ line = 0
+
+ domain: Arc
+ #
+ # these following domains consists in device(s) that can co-exist with others
+ # e.g. ARC, SPDIF, AUX_LINE
+ #
+ conf: Selected
+ AvailableOutputDevices Includes HdmiArc
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/hdmi_arc = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/hdmi_arc = 0
+
+ domain: Spdif
+ #
+ # these following domains consists in device(s) that can co-exist with others
+ # e.g. ARC, SPDIF, AUX_LINE
+ #
+ conf: Selected
+ AvailableOutputDevices Includes Spdif
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/spdif = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/spdif = 0
+
+ domain: AuxLine
+ conf: Selected
+ AvailableOutputDevices Includes AuxLine
+
+ /Policy/policy/strategies/media/selected_output_devices/mask/aux_line = 1
+
+ conf: NotSelected
+ /Policy/policy/strategies/media/selected_output_devices/mask/aux_line = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_phone.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_phone.pfw
new file mode 100644
index 0000000..7b01491
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_phone.pfw
@@ -0,0 +1,485 @@
+supDomain: DeviceForStrategy
+
+ supDomain: Phone
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ # no sonification on remote submix (e.g. WFD)
+ remote_submix = 0
+ hdmi_arc = 0
+ aux_line = 0
+ spdif = 0
+ fm = 0
+ speaker_safe = 0
+
+ domain: Device
+ conf: ScoCarkit
+ AvailableOutputDevices Includes BluetoothScoCarkit
+ ForceUseForCommunication Is ForceBtSco
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 1
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothScoHeadset
+ AvailableOutputDevices Includes BluetoothScoHeadset
+ ForceUseForCommunication Is ForceBtSco
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 1
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothSco
+ AvailableOutputDevices Includes BluetoothSco
+ ForceUseForCommunication Is ForceBtSco
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 1
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dp
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes BluetoothA2dp
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ ANY
+ ForceUseForCommunication Is ForceBtSco
+ ForceUseForCommunication Is ForceNone
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dpHeadphones
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ ANY
+ ForceUseForCommunication Is ForceBtSco
+ ForceUseForCommunication Is ForceNone
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: BluetoothA2dpSpeaker
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ ForceUseForCommunication Is ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: WiredHeadphone
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes WiredHeadphone
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 1
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: WiredHeadset
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes WiredHeadset
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: UsbDevice
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes UsbDevice
+ ANY
+ ForceUseForCommunication Is ForceBtSco
+ ForceUseForCommunication Is ForceNone
+ ALL
+ ForceUseForCommunication Is ForceSpeaker
+ #
+ # In case of Force Speaker, priority between device and accessory are
+ # inverted compared to Force None or Bt Sco
+ #
+ AvailableOutputDevices Excludes UsbAccessory
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: UsbAccessory
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes UsbAccessory
+ TelephonyMode IsNot InCommunication
+ TelephonyMode IsNot InCall
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: DgtlDockHeadset
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes DgtlDockHeadset
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: Hdmi
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes Hdmi
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: AnlgDockHeadset
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes AnlgDockHeadset
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: Earpiece
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes Earpiece
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 1
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+ conf: Line
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes Line
+ ForceUseForCommunication Is ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 1
+ speaker = 0
+
+ conf: Speaker
+ #
+ # Fallback BT Sco devices in case of FORCE_BT_SCO
+ # or FORCE_NONE
+ #
+ AvailableOutputDevices Includes Speaker
+ ForceUseForCommunication Is ForceSpeaker
+
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 1
+
+ conf: Default
+ component: /Policy/policy/strategies/phone/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+ speaker = 0
+
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_rerouting.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_rerouting.pfw
new file mode 100644
index 0000000..d390a33
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_rerouting.pfw
@@ -0,0 +1,297 @@
+domainGroup: DeviceForStrategy
+
+ domainGroup: Rerouting
+ #
+ # Falls through media strategy
+ #
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ hdmi_arc = 0
+ spdif = 0
+ aux_line = 0
+ fm = 0
+ speaker_safe = 0
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ telephony_tx = 0
+
+ domain: Device2
+ conf: RemoteSubmix
+ AvailableOutputDevices Includes RemoteSubmix
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 1
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dp
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpHeadphone
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpSpeaker
+ ForceUseForMedia IsNot ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: ForceSpeaker
+ ForceUseForMedia Is ForceSpeaker
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 1
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadphone
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 1
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Line
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadset
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 1
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: UsbAccessory
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ hdmi = 0
+
+ conf: UsbDevice
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ hdmi = 0
+
+ conf: DgtlDockHeadset
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: AuxDigital
+ #
+ # Rerouting is similar to media and sonification (exept here: sonification is not allowed on HDMI)
+ #
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 1
+
+ conf: AnlgDockHeadset
+ AvailableOutputDevices Includes AnlgDockHeadset
+ ForceUseForDock Is ForceAnalogDock
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Speaker
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 1
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Default
+ component: /Policy/policy/strategies/rerouting/selected_output_devices/mask
+ remote_submix = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ speaker = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification.pfw
new file mode 100644
index 0000000..71101f8
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification.pfw
@@ -0,0 +1,485 @@
+supDomain: DeviceForStrategy
+
+ supDomain: Sonification
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ # no sonification on remote submix (e.g. WFD)
+ remote_submix = 0
+ hdmi_arc = 0
+ spdif = 0
+ fm = 0
+ speaker_safe = 0
+ aux_line = 0
+ #
+ # Sonification follows phone strategy if in call but HDMI is not reachable
+ #
+ hdmi = 0
+
+ domain: Speaker
+
+ conf: Selected
+ AvailableOutputDevices Includes Speaker
+ ANY
+ #
+ # Sonification falls through ENFORCED_AUDIBLE if not in call (widely speaking)
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ALL
+ #
+ # Sonification follows phone strategy if in call (widely speaking)
+ #
+ ForceUseForCommunication Is ForceSpeaker
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Excludes Line
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ speaker = 1
+
+ conf: NotSelected
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ speaker = 0
+
+ domain: Device2
+
+ conf: BluetoothA2dp
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ AvailableOutputDevices Includes BluetoothA2dp
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: BluetoothA2dpHeadphones
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: BluetoothA2dpSpeaker
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceNoBtA2dp
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: ScoCarkit
+ #
+ # Sonification follows phone strategy if in call (widely speaking)
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothScoCarkit
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 1
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: ScoHeadset
+ #
+ # Sonification follows phone strategy if in call (widely speaking)
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothScoHeadset
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 1
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: Sco
+ #
+ # Sonification follows phone strategy if in call (widely speaking)
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothSco
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 1
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: WiredHeadphone
+ AvailableOutputDevices Includes WiredHeadphone
+ ANY
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ #
+ # Sonification follows Phone strategy if in call (widely speaking)
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 1
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: Line
+ AvailableOutputDevices Includes Line
+ ANY
+ #
+ # Sonification follows Phone strategy if in call (widely speaking)
+ #
+ ALL
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceSpeaker
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 1
+
+ conf: WiredHeadset
+ AvailableOutputDevices Includes WiredHeadset
+ ANY
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ ALL
+ #
+ # Sonification Follows Phone Strategy if in call (widely speaking)
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: UsbDevice
+ AvailableOutputDevices Includes UsbDevice
+ ANY
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ ALL
+ AvailableOutputDevices Excludes UsbAccessory
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ ALL
+ #
+ # Sonification Follows Phone Strategy if in call (widely speaking)
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ telephony_tx = 0
+ line = 0
+
+ conf: UsbAccessory
+ AvailableOutputDevices Includes UsbAccessory
+ #
+ # Sonification falls through media strategy if not in call (widely speaking)
+ #
+ # Sonification Follows Phone Strategy if in call (widely speaking)
+ # but USB Accessory not reachable in call.
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: DgtlDockHeadset
+ AvailableOutputDevices Includes DgtlDockHeadset
+ #
+ # Sonification falls through media strategy if not in call
+ #
+ # Sonification Follows Phone Strategy if in call (widely speaking)
+ # but DgtlDockHeadset not reachable in call.
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: AnlgDockHeadset
+ AvailableOutputDevices Includes AnlgDockHeadset
+ #
+ # Sonification falls through media strategy if not in call
+ #
+ # Sonification Follows Phone Strategy if in call (widely speaking)
+ # but AnlgDockHeadset not reachable in call.
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ ForceUseForDock Is ForceAnalogDock
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: Earpiece
+ #
+ # Sonification Follows Phone Strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ AvailableOutputDevices Includes Earpiece
+
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 1
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ conf: None
+ component: /Policy/policy/strategies/sonification/selected_output_devices/mask
+ earpiece = 0
+ wired_headset = 0
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification_respectful.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification_respectful.pfw
new file mode 100644
index 0000000..f66674c
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification_respectful.pfw
@@ -0,0 +1,545 @@
+domainGroup: DeviceForStrategy
+
+ domainGroup: SonificationRespectful
+ #
+ # Sonificiation Respectful follows:
+ # - If in call: Strategy sonification (that follows phone strategy in call also...)
+ # - If not in call AND a music stream is active remotely: Strategy sonification (that
+ # follows enforced audible, which follows media)
+ # - if not in call and no music stream active remotely and music stream active): strategy
+ # media
+ # - Otherwise follows sonification by replacing speaker with speaker safe if speaker is
+ # selected.
+ #
+ # Case of stream active handled programmatically
+
+ domain: UnreachableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ remote_submix = 0
+ hdmi_arc = 0
+ aux_line = 0
+ spdif = 0
+ fm = 0
+ telephony_tx = 0
+
+ domain: Speakers
+
+ conf: SpeakerSafe
+ AvailableOutputDevices Includes Speaker
+ AvailableOutputDevices Includes SpeakerSafe
+ #
+ # Follows sonification strategy if not in call and replace speaker by speaker safe
+ # if and only if speaker only selected
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ speaker_safe = 1
+ speaker = 0
+
+ conf: Speaker
+ AvailableOutputDevices Includes Speaker
+ ANY
+ #
+ # Follows sonification strategy if not in call
+ #
+ ALL
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ALL
+ #
+ # Follows Phone Strategy if call
+ #
+ ForceUseForCommunication Is ForceSpeaker
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ AvailableOutputDevices Excludes Line
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ speaker_safe = 0
+ speaker = 1
+
+ conf: None
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ speaker_safe = 0
+ speaker = 0
+
+ domain: Device2
+ conf: BluetoothA2dp
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia Is ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dp
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 1
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpHeadphones
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia Is ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpHeadphones
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 1
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothA2dpSpeaker
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia Is ForceNoBtA2dp
+ AvailableOutputDevices Includes BluetoothA2dpSpeaker
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 1
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothScoCarkit
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothScoCarkit
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 1
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothScoHeadset
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothScoHeadset
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 1
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: BluetoothSco
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceBtSco
+ AvailableOutputDevices Includes BluetoothSco
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 1
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadphone
+ ANY
+ ALL
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ ALL
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes WiredHeadphone
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 1
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: LineWhenFollowMediaStrategy
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ AvailableOutputDevices Includes WiredHeadphone
+ ForceUseForMedia IsNot ForceSpeaker
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: WiredHeadset
+ ANY
+ ALL
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ ALL
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes WiredHeadset
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 1
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: UsbDevice
+ ANY
+ ALL
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ ALL
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Excludes UsbAccessory
+ AvailableOutputDevices Includes UsbDevice
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 1
+ hdmi = 0
+
+ conf: UsbAccessory
+ #
+ # SonificationRespectful Follows Phone strategy if in call (widely speaking)
+ # but UsbAccessory not reachable in call.
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes UsbAccessory
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 1
+ usb_device = 0
+ hdmi = 0
+
+ conf: DgtlDockHeadset
+ #
+ # SonificationRespectful Follows Phone strategy if in call (widely speaking)
+ # but DgtlDockHeadset not reachable in call.
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes DgtlDockHeadset
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 1
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: AuxDigital
+ #
+ # SonificationRespectful Follows Phone strategy if in call (widely speaking)
+ # but HDMI not reachable in call.
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ AvailableOutputDevices Includes Hdmi
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 1
+
+ conf: AnlgDockHeadset
+ #
+ # SonificationRespectful Follows Phone strategy if in call (widely speaking)
+ # but AnlgDockHeadset not reachable in call.
+ #
+ # SonificationRespectful Follows Sonification that falls through Media strategy if not in call
+ # SonificationRespectful follows media if music stream is active
+ #
+ TelephonyMode IsNot InCall
+ TelephonyMode IsNot InCommunication
+ ForceUseForMedia IsNot ForceSpeaker
+ ForceUseForDock Is ForceAnalogDock
+ AvailableOutputDevices Includes AnlgDockHeadset
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 1
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Earpiece
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication IsNot ForceSpeaker
+ AvailableOutputDevices Includes Earpiece
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 1
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
+
+ conf: Line
+ #
+ # SonificationRespectful Follows Phone strategy if in call
+ #
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+ ForceUseForCommunication Is ForceSpeaker
+ AvailableOutputDevices Includes Line
+
+ component: /Policy/policy/strategies/sonification_respectful/selected_output_devices/mask
+ earpiece = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ bluetooth_a2dp = 0
+ wired_headset = 0
+ wired_headphone = 0
+ line = 1
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ hdmi = 0
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_transmitted_through_speaker.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_transmitted_through_speaker.pfw
new file mode 100644
index 0000000..e5ae9d9
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_transmitted_through_speaker.pfw
@@ -0,0 +1,40 @@
+supDomain: DeviceForStrategy
+
+ supDomain: TransmittedThroughSpeaker
+ domain: UnreacheableDevices
+ conf: Calibration
+ component: /Policy/policy/strategies/transmitted_through_speaker/selected_output_devices/mask
+ remote_submix = 0
+ hdmi_arc = 0
+ spdif = 0
+ aux_line = 0
+ fm = 0
+ speaker_safe = 0
+ earpiece = 0
+ wired_headset = 1
+ wired_headphone = 0
+ bluetooth_sco = 0
+ bluetooth_sco_headset = 0
+ bluetooth_sco_carkit = 0
+ bluetooth_a2dp = 0
+ bluetooth_a2dp_headphones = 0
+ bluetooth_a2dp_speaker = 0
+ hdmi = 0
+ angl_dock_headset = 0
+ dgtl_dock_headset = 0
+ usb_accessory = 0
+ usb_device = 0
+ telephony_tx = 0
+ line = 0
+
+ domain: Speaker
+ conf: Selected
+ AvailableOutputDevices Includes Speaker
+
+ component: /Policy/policy/strategies/transmitted_through_speaker/selected_output_devices/mask
+ speaker = 1
+
+ conf: NotSelected
+ component: /Policy/policy/strategies/transmitted_through_speaker/selected_output_devices/mask
+ speaker = 0
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_stream.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_stream.pfw
new file mode 100755
index 0000000..3940b9d
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_stream.pfw
@@ -0,0 +1,20 @@
+domain: StrategyForStream
+
+ conf: Calibration
+ /Policy/policy/streams/voice_call/applicable_strategy/strategy = phone
+ #
+ # NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
+ # while key clicks are played produces a poor result
+ #
+ /Policy/policy/streams/system/applicable_strategy/strategy = media
+ /Policy/policy/streams/ring/applicable_strategy/strategy = sonification
+ /Policy/policy/streams/music/applicable_strategy/strategy = media
+ /Policy/policy/streams/alarm/applicable_strategy/strategy = sonification
+ /Policy/policy/streams/notification/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/streams/bluetooth_sco/applicable_strategy/strategy = phone
+ /Policy/policy/streams/enforced_audible/applicable_strategy/strategy = enforced_audible
+ /Policy/policy/streams/dtmf/applicable_strategy/strategy = dtmf
+ /Policy/policy/streams/tts/applicable_strategy/strategy = transmitted_through_speaker
+ /Policy/policy/streams/accessibility/applicable_strategy/strategy = accessibility
+ /Policy/policy/streams/rerouting/applicable_strategy/strategy = rerouting
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_usage.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_usage.pfw
new file mode 100644
index 0000000..3f5da13
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_usage.pfw
@@ -0,0 +1,39 @@
+supDomain: SelectedStrategyForUsages
+
+ domain: Calibration
+ conf: Calibration
+ /Policy/policy/usages/unknown/applicable_strategy/strategy = media
+ /Policy/policy/usages/media/applicable_strategy/strategy = media
+ /Policy/policy/usages/voice_communication/applicable_strategy/strategy = phone
+ /Policy/policy/usages/voice_communication_signalling/applicable_strategy/strategy = dtmf
+ /Policy/policy/usages/alarm/applicable_strategy/strategy = sonification
+ /Policy/policy/usages/notification/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/usages/notification_telephony_ringtone/applicable_strategy/strategy = sonification
+ /Policy/policy/usages/notification_communication_request/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/usages/notification_communication_instant/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/usages/notification_communication_delayed/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/usages/notification_event/applicable_strategy/strategy = sonification_respectful
+ /Policy/policy/usages/assistance_navigation_guidance/applicable_strategy/strategy = media
+ /Policy/policy/usages/assistance_sonification/applicable_strategy/strategy = media
+ /Policy/policy/usages/game/applicable_strategy/strategy = media
+
+ domain: AssistanceAccessibility
+ conf: Sonification
+ #
+ # In case of Ring or Alarm stream type active, switching to sonification
+ # @todo: handle this dynamic case. As a WA, using Ringtone mode...
+ #
+ TelephonyMode Is RingTone
+
+ /Policy/policy/usages/assistance_accessibility/applicable_strategy/strategy = sonification
+
+ conf: Phone
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+
+ /Policy/policy/usages/assistance_accessibility/applicable_strategy/strategy = phone
+
+ conf: Accessibility
+ /Policy/policy/usages/assistance_accessibility/applicable_strategy/strategy = accessibility
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/volumes.pfw b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/volumes.pfw
new file mode 100644
index 0000000..1049564
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/volumes.pfw
@@ -0,0 +1,545 @@
+supDomain: VolumeProfilesForStream
+ domain: Calibration
+ conf: Calibration
+ component: /Policy/policy/streams
+ component: voice_call/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -16.0
+ 2/index = 66
+ 2/db_attenuation = -8.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ component: system/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -30.0
+ 1/index = 33
+ 1/db_attenuation = -26.0
+ 2/index = 66
+ 2/db_attenuation = -22.0
+ 3/index = 100
+ 3/db_attenuation = -18.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -21.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ component: ring/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -35.7
+ 1/index = 33
+ 1/db_attenuation = -26.1
+ 2/index = 66
+ 2/db_attenuation = -13.2
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -27.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ component: music/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -56.0
+ 1/index = 33
+ 1/db_attenuation = -34.0
+ 2/index = 66
+ 2/db_attenuation = -11.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ component: alarm/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -35.7
+ 1/index = 33
+ 1/db_attenuation = -26.1
+ 2/index = 66
+ 2/db_attenuation = -13.2
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -27.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ component: notification/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -35.7
+ 1/index = 33
+ 1/db_attenuation = -26.1
+ 2/index = 66
+ 2/db_attenuation = -13.2
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -49.5
+ 1/index = 33
+ 1/db_attenuation = -33.5
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -27.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ component: bluetooth_sco/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -16.0
+ 2/index = 66
+ 2/db_attenuation = -8.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ component: enforced_audible/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -30.0
+ 1/index = 33
+ 1/db_attenuation = -26.0
+ 2/index = 66
+ 2/db_attenuation = -22.0
+ 3/index = 100
+ 3/db_attenuation = -18.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -27.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ component: tts/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -96.0
+ 1/index = 1
+ 1/db_attenuation = -96.0
+ 2/index = 2
+ 2/db_attenuation = -96.0
+ 3/index = 100
+ 3/db_attenuation = -96.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -96.0
+ 1/index = 33
+ 1/db_attenuation = -68.0
+ 2/index = 66
+ 2/db_attenuation = -34.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -96.0
+ 1/index = 1
+ 1/db_attenuation = -96.0
+ 2/index = 2
+ 2/db_attenuation = -96.0
+ 3/index = 100
+ 3/db_attenuation = -96.0
+ component: extmedia_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -96.0
+ 1/index = 1
+ 1/db_attenuation = -96.0
+ 2/index = 2
+ 2/db_attenuation = -96.0
+ 3/index = 100
+ 3/db_attenuation = -96.0
+
+ component: accessibility/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -56.0
+ 1/index = 33
+ 1/db_attenuation = -34.0
+ 2/index = 66
+ 2/db_attenuation = -11.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ component: rerouting/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ component: patch/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: extmedia_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = 0.0
+ 1/index = 1
+ 1/db_attenuation = 0.0
+ 2/index = 2
+ 2/db_attenuation = 0.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
+ domain: Dtmf
+ conf: InCall
+ ANY
+ TelephonyMode Is InCall
+ TelephonyMode Is InCommunication
+
+ component: /Policy/policy/streams
+ component: dtmf/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -30.0
+ 1/index = 33
+ 1/db_attenuation = -26.0
+ 2/index = 66
+ 2/db_attenuation = -22.0
+ 3/index = 100
+ 3/db_attenuation = -18.0
+ component: speaker_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: earpiece_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -27.0
+ 3/index = 100
+ 3/db_attenuation = -10.0
+
+ conf: OutOfCall
+ component: /Policy/policy/streams
+ component: dtmf/volume_profiles
+ component: headset_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: speaker_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -16.0
+ 2/index = 66
+ 2/db_attenuation = -8.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+ component: earpiece_device_category/curve_points
+ 0/index = 0
+ 0/db_attenuation = -24.0
+ 1/index = 33
+ 1/db_attenuation = -18.0
+ 2/index = 66
+ 2/db_attenuation = -12.0
+ 3/index = 100
+ 3/db_attenuation = -6.0
+ component: extmedia_device_category/curve_points
+ 0/index = 1
+ 0/db_attenuation = -58.0
+ 1/index = 33
+ 1/db_attenuation = -40.0
+ 2/index = 66
+ 2/db_attenuation = -17.0
+ 3/index = 100
+ 3/db_attenuation = 0.0
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicyClass.xml b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicyClass.xml
new file mode 100755
index 0000000..296879f
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicyClass.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<SystemClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="../../Schemas/SystemClass.xsd" Name="Policy">
+ <SubsystemInclude Path="PolicySubsystem.xml"/>
+</SystemClass>
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-CommonTypes.xml b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-CommonTypes.xml
new file mode 100755
index 0000000..821d6ad
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-CommonTypes.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ComponentTypeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xsi:noNamespaceSchemaLocation="Schemas/ComponentTypeSet.xsd">
+ <!-- Output devices definition as a bitfield for the supported devices per output
+ profile. It must match with the output device enum parameter.
+ -->
+ <!--#################### GLOBAL COMPONENTS BEGIN ####################-->
+ <!-- Common Types defintion -->
+ <xi:include href="PolicySubsystem-Volume.xml"/>
+
+ <!--#################### GLOBAL COMPONENTS END ####################-->
+
+ <ComponentType Name="OutputDevicesMask" Description="32th bit is not allowed as dedicated
+ for input devices detection">
+ <BitParameterBlock Name="mask" Size="32">
+ <BitParameter Name="earpiece" Size="1" Pos="0"/>
+ <BitParameter Name="speaker" Size="1" Pos="1"/>
+ <BitParameter Name="wired_headset" Size="1" Pos="2"/>
+ <BitParameter Name="wired_headphone" Size="1" Pos="3"/>
+ <BitParameter Name="bluetooth_sco" Size="1" Pos="4"/>
+ <BitParameter Name="bluetooth_sco_headset" Size="1" Pos="5"/>
+ <BitParameter Name="bluetooth_sco_carkit" Size="1" Pos="6"/>
+ <BitParameter Name="bluetooth_a2dp" Size="1" Pos="7"/>
+ <BitParameter Name="bluetooth_a2dp_headphones" Size="1" Pos="8"/>
+ <BitParameter Name="bluetooth_a2dp_speaker" Size="1" Pos="9"/>
+ <BitParameter Name="hdmi" Size="1" Pos="10"/>
+ <BitParameter Name="angl_dock_headset" Size="1" Pos="11"/>
+ <BitParameter Name="dgtl_dock_headset" Size="1" Pos="12"/>
+ <BitParameter Name="usb_accessory" Size="1" Pos="13"/>
+ <BitParameter Name="usb_device" Size="1" Pos="14"/>
+ <BitParameter Name="remote_submix" Size="1" Pos="15"/>
+ <BitParameter Name="telephony_tx" Size="1" Pos="26"/>
+ <BitParameter Name="line" Size="1" Pos="17"/>
+ <BitParameter Name="hdmi_arc" Size="1" Pos="18"/>
+ <BitParameter Name="spdif" Size="1" Pos="19"/>
+ <BitParameter Name="fm" Size="1" Pos="20"/>
+ <BitParameter Name="aux_line" Size="1" Pos="21"/>
+ <BitParameter Name="speaker_safe" Size="1" Pos="22"/>
+ </BitParameterBlock>
+ </ComponentType>
+
+ <!-- Input devices definition as a bitfield for the supported devices per Input
+ profile. It must match with the Input device enum parameter.
+ -->
+ <ComponentType Name="InputDevicesMask">
+ <BitParameterBlock Name="mask" Size="32">
+ <BitParameter Name="communication" Size="1" Pos="0"/>
+ <BitParameter Name="ambient" Size="1" Pos="1"/>
+ <BitParameter Name="builtin_mic" Size="1" Pos="2"/>
+ <BitParameter Name="bluetooth_sco_headset" Size="1" Pos="3"/>
+ <BitParameter Name="wired_headset" Size="1" Pos="4"/>
+ <BitParameter Name="hdmi" Size="1" Pos="5"/>
+ <BitParameter Name="telephony_rx" Size="1" Pos="6"/>
+ <BitParameter Name="back_mic" Size="1" Pos="7"/>
+ <BitParameter Name="remote_submix" Size="1" Pos="8"/>
+ <BitParameter Name="anlg_dock_headset" Size="1" Pos="9"/>
+ <BitParameter Name="dgtl_dock_headset" Size="1" Pos="10"/>
+ <BitParameter Name="usb_accessory" Size="1" Pos="11"/>
+ <BitParameter Name="usb_device" Size="1" Pos="12"/>
+ <BitParameter Name="fm_tuner" Size="1" Pos="13"/>
+ <BitParameter Name="tv_tuner" Size="1" Pos="14"/>
+ <BitParameter Name="line" Size="1" Pos="15"/>
+ <BitParameter Name="spdif" Size="1" Pos="16"/>
+ <BitParameter Name="bluetooth_a2dp" Size="1" Pos="17"/>
+ <BitParameter Name="loopback" Size="1" Pos="18"/>
+ <BitParameter Name="in" Size="1" Pos="31"/>
+ </BitParameterBlock>
+ </ComponentType>
+
+ <ComponentType Name="OutputFlags"
+ Description="the audio output flags serve two purposes:
+ - when an AudioTrack is created they indicate a wish to be connected to an
+ output stream with attributes corresponding to the specified flags.
+ - when present in an output profile descriptor listed for a particular audio
+ hardware module, they indicate that an output stream can be opened that
+ supports the attributes indicated by the flags.
+ The audio policy manager will try to match the flags in the request
+ (when getOuput() is called) to an available output stream.">
+ <BitParameterBlock Name="mask" Size="32">
+ <BitParameter Name="direct" Size="1" Pos="0"/>
+ <BitParameter Name="primary" Size="1" Pos="1"/>
+ <BitParameter Name="fast" Size="1" Pos="2"/>
+ <BitParameter Name="deep_buffer" Size="1" Pos="3"/>
+ <BitParameter Name="compress_offload" Size="1" Pos="4"/>
+ <BitParameter Name="non_blocking" Size="1" Pos="5"/>
+ <BitParameter Name="hw_av_sync" Size="1" Pos="6"/>
+ </BitParameterBlock>
+ </ComponentType>
+
+ <ComponentType Name="InputFlags"
+ Description="The audio input flags are analogous to audio output flags.
+ Currently they are used only when an AudioRecord is created,
+ to indicate a preference to be connected to an input stream with
+ attributes corresponding to the specified flags.">
+ <BitParameterBlock Name="mask" Size="32">
+ <BitParameter Name="fast" Size="1" Pos="0"/>
+ <BitParameter Name="hw_hotword" Size="1" Pos="2"/>
+ </BitParameterBlock>
+ </ComponentType>
+
+ <ComponentType Name="InputSourcesMask" Description="The audio input source is also known
+ as the use case.">
+ <BitParameterBlock Name="mask" Size="32">
+ <BitParameter Name="default" Size="1" Pos="0"/>
+ <BitParameter Name="mic" Size="1" Pos="1"/>
+ <BitParameter Name="voice_uplink" Size="1" Pos="2"/>
+ <BitParameter Name="voice_downlink" Size="1" Pos="3"/>
+ <BitParameter Name="voice_call" Size="1" Pos="4"/>
+ <BitParameter Name="camcorder" Size="1" Pos="5"/>
+ <BitParameter Name="voice_recognition" Size="1" Pos="6"/>
+ <BitParameter Name="voice_communication" Size="1" Pos="7"/>
+ <BitParameter Name="remote_submix" Size="1" Pos="8"/>
+ <BitParameter Name="fm_tuner" Size="1" Pos="9"/>
+ <BitParameter Name="hotword" Size="1" Pos="10"/>
+ </BitParameterBlock>
+ </ComponentType>
+
+ <!-- Routing Strategy definition as an enumeration. Numerical value must match the value
+ of the routing strategy in policy header file. -->
+ <ComponentType Name="Strategy">
+ <EnumParameter Name="strategy" Size="32">
+ <ValuePair Literal="media" Numerical="0"/>
+ <ValuePair Literal="phone" Numerical="1"/>
+ <ValuePair Literal="sonification" Numerical="2"/>
+ <ValuePair Literal="sonification_respectful" Numerical="3"/>
+ <ValuePair Literal="dtmf" Numerical="4"/>
+ <ValuePair Literal="enforced_audible" Numerical="5"/>
+ <ValuePair Literal="transmitted_through_speaker" Numerical="6"/>
+ <ValuePair Literal="accessibility" Numerical="7"/>
+ <ValuePair Literal="rerouting" Numerical="8"/>
+ </EnumParameter>
+ </ComponentType>
+
+ <!--#################### STRATEGY COMMON TYPES BEGIN ####################-->
+
+ <ComponentType Name="StrategyConfig" Mapping="Strategy:'%1'">
+ <Component Name="selected_output_devices" Type="OutputDevicesMask"/>
+ </ComponentType>
+
+ <!--#################### STRATEGY COMMON TYPES END ####################-->
+
+ <!--#################### STREAM COMMON TYPES BEGIN ####################-->
+
+ <ComponentType Name="Stream">
+ <Component Name="applicable_strategy" Type="Strategy" Mapping="Stream:'%1'"/>
+ <Component Name="volume_profiles" Type="VolumeCurvesCategories"
+ Description="A volume profile is refered by the stream type."/>
+ </ComponentType>
+
+ <!--#################### STREAM COMMON TYPES END ####################-->
+
+ <!--#################### USAGE COMMON TYPES BEGIN ####################-->
+
+ <ComponentType Name="Usage">
+ <Component Name="applicable_strategy" Type="Strategy" Mapping="Usage:'%1'"/>
+ </ComponentType>
+
+ <!--#################### USAGE COMMON TYPES END ####################-->
+
+ <!--#################### INPUT SOURCE COMMON TYPES BEGIN ####################-->
+
+ <ComponentType Name="InputSource">
+ <Component Name="applicable_input_device" Type="InputDevicesMask"
+ Mapping="InputSource:'%1'" Description="Selected Input device"/>
+ </ComponentType>
+
+ <!--#################### INPUT SOURCE COMMON TYPES END ####################-->
+
+</ComponentTypeSet>
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-Volume.xml b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-Volume.xml
new file mode 100755
index 0000000..cf39cc2
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-Volume.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ComponentTypeSet xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="Schemas/ComponentTypeSet.xsd">
+ <ComponentType Name="VolumeCurvePoints">
+ <ParameterBlock Name="curve_points" ArrayLength="4" Mapping="VolumeProfile:'%1'"
+ Description="4 points to define the volume attenuation curve, each
+ characterized by the volume index (from 0 to 100) at which
+ they apply, and the attenuation in dB at that index.
+ We use 100 steps to avoid rounding errors when computing
+ the volume">
+ <IntegerParameter Name="index" Size="32"/>
+ <FixedPointParameter Name="db_attenuation" Size="16" Integral="7" Fractional="8"/>
+ </ParameterBlock>
+ </ComponentType>
+
+ <ComponentType Name="VolumeCurvesCategories">
+ <Component Name="headset_device_category" Type="VolumeCurvePoints" Mapping="Category:0"/>
+ <Component Name="speaker_device_category" Type="VolumeCurvePoints" Mapping="Category:1"/>
+ <Component Name="earpiece_device_category" Type="VolumeCurvePoints" Mapping="Category:2"/>
+ <Component Name="extmedia_device_category" Type="VolumeCurvePoints" Mapping="Category:3"/>
+ </ComponentType>
+
+</ComponentTypeSet>
+
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem.xml b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem.xml
new file mode 100755
index 0000000..b21f6ae
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Subsystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xsi:noNamespaceSchemaLocation="Schemas/Subsystem.xsd"
+ Name="policy" Type="Policy" Endianness="Little">
+
+ <ComponentLibrary>
+ <!--#################### GLOBAL COMPONENTS BEGIN ####################-->
+ <!-- Common Types defintion -->
+ <xi:include href="PolicySubsystem-CommonTypes.xml"/>
+
+ <!--#################### GLOBAL COMPONENTS END ####################-->
+
+ <!--#################### STRATEGY BEGIN ####################-->
+
+ <ComponentType Name="Strategies" Description="Identifier must match the enum value to make
+ the link between the PolicyManager and PFW">
+ <Component Name="media" Type="StrategyConfig" Mapping="Amend1:Media,Identifier:0"/>
+ <Component Name="phone" Type="StrategyConfig" Mapping="Amend1:Phone,Identifier:1"/>
+ <Component Name="sonification" Type="StrategyConfig"
+ Mapping="Amend1:Sonification,Identifier:2"/>
+ <Component Name="sonification_respectful" Type="StrategyConfig"
+ Mapping="Amend1:SonificationRespectful,Identifier:3"/>
+ <Component Name="dtmf" Type="StrategyConfig" Mapping="Amend1:Dtmf,Identifier:4"/>
+ <Component Name="enforced_audible" Type="StrategyConfig"
+ Mapping="Amend1:EnforcedAudible,Identifier:5"/>
+ <Component Name="transmitted_through_speaker" Type="StrategyConfig"
+ Mapping="Amend1:TransmittedThroughSpeaker,Identifier:6"/>
+ <Component Name="accessibility" Type="StrategyConfig"
+ Mapping="Amend1:Accessibility,Identifier:7"/>
+ <Component Name="rerouting" Type="StrategyConfig"
+ Mapping="Amend1:Rerouting,Identifier:8"/>
+ </ComponentType>
+
+ <!--#################### STRATEGY END ####################-->
+
+ <!--#################### STREAM BEGIN ####################-->
+
+ <ComponentType Name="Streams" Description="associated to audio_stream_type_t definition,
+ identifier mapping must match the value of the enum">
+ <Component Name="voice_call" Type="Stream" Mapping="Amend1:VoiceCall,Identifier:0"/>
+ <Component Name="system" Type="Stream" Mapping="Amend1:System,Identifier:1"/>
+ <Component Name="ring" Type="Stream" Mapping="Amend1:Ring,Identifier:2"/>
+ <Component Name="music" Type="Stream" Mapping="Amend1:Music,Identifier:3"/>
+ <Component Name="alarm" Type="Stream" Mapping="Amend1:Alarm,Identifier:4"/>
+ <Component Name="notification" Type="Stream"
+ Mapping="Amend1:Notification,Identifier:5"/>
+ <Component Name="bluetooth_sco" Type="Stream"
+ Mapping="Amend1:BluetoothSco,Identifier:6"/>
+ <Component Name="enforced_audible" Type="Stream"
+ Mapping="Amend1:EnforceAudible,Identifier:7"
+ Description="Sounds that cannot be muted by user and must
+ be routed to speaker"/>
+ <Component Name="dtmf" Type="Stream" Mapping="Amend1:Dtmf,Identifier:8"/>
+ <Component Name="tts" Type="Stream" Mapping="Amend1:Tts,Identifier:9"
+ Description="Transmitted Through Speaker.
+ Plays over speaker only, silent on other devices"/>
+ <Component Name="accessibility" Type="Stream"
+ Mapping="Amend1:Accessibility,Identifier:10"
+ Description="For accessibility talk back prompts"/>
+ <Component Name="rerouting" Type="Stream" Mapping="Amend1:Rerouting,Identifier:11"
+ Description="For dynamic policy output mixes"/>
+ <Component Name="patch" Type="Stream" Mapping="Amend1:Patch,Identifier:12"
+ Description="For internal audio flinger tracks. Fixed volume"/>
+ </ComponentType>
+
+ <!--#################### STREAM END ####################-->
+
+ <!--#################### USAGE BEGIN ####################-->
+
+ <ComponentType Name="Usages" Description="associated to audio_stream_type_t definition,
+ identifier mapping must match the value of the enum">
+ <Component Name="unknown" Type="Usage" Mapping="Amend1:Unknown,Identifier:0"/>
+ <Component Name="media" Type="Usage" Mapping="Amend1:Media,Identifier:1"/>
+ <Component Name="voice_communication" Type="Usage"
+ Mapping="Amend1:VoiceCommunication,Identifier:2"/>
+ <Component Name="voice_communication_signalling" Type="Usage"
+ Mapping="Amend1:VoiceCommunicationSignalling,Identifier:3"/>
+ <Component Name="alarm" Type="Usage" Mapping="Amend1:Alarm,Identifier:4"/>
+ <Component Name="notification" Type="Usage" Mapping="Amend1:Notification,Identifier:5"/>
+ <Component Name="notification_telephony_ringtone" Type="Usage"
+ Mapping="Amend1:NotificationTelephonyRingtone,Identifier:6"/>
+ <Component Name="notification_communication_request" Type="Usage"
+ Mapping="Amend1:NotificationCommunicationRequest,Identifier:7"/>
+ <Component Name="notification_communication_instant" Type="Usage"
+ Mapping="Amend1:NotificationCommunicationInstant,Identifier:8"/>
+ <Component Name="notification_communication_delayed" Type="Usage"
+ Mapping="Amend1:NotificationCommunicationDelated,Identifier:9"/>
+ <Component Name="notification_event" Type="Usage"
+ Mapping="Amend1:NotificationEvent,Identifier:10"/>
+ <Component Name="assistance_accessibility" Type="Usage"
+ Mapping="Amend1:AssistanceAccessibility,Identifier:11"/>
+ <Component Name="assistance_navigation_guidance" Type="Usage"
+ Mapping="Amend1:AssistanceNavigationGuidance,Identifier:12"/>
+ <Component Name="assistance_sonification" Type="Usage"
+ Mapping="Amend1:AssistanceSonification,Identifier:13"/>
+ <Component Name="game" Type="Usage" Mapping="Amend1:BluetoothSco,Identifier:14"/>
+ <Component Name="virtual_source" Type="Usage"
+ Mapping="Amend1:VirtualSource,Identifier:15"/>
+ </ComponentType>
+
+ <!--#################### USAGE END ####################-->
+
+ <!--#################### INPUT SOURCE BEGIN ####################-->
+
+ <ComponentType Name="InputSources" Description="associated to audio_source_t definition,
+ identifier mapping must match the value of the enum">
+ <Component Name="default" Type="InputSource" Mapping="Amend1:Default,Identifier:0"/>
+ <Component Name="mic" Type="InputSource" Mapping="Amend1:Mic,Identifier:1"/>
+ <Component Name="voice_uplink" Type="InputSource"
+ Mapping="Amend1:VoiceUplink,Identifier:2"/>
+ <Component Name="voice_downlink" Type="InputSource"
+ Mapping="Amend1:VoiceDownlink,Identifier:3"/>
+ <Component Name="voice_call" Type="InputSource"
+ Mapping="Amend1:VoiceCall,Identifier:4"/>
+ <Component Name="camcorder" Type="InputSource" Mapping="Amend1:Camcorder,Identifier:5"/>
+ <Component Name="voice_recognition" Type="InputSource"
+ Mapping="Amend1:VoiceRecognition,Identifier:6"/>
+ <Component Name="voice_communication" Type="InputSource"
+ Mapping="Amend1:VoiceCommunication,Identifier:7"/>
+ <Component Name="remote_submix" Type="InputSource"
+ Mapping="Amend1:RemoteSubmix,Identifier:8"/>
+ <Component Name="fm_tuner" Type="InputSource" Mapping="Amend1:FmTuner,Identifier:1998"/>
+ <Component Name="hotword" Type="InputSource" Mapping="Amend1:Hotword,Identifier:1999"/>
+ </ComponentType>
+
+ <!--#################### INPUT SOURCE END ####################-->
+
+ </ComponentLibrary>
+
+ <InstanceDefinition>
+ <Component Name="streams" Type="Streams"/>
+ <Component Name="strategies" Type="Strategies"/>
+ <Component Name="input_sources" Type="InputSources"/>
+ <Component Name="usages" Type="Usages"/>
+ </InstanceDefinition>
+</Subsystem>
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/example/policy_criteria.txt b/services/audiopolicy/engineconfigurable/parameter-framework/example/policy_criteria.txt
new file mode 100755
index 0000000..3b3151c
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/example/policy_criteria.txt
@@ -0,0 +1,14 @@
+ExclusiveCriterion TelephonyMode : Normal RingTone InCall InCommunication
+
+InclusiveCriterion AvailableInputDevices : Communication Ambient BuiltinMic BluetoothScoHeadset WiredHeadset Hdmi TelephonyRx BackMic RemoteSubmix AnlgDockHeadset DgtlDockHeadset UsbAccessory UsbDevice FmTuner TvTuner Line Spdif BluetoothA2dp Loopback
+
+InclusiveCriterion AvailableOutputDevices : Earpiece Speaker WiredSpeaker WiredHeadset WiredHeadphone BluetoothSco BluetoothScoHeadset BluetoothScoCarkit BluetoothA2dp BluetoothA2dpHeadphones BluetoothA2dpSpeaker Hdmi AnlgDockHeadset DgtlDockHeadset UsbAccessory UsbDevice RemoteSubmix TelephonyTx Line HdmiArc Spdif Fm AuxLine SpeakerSafe
+
+ExclusiveCriterion ForceUseForCommunication : ForceNone ForceSpeaker ForceBtSco
+ExclusiveCriterion ForceUseForMedia : ForceNone ForceSpeaker ForceHeadphones ForceBtA2dp ForceWiredAccessory ForceAnalogDock ForceDigitalDock ForceNoBtA2dp ForceSystemEnforced
+ExclusiveCriterion ForceUseForRecord : ForceNone ForceBtSco ForceWiredAccessory
+ExclusiveCriterion ForceUseForDock : ForceNone ForceWiredAccessory ForceBtCarDock ForceBtDeskDock ForceAnalogDock ForceDigitalDock
+ExclusiveCriterion ForceUseForSystem : ForceNone ForceSystemEnforced
+ExclusiveCriterion ForceUseForHdmiSystemAudio : ForceNone ForceHdmiSystemEnforced
+
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Android.mk b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Android.mk
new file mode 100755
index 0000000..a41e6b5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Android.mk
@@ -0,0 +1,40 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := \
+ PolicySubsystemBuilder.cpp \
+ PolicySubsystem.cpp \
+ Strategy.cpp \
+ InputSource.cpp \
+ VolumeProfile.cpp \
+ Stream.cpp \
+ Usage.cpp
+
+LOCAL_CFLAGS += \
+ -Wall \
+ -Werror \
+ -Wextra \
+
+LOCAL_C_INCLUDES := \
+ $(TOPDIR)frameworks/av/services/audiopolicy/common/include \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/include \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/interface \
+
+LOCAL_SHARED_LIBRARIES := \
+ libaudiopolicyengineconfigurable \
+ libparameter \
+ liblog \
+
+LOCAL_STATIC_LIBRARIES := \
+ libparameter_includes \
+ libxmlserializer_includes \
+ libpfw_utility \
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := libpolicy-subsystem
+
+include external/stlport/libstlport.mk
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.cpp
new file mode 100755
index 0000000..497d555
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 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 "InputSource.h"
+#include "PolicyMappingKeys.h"
+#include "PolicySubsystem.h"
+
+using std::string;
+
+InputSource::InputSource(const string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context)
+ : CFormattedSubsystemObject(instanceConfigurableElement,
+ mappingValue,
+ MappingKeyAmend1,
+ (MappingKeyAmendEnd - MappingKeyAmend1 + 1),
+ context),
+ mPolicySubsystem(static_cast<const PolicySubsystem *>(
+ instanceConfigurableElement->getBelongingSubsystem())),
+ mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()),
+ mApplicableInputDevice(mDefaultApplicableInputDevice)
+{
+ mId = static_cast<audio_source_t>(context.getItemAsInteger(MappingKeyIdentifier));
+ // Declares the strategy to audio policy engine
+ mPolicyPluginInterface->addInputSource(getFormattedMappingValue(), mId);
+}
+
+bool InputSource::receiveFromHW(string & /*error*/)
+{
+ blackboardWrite(&mApplicableInputDevice, sizeof(mApplicableInputDevice));
+ return true;
+}
+
+bool InputSource::sendToHW(string & /*error*/)
+{
+ uint32_t applicableInputDevice;
+ blackboardRead(&applicableInputDevice, sizeof(applicableInputDevice));
+ mApplicableInputDevice = applicableInputDevice;
+ return mPolicyPluginInterface->setDeviceForInputSource(mId, mApplicableInputDevice);
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.h
new file mode 100755
index 0000000..67c5b50
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "FormattedSubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "MappingContext.h"
+#include <AudioPolicyPluginInterface.h>
+#include <string>
+
+class PolicySubsystem;
+
+class InputSource : public CFormattedSubsystemObject
+{
+public:
+ InputSource(const std::string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context);
+
+protected:
+ virtual bool receiveFromHW(std::string &error);
+ virtual bool sendToHW(std::string &error);
+
+private:
+ const PolicySubsystem *mPolicySubsystem; /**< Route subsytem plugin. */
+
+ /**
+ * Interface to communicate with Audio Policy Engine.
+ */
+ android::AudioPolicyPluginInterface *mPolicyPluginInterface;
+
+ audio_source_t mId; /**< input source identifier to link with audio.h. */
+ uint32_t mApplicableInputDevice; /**< applicable input device for this strategy. */
+ static const uint32_t mDefaultApplicableInputDevice = 0; /**< default input device. */
+};
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicyMappingKeys.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicyMappingKeys.h
new file mode 100755
index 0000000..53944e9
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicyMappingKeys.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+/**
+ * Mapping item types
+ */
+enum PolicyItemType
+{
+ MappingKeyName,
+ MappingKeyCategory,
+ MappingKeyIdentifier,
+ MappingKeyAmend1,
+ MappingKeyAmend2,
+ MappingKeyAmend3
+};
+
+static const uint8_t MappingKeyAmendEnd = MappingKeyAmend3;
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp
new file mode 100755
index 0000000..a5dab36
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2015 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 "PolicySubsystem.h"
+#include "SubsystemObjectFactory.h"
+#include "PolicyMappingKeys.h"
+#include "Strategy.h"
+#include "Stream.h"
+#include "InputSource.h"
+#include "VolumeProfile.h"
+#include "Usage.h"
+#include <AudioPolicyPluginInterface.h>
+#include <AudioPolicyEngineInstance.h>
+#include <utils/Log.h>
+
+using android::audio_policy::EngineInstance;
+
+const char *const PolicySubsystem::mKeyName = "Name";
+const char *const PolicySubsystem::mKeyIdentifier = "Identifier";
+const char *const PolicySubsystem::mKeyCategory = "Category";
+const char *const PolicySubsystem::mKeyAmend1 = "Amend1";
+const char *const PolicySubsystem::mKeyAmend2 = "Amend2";
+const char *const PolicySubsystem::mKeyAmend3 = "Amend3";
+
+
+const char *const PolicySubsystem::mStreamComponentName = "Stream";
+const char *const PolicySubsystem::mStrategyComponentName = "Strategy";
+const char *const PolicySubsystem::mInputSourceComponentName = "InputSource";
+const char *const PolicySubsystem::mUsageComponentName = "Usage";
+const char *const PolicySubsystem::mVolumeProfileComponentName = "VolumeProfile";
+
+PolicySubsystem::PolicySubsystem(const std::string &name)
+ : CSubsystem(name),
+ mPluginInterface(NULL)
+{
+ // Try to connect a Plugin Interface from Audio Policy Engine
+ EngineInstance *engineInstance = EngineInstance::getInstance();
+
+ if (engineInstance == NULL) {
+ ALOG_ASSERT(engineInstance != NULL, "NULL Plugin Interface");
+ return;
+ }
+ // Retrieve the Route Interface
+ mPluginInterface = engineInstance->queryInterface<android::AudioPolicyPluginInterface>();
+ if (mPluginInterface == NULL) {
+ // bailing out
+ ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
+ return;
+ }
+
+ // Provide mapping keys to the core, necessary when parsing the XML Structure files.
+ addContextMappingKey(mKeyName);
+ addContextMappingKey(mKeyCategory);
+ addContextMappingKey(mKeyIdentifier);
+ addContextMappingKey(mKeyAmend1);
+ addContextMappingKey(mKeyAmend2);
+ addContextMappingKey(mKeyAmend3);
+
+ // Provide creators to upper layer
+ addSubsystemObjectFactory(
+ new TSubsystemObjectFactory<Stream>(
+ mStreamComponentName,
+ (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
+ );
+ addSubsystemObjectFactory(
+ new TSubsystemObjectFactory<Strategy>(
+ mStrategyComponentName,
+ (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
+ );
+ addSubsystemObjectFactory(
+ new TSubsystemObjectFactory<Usage>(
+ mUsageComponentName,
+ (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
+ );
+ addSubsystemObjectFactory(
+ new TSubsystemObjectFactory<InputSource>(
+ mInputSourceComponentName,
+ (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
+ );
+ addSubsystemObjectFactory(
+ new TSubsystemObjectFactory<VolumeProfile>(
+ mVolumeProfileComponentName,
+ (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier) | (1 << MappingKeyIdentifier))
+ );
+}
+
+// Retrieve Route interface
+android::AudioPolicyPluginInterface *PolicySubsystem::getPolicyPluginInterface() const
+{
+ ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
+ return mPluginInterface;
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.h
new file mode 100755
index 0000000..3c26fe1
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Subsystem.h"
+#include <string>
+
+namespace android {
+
+class AudioPolicyPluginInterface;
+
+}
+
+class PolicySubsystem : public CSubsystem
+{
+public:
+ PolicySubsystem(const std::string &strName);
+
+ /**
+ * Retrieve Route Manager interface.
+ *
+ * @return RouteManager interface for the route plugin.
+ */
+ android::AudioPolicyPluginInterface *getPolicyPluginInterface() const;
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ PolicySubsystem(const PolicySubsystem &object);
+ PolicySubsystem &operator=(const PolicySubsystem &object);
+
+ android::AudioPolicyPluginInterface *mPluginInterface; /**< Audio Policy Plugin Interface. */
+
+ static const char *const mKeyName; /**< name key mapping string. */
+ static const char *const mKeyIdentifier;
+ static const char *const mKeyCategory;
+
+ static const char *const mKeyAmend1; /**< amend1 key mapping string. */
+ static const char *const mKeyAmend2; /**< amend2 key mapping string. */
+ static const char *const mKeyAmend3; /**< amend3 key mapping string. */
+
+ static const char *const mStreamComponentName;
+ static const char *const mStrategyComponentName;
+ static const char *const mInputSourceComponentName;
+ static const char *const mUsageComponentName;
+ static const char *const mVolumeProfileComponentName;
+};
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystemBuilder.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystemBuilder.cpp
new file mode 100755
index 0000000..b14d446
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystemBuilder.cpp
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 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 "SubsystemLibrary.h"
+#include "NamedElementBuilderTemplate.h"
+#include "PolicySubsystem.h"
+
+static const char *const POLICY_SUBSYSTEM_NAME = "Policy";
+extern "C"
+{
+void getPOLICYSubsystemBuilder(CSubsystemLibrary *subsystemLibrary)
+{
+ subsystemLibrary->addElementBuilder(POLICY_SUBSYSTEM_NAME,
+ new TNamedElementBuilderTemplate<PolicySubsystem>());
+}
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.cpp
new file mode 100755
index 0000000..1848813
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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 "Strategy.h"
+#include "PolicyMappingKeys.h"
+#include "PolicySubsystem.h"
+
+using std::string;
+using android::routing_strategy;
+
+Strategy::Strategy(const string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context)
+ : CFormattedSubsystemObject(instanceConfigurableElement,
+ mappingValue,
+ MappingKeyAmend1,
+ (MappingKeyAmendEnd - MappingKeyAmend1 + 1),
+ context),
+ mPolicySubsystem(static_cast<const PolicySubsystem *>(
+ instanceConfigurableElement->getBelongingSubsystem())),
+ mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()),
+ mApplicableOutputDevice(mDefaultApplicableOutputDevice)
+{
+ mId = static_cast<routing_strategy>(context.getItemAsInteger(MappingKeyIdentifier));
+
+ // Declares the strategy to audio policy engine
+ mPolicyPluginInterface->addStrategy(getFormattedMappingValue(), mId);
+}
+
+bool Strategy::receiveFromHW(string & /*error*/)
+{
+ blackboardWrite(&mApplicableOutputDevice, sizeof(mApplicableOutputDevice));
+ return true;
+}
+
+bool Strategy::sendToHW(string & /*error*/)
+{
+ uint32_t applicableOutputDevice;
+ blackboardRead(&applicableOutputDevice, sizeof(applicableOutputDevice));
+ return mPolicyPluginInterface->setDeviceForStrategy(mId, applicableOutputDevice);
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.h
new file mode 100755
index 0000000..9a9b3e4
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "FormattedSubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "MappingContext.h"
+#include <AudioPolicyPluginInterface.h>
+#include <string>
+
+class PolicySubsystem;
+
+class Strategy : public CFormattedSubsystemObject
+{
+public:
+ Strategy(const std::string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context);
+
+protected:
+ virtual bool receiveFromHW(std::string &error);
+ virtual bool sendToHW(std::string &error);
+
+private:
+ const PolicySubsystem *mPolicySubsystem; /**< Route subsytem plugin. */
+
+ /**
+ * Interface to communicate with Audio Policy Engine.
+ */
+ android::AudioPolicyPluginInterface *mPolicyPluginInterface;
+
+ android::routing_strategy mId; /**< strategy identifier to link with audio.h.*/
+ uint32_t mApplicableOutputDevice; /**< applicable output device for this strategy. */
+ static const uint32_t mDefaultApplicableOutputDevice = 0; /**< default output device. */
+};
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.cpp
new file mode 100755
index 0000000..575b0bb
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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 "Stream.h"
+#include "PolicyMappingKeys.h"
+#include "PolicySubsystem.h"
+
+using std::string;
+using android::routing_strategy;
+
+Stream::Stream(const string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context)
+ : CFormattedSubsystemObject(instanceConfigurableElement,
+ mappingValue,
+ MappingKeyAmend1,
+ (MappingKeyAmendEnd - MappingKeyAmend1 + 1),
+ context),
+ mPolicySubsystem(static_cast<const PolicySubsystem *>(
+ instanceConfigurableElement->getBelongingSubsystem())),
+ mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()),
+ mApplicableStrategy(mDefaultApplicableStrategy)
+{
+ mId = static_cast<audio_stream_type_t>(context.getItemAsInteger(MappingKeyIdentifier));
+
+ // Declares the strategy to audio policy engine
+ mPolicyPluginInterface->addStream(getFormattedMappingValue(), mId);
+}
+
+bool Stream::receiveFromHW(string & /*error*/)
+{
+ blackboardWrite(&mApplicableStrategy, sizeof(mApplicableStrategy));
+ return true;
+}
+
+bool Stream::sendToHW(string & /*error*/)
+{
+ uint32_t applicableStrategy;
+ blackboardRead(&applicableStrategy, sizeof(applicableStrategy));
+ mApplicableStrategy = applicableStrategy;
+ return mPolicyPluginInterface->setStrategyForStream(mId,
+ static_cast<routing_strategy>(mApplicableStrategy));
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.h
new file mode 100755
index 0000000..7d90c36
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "FormattedSubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "MappingContext.h"
+#include <AudioPolicyPluginInterface.h>
+#include <string>
+
+class PolicySubsystem;
+
+class Stream : public CFormattedSubsystemObject
+{
+public:
+ Stream(const std::string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context);
+
+protected:
+ virtual bool receiveFromHW(std::string &error);
+ virtual bool sendToHW(std::string &error);
+
+private:
+ const PolicySubsystem *mPolicySubsystem; /**< Route subsytem plugin. */
+
+ /**
+ * Interface to communicate with Audio Policy Engine.
+ */
+ android::AudioPolicyPluginInterface *mPolicyPluginInterface;
+
+ audio_stream_type_t mId; /**< stream type identifier to link with audio.h. */
+ uint32_t mApplicableStrategy; /**< applicable strategy for this stream. */
+ static const uint32_t mDefaultApplicableStrategy = 0; /**< default strategy. */
+};
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.cpp
new file mode 100755
index 0000000..1916b9b
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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 "Usage.h"
+#include "PolicyMappingKeys.h"
+#include "PolicySubsystem.h"
+
+using std::string;
+using android::routing_strategy;
+
+Usage::Usage(const string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context)
+ : CFormattedSubsystemObject(instanceConfigurableElement,
+ mappingValue,
+ MappingKeyAmend1,
+ (MappingKeyAmendEnd - MappingKeyAmend1 + 1),
+ context),
+ mPolicySubsystem(static_cast<const PolicySubsystem *>(
+ instanceConfigurableElement->getBelongingSubsystem())),
+ mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()),
+ mApplicableStrategy(mDefaultApplicableStrategy)
+{
+ mId = static_cast<audio_usage_t>(context.getItemAsInteger(MappingKeyIdentifier));
+
+ // Declares the strategy to audio policy engine
+ mPolicyPluginInterface->addUsage(getFormattedMappingValue(), mId);
+}
+
+bool Usage::receiveFromHW(string & /*error*/)
+{
+ blackboardWrite(&mApplicableStrategy, sizeof(mApplicableStrategy));
+ return true;
+}
+
+bool Usage::sendToHW(string & /*error*/)
+{
+ uint32_t applicableStrategy;
+ blackboardRead(&applicableStrategy, sizeof(applicableStrategy));
+ mApplicableStrategy = applicableStrategy;
+ return mPolicyPluginInterface->setStrategyForUsage(mId,
+ static_cast<routing_strategy>(mApplicableStrategy));
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.h
new file mode 100755
index 0000000..8e9b638
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "FormattedSubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "MappingContext.h"
+#include <AudioPolicyPluginInterface.h>
+#include <string>
+
+class PolicySubsystem;
+
+class Usage : public CFormattedSubsystemObject
+{
+public:
+ Usage(const std::string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context);
+
+protected:
+ virtual bool receiveFromHW(std::string &error);
+ virtual bool sendToHW(std::string &error);
+
+private:
+ const PolicySubsystem *mPolicySubsystem; /**< Route subsytem plugin. */
+
+ /**
+ * Interface to communicate with Audio Policy Engine.
+ */
+ android::AudioPolicyPluginInterface *mPolicyPluginInterface;
+
+ audio_usage_t mId; /**< usage identifier to link with audio.h. */
+ uint32_t mApplicableStrategy; /**< applicable strategy for this usage. */
+ static const uint32_t mDefaultApplicableStrategy = 0; /**< default strategy. */
+};
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.cpp b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.cpp
new file mode 100755
index 0000000..5c155c8
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.cpp
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 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 "VolumeProfile.h"
+#include "PolicyMappingKeys.h"
+#include "PolicySubsystem.h"
+#include "ParameterBlockType.h"
+#include <Volume.h>
+#include <math.h>
+
+using std::string;
+
+VolumeProfile::VolumeProfile(const string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context)
+ : CFormattedSubsystemObject(instanceConfigurableElement,
+ mappingValue,
+ MappingKeyAmend1,
+ (MappingKeyAmendEnd - MappingKeyAmend1 + 1),
+ context),
+ mPolicySubsystem(static_cast<const PolicySubsystem *>(
+ instanceConfigurableElement->getBelongingSubsystem())),
+ mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface())
+{
+ uint32_t categoryKey = context.getItemAsInteger(MappingKeyCategory);
+ if (categoryKey >= Volume::DEVICE_CATEGORY_CNT) {
+ mCategory = Volume::DEVICE_CATEGORY_SPEAKER;
+ } else {
+ mCategory = static_cast<Volume::device_category>(categoryKey);
+ }
+ mId = static_cast<audio_stream_type_t>(context.getItemAsInteger(MappingKeyIdentifier));
+
+ // (no exception support, defer the error)
+ if (instanceConfigurableElement->getType() != CInstanceConfigurableElement::EParameterBlock) {
+ return;
+ }
+ // Get actual element type
+ const CParameterBlockType *parameterType = static_cast<const CParameterBlockType *>(
+ instanceConfigurableElement->getTypeElement());
+ mPoints = parameterType->getArrayLength();
+}
+
+bool VolumeProfile::receiveFromHW(string & /*error*/)
+{
+ return true;
+}
+
+bool VolumeProfile::sendToHW(string & /*error*/)
+{
+ Point points[mPoints];
+ blackboardRead(&points, sizeof(Point) * mPoints);
+
+ VolumeCurvePoints pointsVector;
+ for (size_t i = 0; i < mPoints; i++) {
+ VolumeCurvePoint curvePoint;
+ curvePoint.mIndex = points[i].index;
+ curvePoint.mDBAttenuation = static_cast<float>(points[i].dbAttenuation) /
+ (1UL << gFractional);
+ pointsVector.push_back(curvePoint);
+ }
+ return mPolicyPluginInterface->setVolumeProfileForStream(mId, mCategory, pointsVector);
+}
diff --git a/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.h b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.h
new file mode 100755
index 0000000..a00ae84
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "FormattedSubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "MappingContext.h"
+#include <Volume.h>
+#include <AudioPolicyPluginInterface.h>
+#include <string>
+
+class PolicySubsystem;
+
+class VolumeProfile : public CFormattedSubsystemObject
+{
+private:
+ struct Point
+ {
+ int index;
+ /** Volume is using FixedPointParameter until float parameters are available. */
+ int16_t dbAttenuation;
+ } __attribute__((packed));
+
+public:
+ VolumeProfile(const std::string &mappingValue,
+ CInstanceConfigurableElement *instanceConfigurableElement,
+ const CMappingContext &context);
+
+protected:
+ virtual bool receiveFromHW(std::string &error);
+ virtual bool sendToHW(std::string &error);
+
+private:
+ const PolicySubsystem *mPolicySubsystem; /**< Route subsytem plugin. */
+
+ /**
+ * Interface to communicate with Audio Policy Engine.
+ */
+ android::AudioPolicyPluginInterface *mPolicyPluginInterface;
+
+ /**
+ * volume profile identifier, which is in fact a stream type to link with audio.h.
+ */
+ audio_stream_type_t mId;
+
+ size_t mPoints;
+ Volume::device_category mCategory;
+
+ static const uint32_t gFractional = 8; /**< Beware to align with the structure. */
+};
diff --git a/services/audiopolicy/engineconfigurable/src/Collection.h b/services/audiopolicy/engineconfigurable/src/Collection.h
new file mode 100755
index 0000000..8f17b15
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Collection.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Element.h"
+#include "Stream.h"
+#include "Strategy.h"
+#include "Usage.h"
+#include "InputSource.h"
+#include <utils/Errors.h>
+#include <system/audio.h>
+#include <utils/Log.h>
+#include <map>
+#include <stdint.h>
+#include <string>
+
+namespace android
+{
+namespace audio_policy
+{
+
+/**
+ * Collection of policy element as a map indexed with a their UID type.
+ *
+ * @tparam Key type of the policy element indexing the collection.
+ * Policy Element supported are:
+ * - Strategy
+ * - Stream
+ * - InputSource
+ * - Usage.
+ */
+template <typename Key>
+class Collection : public std::map<Key, Element<Key> *>
+{
+private:
+ typedef Element<Key> T;
+ typedef typename std::map<Key, T *>::iterator CollectionIterator;
+ typedef typename std::map<Key, T *>::const_iterator CollectionConstIterator;
+
+public:
+ Collection()
+ {
+ collectionSupported();
+ }
+
+ /**
+ * Add a policy element to the collection. Policy elements are streams, strategies, input
+ * sources, ... Compile time error generated if called with not supported collection.
+ * It also set the key as the unique identifier of the policy element.
+ *
+ * @tparam Key indexing the collection of policy element.
+ * @param[in] name of the policy element to find.
+ * @param[in] key to be used to index this new policy element.
+ *
+ * @return NO_ERROR if the policy element has been successfully added to the collection.
+ */
+ status_t add(const std::string &name, Key key)
+ {
+ if ((*this).find(key) != (*this).end()) {
+ ALOGW("%s: element %s already added", __FUNCTION__, name.c_str());
+ return BAD_VALUE;
+ }
+ (*this)[key] = new T(name);
+ ALOGD("%s: adding element %s to collection", __FUNCTION__, name.c_str());
+ return (*this)[key]->setIdentifier(key);
+ }
+
+ /**
+ * Get a policy element from the collection by its key. Policy elements are streams, strategies,
+ * input sources, ... Compile time error generated if called with not supported collection.
+ *
+ * @tparam Key indexing the collection of policy element.
+ * @param[in] key of the policy element to find.
+ *
+ * @return valid pointer on policy element if found, NULL otherwise.
+ */
+ T *get(Key key) const
+ {
+ CollectionConstIterator it = (*this).find(key);
+ return (it == (*this).end()) ? NULL : it->second;
+ }
+
+ /**
+ * Find a policy element from the collection by its name. Policy elements are streams,
+ * strategies, input sources, ...
+ * Compile time error generated if called with not supported collection.
+ *
+ * @tparam Key indexing the collection of policy element.
+ * @param[in] name of the policy element to find.
+ * @param[in] elementsMap maps of policy elements to search into.
+ *
+ * @return valid pointer on element if found, NULL otherwise.
+ */
+ T *findByName(const std::string &name) const
+ {
+
+ CollectionConstIterator it;
+ for (it = (*this).begin(); it != (*this).end(); ++it) {
+ T *element = it->second;
+ if (element->getName() == name) {
+ return element;
+ }
+ }
+ return NULL;
+ }
+
+ /**
+ * Removes all the elements from the list and destroy them.
+ */
+ void clear()
+ {
+ CollectionIterator it;
+ for (it = (*this).begin(); it != (*this).end(); ++it) {
+ delete it->second;
+ }
+ (*this).clear();
+ }
+
+private:
+ /**
+ * provide a compile time error if no specialization is provided for a given type.
+ *
+ * @tparam T: type of the policyElement. Policy Element supported are:
+ * - Strategy
+ * - Stream
+ * - InputSource
+ * - Usage.
+ */
+ struct collectionSupported;
+};
+
+template <>
+struct Collection<audio_stream_type_t>::collectionSupported {};
+template <>
+struct Collection<std::string>::collectionSupported {};
+template <>
+struct Collection<audio_usage_t>::collectionSupported {};
+template <>
+struct Collection<audio_source_t>::collectionSupported {};
+template <>
+struct Collection<routing_strategy>::collectionSupported {};
+
+typedef Collection<routing_strategy> StrategyCollection;
+typedef Collection<audio_stream_type_t> StreamCollection;
+typedef Collection<audio_usage_t> UsageCollection;
+typedef Collection<audio_source_t> InputSourceCollection;
+
+} // namespace audio_policy
+} // namespace android
diff --git a/services/audiopolicy/engineconfigurable/src/Element.h b/services/audiopolicy/engineconfigurable/src/Element.h
new file mode 100755
index 0000000..52e77e5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Element.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <stdint.h>
+#include <string>
+#include <utils/Errors.h>
+#include <system/audio.h>
+#include <utils/Log.h>
+
+namespace android
+{
+namespace audio_policy
+{
+
+template <typename Key>
+class Element
+{
+public:
+ Element(const std::string &name)
+ : mName(name)
+ {}
+ ~Element() {}
+
+ /**
+ * Returns identifier of this policy element
+ *
+ * @returns string representing the name of this policy element
+ */
+ const std::string &getName() const { return mName; }
+
+ /**
+ * Set the unique identifier for this policy element.
+ *
+ * @tparam Key type of the unique identifier.
+ * @param[in] identifier to be set.
+ *
+ * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
+ */
+ status_t setIdentifier(Key identifier)
+ {
+ mIdentifier = identifier;
+ return NO_ERROR;
+ }
+
+ /**
+ * @return the unique identifier of this policy element.
+ */
+ const Key &getIdentifier() const { return mIdentifier; }
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ *
+ * @tparam Property for which this policy element has setter / getter.
+ * @return the property kept track by this policy base element.
+ */
+ template <typename Property>
+ Property get() const;
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ *
+ * @tparam Property for which this policy element has setter / getter.
+ *
+ * @param[in] property value to be assigned for this policy base element.
+ *
+ * @return the property kept track by this policy base element.
+ */
+ template <typename Property>
+ status_t set(Property property);
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Element(const Element &object);
+ Element &operator=(const Element &object);
+
+ std::string mName; /**< Unique literal Identifier of a policy base element*/
+ Key mIdentifier; /**< Unique numerical Identifier of a policy base element*/
+};
+} // namespace audio_policy
+} // namespace android
diff --git a/services/audiopolicy/engineconfigurable/src/Engine.cpp b/services/audiopolicy/engineconfigurable/src/Engine.cpp
new file mode 100755
index 0000000..c5cccfd
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Engine.cpp
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine"
+//#define LOG_NDEBUG 0
+
+//#define VERY_VERBOSE_LOGGING
+#ifdef VERY_VERBOSE_LOGGING
+#define ALOGVV ALOGV
+#else
+#define ALOGVV(a...) do { } while(0)
+#endif
+
+#include "Engine.h"
+#include "Strategy.h"
+#include "Stream.h"
+#include "InputSource.h"
+#include "Usage.h"
+#include <policy.h>
+#include <ParameterManagerWrapper.h>
+
+using std::string;
+using std::map;
+
+namespace android
+{
+namespace audio_policy
+{
+template <>
+StrategyCollection &Engine::getCollection<routing_strategy>()
+{
+ return mStrategyCollection;
+}
+template <>
+StreamCollection &Engine::getCollection<audio_stream_type_t>()
+{
+ return mStreamCollection;
+}
+template <>
+UsageCollection &Engine::getCollection<audio_usage_t>()
+{
+ return mUsageCollection;
+}
+template <>
+InputSourceCollection &Engine::getCollection<audio_source_t>()
+{
+ return mInputSourceCollection;
+}
+
+template <>
+const StrategyCollection &Engine::getCollection<routing_strategy>() const
+{
+ return mStrategyCollection;
+}
+template <>
+const StreamCollection &Engine::getCollection<audio_stream_type_t>() const
+{
+ return mStreamCollection;
+}
+template <>
+const UsageCollection &Engine::getCollection<audio_usage_t>() const
+{
+ return mUsageCollection;
+}
+template <>
+const InputSourceCollection &Engine::getCollection<audio_source_t>() const
+{
+ return mInputSourceCollection;
+}
+
+Engine::Engine()
+ : mManagerInterface(this),
+ mPluginInterface(this),
+ mPolicyParameterMgr(new ParameterManagerWrapper()),
+ mApmObserver(NULL)
+{
+ if (mPolicyParameterMgr->start() != NO_ERROR) {
+ ALOGE("%s: could not start Policy PFW", __FUNCTION__);
+ delete mPolicyParameterMgr;
+ mPolicyParameterMgr = NULL;
+ }
+}
+
+Engine::~Engine()
+{
+ mStrategyCollection.clear();
+ mStreamCollection.clear();
+ mInputSourceCollection.clear();
+ mUsageCollection.clear();
+}
+
+
+void Engine::setObserver(AudioPolicyManagerObserver *observer)
+{
+ ALOG_ASSERT(observer != NULL, "Invalid Audio Policy Manager observer");
+ mApmObserver = observer;
+}
+
+status_t Engine::initCheck()
+{
+ return (mPolicyParameterMgr != NULL) &&
+ mPolicyParameterMgr->isStarted() &&
+ (mApmObserver != NULL)?
+ NO_ERROR : NO_INIT;
+}
+
+bool Engine::setVolumeProfileForStream(const audio_stream_type_t &streamType,
+ Volume::device_category deviceCategory,
+ const VolumeCurvePoints &points)
+{
+ Stream *stream = getFromCollection<audio_stream_type_t>(streamType);
+ if (stream == NULL) {
+ ALOGE("%s: stream %d not found", __FUNCTION__, streamType);
+ return false;
+ }
+ return stream->setVolumeProfile(deviceCategory, points) == NO_ERROR;
+}
+
+template <typename Key>
+Element<Key> *Engine::getFromCollection(const Key &key) const
+{
+ const Collection<Key> collection = getCollection<Key>();
+ return collection.get(key);
+}
+
+template <typename Key>
+status_t Engine::add(const std::string &name, const Key &key)
+{
+ Collection<Key> &collection = getCollection<Key>();
+ return collection.add(name, key);
+}
+
+template <>
+routing_strategy Engine::getPropertyForKey<routing_strategy, audio_usage_t>(audio_usage_t usage) const
+{
+ const AudioOutputCollection &outputs = mApmObserver->getOutputs();
+
+ if (usage == AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY &&
+ (outputs.isStreamActive(AUDIO_STREAM_RING) ||
+ outputs.isStreamActive(AUDIO_STREAM_ALARM))) {
+ return STRATEGY_SONIFICATION;
+ }
+ return getPropertyForKey<routing_strategy, audio_usage_t>(usage);
+}
+
+template <typename Property, typename Key>
+Property Engine::getPropertyForKey(Key key) const
+{
+ Element<Key> *element = getFromCollection<Key>(key);
+ if (element == NULL) {
+ ALOGE("%s: Element not found within collection", __FUNCTION__);
+ return static_cast<Property>(0);
+ }
+ return element->template get<Property>();
+}
+
+template <>
+audio_devices_t Engine::getPropertyForKey<audio_devices_t, routing_strategy>(routing_strategy strategy) const
+{
+ const AudioOutputCollection &outputs = mApmObserver->getOutputs();
+
+ /** This is the only case handled programmatically because the PFW is unable to know the
+ * activity of streams.
+ *
+ * -While media is playing on a remote device, use the the sonification behavior.
+ * Note that we test this usecase before testing if media is playing because
+ * the isStreamActive() method only informs about the activity of a stream, not
+ * if it's for local playback. Note also that we use the same delay between both tests
+ *
+ * -When media is not playing anymore, fall back on the sonification behavior
+ */
+ if (strategy == STRATEGY_SONIFICATION_RESPECTFUL &&
+ !is_state_in_call(getPhoneState()) &&
+ !outputs.isStreamActiveRemotely(AUDIO_STREAM_MUSIC,
+ SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY) &&
+ outputs.isStreamActive(AUDIO_STREAM_MUSIC, SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY)) {
+ return getPropertyForKey<audio_devices_t, routing_strategy>(STRATEGY_MEDIA);
+ }
+ return getPropertyForKey<audio_devices_t, routing_strategy>(strategy);
+}
+
+routing_strategy Engine::ManagerInterfaceImpl::getStrategyForUsage(audio_usage_t usage)
+{
+ return mPolicyEngine->getPropertyForKey<routing_strategy, audio_usage_t>(usage);
+}
+
+audio_devices_t Engine::ManagerInterfaceImpl::getDeviceForStrategy(routing_strategy stategy) const
+{
+ return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(stategy);
+}
+
+template <typename Property, typename Key>
+bool Engine::setPropertyForKey(const Property &property, const Key &key)
+{
+ Element<Key> *element = getFromCollection<Key>(key);
+ if (element == NULL) {
+ ALOGE("%s: Element not found within collection", __FUNCTION__);
+ return BAD_VALUE;
+ }
+ return element->template set<Property>(property) == NO_ERROR;
+}
+
+float Engine::volIndexToAmpl(Volume::device_category category,
+ audio_stream_type_t streamType,
+ int indexInUi)
+{
+ Stream *stream = getFromCollection<audio_stream_type_t>(streamType);
+ if (stream == NULL) {
+ ALOGE("%s: Element indexed by key=%d not found", __FUNCTION__, streamType);
+ return 1.0f;
+ }
+ return stream->volIndexToAmpl(category, indexInUi);
+}
+
+status_t Engine::initStreamVolume(audio_stream_type_t streamType,
+ int indexMin, int indexMax)
+{
+ Stream *stream = getFromCollection<audio_stream_type_t>(streamType);
+ if (stream == NULL) {
+ ALOGE("%s: Stream Type %d not found", __FUNCTION__, streamType);
+ return BAD_TYPE;
+ }
+ return stream->initVolume(indexMin, indexMax);
+}
+
+status_t Engine::setPhoneState(audio_mode_t mode)
+{
+ return mPolicyParameterMgr->setPhoneState(mode);
+}
+
+audio_mode_t Engine::getPhoneState() const
+{
+ return mPolicyParameterMgr->getPhoneState();
+}
+
+status_t Engine::setForceUse(audio_policy_force_use_t usage,
+ audio_policy_forced_cfg_t config)
+{
+ return mPolicyParameterMgr->setForceUse(usage, config);
+}
+
+audio_policy_forced_cfg_t Engine::getForceUse(audio_policy_force_use_t usage) const
+{
+ return mPolicyParameterMgr->getForceUse(usage);
+}
+
+status_t Engine::setDeviceConnectionState(audio_devices_t devices, audio_policy_dev_state_t state,
+ const char *deviceAddress)
+{
+ return mPolicyParameterMgr->setDeviceConnectionState(devices, state, deviceAddress);
+}
+
+template <>
+AudioPolicyManagerInterface *Engine::queryInterface()
+{
+ return &mManagerInterface;
+}
+
+template <>
+AudioPolicyPluginInterface *Engine::queryInterface()
+{
+ return &mPluginInterface;
+}
+
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/src/Engine.h b/services/audiopolicy/engineconfigurable/src/Engine.h
new file mode 100755
index 0000000..23ca7d0
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Engine.h
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+
+#include <AudioPolicyManagerInterface.h>
+#include <AudioPolicyPluginInterface.h>
+#include "Collection.h"
+
+namespace android
+{
+class AudioPolicyManagerObserver;
+
+namespace audio_policy
+{
+
+class ParameterManagerWrapper;
+class VolumeProfile;
+
+class Engine
+{
+public:
+ Engine();
+ virtual ~Engine();
+
+ template <class RequestedInterface>
+ RequestedInterface *queryInterface();
+
+private:
+ /// Interface members
+ class ManagerInterfaceImpl : public AudioPolicyManagerInterface
+ {
+ public:
+ ManagerInterfaceImpl(Engine *policyEngine)
+ : mPolicyEngine(policyEngine) {}
+
+ virtual android::status_t initCheck()
+ {
+ return mPolicyEngine->initCheck();
+ }
+ virtual void setObserver(AudioPolicyManagerObserver *observer)
+ {
+ mPolicyEngine->setObserver(observer);
+ }
+ virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource) const
+ {
+ return mPolicyEngine->getPropertyForKey<audio_devices_t, audio_source_t>(inputSource);
+ }
+ virtual audio_devices_t getDeviceForStrategy(routing_strategy stategy) const;
+ virtual routing_strategy getStrategyForStream(audio_stream_type_t stream)
+ {
+ return mPolicyEngine->getPropertyForKey<routing_strategy, audio_stream_type_t>(stream);
+ }
+ virtual routing_strategy getStrategyForUsage(audio_usage_t usage);
+ virtual status_t setPhoneState(audio_mode_t mode)
+ {
+ return mPolicyEngine->setPhoneState(mode);
+ }
+ virtual audio_mode_t getPhoneState() const
+ {
+ return mPolicyEngine->getPhoneState();
+ }
+ virtual status_t setForceUse(audio_policy_force_use_t usage,
+ audio_policy_forced_cfg_t config)
+ {
+ return mPolicyEngine->setForceUse(usage, config);
+ }
+ virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) const
+ {
+ return mPolicyEngine->getForceUse(usage);
+ }
+ virtual android::status_t setDeviceConnectionState(const sp<DeviceDescriptor> devDesc,
+ audio_policy_dev_state_t state)
+ {
+ return mPolicyEngine->setDeviceConnectionState(devDesc->type(), state,
+ devDesc->mAddress);
+ }
+ virtual status_t initStreamVolume(audio_stream_type_t stream,
+ int indexMin, int indexMax)
+ {
+ return mPolicyEngine->initStreamVolume(stream, indexMin, indexMax);
+ }
+
+ virtual void initializeVolumeCurves(bool /*isSpeakerDrcEnabled*/) {}
+
+ virtual float volIndexToAmpl(Volume::device_category deviceCategory,
+ audio_stream_type_t stream,
+ int indexInUi)
+ {
+ return mPolicyEngine->volIndexToAmpl(deviceCategory, stream, indexInUi);
+ }
+
+ private:
+ Engine *mPolicyEngine;
+ } mManagerInterface;
+
+ class PluginInterfaceImpl : public AudioPolicyPluginInterface
+ {
+ public:
+ PluginInterfaceImpl(Engine *policyEngine)
+ : mPolicyEngine(policyEngine) {}
+
+ virtual status_t addStrategy(const std::string &name, routing_strategy strategy)
+ {
+ return mPolicyEngine->add<routing_strategy>(name, strategy);
+ }
+ virtual status_t addStream(const std::string &name, audio_stream_type_t stream)
+ {
+ return mPolicyEngine->add<audio_stream_type_t>(name, stream);
+ }
+ virtual status_t addUsage(const std::string &name, audio_usage_t usage)
+ {
+ return mPolicyEngine->add<audio_usage_t>(name, usage);
+ }
+ virtual status_t addInputSource(const std::string &name, audio_source_t source)
+ {
+ return mPolicyEngine->add<audio_source_t>(name, source);
+ }
+ virtual bool setDeviceForStrategy(const routing_strategy &strategy, audio_devices_t devices)
+ {
+ return mPolicyEngine->setPropertyForKey<audio_devices_t, routing_strategy>(devices,
+ strategy);
+ }
+ virtual bool setStrategyForStream(const audio_stream_type_t &stream,
+ routing_strategy strategy)
+ {
+ return mPolicyEngine->setPropertyForKey<routing_strategy, audio_stream_type_t>(strategy,
+ stream);
+ }
+ virtual bool setVolumeProfileForStream(const audio_stream_type_t &stream,
+ Volume::device_category deviceCategory,
+ const VolumeCurvePoints &points)
+ {
+ return mPolicyEngine->setVolumeProfileForStream(stream, deviceCategory, points);
+ }
+
+ virtual bool setStrategyForUsage(const audio_usage_t &usage, routing_strategy strategy)
+ {
+ return mPolicyEngine->setPropertyForKey<routing_strategy, audio_usage_t>(strategy,
+ usage);
+ }
+ virtual bool setDeviceForInputSource(const audio_source_t &inputSource,
+ audio_devices_t device)
+ {
+ return mPolicyEngine->setPropertyForKey<audio_devices_t, audio_source_t>(device,
+ inputSource);
+ }
+
+ private:
+ Engine *mPolicyEngine;
+ } mPluginInterface;
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Engine(const Engine &object);
+ Engine &operator=(const Engine &object);
+
+ void setObserver(AudioPolicyManagerObserver *observer);
+
+ bool setVolumeProfileForStream(const audio_stream_type_t &stream,
+ Volume::device_category deviceCategory,
+ const VolumeCurvePoints &points);
+
+ status_t initCheck();
+ status_t setPhoneState(audio_mode_t mode);
+ audio_mode_t getPhoneState() const;
+ status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
+ audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) const;
+ status_t setDeviceConnectionState(audio_devices_t devices, audio_policy_dev_state_t state,
+ const char *deviceAddress);
+
+ float volIndexToAmpl(Volume::device_category category,
+ audio_stream_type_t stream,
+ int indexInUi);
+ status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax);
+
+ StrategyCollection mStrategyCollection; /**< Strategies indexed by their enum id. */
+ StreamCollection mStreamCollection; /**< Streams indexed by their enum id. */
+ UsageCollection mUsageCollection; /**< Usages indexed by their enum id. */
+ InputSourceCollection mInputSourceCollection; /**< Input sources indexed by their enum id. */
+
+ template <typename Key>
+ status_t add(const std::string &name, const Key &key);
+
+ template <typename Key>
+ Element<Key> *getFromCollection(const Key &key) const;
+
+ template <typename Key>
+ const Collection<Key> &getCollection() const;
+
+ template <typename Key>
+ Collection<Key> &getCollection();
+
+ template <typename Property, typename Key>
+ Property getPropertyForKey(Key key) const;
+
+ template <typename Property, typename Key>
+ bool setPropertyForKey(const Property &property, const Key &key);
+
+ /**
+ * Policy Parameter Manager hidden through a wrapper.
+ */
+ ParameterManagerWrapper *mPolicyParameterMgr;
+
+ AudioPolicyManagerObserver *mApmObserver;
+};
+
+}; // namespace audio_policy
+
+}; // namespace android
+
diff --git a/services/audiopolicy/engineconfigurable/src/EngineInstance.cpp b/services/audiopolicy/engineconfigurable/src/EngineInstance.cpp
new file mode 100755
index 0000000..9aa89b2
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/EngineInstance.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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 <AudioPolicyManagerInterface.h>
+#include <AudioPolicyPluginInterface.h>
+#include "AudioPolicyEngineInstance.h"
+#include "Engine.h"
+
+using std::string;
+
+namespace android
+{
+namespace audio_policy
+{
+
+EngineInstance::EngineInstance()
+{
+}
+
+EngineInstance *EngineInstance::getInstance()
+{
+ static EngineInstance instance;
+ return &instance;
+}
+
+EngineInstance::~EngineInstance()
+{
+}
+
+Engine *EngineInstance::getEngine() const
+{
+ static Engine engine;
+ return &engine;
+}
+
+template <>
+AudioPolicyManagerInterface *EngineInstance::queryInterface() const
+{
+ return getEngine()->queryInterface<AudioPolicyManagerInterface>();
+}
+
+template <>
+AudioPolicyPluginInterface *EngineInstance::queryInterface() const
+{
+ return getEngine()->queryInterface<AudioPolicyPluginInterface>();
+}
+
+} // namespace audio_policy
+} // namespace android
+
diff --git a/services/audiopolicy/engineconfigurable/src/InputSource.cpp b/services/audiopolicy/engineconfigurable/src/InputSource.cpp
new file mode 100755
index 0000000..9ff1538
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/InputSource.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine/InputSource"
+
+#include "InputSource.h"
+
+using std::string;
+
+namespace android
+{
+namespace audio_policy
+{
+status_t Element<audio_source_t>::setIdentifier(audio_source_t identifier)
+{
+ if (identifier > AUDIO_SOURCE_MAX && identifier != AUDIO_SOURCE_HOTWORD) {
+ return BAD_VALUE;
+ }
+ mIdentifier = identifier;
+ ALOGD("%s: InputSource %s identifier 0x%X", __FUNCTION__, getName().c_str(), identifier);
+ return NO_ERROR;
+}
+
+/**
+* Set the device associated to this source.
+* It checks if the input device is valid but allows to set a NONE device
+* (i.e. only the IN BIT is set).
+*
+* @param[in] devices selected for the given input source.
+* @tparam audio_devices_t: Applicable input device for this input source.
+*
+* @return NO_ERROR if the device is either valid or none, error code otherwise.
+*/
+template <>
+status_t Element<audio_source_t>::set(audio_devices_t devices)
+{
+ if (!audio_is_input_device(devices) && devices != AUDIO_DEVICE_BIT_IN) {
+ ALOGE("%s: trying to set an invalid device 0x%X for input source %s",
+ __FUNCTION__, devices, getName().c_str());
+ return BAD_VALUE;
+ }
+ ALOGD("%s: 0x%X for input source %s", __FUNCTION__, devices, getName().c_str());
+ mApplicableDevices = devices;
+ return NO_ERROR;
+}
+
+template <>
+audio_devices_t Element<audio_source_t>::get<audio_devices_t>() const
+{
+ ALOGV("%s: 0x%X for inputSource %s", __FUNCTION__, mApplicableDevices, getName().c_str());
+ return mApplicableDevices;
+}
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/src/InputSource.h b/services/audiopolicy/engineconfigurable/src/InputSource.h
new file mode 100755
index 0000000..6c498dc
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/InputSource.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Element.h"
+
+namespace android
+{
+namespace audio_policy
+{
+
+/**
+ * Specialization of policy base class element for audio_source_t
+ * @tparam audio_source_t Policy Base Element identified by the audio_source_t definition.
+ */
+template <>
+class Element<audio_source_t>
+{
+public:
+ Element(const std::string &name)
+ : mName(name),
+ mApplicableDevices(AUDIO_DEVICE_NONE)
+ {}
+ ~Element() {}
+
+ /**
+ * Returns identifier of this policy element
+ *
+ * @returns string representing the name of this policy element
+ */
+ const std::string &getName() const { return mName; }
+
+ /**
+ * Set the unique identifier for this policy element.
+ *
+ * @tparam Key type of the unique identifier.
+ * @param[in] identifier to be set.
+ *
+ * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
+ */
+ status_t setIdentifier(audio_source_t identifier);
+
+ /**
+ * @return the unique identifier of this policy element.
+ */
+ audio_source_t getIdentifier() const { return mIdentifier; }
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ */
+ template <typename Property>
+ Property get() const;
+
+ template <typename Property>
+ status_t set(Property property);
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Element(const Element &object);
+ Element &operator=(const Element &object);
+
+ std::string mName; /**< Unique literal Identifier of a policy base element*/
+ audio_source_t mIdentifier; /**< Unique numerical Identifier of a policy base element*/
+
+ audio_devices_t mApplicableDevices; /**< Applicable input device for this input source. */
+};
+
+typedef Element<audio_source_t> InputSource;
+
+} // namespace audio_policy
+} // namespace android
+
diff --git a/services/audiopolicy/engineconfigurable/src/Strategy.cpp b/services/audiopolicy/engineconfigurable/src/Strategy.cpp
new file mode 100755
index 0000000..847443a
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Strategy.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine/Strategy"
+
+#include "Strategy.h"
+
+using std::string;
+
+namespace android
+{
+namespace audio_policy
+{
+
+status_t Element<routing_strategy>::setIdentifier(routing_strategy identifier)
+{
+ if (identifier >= NUM_STRATEGIES) {
+ return BAD_VALUE;
+ }
+ mIdentifier = identifier;
+ ALOGD("%s: Strategy %s identifier 0x%X", __FUNCTION__, getName().c_str(), identifier);
+ return NO_ERROR;
+}
+
+/**
+ * Set the device associated to this strategy.
+ * It checks if the output device is valid but allows to set a NONE device
+ *
+ * @param[in] devices selected for the given strategy.
+ *
+ * @return NO_ERROR if the device is either valid or none, error code otherwise.
+ */
+template <>
+status_t Element<routing_strategy>::set<audio_devices_t>(audio_devices_t devices)
+{
+ if (!audio_is_output_devices(devices) && devices != AUDIO_DEVICE_NONE) {
+ ALOGE("%s: trying to set an invalid device 0x%X for strategy %s",
+ __FUNCTION__, devices, getName().c_str());
+ return BAD_VALUE;
+ }
+ ALOGD("%s: 0x%X for strategy %s", __FUNCTION__, devices, getName().c_str());
+ mApplicableDevices = devices;
+ return NO_ERROR;
+}
+
+template <>
+audio_devices_t Element<routing_strategy>::get<audio_devices_t>() const
+{
+ ALOGV("%s: 0x%X for strategy %s", __FUNCTION__, mApplicableDevices, getName().c_str());
+ return mApplicableDevices;
+}
+
+} // namespace audio_policy
+} // namespace android
+
diff --git a/services/audiopolicy/engineconfigurable/src/Strategy.h b/services/audiopolicy/engineconfigurable/src/Strategy.h
new file mode 100755
index 0000000..1157d55
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Strategy.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Element.h"
+#include <RoutingStrategy.h>
+
+namespace android
+{
+namespace audio_policy
+{
+
+/**
+ * @tparam audio_devices_t: Applicable output device(s) for this strategy.
+ */
+template <>
+class Element<routing_strategy>
+{
+public:
+ Element(const std::string &name)
+ : mName(name),
+ mApplicableDevices(AUDIO_DEVICE_NONE)
+ {}
+ ~Element() {}
+
+ /**
+ * Returns identifier of this policy element
+ *
+ * @returns string representing the name of this policy element
+ */
+ const std::string &getName() const { return mName; }
+
+ /**
+ * Set the unique identifier for this policy element.
+ *
+ * @tparam Key type of the unique identifier.
+ * @param[in] identifier to be set.
+ *
+ * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
+ */
+ status_t setIdentifier(routing_strategy identifier);
+
+ /**
+ * @return the unique identifier of this policy element.
+ */
+ routing_strategy getIdentifier() const { return mIdentifier; }
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ */
+ template <typename Property>
+ Property get() const;
+
+ template <typename Property>
+ status_t set(Property property);
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Element(const Element &object);
+ Element &operator=(const Element &object);
+
+ std::string mName; /**< Unique literal Identifier of a policy base element*/
+ routing_strategy mIdentifier; /**< Unique numerical Identifier of a policy base element*/
+
+ audio_devices_t mApplicableDevices; /**< Applicable output device(s) for this strategy. */
+};
+
+typedef Element<routing_strategy> Strategy;
+
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/src/Stream.cpp b/services/audiopolicy/engineconfigurable/src/Stream.cpp
new file mode 100755
index 0000000..7126c27
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Stream.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine/Stream"
+
+#include "Stream.h"
+#include <system/audio.h>
+
+using std::string;
+
+namespace android
+{
+namespace audio_policy
+{
+
+status_t Element<audio_stream_type_t>::setIdentifier(audio_stream_type_t identifier)
+{
+ if (identifier > AUDIO_STREAM_CNT) {
+ return BAD_VALUE;
+ }
+ mIdentifier = identifier;
+ ALOGD("%s: Stream %s identifier 0x%X", __FUNCTION__, getName().c_str(), identifier);
+ return NO_ERROR;
+}
+
+/**
+* Set the strategy to follow for this stream.
+* It checks if the strategy is valid.
+*
+* @param[in] strategy to be followed.
+*
+* @return NO_ERROR if the strategy is set correctly, error code otherwise.
+*/
+template <>
+status_t Element<audio_stream_type_t>::set<routing_strategy>(routing_strategy strategy)
+{
+ if (strategy >= NUM_STRATEGIES) {
+ return BAD_VALUE;
+ }
+ mApplicableStrategy = strategy;
+ ALOGD("%s: 0x%X for Stream %s", __FUNCTION__, strategy, getName().c_str());
+ return NO_ERROR;
+}
+
+template <>
+routing_strategy Element<audio_stream_type_t>::get<routing_strategy>() const
+{
+ ALOGV("%s: 0x%X for Stream %s", __FUNCTION__, mApplicableStrategy, getName().c_str());
+ return mApplicableStrategy;
+}
+
+status_t Element<audio_stream_type_t>::setVolumeProfile(Volume::device_category category,
+ const VolumeCurvePoints &points)
+{
+ ALOGD("%s: adding volume profile for %s for device category %d, points nb =%d", __FUNCTION__,
+ getName().c_str(), category, points.size());
+ mVolumeProfiles[category] = points;
+
+ for (size_t i = 0; i < points.size(); i++) {
+ ALOGV("%s: %s cat=%d curve index =%d Index=%d dBAttenuation=%f",
+ __FUNCTION__, getName().c_str(), category, i, points[i].mIndex,
+ points[i].mDBAttenuation);
+ }
+ return NO_ERROR;
+}
+
+status_t Element<audio_stream_type_t>::initVolume(int indexMin, int indexMax)
+{
+ ALOGV("initStreamVolume() stream %s, min %d, max %d", getName().c_str(), indexMin, indexMax);
+ if (indexMin < 0 || indexMin >= indexMax) {
+ ALOGW("initStreamVolume() invalid index limits for stream %s, min %d, max %d",
+ getName().c_str(), indexMin, indexMax);
+ return BAD_VALUE;
+ }
+ mIndexMin = indexMin;
+ mIndexMax = indexMax;
+
+ return NO_ERROR;
+}
+
+float Element<audio_stream_type_t>::volIndexToAmpl(Volume::device_category deviceCategory,
+ int indexInUi)
+{
+ VolumeProfileConstIterator it = mVolumeProfiles.find(deviceCategory);
+ if (it == mVolumeProfiles.end()) {
+ ALOGE("%s: device category %d not found for stream %s", __FUNCTION__, deviceCategory,
+ getName().c_str());
+ return 1.0f;
+ }
+ const VolumeCurvePoints curve = mVolumeProfiles[deviceCategory];
+ if (curve.size() != Volume::VOLCNT) {
+ ALOGE("%s: invalid profile for category %d and for stream %s", __FUNCTION__, deviceCategory,
+ getName().c_str());
+ return 1.0f;
+ }
+
+ // the volume index in the UI is relative to the min and max volume indices for this stream type
+ int nbSteps = 1 + curve[Volume::VOLMAX].mIndex -
+ curve[Volume::VOLMIN].mIndex;
+
+ if (mIndexMax - mIndexMin == 0) {
+ ALOGE("%s: Invalid volume indexes Min=Max=%d", __FUNCTION__, mIndexMin);
+ return 1.0f;
+ }
+ int volIdx = (nbSteps * (indexInUi - mIndexMin)) /
+ (mIndexMax - mIndexMin);
+
+ // find what part of the curve this index volume belongs to, or if it's out of bounds
+ int segment = 0;
+ if (volIdx < curve[Volume::VOLMIN].mIndex) { // out of bounds
+ return 0.0f;
+ } else if (volIdx < curve[Volume::VOLKNEE1].mIndex) {
+ segment = 0;
+ } else if (volIdx < curve[Volume::VOLKNEE2].mIndex) {
+ segment = 1;
+ } else if (volIdx <= curve[Volume::VOLMAX].mIndex) {
+ segment = 2;
+ } else { // out of bounds
+ return 1.0f;
+ }
+
+ // linear interpolation in the attenuation table in dB
+ float decibels = curve[segment].mDBAttenuation +
+ ((float)(volIdx - curve[segment].mIndex)) *
+ ( (curve[segment+1].mDBAttenuation -
+ curve[segment].mDBAttenuation) /
+ ((float)(curve[segment+1].mIndex -
+ curve[segment].mIndex)) );
+
+ float amplification = exp(decibels * 0.115129f); /** exp( dB * ln(10) / 20 ) */
+
+ ALOGV("VOLUME vol index=[%d %d %d], dB=[%.1f %.1f %.1f] ampl=%.5f",
+ curve[segment].mIndex, volIdx,
+ curve[segment+1].mIndex,
+ curve[segment].mDBAttenuation,
+ decibels,
+ curve[segment+1].mDBAttenuation,
+ amplification);
+
+ return amplification;
+}
+
+} // namespace audio_policy
+} // namespace android
+
diff --git a/services/audiopolicy/engineconfigurable/src/Stream.h b/services/audiopolicy/engineconfigurable/src/Stream.h
new file mode 100755
index 0000000..03a9b3e9
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Stream.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Element.h"
+#include "EngineDefinition.h"
+#include <Volume.h>
+#include <RoutingStrategy.h>
+#include <map>
+
+namespace android
+{
+namespace audio_policy
+{
+/**
+ * @tparam routing_strategy: Applicable strategy for this stream.
+ */
+template <>
+class Element<audio_stream_type_t>
+{
+private:
+ typedef std::map<Volume::device_category, VolumeCurvePoints> VolumeProfiles;
+ typedef VolumeProfiles::iterator VolumeProfileIterator;
+ typedef VolumeProfiles::const_iterator VolumeProfileConstIterator;
+
+public:
+ Element(const std::string &name)
+ : mName(name),
+ mApplicableStrategy(STRATEGY_MEDIA),
+ mIndexMin(0),
+ mIndexMax(1)
+ {}
+ ~Element() {}
+
+ /**
+ * Returns identifier of this policy element
+ *
+ * @returns string representing the name of this policy element
+ */
+ const std::string &getName() const { return mName; }
+
+ /**
+ * Set the unique identifier for this policy element.
+ *
+ * @tparam Key type of the unique identifier.
+ * @param[in] identifier to be set.
+ *
+ * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
+ */
+ status_t setIdentifier(audio_stream_type_t identifier);
+
+ /**
+ * @return the unique identifier of this policy element.
+ */
+ audio_stream_type_t getIdentifier() const { return mIdentifier; }
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ */
+ template <typename Property>
+ Property get() const;
+
+ template <typename Property>
+ status_t set(Property property);
+
+ status_t setVolumeProfile(Volume::device_category category, const VolumeCurvePoints &points);
+
+ float volIndexToAmpl(Volume::device_category deviceCategory, int indexInUi);
+
+ status_t initVolume(int indexMin, int indexMax);
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Element(const Element &object);
+ Element &operator=(const Element &object);
+
+ std::string mName; /**< Unique literal Identifier of a policy base element*/
+ audio_stream_type_t mIdentifier; /**< Unique numerical Identifier of a policy base element*/
+
+ routing_strategy mApplicableStrategy; /**< Applicable strategy for this stream. */
+
+ /**
+ * Collection of volume profiles indexed by the stream type.
+ * Volume is the only reason why the stream profile was not removed from policy when introducing
+ * attributes.
+ */
+ VolumeProfiles mVolumeProfiles;
+
+ int mIndexMin;
+
+ int mIndexMax;
+};
+
+typedef Element<audio_stream_type_t> Stream;
+
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/src/Usage.cpp b/services/audiopolicy/engineconfigurable/src/Usage.cpp
new file mode 100755
index 0000000..5d20828
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Usage.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine/Usage"
+
+#include "Usage.h"
+
+namespace android
+{
+namespace audio_policy
+{
+
+status_t Element<audio_usage_t>::setIdentifier(audio_usage_t identifier)
+{
+ if (identifier > AUDIO_USAGE_MAX) {
+ return BAD_VALUE;
+ }
+ mIdentifier = identifier;
+ ALOGD("%s: Usage %s has identifier 0x%X", __FUNCTION__, getName().c_str(), identifier);
+ return NO_ERROR;
+}
+
+template <>
+status_t Element<audio_usage_t>::set<routing_strategy>(routing_strategy strategy)
+{
+ if (strategy >= NUM_STRATEGIES) {
+ return BAD_VALUE;
+ }
+ ALOGD("%s: %d for Usage %s", __FUNCTION__, strategy, getName().c_str());
+ mApplicableStrategy = strategy;
+ return NO_ERROR;
+}
+
+template <>
+routing_strategy Element<audio_usage_t>::get<routing_strategy>() const
+{
+ ALOGD("%s: %d for Usage %s", __FUNCTION__, mApplicableStrategy, getName().c_str());
+ return mApplicableStrategy;
+}
+
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/src/Usage.h b/services/audiopolicy/engineconfigurable/src/Usage.h
new file mode 100755
index 0000000..d69e0e0
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/src/Usage.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include "Element.h"
+#include <RoutingStrategy.h>
+
+namespace android
+{
+namespace audio_policy
+{
+
+/**
+ * @tparam routing_strategy: Applicable strategy for this usage.
+ */
+template <>
+class Element<audio_usage_t>
+{
+public:
+ Element(const std::string &name)
+ : mName(name),
+ mApplicableStrategy(STRATEGY_MEDIA)
+ {}
+ ~Element() {}
+
+ /**
+ * Returns identifier of this policy element
+ *
+ * @returns string representing the name of this policy element
+ */
+ const std::string &getName() const { return mName; }
+
+ /**
+ * Set the unique identifier for this policy element.
+ *
+ * @tparam Key type of the unique identifier.
+ * @param[in] identifier to be set.
+ *
+ * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
+ */
+ status_t setIdentifier(audio_usage_t identifier);
+
+ /**
+ * @return the unique identifier of this policy element.
+ */
+ audio_usage_t getIdentifier() const { return mIdentifier; }
+
+ /**
+ * A Policy element may implement getter/setter function for a given property.
+ * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
+ * or a string.
+ */
+ template <typename Property>
+ Property get() const;
+
+ template <typename Property>
+ status_t set(Property property);
+
+private:
+ /* Copy facilities are put private to disable copy. */
+ Element(const Element &object);
+ Element &operator=(const Element &object);
+
+ std::string mName; /**< Unique literal Identifier of a policy base element*/
+ audio_usage_t mIdentifier; /**< Unique numerical Identifier of a policy base element*/
+ routing_strategy mApplicableStrategy; /**< Applicable strategy for this usage. */
+};
+
+typedef Element<audio_usage_t> Usage;
+
+} // namespace audio_policy
+} // namespace android
+
+
diff --git a/services/audiopolicy/engineconfigurable/wrapper/Android.mk b/services/audiopolicy/engineconfigurable/wrapper/Android.mk
new file mode 100644
index 0000000..5373613
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/wrapper/Android.mk
@@ -0,0 +1,42 @@
+LOCAL_PATH:= $(call my-dir)
+
+##################################################################
+# WRAPPER LIBRARY
+##################################################################
+
+include $(CLEAR_VARS)
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH)/include \
+ $(TARGET_OUT_HEADERS)/parameter \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/include \
+ $(TOPDIR)frameworks/av/services/audiopolicy/engineconfigurable/interface \
+
+LOCAL_SRC_FILES:= ParameterManagerWrapper.cpp
+
+LOCAL_STATIC_LIBRARIES := \
+ libmedia_helper \
+ libutilities_convert
+
+LOCAL_MODULE:= libaudiopolicypfwwrapper
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS := -Wall -Werror -Wextra
+
+include external/stlport/libstlport.mk
+
+include $(BUILD_STATIC_LIBRARY)
+
+##################################################################
+# CONFIGURATION FILE
+##################################################################
+
+# specific management of audio_policy_criteria.conf
+include $(CLEAR_VARS)
+LOCAL_MODULE := audio_policy_criteria.conf
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
+LOCAL_SRC_FILES := config/$(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
diff --git a/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp b/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp
new file mode 100755
index 0000000..9dda20c
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp
@@ -0,0 +1,434 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#define LOG_TAG "APM::AudioPolicyEngine/PFWWrapper"
+
+#include "ParameterManagerWrapper.h"
+#include "audio_policy_criteria_conf.h"
+#include <ParameterMgrPlatformConnector.h>
+#include <SelectionCriterionTypeInterface.h>
+#include <SelectionCriterionInterface.h>
+#include <convert.h>
+#include <algorithm>
+#include <cutils/config_utils.h>
+#include <cutils/misc.h>
+#include <fstream>
+#include <limits>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <stdint.h>
+#include <cmath>
+#include <utils/Log.h>
+
+using std::string;
+using std::map;
+using std::vector;
+
+/// PFW related definitions
+// Logger
+class ParameterMgrPlatformConnectorLogger : public CParameterMgrPlatformConnector::ILogger
+{
+public:
+ ParameterMgrPlatformConnectorLogger() {}
+
+ virtual void log(bool isWarning, const string &log)
+ {
+ const static string format("policy-parameter-manager: ");
+
+ if (isWarning) {
+ ALOGW("%s %s", format.c_str(), log.c_str());
+ } else {
+ ALOGD("%s %s", format.c_str(), log.c_str());
+ }
+ }
+};
+
+namespace android
+{
+
+using utilities::convertTo;
+
+namespace audio_policy
+{
+const char *const ParameterManagerWrapper::mPolicyPfwDefaultConfFileName =
+ "/etc/parameter-framework/ParameterFrameworkConfigurationPolicy.xml";
+
+template <>
+struct ParameterManagerWrapper::parameterManagerElementSupported<ISelectionCriterionInterface> {};
+template <>
+struct ParameterManagerWrapper::parameterManagerElementSupported<ISelectionCriterionTypeInterface> {};
+
+ParameterManagerWrapper::ParameterManagerWrapper()
+ : mPfwConnectorLogger(new ParameterMgrPlatformConnectorLogger)
+{
+ // Connector
+ mPfwConnector = new CParameterMgrPlatformConnector(mPolicyPfwDefaultConfFileName);
+
+ // Logger
+ mPfwConnector->setLogger(mPfwConnectorLogger);
+
+ // Load criteria file
+ if ((loadAudioPolicyCriteriaConfig(gAudioPolicyCriteriaVendorConfFilePath) != NO_ERROR) &&
+ (loadAudioPolicyCriteriaConfig(gAudioPolicyCriteriaConfFilePath) != NO_ERROR)) {
+ ALOGE("%s: Neither vendor conf file (%s) nor system conf file (%s) could be found",
+ __FUNCTION__, gAudioPolicyCriteriaVendorConfFilePath,
+ gAudioPolicyCriteriaConfFilePath);
+ }
+ ALOGD("%s: ParameterManagerWrapper instantiated!", __FUNCTION__);
+}
+
+ParameterManagerWrapper::~ParameterManagerWrapper()
+{
+ // Unset logger
+ mPfwConnector->setLogger(NULL);
+ // Remove logger
+ delete mPfwConnectorLogger;
+ // Remove connector
+ delete mPfwConnector;
+}
+
+status_t ParameterManagerWrapper::start()
+{
+ ALOGD("%s: in", __FUNCTION__);
+ /// Start PFW
+ std::string error;
+ if (!mPfwConnector->start(error)) {
+ ALOGE("%s: Policy PFW start error: %s", __FUNCTION__, error.c_str());
+ return NO_INIT;
+ }
+ ALOGD("%s: Policy PFW successfully started!", __FUNCTION__);
+ return NO_ERROR;
+}
+
+
+void ParameterManagerWrapper::addCriterionType(const string &typeName, bool isInclusive)
+{
+ ALOG_ASSERT(mPolicyCriterionTypes.find(typeName) == mPolicyCriterionTypes.end(),
+ "CriterionType " << typeName << " already added");
+ ALOGD("%s: Adding new criterionType %s", __FUNCTION__, typeName.c_str());
+
+ mPolicyCriterionTypes[typeName] = mPfwConnector->createSelectionCriterionType(isInclusive);
+}
+
+void ParameterManagerWrapper::addCriterionTypeValuePair(
+ const string &typeName,
+ uint32_t numericValue,
+ const string &literalValue)
+{
+ ALOG_ASSERT(mPolicyCriterionTypes.find(typeName) != mPolicyCriterionTypes.end(),
+ "CriterionType " << typeName.c_str() << "not found");
+ ALOGV("%s: Adding new value pair (%d,%s) for criterionType %s", __FUNCTION__,
+ numericValue, literalValue.c_str(), typeName.c_str());
+ ISelectionCriterionTypeInterface *criterionType = mPolicyCriterionTypes[typeName];
+ criterionType->addValuePair(numericValue, literalValue.c_str());
+}
+
+void ParameterManagerWrapper::loadCriterionType(cnode *root, bool isInclusive)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node;
+ for (node = root->first_child; node != NULL; node = node->next) {
+
+ ALOG_ASSERT(node != NULL, "error in parsing file");
+ const char *typeName = node->name;
+ char *valueNames = (char *)node->value;
+
+ addCriterionType(typeName, isInclusive);
+
+ uint32_t index = 0;
+ char *ctx;
+ char *valueName = strtok_r(valueNames, ",", &ctx);
+ while (valueName != NULL) {
+ if (strlen(valueName) != 0) {
+
+ // Conf file may use or not pair, if no pair, use incremental index, else
+ // use provided index.
+ if (strchr(valueName, ':') != NULL) {
+
+ char *first = strtok(valueName, ":");
+ char *second = strtok(NULL, ":");
+ ALOG_ASSERT((first != NULL) && (strlen(first) != 0) &&
+ (second != NULL) && (strlen(second) != 0),
+ "invalid value pair");
+
+ if (!convertTo<string, uint32_t>(first, index)) {
+ ALOGE("%s: Invalid index(%s) found", __FUNCTION__, first);
+ }
+ addCriterionTypeValuePair(typeName, index, second);
+ } else {
+
+ uint32_t pfwIndex = isInclusive ? 1 << index : index;
+ addCriterionTypeValuePair(typeName, pfwIndex, valueName);
+ index += 1;
+ }
+ }
+ valueName = strtok_r(NULL, ",", &ctx);
+ }
+ }
+}
+
+void ParameterManagerWrapper::loadInclusiveCriterionType(cnode *root)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node = config_find(root, gInclusiveCriterionTypeTag.c_str());
+ if (node == NULL) {
+ return;
+ }
+ loadCriterionType(node, true);
+}
+
+void ParameterManagerWrapper::loadExclusiveCriterionType(cnode *root)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node = config_find(root, gExclusiveCriterionTypeTag.c_str());
+ if (node == NULL) {
+ return;
+ }
+ loadCriterionType(node, false);
+}
+
+void ParameterManagerWrapper::parseChildren(cnode *root, string &defaultValue, string &type)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node;
+ for (node = root->first_child; node != NULL; node = node->next) {
+ ALOG_ASSERT(node != NULL, "error in parsing file");
+
+ if (string(node->name) == gDefaultTag) {
+ defaultValue = node->value;
+ } else if (string(node->name) == gTypeTag) {
+ type = node->value;
+ } else {
+ ALOGE("%s: Unrecognized %s %s node", __FUNCTION__, node->name, node->value);
+ }
+ }
+}
+
+template <typename T>
+T *ParameterManagerWrapper::getElement(const string &name, std::map<string, T *> &elementsMap)
+{
+ parameterManagerElementSupported<T>();
+ typename std::map<string, T *>::iterator it = elementsMap.find(name);
+ ALOG_ASSERT(it != elementsMap.end(), "Element " << name << " not found");
+ return it->second;
+}
+
+template <typename T>
+const T *ParameterManagerWrapper::getElement(const string &name, const std::map<string, T *> &elementsMap) const
+{
+ parameterManagerElementSupported<T>();
+ typename std::map<string, T *>::const_iterator it = elementsMap.find(name);
+ ALOG_ASSERT(it != elementsMap.end(), "Element " << name << " not found");
+ return it->second;
+}
+
+void ParameterManagerWrapper::loadCriteria(cnode *root)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node = config_find(root, gCriterionTag.c_str());
+
+ if (node == NULL) {
+ ALOGW("%s: no inclusive criteria found", __FUNCTION__);
+ return;
+ }
+ for (node = node->first_child; node != NULL; node = node->next) {
+ loadCriterion(node);
+ }
+}
+
+void ParameterManagerWrapper::addCriterion(const string &name, const string &typeName,
+ const string &defaultLiteralValue)
+{
+ ALOG_ASSERT(mPolicyCriteria.find(criterionName) == mPolicyCriteria.end(),
+ "Route Criterion " << criterionName << " already added");
+
+ ISelectionCriterionTypeInterface *criterionType =
+ getElement<ISelectionCriterionTypeInterface>(typeName, mPolicyCriterionTypes);
+
+ ISelectionCriterionInterface *criterion =
+ mPfwConnector->createSelectionCriterion(name, criterionType);
+
+ mPolicyCriteria[name] = criterion;
+ int numericalValue = 0;
+ if (!criterionType->getNumericalValue(defaultLiteralValue.c_str(), numericalValue)) {
+ ALOGE("%s; trying to apply invalid default literal value", __FUNCTION__,
+ defaultLiteralValue.c_str());
+ }
+ criterion->setCriterionState(numericalValue);
+}
+
+void ParameterManagerWrapper::loadCriterion(cnode *root)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ const char *criterionName = root->name;
+
+ ALOG_ASSERT(mPolicyCriteria.find(criterionName) == mPolicyCriteria.end(),
+ "Criterion " << criterionName << " already added");
+
+ string paramKeyName = "";
+ string path = "";
+ string typeName = "";
+ string defaultValue = "";
+
+ parseChildren(root, defaultValue, typeName);
+
+ addCriterion(criterionName, typeName, defaultValue);
+}
+
+void ParameterManagerWrapper::loadConfig(cnode *root)
+{
+ ALOG_ASSERT(root != NULL, "error in parsing file");
+ cnode *node = config_find(root, gPolicyConfTag.c_str());
+ if (node == NULL) {
+ ALOGW("%s: Could not find node for pfw", __FUNCTION__);
+ return;
+ }
+ ALOGD("%s: Loading conf for pfw", __FUNCTION__);
+ loadInclusiveCriterionType(node);
+ loadExclusiveCriterionType(node);
+ loadCriteria(node);
+}
+
+
+status_t ParameterManagerWrapper::loadAudioPolicyCriteriaConfig(const char *path)
+{
+ ALOG_ASSERT(path != NULL, "error in parsing file: empty path");
+ cnode *root;
+ char *data;
+ ALOGD("%s", __FUNCTION__);
+ data = (char *)load_file(path, NULL);
+ if (data == NULL) {
+ return -ENODEV;
+ }
+ root = config_node("", "");
+ ALOG_ASSERT(root != NULL, "Unable to allocate a configuration node");
+ config_load(root, data);
+
+ loadConfig(root);
+
+ config_free(root);
+ free(root);
+ free(data);
+ ALOGD("%s: loaded", __FUNCTION__);
+ return NO_ERROR;
+}
+
+bool ParameterManagerWrapper::isStarted()
+{
+ return mPfwConnector && mPfwConnector->isStarted();
+}
+
+status_t ParameterManagerWrapper::setPhoneState(audio_mode_t mode)
+{
+ ISelectionCriterionInterface *criterion = mPolicyCriteria[gPhoneStateCriterionTag];
+ if (!isValueValidForCriterion(criterion, static_cast<int>(mode))) {
+ return BAD_VALUE;
+ }
+ criterion->setCriterionState((int)(mode));
+ applyPlatformConfiguration();
+ return NO_ERROR;
+}
+
+audio_mode_t ParameterManagerWrapper::getPhoneState() const
+{
+ const ISelectionCriterionInterface *criterion =
+ getElement<ISelectionCriterionInterface>(gPhoneStateCriterionTag, mPolicyCriteria);
+ return static_cast<audio_mode_t>(criterion->getCriterionState());
+}
+
+status_t ParameterManagerWrapper::setForceUse(audio_policy_force_use_t usage,
+ audio_policy_forced_cfg_t config)
+{
+ // @todo: return an error on a unsupported value
+ if (usage > AUDIO_POLICY_FORCE_USE_CNT) {
+ return BAD_VALUE;
+ }
+
+ ISelectionCriterionInterface *criterion = mPolicyCriteria[gForceUseCriterionTag[usage]];
+ if (!isValueValidForCriterion(criterion, static_cast<int>(config))) {
+ return BAD_VALUE;
+ }
+ criterion->setCriterionState((int)config);
+ applyPlatformConfiguration();
+ return NO_ERROR;
+}
+
+audio_policy_forced_cfg_t ParameterManagerWrapper::getForceUse(audio_policy_force_use_t usage) const
+{
+ // @todo: return an error on a unsupported value
+ if (usage > AUDIO_POLICY_FORCE_USE_CNT) {
+ return AUDIO_POLICY_FORCE_NONE;
+ }
+ const ISelectionCriterionInterface *criterion =
+ getElement<ISelectionCriterionInterface>(gForceUseCriterionTag[usage], mPolicyCriteria);
+ return static_cast<audio_policy_forced_cfg_t>(criterion->getCriterionState());
+}
+
+bool ParameterManagerWrapper::isValueValidForCriterion(ISelectionCriterionInterface *criterion,
+ int valueToCheck)
+{
+ const ISelectionCriterionTypeInterface *interface = criterion->getCriterionType();
+ string literalValue;
+ return interface->getLiteralValue(valueToCheck, literalValue);
+}
+
+status_t ParameterManagerWrapper::setDeviceConnectionState(audio_devices_t devices,
+ audio_policy_dev_state_t state,
+ const char */*deviceAddres*/)
+{
+ ISelectionCriterionInterface *criterion = NULL;
+
+ if (audio_is_output_devices(devices)) {
+ criterion = mPolicyCriteria[gOutputDeviceCriterionTag];
+ } else if (devices & AUDIO_DEVICE_BIT_IN) {
+ criterion = mPolicyCriteria[gInputDeviceCriterionTag];
+ } else {
+ return BAD_TYPE;
+ }
+ if (criterion == NULL) {
+ ALOGE("%s: no criterion found for devices");
+ return DEAD_OBJECT;
+ }
+
+ int32_t previousDevices = criterion->getCriterionState();
+ switch (state)
+ {
+ case AUDIO_POLICY_DEVICE_STATE_AVAILABLE:
+ criterion->setCriterionState(previousDevices |= devices);
+ break;
+
+ case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE:
+ if (devices & AUDIO_DEVICE_BIT_IN) {
+ devices &= ~AUDIO_DEVICE_BIT_IN;
+ }
+ criterion->setCriterionState(previousDevices &= ~devices);
+ break;
+
+ default:
+ return BAD_VALUE;
+ }
+ applyPlatformConfiguration();
+ return NO_ERROR;
+}
+
+void ParameterManagerWrapper::applyPlatformConfiguration()
+{
+ mPfwConnector->applyConfigurations();
+}
+
+} // namespace audio_policy
+} // namespace android
diff --git a/services/audiopolicy/engineconfigurable/wrapper/audio_policy_criteria_conf.h b/services/audiopolicy/engineconfigurable/wrapper/audio_policy_criteria_conf.h
new file mode 100755
index 0000000..58e7135
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/wrapper/audio_policy_criteria_conf.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <string>
+#include <system/audio_policy.h>
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// Definitions for audio policy criteria configuration file (audio_policy_criteria.conf) //
+// //
+// @TODO: scripted from audio.h & audio_policy,h //
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+static const char *const gAudioPolicyCriteriaConfFilePath =
+ "/system/etc/audio_policy_criteria.conf";
+static const char *const gAudioPolicyCriteriaVendorConfFilePath =
+ "/vendor/etc/audio_policy_criteria.conf";
+
+/**
+ * PFW instances tags
+ */
+static const std::string &gPolicyConfTag = "Policy";
+static const std::string &gDefaultTag = "Default";
+static const std::string &gTypeTag = "Type";
+
+/**
+ * PFW elements tags
+ */
+static const std::string &gInclusiveCriterionTypeTag = "InclusiveCriterionType";
+static const std::string &gExclusiveCriterionTypeTag = "ExclusiveCriterionType";
+static const std::string &gCriterionTag = "Criterion";
+
+/**
+ * PFW known criterion tags
+ */
+static const std::string &gInputDeviceCriterionTag = "AvailableInputDevices";
+static const std::string &gOutputDeviceCriterionTag = "AvailableOutputDevices";
+static const std::string &gPhoneStateCriterionTag = "TelephonyMode";
+
+/**
+ * Order MUST be align with defintiion of audio_policy_force_use_t within audio_policy.h
+ */
+static const std::string gForceUseCriterionTag[AUDIO_POLICY_FORCE_USE_CNT] =
+{
+ [AUDIO_POLICY_FORCE_FOR_COMMUNICATION] = "ForceUseForCommunication",
+ [AUDIO_POLICY_FORCE_FOR_MEDIA] = "ForceUseForMedia",
+ [AUDIO_POLICY_FORCE_FOR_RECORD] = "ForceUseForRecord",
+ [AUDIO_POLICY_FORCE_FOR_DOCK] = "ForceUseForDock",
+ [AUDIO_POLICY_FORCE_FOR_SYSTEM] = "ForceUseForSystem",
+ [AUDIO_POLICY_FORCE_FOR_HDMI_SYSTEM_AUDIO] = "ForceUseForHdmiSystemAudio"
+};
+
+
+
+
+
+
diff --git a/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf b/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf
new file mode 100755
index 0000000..a4ffdd5
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf
@@ -0,0 +1,192 @@
+################################################################################################
+#
+# @NOTE:
+# Audio Policy Criteria file example for generic device build
+#
+# Any vendor shall have its own configuration within the corresponding device folder
+#
+################################################################################################
+
+#########################################################
+# Criterion type Example:
+# For each criterion, a couple of numerical, literal values must be provided to the PFW.
+# The numerical part is not mandatory. If not filled by the user, a default numerical value will be
+# automatically provided by audio HAL using the following logic:
+# - Exclusive criterion:
+# * 0 -> first literal value,
+# * 1 -> second literal value,
+# ...
+# * N -> (N+1)th literal value.
+# - Inclusive criterion:
+# * 1 << 0 -> first literal value,
+# * 1 << 1 -> second literal value,
+# ...
+# * 1 << N -> (N+1)th literal value,
+#
+#########################################################
+# Route|Audio {
+# InclusiveCriterionType|ExclusiveCriterionType {
+# <Criterion Name> [numerical value 1:]<literal value 1>,[numerical value 2:]<literal value 2>,<literal value 3>,...
+# }
+# }
+
+#########################################################
+# Criterion:
+#########################################################
+# Route|Audio {
+# Criterion {
+# <Criterion Name> {
+# Type <Criterion type name>
+# Default <default value of the criterion>
+# }
+# }
+# }
+
+Policy {
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the audio_mode_t
+ # from system/audio.h
+ #
+ AndroidModeType 0:Normal,1:RingTone,2:InCall,3:InCommunication
+ }
+ InclusiveCriterionType {
+ #
+ # DO NOT CHANGE ORDER. This definition must be aligned with the definition of
+ # AUDIO_DEVICE_OUT_* within <system/audio.h> file of android.
+ #
+ OutputDevicesMaskType Earpiece,Speaker,WiredHeadset,WiredHeadphone,BluetoothSco,BluetoothScoHeadset,BluetoothScoCarkit,BluetoothA2dp,BluetoothA2dpHeadphones,BluetoothA2dpSpeaker,Hdmi,AnlgDockHeadset,DgtlDockHeadset,UsbAccessory,UsbDevice,RemoteSubmix,TelephonyTx,Line,HdmiArc,Spdif,Fm,AuxLine,SpeakerSafe
+ }
+ InclusiveCriterionType {
+ #
+ # DO NOT CHANGE ORDER. This definition must be aligned with the definition of
+ # AUDIO_DEVICE_IN_* within <system/audio.h> file of android.
+ # Note also that direction bit will be decimated by AudioHAL in order to allow using a mask
+ # with the cardinality of 1 between a bit and an input device.
+ #
+ InputDevicesMaskType Communication,Ambient,BuiltinMic,BluetoothScoHeadset,WiredHeadset,Hdmi,TelephonyRx,BackMic,RemoteSubmix,AnlgDockHeadset,DgtlDockHeadset,UsbAccessory,UsbDevice,FmTuner,TvTune,Line,Spdif,BluetoothA2dp,Loopback
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForCommunicationType 0:ForceNone,1:ForceSpeaker,3:ForceBtSco
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForMediaType 0:ForceNone,1:ForceSpeaker,2:ForceHeadphones,4:ForceBtA2dp,5:ForceWiredAccessory,8:ForceAnalogDock,9:ForceDigitalDock,10:ForceNoBtA2dp
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForRecordType 0:ForceNone,3:ForceBtSco,5:ForceWiredAccessory
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForDockType 0:ForceNone,5:ForceWiredAccessory,6:ForceBtCarDock,7:ForceBtDeskDock,8:ForceAnalogDock,9:ForceDigitalDock
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForSystemType 0:ForceNone,11:ForceSystemEnforced
+ }
+ ExclusiveCriterionType {
+ #
+ # The values of the mode MUST be aligned with the definition of the
+ # audio_policy_forced_config_t from system/audio.h
+ #
+ ForceUseForHdmiSystemAudioType 0:ForceNone,12:ForceHdmiSystemEnforced
+ }
+ ExclusiveCriterionType {
+ Rate 8000,11025,12000,16000,22050,24000,32000,44100,48000,96000,176400,192000
+ }
+ ExclusiveCriterionType {
+ Format Mp3,AmrNb,AmrWb,Aac,HeAacV1,HeAacV2,Vorbis,Pcm16Bit,Pcm8Bit,Pcm32Bit,Pcm8_24Bit
+ }
+ InclusiveCriterionType {
+ OutputChannelMask FrontLeft,FrontRight,FrontCenter,LowFrequence,BackLeft,BackRight,FromLeftOfCenter,FromRightOfCenter,BackCenter,SideLeft,SideRight,TopCenter,TopFrontLeft,TopFrontCenter,TopFrontRight,TopBackLeft,TopBackCenter,TopBackRight
+ }
+ ExclusiveCriterionType {
+ OutputChannelMasks Mono,Stereo,Quad,QuadBack,QuadSide,5Point1,5Point1Back,5Point1Side,7Point1,All
+ }
+ InclusiveCriterionType {
+ InputChannelMask Left,Right,Front,Back,LeftProcessed,RightProcessed,FrontProcessed,BackProcessed,Pressure,XAxis,YAxis,ZAxis,VoiceUplink,VoiceDnlink
+ }
+ ExclusiveCriterionType {
+ InputChannelMasks Mono,Stereo,FrontBack,VoiceUplinkDnlink,All
+ }
+ InclusiveCriterionType {
+ OutputFlags Direct,Primary,Fast,DeepBuffer,CompressOffload,NonBlocking,HwAvSync
+ }
+ ExclusiveCriterionType {
+ InputSource Default,Mic,VoiceUplink,VoiceDownlink,VoiceCall,Camcorder,VoiceRecognition,VoiceCommunication,RemoteSubmix,Hotword
+ }
+
+
+ Criterion {
+ AvailableInputDevices {
+ Type InputDevicesMaskType
+ Default none
+ }
+ }
+ Criterion {
+ AvailableOutputDevices {
+ Type OutputDevicesMaskType
+ Default none
+ }
+ }
+ Criterion {
+ TelephonyMode {
+ Type AndroidModeType
+ Default Normal
+ }
+ }
+ Criterion {
+ ForceUseForCommunication {
+ Type ForceUseForCommunicationType
+ Default ForceNone
+ }
+ }
+ Criterion {
+ ForceUseForMedia {
+ Type ForceUseForMediaType
+ Default ForceNone
+ }
+ }
+ Criterion {
+ ForceUseForRecord {
+ Type ForceUseForRecordType
+ Default ForceNone
+ }
+ }
+ Criterion {
+ ForceUseForDock {
+ Type ForceUseForDockType
+ Default ForceNone
+ }
+ }
+ Criterion {
+ ForceUseForSystem {
+ Type ForceUseForSystemType
+ Default ForceNone
+ }
+ }
+ Criterion {
+ ForceUseForHdmiSystemAudio {
+ Type ForceUseForHdmiSystemAudioType
+ Default ForceNone
+ }
+ }
+}
+
diff --git a/services/audiopolicy/engineconfigurable/wrapper/include/ParameterManagerWrapper.h b/services/audiopolicy/engineconfigurable/wrapper/include/ParameterManagerWrapper.h
new file mode 100755
index 0000000..7530157
--- /dev/null
+++ b/services/audiopolicy/engineconfigurable/wrapper/include/ParameterManagerWrapper.h
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <system/audio.h>
+#include <system/audio_policy.h>
+#include <utils/Errors.h>
+#include <utils/RWLock.h>
+#include <list>
+#include <map>
+#include <string>
+#include <vector>
+
+class CParameterMgrPlatformConnector;
+class ISelectionCriterionInterface;
+class ISelectionCriterionTypeInterface;
+class cnode;
+
+class ParameterMgrPlatformConnectorLogger;
+
+namespace android
+{
+namespace audio_policy
+{
+
+class ParameterManagerWrapper
+{
+private:
+ typedef std::pair<int, const char *> CriterionTypeValuePair;
+
+ typedef std::map<std::string, ISelectionCriterionInterface *> CriterionCollection;
+ typedef std::map<std::string, ISelectionCriterionTypeInterface *> CriterionTypeCollection;
+ typedef CriterionCollection::iterator CriterionMapIterator;
+ typedef CriterionCollection::const_iterator CriterionMapConstIterator;
+ typedef CriterionTypeCollection::iterator CriterionTypeMapIterator;
+ typedef CriterionTypeCollection::const_iterator CriteriaTypeMapConstIterator;
+
+public:
+ ParameterManagerWrapper();
+ ~ParameterManagerWrapper();
+
+ /**
+ * Starts the platform state service.
+ * It starts the parameter framework policy instance.
+ *
+ * @return NO_ERROR if success, error code otherwise.
+ */
+ status_t start();
+
+ /**
+ * The following API wrap policy action to criteria
+ */
+
+ /**
+ * Checks if the platform state was correctly started (ie the policy parameter manager
+ * has been instantiated and started correctly).
+ *
+ * @todo: map on initCheck?
+ *
+ * @return true if platform state is started correctly, false otherwise.
+ */
+ bool isStarted();
+
+ /**
+ * Set Telephony Mode.
+ * It will set the telephony mode criterion accordingly and apply the configuration in order
+ * to select the right configuration on domains depending on this mode criterion.
+ *
+ * @param[in] mode: Android Phone state (normal, ringtone, csv, in communication)
+ *
+ * @return NO_ERROR if criterion set correctly, error code otherwise.
+ */
+ status_t setPhoneState(audio_mode_t mode);
+
+ audio_mode_t getPhoneState() const;
+
+ /**
+ * Set Force Use config for a given usage.
+ * It will set the corresponding policy parameter framework criterion.
+ *
+ * @param[in] usage for which a configuration shall be forced.
+ * @param[in] config wished to be forced for the given shall.
+ *
+ * @return NO_ERROR if the criterion was set correctly, error code otherwise (e.g. config not
+ * allowed a given usage...)
+ */
+ status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
+
+ audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) const;
+
+ /**
+ * Set the connection state of device(s).
+ * It will set the associated policy parameter framework criterion.
+ *
+ * @param[in] devices mask of devices for which the state has changed.
+ * @param[in] state of availability of this(these) device(s).
+ * @param[in] deviceAddress: the mask might not be enough, as it may represents a type of
+ * device, so address of the device will help precise identification.
+ *
+ * @return NO_ERROR if devices criterion updated correctly, error code otherwise.
+ */
+ status_t setDeviceConnectionState(audio_devices_t devices, audio_policy_dev_state_t state,
+ const char *deviceAddress);
+
+private:
+ /**
+ * Apply the configuration of the platform on the policy parameter manager.
+ * Once all the criteria have been set, the client of the platform state must call
+ * this function in order to have the route PFW taking into account these criteria.
+ *
+ * OPENS: shall we expose this?
+ * - Yes if atomic set operation.
+ * In this case, abstract it behind the "STAGE AND COMMIT" pattern
+ * - no if need to set more than one before triggering an apply configuration.
+ */
+ void applyPlatformConfiguration();
+
+ /**
+ * Load the criterion configuration file.
+ *
+ * @param[in] path Criterion conf file path.
+ *
+ * @return NO_ERROR is parsing successful, error code otherwise.
+ */
+ status_t loadAudioPolicyCriteriaConfig(const char *path);
+
+ /**
+ * Add a criterion type to AudioPolicyPfw.
+ *
+ * @param[in] typeName of the PFW criterion type.
+ * @param[in] isInclusive attribute of the criterion type.
+ */
+ void addCriterionType(const std::string &typeName, bool isInclusive);
+
+ /**
+ * Add a criterion type value pair to AudioPolicyPfw.
+ *
+ * @param[in] typeName criterion type name to which this value pair is added to.
+ * @param[in] numeric part of the value pair.
+ * @param[in] literal part of the value pair.
+ */
+ void addCriterionTypeValuePair(const std::string &typeName, uint32_t numeric,
+ const std::string &literal);
+
+ /**
+ * Add a criterion to AudioPolicyPfw.
+ *
+ * @param[in] name of the PFW criterion.
+ * @param[in] typeName criterion type name to which this criterion is associated to.
+ * @param[in] defaultLiteralValue of the PFW criterion.
+ */
+ void addCriterion(const std::string &name,
+ const std::string &typeName,
+ const std::string &defaultLiteralValue);
+ /**
+ * Parse and load the inclusive criterion type from configuration file.
+ *
+ * @param[in] root node of the configuration file.
+ */
+ void loadInclusiveCriterionType(cnode *root);
+
+ /**
+ * Parse and load the exclusive criterion type from configuration file.
+ *
+ * @param[in] root node of the configuration file.
+ */
+ void loadExclusiveCriterionType(cnode *root);
+
+ /**
+ * Parse and load the criteria from configuration file.
+ *
+ * @param[in] root node of the configuration file.
+ */
+ void loadCriteria(cnode *root);
+
+ /**
+ * Parse and load a criterion from configuration file.
+ *
+ * @param[in] root node of the configuration file.
+ */
+ void loadCriterion(cnode *root);
+
+ /**
+ * Parse and load the criterion types from configuration file.
+ *
+ * @param[in] root node of the configuration file
+ * @param[in] isInclusive true if inclusive, false is exclusive.
+ */
+ void loadCriterionType(cnode *root, bool isInclusive);
+
+ /**
+ * Load the configuration file.
+ *
+ * @param[in] root node of the configuration file.
+ */
+ void loadConfig(cnode *root);
+
+ /**
+ * Parse and load the chidren node from a given root node.
+ *
+ * @param[in] root node of the configuration file
+ * @param[out] defaultValue of the parameter manager element to retrieve.
+ * @param[out] type of the parameter manager element to retrieve.
+ */
+ void parseChildren(cnode *root, std::string &defaultValue, std::string &type);
+
+ /**
+ * Retrieve an element from a map by its name.
+ *
+ * @tparam T type of element to search.
+ * @param[in] name name of the element to find.
+ * @param[in] elementsMap maps of elements to search into.
+ *
+ * @return valid pointer on element if found, NULL otherwise.
+ */
+ template <typename T>
+ T *getElement(const std::string &name, std::map<std::string, T *> &elementsMap);
+
+ /**
+ * Retrieve an element from a map by its name. Const version.
+ *
+ * @tparam T type of element to search.
+ * @param[in] name name of the element to find.
+ * @param[in] elementsMap maps of elements to search into.
+ *
+ * @return valid pointer on element if found, NULL otherwise.
+ */
+ template <typename T>
+ const T *getElement(const std::string &name,
+ const std::map<std::string, T *> &elementsMap) const;
+
+ /**
+ * set the value of a component state.
+ *
+ * @param[in] value new value to set to the component state.
+ * @param[in] stateName of the component state.
+ */
+ void setValue(int value, const std::string &stateName);
+
+ /**
+ * get the value of a component state.
+ *
+ * @param[in] name of the component state.
+ *
+ * @return value of the component state
+ */
+ int getValue(const std::string &stateName) const;
+
+ bool isValueValidForCriterion(ISelectionCriterionInterface *criterion, int valueToCheck);
+
+ CriterionTypeCollection mPolicyCriterionTypes; /**< Policy Criterion Type map. */
+ CriterionCollection mPolicyCriteria; /**< Policy Criterion Map. */
+
+ CParameterMgrPlatformConnector *mPfwConnector; /**< Policy Parameter Manager connector. */
+ ParameterMgrPlatformConnectorLogger *mPfwConnectorLogger; /**< Policy PFW logger. */
+
+
+ /**
+ * provide a compile time error if no specialization is provided for a given type.
+ *
+ * @tparam T: type of the parameter manager element. Supported one are:
+ * - Criterion
+ * - CriterionType.
+ */
+ template <typename T>
+ struct parameterManagerElementSupported;
+
+ static const char *const mPolicyPfwDefaultConfFileName; /**< Default Policy PFW top file name.*/
+};
+
+} // namespace audio_policy
+} // namespace android
diff --git a/services/audiopolicy/utilities/Android.mk b/services/audiopolicy/utilities/Android.mk
new file mode 100644
index 0000000..ccf33f2
--- /dev/null
+++ b/services/audiopolicy/utilities/Android.mk
@@ -0,0 +1,7 @@
+
+LOCAL_PATH := $(call my-dir)
+
+# Recursive call sub-folder Android.mk
+#
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
diff --git a/services/audiopolicy/utilities/convert/Android.mk b/services/audiopolicy/utilities/convert/Android.mk
new file mode 100755
index 0000000..947dec5
--- /dev/null
+++ b/services/audiopolicy/utilities/convert/Android.mk
@@ -0,0 +1,30 @@
+LOCAL_PATH := $(call my-dir)
+
+###########################
+# convert static lib target
+
+include $(CLEAR_VARS)
+
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/
+
+LOCAL_MODULE := libutilities_convert
+
+include $(BUILD_STATIC_LIBRARY)
+
+#########################
+# convert static lib host
+
+include $(CLEAR_VARS)
+
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/
+
+LOCAL_MODULE := libutilities_convert_host
+
+LOCAL_CFLAGS = -O0 --coverage
+
+LOCAL_LDFLAGS = --coverage
+
+LOCAL_MODULE_TAGS := tests
+
+include $(BUILD_HOST_STATIC_LIBRARY)
+
diff --git a/services/audiopolicy/utilities/convert/convert.h b/services/audiopolicy/utilities/convert/convert.h
new file mode 100644
index 0000000..980b5d5
--- /dev/null
+++ b/services/audiopolicy/utilities/convert/convert.h
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#pragma once
+
+#include <limits>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <stdint.h>
+#include <cmath>
+
+namespace android
+{
+
+namespace utilities
+{
+
+/**
+ * Convert a given source type to a given destination type.
+ *
+ * String conversion to T reads the value of the type T in the given string.
+ * The function does not allow to have white spaces around the value to parse
+ * and tries to parse the whole string, which means that if some bytes were not
+ * read in the string, the function fails.
+ * Hexadecimal representation (ie. numbers starting with 0x) is supported only
+ * for integral types conversions.
+ *
+ * Numeric conversion to string formats the source value to decimal space.
+ *
+ * Vector to vector conversion calls convertTo on each element.
+ *
+ * @tparam srcType source type, default value is string type
+ * @tparam dstType destination type
+ * @param[in] input The source to convert from.
+ * @param[out] result Converted value if success, undefined on failure.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <typename srcType, typename dstType>
+static inline bool convertTo(const srcType &input, dstType &result);
+
+/* details namespace is here to hide implementation details to header end user. It
+ * is NOT intended to be used outside. */
+namespace details
+{
+
+/** Helper class to limit instantiation of templates */
+template <typename T>
+struct ConversionFromStringAllowed;
+template <typename T>
+struct ConversionToStringAllowed;
+
+/* List of allowed types for conversion */
+template <>
+struct ConversionFromStringAllowed<bool> {};
+template <>
+struct ConversionFromStringAllowed<uint64_t> {};
+template <>
+struct ConversionFromStringAllowed<int64_t> {};
+template <>
+struct ConversionFromStringAllowed<uint32_t> {};
+template <>
+struct ConversionFromStringAllowed<int32_t> {};
+template <>
+struct ConversionFromStringAllowed<uint16_t> {};
+template <>
+struct ConversionFromStringAllowed<int16_t> {};
+template <>
+struct ConversionFromStringAllowed<float> {};
+template <>
+struct ConversionFromStringAllowed<double> {};
+
+template <>
+struct ConversionToStringAllowed<int64_t> {};
+template <>
+struct ConversionToStringAllowed<uint64_t> {};
+template <>
+struct ConversionToStringAllowed<uint32_t> {};
+template <>
+struct ConversionToStringAllowed<int32_t> {};
+template <>
+struct ConversionToStringAllowed<double> {};
+template <>
+struct ConversionToStringAllowed<float> {};
+
+/**
+ * Set the decimal precision to 10 digits.
+ * Note that this setting is aligned with Android Audio Parameter
+ * policy concerning float storage into string.
+ */
+static const uint32_t gFloatPrecision = 10;
+
+template <typename T>
+static inline bool fromString(const std::string &str, T &result)
+{
+ /* Check that conversion to that type is allowed.
+ * If this fails, this means that this template was not intended to be used
+ * with this type, thus that the result is undefined. */
+ ConversionFromStringAllowed<T>();
+
+ if (str.find_first_of(std::string("\r\n\t\v ")) != std::string::npos) {
+ return false;
+ }
+
+ /* Check for a '-' in string. If type is unsigned and a - is found, the
+ * parsing fails. This is made necessary because "-1" is read as 65535 for
+ * uint16_t, for example */
+ if (str.find("-") != std::string::npos
+ && !std::numeric_limits<T>::is_signed) {
+ return false;
+ }
+
+ std::stringstream ss(str);
+
+ /* Sadly, the stream conversion does not handle hexadecimal format, thus
+ * check is done manually */
+ if (str.substr(0, 2) == "0x") {
+ if (std::numeric_limits<T>::is_integer) {
+ ss >> std::hex >> result;
+ } else {
+ /* Conversion undefined for non integers */
+ return false;
+ }
+ } else {
+ ss >> result;
+ }
+
+ return ss.eof() && !ss.fail() && !ss.bad();
+}
+
+template <typename T>
+static inline bool toString(const T &value, std::string &str)
+{
+ /* Check that conversion from that type is allowed.
+ * If this fails, this means that this template was not intended to be used
+ * with this type, thus that the result is undefined. */
+ ConversionToStringAllowed<T>();
+
+ std::stringstream oss;
+ oss.precision(gFloatPrecision);
+ oss << value;
+ str = oss.str();
+ return !oss.fail() && !oss.bad();
+}
+
+template <typename srcType, typename dstType>
+class Converter;
+
+template <typename dstType>
+class Converter<std::string, dstType>
+{
+public:
+ static inline bool run(const std::string &str, dstType &result)
+ {
+ return fromString<dstType>(str, result);
+ }
+};
+
+template <typename srcType>
+class Converter<srcType, std::string>
+{
+public:
+ static inline bool run(const srcType &str, std::string &result)
+ {
+ return toString<srcType>(str, result);
+ }
+};
+
+/** Convert a vector by applying convertTo on each element.
+ *
+ * @tparam SrcElem Type of the src elements.
+ * @tparam DstElem Type of the destination elements.
+ */
+template <typename SrcElem, typename DstElem>
+class Converter<std::vector<SrcElem>, std::vector<DstElem> >
+{
+public:
+ typedef const std::vector<SrcElem> Src;
+ typedef std::vector<DstElem> Dst;
+
+ static inline bool run(Src &src, Dst &dst)
+ {
+ typedef typename Src::const_iterator SrcIt;
+ dst.clear();
+ dst.reserve(src.size());
+ for (SrcIt it = src.begin(); it != src.end(); ++it) {
+ DstElem dstElem;
+ if (not convertTo(*it, dstElem)) {
+ return false;
+ }
+ dst.push_back(dstElem);
+ }
+ return true;
+ }
+};
+
+} // namespace details
+
+template <typename srcType, typename dstType>
+static inline bool convertTo(const srcType &input, dstType &result)
+{
+ return details::Converter<srcType, dstType>::run(input, result);
+}
+
+/**
+ * Specialization for int16_t of convertTo template function.
+ *
+ * This function follows the same paradigm than it's generic version.
+ *
+ * The specific implementation is made necessary because the stlport version of
+ * string streams is bugged and does not fail when giving overflowed values.
+ * This specialisation can be safely removed when stlport behaviour is fixed.
+ *
+ * @param[in] str the string to parse.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<std::string, int16_t>(const std::string &str, int16_t &result)
+{
+ int64_t res;
+
+ if (!convertTo<std::string, int64_t>(str, res)) {
+ return false;
+ }
+
+ if (res > std::numeric_limits<int16_t>::max() || res < std::numeric_limits<int16_t>::min()) {
+ return false;
+ }
+
+ result = static_cast<int16_t>(res);
+ return true;
+}
+
+/**
+ * Specialization for float of convertTo template function.
+ *
+ * This function follows the same paradigm than it's generic version and is
+ * based on it but makes furthers checks on the returned value.
+ *
+ * The specific implementation is made necessary because the stlport conversion
+ * from string to float behaves differently than GNU STL: overflow produce
+ * +/-Infinity rather than an error.
+ *
+ * @param[in] str the string to parse.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<std::string, float>(const std::string &str, float &result)
+{
+ if (!details::Converter<std::string, float>::run(str, result)) {
+ return false;
+ }
+
+ if (std::abs(result) == std::numeric_limits<float>::infinity() ||
+ result == std::numeric_limits<float>::quiet_NaN()) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Specialization for double of convertTo template function.
+ *
+ * This function follows the same paradigm than it's generic version and is
+ * based on it but makes furthers checks on the returned value.
+ *
+ * The specific implementation is made necessary because the stlport conversion
+ * from string to double behaves differently than GNU STL: overflow produce
+ * +/-Infinity rather than an error.
+ *
+ * @param[in] str the string to parse.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<std::string, double>(const std::string &str, double &result)
+{
+ if (!details::Converter<std::string, double>::run(str, result)) {
+ return false;
+ }
+
+ if (std::abs(result) == std::numeric_limits<double>::infinity() ||
+ result == std::numeric_limits<double>::quiet_NaN()) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Specialization for boolean of convertTo template function.
+ *
+ * This function follows the same paradigm than it's generic version.
+ * This function accepts to parse boolean as "0/1" or "false/true" or
+ * "FALSE/TRUE".
+ * The specific implementation is made necessary because the behaviour of
+ * string streams when parsing boolean values is not sufficient to fit our
+ * requirements. Indeed, parsing "true" will correctly parse the value, but the
+ * end of stream is not reached which makes the ss.eof() fails in the generic
+ * implementation.
+ *
+ * @param[in] str the string to parse.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<std::string, bool>(const std::string &str, bool &result)
+{
+ if (str == "0" || str == "FALSE" || str == "false") {
+ result = false;
+ return true;
+ }
+
+ if (str == "1" || str == "TRUE" || str == "true") {
+ result = true;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Specialization for boolean to string of convertTo template function.
+ *
+ * This function follows the same paradigm than it's generic version.
+ * This function arbitrarily decides to return "false/true".
+ * It is compatible with the specialization from string to boolean.
+ *
+ * @param[in] isSet boolean to convert to a string.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<bool, std::string>(const bool &isSet, std::string &result)
+{
+ result = isSet ? "true" : "false";
+ return true;
+}
+
+/**
+ * Specialization for string to string of convertTo template function.
+ *
+ * This function is a dummy conversion from string to string.
+ * In case of clients using template as well, this implementation avoids adding extra
+ * specialization to bypass the conversion from string to string.
+ *
+ * @param[in] str the string to parse.
+ * @param[out] result reference to object where to store the result.
+ *
+ * @return true if conversion was successful, false otherwise.
+ */
+template <>
+inline bool convertTo<std::string, std::string>(const std::string &str, std::string &result)
+{
+ result = str;
+ return true;
+}
+
+} // namespace utilities
+
+} // namespace android