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