From 65c3781db3443531deacecfbda5c7e7e82868a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Gaffie?= Date: Tue, 24 Mar 2015 09:01:14 +0100 Subject: Add a configurable version of the policy engine based on PFW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- services/audiopolicy/engineconfigurable/Android.mk | 59 ++ .../include/AudioPolicyEngineInstance.h | 81 +++ .../engineconfigurable/include/EngineDefinition.h | 22 + .../interface/AudioPolicyPluginInterface.h | 147 +++++ .../parameter-framework/Android.mk | 7 + .../parameter-framework/example/Android.mk | 104 ++++ .../ParameterFrameworkConfigurationPolicy.xml | 15 + .../parameter-framework/example/README.md | 11 + .../example/Settings/device_for_input_source.pfw | 515 +++++++++++++++++ .../Settings/device_for_strategy_accessibility.pfw | 302 ++++++++++ .../example/Settings/device_for_strategy_dtmf.pfw | 637 +++++++++++++++++++++ .../device_for_strategy_enforced_audible.pfw | 358 ++++++++++++ .../example/Settings/device_for_strategy_media.pfw | 331 +++++++++++ .../example/Settings/device_for_strategy_phone.pfw | 485 ++++++++++++++++ .../Settings/device_for_strategy_rerouting.pfw | 297 ++++++++++ .../Settings/device_for_strategy_sonification.pfw | 485 ++++++++++++++++ ...device_for_strategy_sonification_respectful.pfw | 545 ++++++++++++++++++ ...ce_for_strategy_transmitted_through_speaker.pfw | 40 ++ .../example/Settings/strategy_for_stream.pfw | 20 + .../example/Settings/strategy_for_usage.pfw | 39 ++ .../example/Settings/volumes.pfw | 545 ++++++++++++++++++ .../example/Structure/PolicyClass.xml | 5 + .../Structure/PolicySubsystem-CommonTypes.xml | 170 ++++++ .../example/Structure/PolicySubsystem-Volume.xml | 26 + .../example/Structure/PolicySubsystem.xml | 137 +++++ .../example/policy_criteria.txt | 14 + .../parameter-framework/plugin/Android.mk | 40 ++ .../parameter-framework/plugin/InputSource.cpp | 53 ++ .../parameter-framework/plugin/InputSource.h | 49 ++ .../parameter-framework/plugin/PolicyMappingKeys.h | 32 ++ .../parameter-framework/plugin/PolicySubsystem.cpp | 105 ++++ .../parameter-framework/plugin/PolicySubsystem.h | 60 ++ .../plugin/PolicySubsystemBuilder.cpp | 29 + .../parameter-framework/plugin/Strategy.cpp | 54 ++ .../parameter-framework/plugin/Strategy.h | 49 ++ .../parameter-framework/plugin/Stream.cpp | 56 ++ .../parameter-framework/plugin/Stream.h | 49 ++ .../parameter-framework/plugin/Usage.cpp | 56 ++ .../parameter-framework/plugin/Usage.h | 49 ++ .../parameter-framework/plugin/VolumeProfile.cpp | 75 +++ .../parameter-framework/plugin/VolumeProfile.h | 64 +++ .../engineconfigurable/src/Collection.h | 163 ++++++ .../audiopolicy/engineconfigurable/src/Element.h | 99 ++++ .../audiopolicy/engineconfigurable/src/Engine.cpp | 281 +++++++++ .../audiopolicy/engineconfigurable/src/Engine.h | 225 ++++++++ .../engineconfigurable/src/EngineInstance.cpp | 63 ++ .../engineconfigurable/src/InputSource.cpp | 69 +++ .../engineconfigurable/src/InputSource.h | 88 +++ .../engineconfigurable/src/Strategy.cpp | 68 +++ .../audiopolicy/engineconfigurable/src/Strategy.h | 89 +++ .../audiopolicy/engineconfigurable/src/Stream.cpp | 158 +++++ .../audiopolicy/engineconfigurable/src/Stream.h | 115 ++++ .../audiopolicy/engineconfigurable/src/Usage.cpp | 57 ++ .../audiopolicy/engineconfigurable/src/Usage.h | 88 +++ .../engineconfigurable/wrapper/Android.mk | 42 ++ .../wrapper/ParameterManagerWrapper.cpp | 434 ++++++++++++++ .../wrapper/audio_policy_criteria_conf.h | 71 +++ .../wrapper/config/audio_policy_criteria.conf | 192 +++++++ .../wrapper/include/ParameterManagerWrapper.h | 286 +++++++++ 59 files changed, 8805 insertions(+) create mode 100755 services/audiopolicy/engineconfigurable/Android.mk create mode 100755 services/audiopolicy/engineconfigurable/include/AudioPolicyEngineInstance.h create mode 100755 services/audiopolicy/engineconfigurable/include/EngineDefinition.h create mode 100755 services/audiopolicy/engineconfigurable/interface/AudioPolicyPluginInterface.h create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/Android.mk create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Android.mk create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/ParameterFrameworkConfigurationPolicy.xml create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/README.md create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_input_source.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_accessibility.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_dtmf.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_enforced_audible.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_media.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_phone.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_rerouting.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_sonification_respectful.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/device_for_strategy_transmitted_through_speaker.pfw create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_stream.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/strategy_for_usage.pfw create mode 100644 services/audiopolicy/engineconfigurable/parameter-framework/example/Settings/volumes.pfw create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicyClass.xml create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-CommonTypes.xml create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem-Volume.xml create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/Structure/PolicySubsystem.xml create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/example/policy_criteria.txt create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Android.mk create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/InputSource.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicyMappingKeys.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystem.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/PolicySubsystemBuilder.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Strategy.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Stream.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/Usage.h create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.cpp create mode 100755 services/audiopolicy/engineconfigurable/parameter-framework/plugin/VolumeProfile.h create mode 100755 services/audiopolicy/engineconfigurable/src/Collection.h create mode 100755 services/audiopolicy/engineconfigurable/src/Element.h create mode 100755 services/audiopolicy/engineconfigurable/src/Engine.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/Engine.h create mode 100755 services/audiopolicy/engineconfigurable/src/EngineInstance.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/InputSource.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/InputSource.h create mode 100755 services/audiopolicy/engineconfigurable/src/Strategy.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/Strategy.h create mode 100755 services/audiopolicy/engineconfigurable/src/Stream.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/Stream.h create mode 100755 services/audiopolicy/engineconfigurable/src/Usage.cpp create mode 100755 services/audiopolicy/engineconfigurable/src/Usage.h create mode 100644 services/audiopolicy/engineconfigurable/wrapper/Android.mk create mode 100755 services/audiopolicy/engineconfigurable/wrapper/ParameterManagerWrapper.cpp create mode 100755 services/audiopolicy/engineconfigurable/wrapper/audio_policy_criteria_conf.h create mode 100755 services/audiopolicy/engineconfigurable/wrapper/config/audio_policy_criteria.conf create mode 100755 services/audiopolicy/engineconfigurable/wrapper/include/ParameterManagerWrapper.h (limited to 'services/audiopolicy/engineconfigurable') 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 + 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 +#include + +typedef std::vector 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 +#include +#include +#include +#include +#include +#include + +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 @@ + + + + + + + + + + + + + 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 @@ + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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( + instanceConfigurableElement->getBelongingSubsystem())), + mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()), + mApplicableInputDevice(mDefaultApplicableInputDevice) +{ + mId = static_cast(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 +#include + +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 +#include +#include + +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(); + 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( + mStreamComponentName, + (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier)) + ); + addSubsystemObjectFactory( + new TSubsystemObjectFactory( + mStrategyComponentName, + (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier)) + ); + addSubsystemObjectFactory( + new TSubsystemObjectFactory( + mUsageComponentName, + (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier)) + ); + addSubsystemObjectFactory( + new TSubsystemObjectFactory( + mInputSourceComponentName, + (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier)) + ); + addSubsystemObjectFactory( + new TSubsystemObjectFactory( + 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 + +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()); +} +} 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( + instanceConfigurableElement->getBelongingSubsystem())), + mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()), + mApplicableOutputDevice(mDefaultApplicableOutputDevice) +{ + mId = static_cast(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 +#include + +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( + instanceConfigurableElement->getBelongingSubsystem())), + mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()), + mApplicableStrategy(mDefaultApplicableStrategy) +{ + mId = static_cast(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(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 +#include + +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( + instanceConfigurableElement->getBelongingSubsystem())), + mPolicyPluginInterface(mPolicySubsystem->getPolicyPluginInterface()), + mApplicableStrategy(mDefaultApplicableStrategy) +{ + mId = static_cast(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(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 +#include + +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 +#include + +using std::string; + +VolumeProfile::VolumeProfile(const string &mappingValue, + CInstanceConfigurableElement *instanceConfigurableElement, + const CMappingContext &context) + : CFormattedSubsystemObject(instanceConfigurableElement, + mappingValue, + MappingKeyAmend1, + (MappingKeyAmendEnd - MappingKeyAmend1 + 1), + context), + mPolicySubsystem(static_cast( + 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(categoryKey); + } + mId = static_cast(context.getItemAsInteger(MappingKeyIdentifier)); + + // (no exception support, defer the error) + if (instanceConfigurableElement->getType() != CInstanceConfigurableElement::EParameterBlock) { + return; + } + // Get actual element type + const CParameterBlockType *parameterType = static_cast( + 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(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 +#include +#include + +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 +#include +#include +#include +#include +#include + +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 +class Collection : public std::map *> +{ +private: + typedef Element T; + typedef typename std::map::iterator CollectionIterator; + typedef typename std::map::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::collectionSupported {}; +template <> +struct Collection::collectionSupported {}; +template <> +struct Collection::collectionSupported {}; +template <> +struct Collection::collectionSupported {}; +template <> +struct Collection::collectionSupported {}; + +typedef Collection StrategyCollection; +typedef Collection StreamCollection; +typedef Collection UsageCollection; +typedef Collection 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 +#include +#include +#include +#include + +namespace android +{ +namespace audio_policy +{ + +template +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 + 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 + 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 +#include + +using std::string; +using std::map; + +namespace android +{ +namespace audio_policy +{ +template <> +StrategyCollection &Engine::getCollection() +{ + return mStrategyCollection; +} +template <> +StreamCollection &Engine::getCollection() +{ + return mStreamCollection; +} +template <> +UsageCollection &Engine::getCollection() +{ + return mUsageCollection; +} +template <> +InputSourceCollection &Engine::getCollection() +{ + return mInputSourceCollection; +} + +template <> +const StrategyCollection &Engine::getCollection() const +{ + return mStrategyCollection; +} +template <> +const StreamCollection &Engine::getCollection() const +{ + return mStreamCollection; +} +template <> +const UsageCollection &Engine::getCollection() const +{ + return mUsageCollection; +} +template <> +const InputSourceCollection &Engine::getCollection() 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(streamType); + if (stream == NULL) { + ALOGE("%s: stream %d not found", __FUNCTION__, streamType); + return false; + } + return stream->setVolumeProfile(deviceCategory, points) == NO_ERROR; +} + +template +Element *Engine::getFromCollection(const Key &key) const +{ + const Collection collection = getCollection(); + return collection.get(key); +} + +template +status_t Engine::add(const std::string &name, const Key &key) +{ + Collection &collection = getCollection(); + return collection.add(name, key); +} + +template <> +routing_strategy Engine::getPropertyForKey(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(usage); +} + +template +Property Engine::getPropertyForKey(Key key) const +{ + Element *element = getFromCollection(key); + if (element == NULL) { + ALOGE("%s: Element not found within collection", __FUNCTION__); + return static_cast(0); + } + return element->template get(); +} + +template <> +audio_devices_t Engine::getPropertyForKey(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(STRATEGY_MEDIA); + } + return getPropertyForKey(strategy); +} + +routing_strategy Engine::ManagerInterfaceImpl::getStrategyForUsage(audio_usage_t usage) +{ + return mPolicyEngine->getPropertyForKey(usage); +} + +audio_devices_t Engine::ManagerInterfaceImpl::getDeviceForStrategy(routing_strategy stategy) const +{ + return mPolicyEngine->getPropertyForKey(stategy); +} + +template +bool Engine::setPropertyForKey(const Property &property, const Key &key) +{ + Element *element = getFromCollection(key); + if (element == NULL) { + ALOGE("%s: Element not found within collection", __FUNCTION__); + return BAD_VALUE; + } + return element->template set(property) == NO_ERROR; +} + +float Engine::volIndexToAmpl(Volume::device_category category, + audio_stream_type_t streamType, + int indexInUi) +{ + Stream *stream = getFromCollection(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(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 +#include +#include "Collection.h" + +namespace android +{ +class AudioPolicyManagerObserver; + +namespace audio_policy +{ + +class ParameterManagerWrapper; +class VolumeProfile; + +class Engine +{ +public: + Engine(); + virtual ~Engine(); + + template + 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(inputSource); + } + virtual audio_devices_t getDeviceForStrategy(routing_strategy stategy) const; + virtual routing_strategy getStrategyForStream(audio_stream_type_t stream) + { + return mPolicyEngine->getPropertyForKey(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 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(name, strategy); + } + virtual status_t addStream(const std::string &name, audio_stream_type_t stream) + { + return mPolicyEngine->add(name, stream); + } + virtual status_t addUsage(const std::string &name, audio_usage_t usage) + { + return mPolicyEngine->add(name, usage); + } + virtual status_t addInputSource(const std::string &name, audio_source_t source) + { + return mPolicyEngine->add(name, source); + } + virtual bool setDeviceForStrategy(const routing_strategy &strategy, audio_devices_t devices) + { + return mPolicyEngine->setPropertyForKey(devices, + strategy); + } + virtual bool setStrategyForStream(const audio_stream_type_t &stream, + routing_strategy strategy) + { + return mPolicyEngine->setPropertyForKey(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(strategy, + usage); + } + virtual bool setDeviceForInputSource(const audio_source_t &inputSource, + audio_devices_t device) + { + return mPolicyEngine->setPropertyForKey(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 + status_t add(const std::string &name, const Key &key); + + template + Element *getFromCollection(const Key &key) const; + + template + const Collection &getCollection() const; + + template + Collection &getCollection(); + + template + Property getPropertyForKey(Key key) const; + + template + 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 +#include +#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(); +} + +template <> +AudioPolicyPluginInterface *EngineInstance::queryInterface() const +{ + return getEngine()->queryInterface(); +} + +} // 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::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::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::get() 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 +{ +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 + Property get() const; + + template + 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 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::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::set(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::get() 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 + +namespace android +{ +namespace audio_policy +{ + +/** + * @tparam audio_devices_t: Applicable output device(s) for this strategy. + */ +template <> +class Element +{ +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 + Property get() const; + + template + 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 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 + +using std::string; + +namespace android +{ +namespace audio_policy +{ + +status_t Element::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::set(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::get() const +{ + ALOGV("%s: 0x%X for Stream %s", __FUNCTION__, mApplicableStrategy, getName().c_str()); + return mApplicableStrategy; +} + +status_t Element::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::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::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 +#include +#include + +namespace android +{ +namespace audio_policy +{ +/** + * @tparam routing_strategy: Applicable strategy for this stream. + */ +template <> +class Element +{ +private: + typedef std::map 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 + Property get() const; + + template + 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 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::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::set(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::get() 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 + +namespace android +{ +namespace audio_policy +{ + +/** + * @tparam routing_strategy: Applicable strategy for this usage. + */ +template <> +class Element +{ +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 + Property get() const; + + template + 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 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 {}; +template <> +struct ParameterManagerWrapper::parameterManagerElementSupported {}; + +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(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 +T *ParameterManagerWrapper::getElement(const string &name, std::map &elementsMap) +{ + parameterManagerElementSupported(); + typename std::map::iterator it = elementsMap.find(name); + ALOG_ASSERT(it != elementsMap.end(), "Element " << name << " not found"); + return it->second; +} + +template +const T *ParameterManagerWrapper::getElement(const string &name, const std::map &elementsMap) const +{ + parameterManagerElementSupported(); + typename std::map::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(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(mode))) { + return BAD_VALUE; + } + criterion->setCriterionState((int)(mode)); + applyPlatformConfiguration(); + return NO_ERROR; +} + +audio_mode_t ParameterManagerWrapper::getPhoneState() const +{ + const ISelectionCriterionInterface *criterion = + getElement(gPhoneStateCriterionTag, mPolicyCriteria); + return static_cast(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(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(gForceUseCriterionTag[usage], mPolicyCriteria); + return static_cast(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 +#include + +////////////////////////////////////////////////////////////////////////////////////////////////// +// 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 { +# [numerical value 1:],[numerical value 2:],,... +# } +# } + +######################################################### +# Criterion: +######################################################### +# Route|Audio { +# Criterion { +# { +# Type +# Default +# } +# } +# } + +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 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 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 +#include +#include +#include +#include +#include +#include +#include + +class CParameterMgrPlatformConnector; +class ISelectionCriterionInterface; +class ISelectionCriterionTypeInterface; +class cnode; + +class ParameterMgrPlatformConnectorLogger; + +namespace android +{ +namespace audio_policy +{ + +class ParameterManagerWrapper +{ +private: + typedef std::pair CriterionTypeValuePair; + + typedef std::map CriterionCollection; + typedef std::map 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 + T *getElement(const std::string &name, std::map &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 + const T *getElement(const std::string &name, + const std::map &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 + struct parameterManagerElementSupported; + + static const char *const mPolicyPfwDefaultConfFileName; /**< Default Policy PFW top file name.*/ +}; + +} // namespace audio_policy +} // namespace android -- cgit v1.1