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#pragma once
1820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
1920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <AudioPolicyManagerInterface.h>
2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <AudioPolicyPluginInterface.h>
2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Collection.h"
2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace android
2520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass AudioPolicyManagerObserver;
2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace audio_policy
2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass ParameterManagerWrapper;
3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass VolumeProfile;
3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass Engine
3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiepublic:
3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Engine();
3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    virtual ~Engine();
3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <class RequestedInterface>
4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    RequestedInterface *queryInterface();
4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
4320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate:
4420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /// Interface members
4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    class ManagerInterfaceImpl : public AudioPolicyManagerInterface
4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    {
4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    public:
4820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        ManagerInterfaceImpl(Engine *policyEngine)
4920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            : mPolicyEngine(policyEngine) {}
5020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
5120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual android::status_t initCheck()
5220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
5320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->initCheck();
5420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
5520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual void setObserver(AudioPolicyManagerObserver *observer)
5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            mPolicyEngine->setObserver(observer);
5820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual audio_devices_t getDeviceForInputSource(audio_source_t inputSource) const
6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->getPropertyForKey<audio_devices_t, audio_source_t>(inputSource);
6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual audio_devices_t getDeviceForStrategy(routing_strategy stategy) const;
6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual routing_strategy getStrategyForStream(audio_stream_type_t stream)
6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->getPropertyForKey<routing_strategy, audio_stream_type_t>(stream);
6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
6820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual routing_strategy getStrategyForUsage(audio_usage_t usage);
6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t setPhoneState(audio_mode_t mode)
7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setPhoneState(mode);
7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual audio_mode_t getPhoneState() const
7420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->getPhoneState();
7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t setForceUse(audio_policy_force_use_t usage,
7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                              audio_policy_forced_cfg_t config)
7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setForceUse(usage, config);
8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) const
8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
8420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->getForceUse(usage);
8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual android::status_t setDeviceConnectionState(const sp<DeviceDescriptor> devDesc,
8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                           audio_policy_dev_state_t state)
8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setDeviceConnectionState(devDesc->type(), state,
9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                           devDesc->mAddress);
9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
9220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t initStreamVolume(audio_stream_type_t stream,
9320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                   int indexMin, int indexMax)
9420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
9520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->initStreamVolume(stream, indexMin, indexMax);
9620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
9720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
9820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual void initializeVolumeCurves(bool /*isSpeakerDrcEnabled*/) {}
9920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual float volIndexToDb(Volume::device_category deviceCategory,
10120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                     audio_stream_type_t stream,
10220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                     int indexInUi)
10320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
10420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->volIndexToDb(deviceCategory, stream, indexInUi);
10520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
10620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    private:
10820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        Engine *mPolicyEngine;
10920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    } mManagerInterface;
11020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    class PluginInterfaceImpl : public AudioPolicyPluginInterface
11220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    {
11320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    public:
11420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        PluginInterfaceImpl(Engine *policyEngine)
11520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            : mPolicyEngine(policyEngine) {}
11620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t addStrategy(const std::string &name, routing_strategy strategy)
11820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
11920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->add<routing_strategy>(name, strategy);
12020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
12120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t addStream(const std::string &name, audio_stream_type_t stream)
12220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
12320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->add<audio_stream_type_t>(name, stream);
12420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
12520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t addUsage(const std::string &name, audio_usage_t usage)
12620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
12720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->add<audio_usage_t>(name, usage);
12820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
12920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual status_t addInputSource(const std::string &name, audio_source_t source)
13020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
13120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->add<audio_source_t>(name, source);
13220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
13320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual bool setDeviceForStrategy(const routing_strategy &strategy, audio_devices_t devices)
13420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
13520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setPropertyForKey<audio_devices_t, routing_strategy>(devices,
13620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                                                       strategy);
13720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
13820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual bool setStrategyForStream(const audio_stream_type_t &stream,
13920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                          routing_strategy strategy)
14020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
14120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setPropertyForKey<routing_strategy, audio_stream_type_t>(strategy,
14220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                                                           stream);
14320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
14420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual bool setVolumeProfileForStream(const audio_stream_type_t &stream,
14520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                               Volume::device_category deviceCategory,
14620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                               const VolumeCurvePoints &points)
14720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
14820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setVolumeProfileForStream(stream, deviceCategory, points);
14920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
15020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
15120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual bool setStrategyForUsage(const audio_usage_t &usage, routing_strategy strategy)
15220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
15320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setPropertyForKey<routing_strategy, audio_usage_t>(strategy,
15420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                                                     usage);
15520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
15620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        virtual bool setDeviceForInputSource(const audio_source_t &inputSource,
15720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                             audio_devices_t device)
15820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        {
15920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            return mPolicyEngine->setPropertyForKey<audio_devices_t, audio_source_t>(device,
16020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                                                                     inputSource);
16120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        }
16220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
16320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    private:
16420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        Engine *mPolicyEngine;
16520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    } mPluginInterface;
16620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
16720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate:
16820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /* Copy facilities are put private to disable copy. */
16920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Engine(const Engine &object);
17020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Engine &operator=(const Engine &object);
17120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
17220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    void setObserver(AudioPolicyManagerObserver *observer);
17320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
17420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    bool setVolumeProfileForStream(const audio_stream_type_t &stream,
17520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                   Volume::device_category deviceCategory,
17620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                   const VolumeCurvePoints &points);
17720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
17820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t initCheck();
17920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t setPhoneState(audio_mode_t mode);
18020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    audio_mode_t getPhoneState() const;
18120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
18220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) const;
18320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t setDeviceConnectionState(audio_devices_t devices, audio_policy_dev_state_t state,
18420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                      const char *deviceAddress);
18520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
18620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    float volIndexToDb(Volume::device_category category,
18720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                       audio_stream_type_t stream,
18820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                       int indexInUi);
18920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t initStreamVolume(audio_stream_type_t stream, int indexMin, int indexMax);
19020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
19120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    StrategyCollection mStrategyCollection; /**< Strategies indexed by their enum id. */
19220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    StreamCollection mStreamCollection; /**< Streams indexed by their enum id.  */
19320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    UsageCollection mUsageCollection; /**< Usages indexed by their enum id. */
19420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    InputSourceCollection mInputSourceCollection; /**< Input sources indexed by their enum id. */
19520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
19620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Key>
19720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t add(const std::string &name, const Key &key);
19820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
19920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Key>
20020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element<Key> *getFromCollection(const Key &key) const;
20120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
20220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Key>
20320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    const Collection<Key> &getCollection() const;
20420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
20520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Key>
20620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Collection<Key> &getCollection();
20720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
20820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Property, typename Key>
20920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Property getPropertyForKey(Key key) const;
21020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
21120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Property, typename Key>
21220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    bool setPropertyForKey(const Property &property, const Key &key);
21320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
21420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
21520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Policy Parameter Manager hidden through a wrapper.
21620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
21720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    ParameterManagerWrapper *mPolicyParameterMgr;
21820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
21920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    AudioPolicyManagerObserver *mApmObserver;
22020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie};
22120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
22220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}; // namespace audio_policy
22320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
22420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}; // namespace android
22520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
226