120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie/* 220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Copyright (C) 2015 The Android Open Source Project 320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Licensed under the Apache License, Version 2.0 (the "License"); 520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * you may not use this file except in compliance with the License. 620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * You may obtain a copy of the License at 720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * http://www.apache.org/licenses/LICENSE-2.0 920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 1020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Unless required by applicable law or agreed to in writing, software 1120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * distributed under the License is distributed on an "AS IS" BASIS, 1220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * See the License for the specific language governing permissions and 1420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * limitations under the License. 1520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 1620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 1720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#define LOG_TAG "APM::AudioPolicyEngine/PFWWrapper" 18814ce809867326e6ba46583444476e9f63ad01f7François Gaffie//#define LOG_NDEBUG 0 1920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 2020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "ParameterManagerWrapper.h" 2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "audio_policy_criteria_conf.h" 2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <ParameterMgrPlatformConnector.h> 2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <SelectionCriterionTypeInterface.h> 2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <SelectionCriterionInterface.h> 25913d06c099bd689375483a839e11057ccf284d1cMikhail Naganov#include <media/convert.h> 2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <algorithm> 2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <cutils/config_utils.h> 2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <cutils/misc.h> 2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <fstream> 3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <limits> 3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <sstream> 3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <string> 3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <vector> 3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <stdint.h> 3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <cmath> 3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <utils/Log.h> 3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing std::string; 3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing std::map; 4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing std::vector; 4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie/// PFW related definitions 4320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie// Logger 4420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass ParameterMgrPlatformConnectorLogger : public CParameterMgrPlatformConnector::ILogger 4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiepublic: 4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ParameterMgrPlatformConnectorLogger() {} 4820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 49c1391f91c4f85f5f2f08b072486455b990817710François Gaffie virtual void info(const string &log) 5020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 5130cf41f2d7c35eef05654ea7493792a7bf1b6af7Liu Changcheng ALOGV("policy-parameter-manager: %s", log.c_str()); 52c1391f91c4f85f5f2f08b072486455b990817710François Gaffie } 53c1391f91c4f85f5f2f08b072486455b990817710François Gaffie virtual void warning(const string &log) 54c1391f91c4f85f5f2f08b072486455b990817710François Gaffie { 55c1391f91c4f85f5f2f08b072486455b990817710François Gaffie ALOGW("policy-parameter-manager: %s", log.c_str()); 5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}; 5820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace android 6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing utilities::convertTo; 6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace audio_policy 6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const ParameterManagerWrapper::mPolicyPfwDefaultConfFileName = 6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie "/etc/parameter-framework/ParameterFrameworkConfigurationPolicy.xml"; 6820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct ParameterManagerWrapper::parameterManagerElementSupported<ISelectionCriterionInterface> {}; 7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct ParameterManagerWrapper::parameterManagerElementSupported<ISelectionCriterionTypeInterface> {}; 7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 7420f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieParameterManagerWrapper::ParameterManagerWrapper() 7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie : mPfwConnectorLogger(new ParameterMgrPlatformConnectorLogger) 7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Connector 7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPfwConnector = new CParameterMgrPlatformConnector(mPolicyPfwDefaultConfFileName); 7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Logger 8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPfwConnector->setLogger(mPfwConnectorLogger); 8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Load criteria file 8420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if ((loadAudioPolicyCriteriaConfig(gAudioPolicyCriteriaVendorConfFilePath) != NO_ERROR) && 8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie (loadAudioPolicyCriteriaConfig(gAudioPolicyCriteriaConfFilePath) != NO_ERROR)) { 8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGE("%s: Neither vendor conf file (%s) nor system conf file (%s) could be found", 8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie __FUNCTION__, gAudioPolicyCriteriaVendorConfFilePath, 8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie gAudioPolicyCriteriaConfFilePath); 8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 9220f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieParameterManagerWrapper::~ParameterManagerWrapper() 9320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 9420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Unset logger 9520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPfwConnector->setLogger(NULL); 9620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Remove logger 9720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie delete mPfwConnectorLogger; 9820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Remove connector 9920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie delete mPfwConnector; 10020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 10120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 10220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t ParameterManagerWrapper::start() 10320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 10420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: in", __FUNCTION__); 10520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /// Start PFW 10620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie std::string error; 10720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (!mPfwConnector->start(error)) { 10820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGE("%s: Policy PFW start error: %s", __FUNCTION__, error.c_str()); 10920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_INIT; 11020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 11120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: Policy PFW successfully started!", __FUNCTION__); 11220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_ERROR; 11320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 11420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 11520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 11620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::addCriterionType(const string &typeName, bool isInclusive) 11720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 11820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(mPolicyCriterionTypes.find(typeName) == mPolicyCriterionTypes.end(), 119814ce809867326e6ba46583444476e9f63ad01f7François Gaffie "CriterionType %s already added", typeName.c_str()); 12020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: Adding new criterionType %s", __FUNCTION__, typeName.c_str()); 12120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 12220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPolicyCriterionTypes[typeName] = mPfwConnector->createSelectionCriterionType(isInclusive); 12320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 12420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 12520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::addCriterionTypeValuePair( 12620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const string &typeName, 12720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie uint32_t numericValue, 12820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const string &literalValue) 12920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 13020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(mPolicyCriterionTypes.find(typeName) != mPolicyCriterionTypes.end(), 131814ce809867326e6ba46583444476e9f63ad01f7François Gaffie "CriterionType %s not found", typeName.c_str()); 13220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGV("%s: Adding new value pair (%d,%s) for criterionType %s", __FUNCTION__, 13320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie numericValue, literalValue.c_str(), typeName.c_str()); 13420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ISelectionCriterionTypeInterface *criterionType = mPolicyCriterionTypes[typeName]; 135c1391f91c4f85f5f2f08b072486455b990817710François Gaffie std::string error; 136c1391f91c4f85f5f2f08b072486455b990817710François Gaffie criterionType->addValuePair(numericValue, literalValue, error); 13720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 13820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 13920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadCriterionType(cnode *root, bool isInclusive) 14020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 14120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 14220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node; 14320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie for (node = root->first_child; node != NULL; node = node->next) { 14420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 14520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(node != NULL, "error in parsing file"); 14620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const char *typeName = node->name; 1470f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie char *valueNames = strndup(node->value, strlen(node->value)); 14820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 14920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie addCriterionType(typeName, isInclusive); 15020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 15120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie uint32_t index = 0; 15220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie char *ctx; 15320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie char *valueName = strtok_r(valueNames, ",", &ctx); 15420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie while (valueName != NULL) { 15520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (strlen(valueName) != 0) { 15620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 15720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // Conf file may use or not pair, if no pair, use incremental index, else 15820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // use provided index. 15920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (strchr(valueName, ':') != NULL) { 16020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 16120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie char *first = strtok(valueName, ":"); 16220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie char *second = strtok(NULL, ":"); 16320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT((first != NULL) && (strlen(first) != 0) && 16420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie (second != NULL) && (strlen(second) != 0), 16520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie "invalid value pair"); 16620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 16720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (!convertTo<string, uint32_t>(first, index)) { 16820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGE("%s: Invalid index(%s) found", __FUNCTION__, first); 16920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 17020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie addCriterionTypeValuePair(typeName, index, second); 17120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } else { 17220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 17320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie uint32_t pfwIndex = isInclusive ? 1 << index : index; 17420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie addCriterionTypeValuePair(typeName, pfwIndex, valueName); 17520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie index += 1; 17620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 17720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 17820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie valueName = strtok_r(NULL, ",", &ctx); 17920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 1800f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie free(valueNames); 18120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 18220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 18320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 18420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadInclusiveCriterionType(cnode *root) 18520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 18620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 18720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node = config_find(root, gInclusiveCriterionTypeTag.c_str()); 18820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (node == NULL) { 18920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return; 19020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 19120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadCriterionType(node, true); 19220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 19320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 19420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadExclusiveCriterionType(cnode *root) 19520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 19620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 19720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node = config_find(root, gExclusiveCriterionTypeTag.c_str()); 19820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (node == NULL) { 19920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return; 20020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 20120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadCriterionType(node, false); 20220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 20320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 20420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::parseChildren(cnode *root, string &defaultValue, string &type) 20520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 20620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 20720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node; 20820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie for (node = root->first_child; node != NULL; node = node->next) { 20920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(node != NULL, "error in parsing file"); 21020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 21120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (string(node->name) == gDefaultTag) { 21220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie defaultValue = node->value; 21320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } else if (string(node->name) == gTypeTag) { 21420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie type = node->value; 21520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } else { 21620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGE("%s: Unrecognized %s %s node", __FUNCTION__, node->name, node->value); 21720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 21820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 21920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 22020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 22120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename T> 22220f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieT *ParameterManagerWrapper::getElement(const string &name, std::map<string, T *> &elementsMap) 22320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 22420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie parameterManagerElementSupported<T>(); 22520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie typename std::map<string, T *>::iterator it = elementsMap.find(name); 226814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOG_ASSERT(it != elementsMap.end(), "Element %s not found", name.c_str()); 227814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return it != elementsMap.end() ? it->second : NULL; 22820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 22920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 23020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename T> 23120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst T *ParameterManagerWrapper::getElement(const string &name, const std::map<string, T *> &elementsMap) const 23220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 23320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie parameterManagerElementSupported<T>(); 23420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie typename std::map<string, T *>::const_iterator it = elementsMap.find(name); 235814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOG_ASSERT(it != elementsMap.end(), "Element %s not found", name.c_str()); 236814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return it != elementsMap.end() ? it->second : NULL; 23720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 23820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 23920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadCriteria(cnode *root) 24020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 24120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 24220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node = config_find(root, gCriterionTag.c_str()); 24320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 24420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (node == NULL) { 24520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGW("%s: no inclusive criteria found", __FUNCTION__); 24620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return; 24720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 24820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie for (node = node->first_child; node != NULL; node = node->next) { 24920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadCriterion(node); 25020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 25120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 25220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 25320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::addCriterion(const string &name, const string &typeName, 25420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const string &defaultLiteralValue) 25520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 256814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOG_ASSERT(mPolicyCriteria.find(name) == mPolicyCriteria.end(), 257814ce809867326e6ba46583444476e9f63ad01f7François Gaffie "Route Criterion %s already added", name.c_str()); 25820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 25920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ISelectionCriterionTypeInterface *criterionType = 26020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie getElement<ISelectionCriterionTypeInterface>(typeName, mPolicyCriterionTypes); 26120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 26220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ISelectionCriterionInterface *criterion = 26320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPfwConnector->createSelectionCriterion(name, criterionType); 26420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 26520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPolicyCriteria[name] = criterion; 26620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie int numericalValue = 0; 26720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (!criterionType->getNumericalValue(defaultLiteralValue.c_str(), numericalValue)) { 26820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGE("%s; trying to apply invalid default literal value (%s)", __FUNCTION__, 26920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie defaultLiteralValue.c_str()); 27020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 27120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie criterion->setCriterionState(numericalValue); 27220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 27320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 27420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadCriterion(cnode *root) 27520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 27620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 27720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const char *criterionName = root->name; 27820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 27920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(mPolicyCriteria.find(criterionName) == mPolicyCriteria.end(), 280814ce809867326e6ba46583444476e9f63ad01f7François Gaffie "Criterion %s already added", criterionName); 28120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 28220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie string paramKeyName = ""; 28320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie string path = ""; 28420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie string typeName = ""; 28520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie string defaultValue = ""; 28620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 28720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie parseChildren(root, defaultValue, typeName); 28820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 28920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie addCriterion(criterionName, typeName, defaultValue); 29020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 29120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 29220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::loadConfig(cnode *root) 29320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 29420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "error in parsing file"); 29520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *node = config_find(root, gPolicyConfTag.c_str()); 29620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (node == NULL) { 29720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGW("%s: Could not find node for pfw", __FUNCTION__); 29820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return; 29920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 30020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: Loading conf for pfw", __FUNCTION__); 30120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadInclusiveCriterionType(node); 30220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadExclusiveCriterionType(node); 30320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadCriteria(node); 30420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 30520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 30620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 30720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t ParameterManagerWrapper::loadAudioPolicyCriteriaConfig(const char *path) 30820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 30920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(path != NULL, "error in parsing file: empty path"); 31020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie cnode *root; 31120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie char *data; 31220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s", __FUNCTION__); 31320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie data = (char *)load_file(path, NULL); 31420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (data == NULL) { 31520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return -ENODEV; 31620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 31720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie root = config_node("", ""); 31820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOG_ASSERT(root != NULL, "Unable to allocate a configuration node"); 31920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie config_load(root, data); 32020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 32120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie loadConfig(root); 32220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 32320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie config_free(root); 32420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie free(root); 32520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie free(data); 32620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: loaded", __FUNCTION__); 32720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_ERROR; 32820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 32920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 33020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiebool ParameterManagerWrapper::isStarted() 33120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 33220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return mPfwConnector && mPfwConnector->isStarted(); 33320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 33420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 33520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t ParameterManagerWrapper::setPhoneState(audio_mode_t mode) 33620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 337814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ISelectionCriterionInterface *criterion = 338814ce809867326e6ba46583444476e9f63ad01f7François Gaffie getElement<ISelectionCriterionInterface>(gPhoneStateCriterionTag, mPolicyCriteria); 339814ce809867326e6ba46583444476e9f63ad01f7François Gaffie if (criterion == NULL) { 340814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gPhoneStateCriterionTag.c_str()); 341814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return BAD_VALUE; 342814ce809867326e6ba46583444476e9f63ad01f7François Gaffie } 34320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (!isValueValidForCriterion(criterion, static_cast<int>(mode))) { 34420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return BAD_VALUE; 34520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 34620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie criterion->setCriterionState((int)(mode)); 34720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie applyPlatformConfiguration(); 34820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_ERROR; 34920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 35020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 35120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieaudio_mode_t ParameterManagerWrapper::getPhoneState() const 35220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 35320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const ISelectionCriterionInterface *criterion = 35420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie getElement<ISelectionCriterionInterface>(gPhoneStateCriterionTag, mPolicyCriteria); 355814ce809867326e6ba46583444476e9f63ad01f7François Gaffie if (criterion == NULL) { 356814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gPhoneStateCriterionTag.c_str()); 357814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return AUDIO_MODE_NORMAL; 358814ce809867326e6ba46583444476e9f63ad01f7François Gaffie } 35920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return static_cast<audio_mode_t>(criterion->getCriterionState()); 36020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 36120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 36220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t ParameterManagerWrapper::setForceUse(audio_policy_force_use_t usage, 36320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie audio_policy_forced_cfg_t config) 36420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 36520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // @todo: return an error on a unsupported value 36620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (usage > AUDIO_POLICY_FORCE_USE_CNT) { 36720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return BAD_VALUE; 36820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 36920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 370814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ISelectionCriterionInterface *criterion = 371814ce809867326e6ba46583444476e9f63ad01f7François Gaffie getElement<ISelectionCriterionInterface>(gForceUseCriterionTag[usage], mPolicyCriteria); 372814ce809867326e6ba46583444476e9f63ad01f7François Gaffie if (criterion == NULL) { 373814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gForceUseCriterionTag[usage].c_str()); 374814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return BAD_VALUE; 375814ce809867326e6ba46583444476e9f63ad01f7François Gaffie } 37620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (!isValueValidForCriterion(criterion, static_cast<int>(config))) { 37720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return BAD_VALUE; 37820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 37920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie criterion->setCriterionState((int)config); 38020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie applyPlatformConfiguration(); 38120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_ERROR; 38220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 38320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 38420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieaudio_policy_forced_cfg_t ParameterManagerWrapper::getForceUse(audio_policy_force_use_t usage) const 38520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 38620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie // @todo: return an error on a unsupported value 38720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (usage > AUDIO_POLICY_FORCE_USE_CNT) { 38820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return AUDIO_POLICY_FORCE_NONE; 38920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 39020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const ISelectionCriterionInterface *criterion = 39120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie getElement<ISelectionCriterionInterface>(gForceUseCriterionTag[usage], mPolicyCriteria); 392814ce809867326e6ba46583444476e9f63ad01f7François Gaffie if (criterion == NULL) { 393814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gForceUseCriterionTag[usage].c_str()); 394814ce809867326e6ba46583444476e9f63ad01f7François Gaffie return AUDIO_POLICY_FORCE_NONE; 395814ce809867326e6ba46583444476e9f63ad01f7François Gaffie } 39620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return static_cast<audio_policy_forced_cfg_t>(criterion->getCriterionState()); 39720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 39820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 39920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiebool ParameterManagerWrapper::isValueValidForCriterion(ISelectionCriterionInterface *criterion, 40020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie int valueToCheck) 40120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 40220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie const ISelectionCriterionTypeInterface *interface = criterion->getCriterionType(); 40320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie string literalValue; 40420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return interface->getLiteralValue(valueToCheck, literalValue); 40520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 40620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 407a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffiestatus_t ParameterManagerWrapper::setAvailableInputDevices(audio_devices_t inputDevices) 40820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 409814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ISelectionCriterionInterface *criterion = 410814ce809867326e6ba46583444476e9f63ad01f7François Gaffie getElement<ISelectionCriterionInterface>(gInputDeviceCriterionTag, mPolicyCriteria); 41120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (criterion == NULL) { 412814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gInputDeviceCriterionTag.c_str()); 41320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return DEAD_OBJECT; 41420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 415a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie criterion->setCriterionState(inputDevices & ~AUDIO_DEVICE_BIT_IN); 416a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie applyPlatformConfiguration(); 417a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie return NO_ERROR; 418a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie} 41920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 420a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffiestatus_t ParameterManagerWrapper::setAvailableOutputDevices(audio_devices_t outputDevices) 421a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie{ 422814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ISelectionCriterionInterface *criterion = 423814ce809867326e6ba46583444476e9f63ad01f7François Gaffie getElement<ISelectionCriterionInterface>(gOutputDeviceCriterionTag, mPolicyCriteria); 424a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie if (criterion == NULL) { 425814ce809867326e6ba46583444476e9f63ad01f7François Gaffie ALOGE("%s: no criterion found for %s", __FUNCTION__, gOutputDeviceCriterionTag.c_str()); 426a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie return DEAD_OBJECT; 42720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 428a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie criterion->setCriterionState(outputDevices); 42920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie applyPlatformConfiguration(); 43020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NO_ERROR; 43120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 43220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 43320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid ParameterManagerWrapper::applyPlatformConfiguration() 43420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 43520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie mPfwConnector->applyConfigurations(); 43620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} 43720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 43820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace audio_policy 43920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace android 440