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#include "PolicySubsystem.h"
1820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "SubsystemObjectFactory.h"
1920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "PolicyMappingKeys.h"
2020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Strategy.h"
2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Stream.h"
2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "InputSource.h"
2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Usage.h"
2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <AudioPolicyPluginInterface.h>
2520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <AudioPolicyEngineInstance.h>
2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <utils/Log.h>
2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing android::audio_policy::EngineInstance;
2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyName = "Name";
3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyIdentifier = "Identifier";
3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyCategory = "Category";
3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyAmend1 = "Amend1";
3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyAmend2 = "Amend2";
3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mKeyAmend3 = "Amend3";
3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mStreamComponentName = "Stream";
3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mStrategyComponentName = "Strategy";
4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mInputSourceComponentName = "InputSource";
4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst char *const PolicySubsystem::mUsageComponentName = "Usage";
4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
43c1391f91c4f85f5f2f08b072486455b990817710François GaffiePolicySubsystem::PolicySubsystem(const std::string &name, core::log::Logger &logger)
44c1391f91c4f85f5f2f08b072486455b990817710François Gaffie    : CSubsystem(name, logger),
4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie      mPluginInterface(NULL)
4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    // Try to connect a Plugin Interface from Audio Policy Engine
4820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    EngineInstance *engineInstance = EngineInstance::getInstance();
4920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
500f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    ALOG_ASSERT(engineInstance != NULL, "NULL Plugin Interface");
510f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie
5220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    // Retrieve the Route Interface
5320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mPluginInterface = engineInstance->queryInterface<android::AudioPolicyPluginInterface>();
540f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
5520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    // Provide mapping keys to the core, necessary when parsing the XML Structure files.
5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyName);
5820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyCategory);
5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyIdentifier);
6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyAmend1);
6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyAmend2);
6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addContextMappingKey(mKeyAmend3);
6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    // Provide creators to upper layer
6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addSubsystemObjectFactory(
6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        new TSubsystemObjectFactory<Stream>(
6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            mStreamComponentName,
68d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie            (1 << MappingKeyIdentifier))
6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        );
7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addSubsystemObjectFactory(
7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        new TSubsystemObjectFactory<Strategy>(
7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            mStrategyComponentName,
7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
7420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        );
7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addSubsystemObjectFactory(
7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        new TSubsystemObjectFactory<Usage>(
7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            mUsageComponentName,
7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        );
8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    addSubsystemObjectFactory(
8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        new TSubsystemObjectFactory<InputSource>(
8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            mInputSourceComponentName,
8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            (1 << MappingKeyAmend1) | (1 << MappingKeyIdentifier))
8420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        );
8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie// Retrieve Route interface
8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieandroid::AudioPolicyPluginInterface *PolicySubsystem::getPolicyPluginInterface() const
8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    ALOG_ASSERT(mPluginInterface != NULL, "NULL Plugin Interface");
9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mPluginInterface;
9220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
93