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"
1820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie//#define LOG_NDEBUG 0
1920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie//#define VERY_VERBOSE_LOGGING
2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#ifdef VERY_VERBOSE_LOGGING
2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#define ALOGVV ALOGV
2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#else
2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#define ALOGVV(a...) do { } while(0)
2520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#endif
2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Engine.h"
2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Strategy.h"
2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Stream.h"
3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "InputSource.h"
3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Usage.h"
3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <policy.h>
3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <ParameterManagerWrapper.h>
3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing std::string;
3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieusing std::map;
3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace android
3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace audio_policy
4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
4320f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieStrategyCollection &Engine::getCollection<routing_strategy>()
4420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mStrategyCollection;
4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
4820f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieStreamCollection &Engine::getCollection<audio_stream_type_t>()
4920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
5020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mStreamCollection;
5120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
5220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
5320f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieUsageCollection &Engine::getCollection<audio_usage_t>()
5420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
5520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mUsageCollection;
5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
5820f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieInputSourceCollection &Engine::getCollection<audio_source_t>()
5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mInputSourceCollection;
6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst StrategyCollection &Engine::getCollection<routing_strategy>() const
6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mStrategyCollection;
6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
6820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst StreamCollection &Engine::getCollection<audio_stream_type_t>() const
7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mStreamCollection;
7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
7420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst UsageCollection &Engine::getCollection<audio_usage_t>() const
7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mUsageCollection;
7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieconst InputSourceCollection &Engine::getCollection<audio_source_t>() const
8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mInputSourceCollection;
8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8420f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieEngine::Engine()
8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    : mManagerInterface(this),
8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie      mPluginInterface(this),
8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie      mPolicyParameterMgr(new ParameterManagerWrapper()),
8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie      mApmObserver(NULL)
8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
9220f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieEngine::~Engine()
9320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
9420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mStrategyCollection.clear();
9520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mStreamCollection.clear();
9620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mInputSourceCollection.clear();
9720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mUsageCollection.clear();
9820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
9920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffievoid Engine::setObserver(AudioPolicyManagerObserver *observer)
10220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
10320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    ALOG_ASSERT(observer != NULL, "Invalid Audio Policy Manager observer");
10420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    mApmObserver = observer;
10520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
10620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t Engine::initCheck()
10820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
109814ce809867326e6ba46583444476e9f63ad01f7François Gaffie    if (mPolicyParameterMgr == NULL || mPolicyParameterMgr->start() != NO_ERROR) {
1100f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie        ALOGE("%s: could not start Policy PFW", __FUNCTION__);
1110f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie        return NO_INIT;
1120f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    }
1130f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    return (mApmObserver != NULL)? NO_ERROR : NO_INIT;
11420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
11520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename Key>
11720f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieElement<Key> *Engine::getFromCollection(const Key &key) const
11820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
11920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    const Collection<Key> collection = getCollection<Key>();
12020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return collection.get(key);
12120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
12220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
12320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename Key>
12420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t Engine::add(const std::string &name, const Key &key)
12520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
12620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Collection<Key> &collection = getCollection<Key>();
12720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return collection.add(name, key);
12820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
12920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
13020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename Property, typename Key>
13120f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieProperty Engine::getPropertyForKey(Key key) const
13220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
13320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element<Key> *element = getFromCollection<Key>(key);
13420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    if (element == NULL) {
13520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        ALOGE("%s: Element not found within collection", __FUNCTION__);
13620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        return static_cast<Property>(0);
13720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    }
13820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return element->template get<Property>();
13920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
14020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
1410f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffierouting_strategy Engine::ManagerInterfaceImpl::getStrategyForUsage(audio_usage_t usage)
14220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
1430f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    return mPolicyEngine->getPropertyForKey<routing_strategy, audio_usage_t>(usage);
1440f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie}
1450f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie
1460f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffieaudio_devices_t Engine::ManagerInterfaceImpl::getDeviceForStrategy(routing_strategy strategy) const
1470f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie{
1480f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    const SwAudioOutputCollection &outputs = mPolicyEngine->mApmObserver->getOutputs();
14920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
15020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /** This is the only case handled programmatically because the PFW is unable to know the
15120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * activity of streams.
15220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     *
15320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * -While media is playing on a remote device, use the the sonification behavior.
15420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Note that we test this usecase before testing if media is playing because
15520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * the isStreamActive() method only informs about the activity of a stream, not
15620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * if it's for local playback. Note also that we use the same delay between both tests
15720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     *
15820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * -When media is not playing anymore, fall back on the sonification behavior
15920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
16020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    if (strategy == STRATEGY_SONIFICATION_RESPECTFUL &&
16120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            !is_state_in_call(getPhoneState()) &&
16220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            !outputs.isStreamActiveRemotely(AUDIO_STREAM_MUSIC,
16320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                    SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY) &&
16420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie            outputs.isStreamActive(AUDIO_STREAM_MUSIC, SONIFICATION_RESPECTFUL_AFTER_MUSIC_DELAY)) {
1650f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie        return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(STRATEGY_MEDIA);
16620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    }
1674ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie    if (strategy == STRATEGY_ACCESSIBILITY &&
1684ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie        (outputs.isStreamActive(AUDIO_STREAM_RING) || outputs.isStreamActive(AUDIO_STREAM_ALARM))) {
1694ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie            // do not route accessibility prompts to a digital output currently configured with a
1704ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie            // compressed format as they would likely not be mixed and dropped.
1714ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie            // Device For Sonification conf file has HDMI, SPDIF and HDMI ARC unreacheable.
1724ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie        return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(
1734ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie                    STRATEGY_SONIFICATION);
1744ac9d8441da55d95a60e92725576e38d7cc6cb34François Gaffie    }
1750f17ab7f9fac4327a8772e9199f411af7df912a4François Gaffie    return mPolicyEngine->getPropertyForKey<audio_devices_t, routing_strategy>(strategy);
17620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
17720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
178d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffiebool Engine::PluginInterfaceImpl::setVolumeProfileForStream(const audio_stream_type_t &stream,
179d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie                                                            const audio_stream_type_t &profile)
180d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie{
181d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie    if (mPolicyEngine->setPropertyForKey<audio_stream_type_t, audio_stream_type_t>(stream,
182d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie                                                                                   profile)) {
183d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie        mPolicyEngine->mApmObserver->getVolumeCurves().switchVolumeCurve(profile, stream);
184d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie        return true;
185d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie    }
186d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie    return false;
187d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie}
188d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie
189d1ab2bd4f1ea166a7e9e81cfd7f3e5dd47135d4dFrançois Gaffie
19020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename Property, typename Key>
19120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiebool Engine::setPropertyForKey(const Property &property, const Key &key)
19220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
19320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element<Key> *element = getFromCollection<Key>(key);
19420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    if (element == NULL) {
19520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        ALOGE("%s: Element not found within collection", __FUNCTION__);
19620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        return BAD_VALUE;
19720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    }
19820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return element->template set<Property>(property) == NO_ERROR;
19920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
20020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
20120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t Engine::setPhoneState(audio_mode_t mode)
20220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
20320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mPolicyParameterMgr->setPhoneState(mode);
20420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
20520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
20620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieaudio_mode_t Engine::getPhoneState() const
20720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
20820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mPolicyParameterMgr->getPhoneState();
20920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
21020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
21120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestatus_t Engine::setForceUse(audio_policy_force_use_t usage,
21220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie                                      audio_policy_forced_cfg_t config)
21320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
21420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mPolicyParameterMgr->setForceUse(usage, config);
21520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
21620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
21720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieaudio_policy_forced_cfg_t Engine::getForceUse(audio_policy_force_use_t usage) const
21820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
21920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return mPolicyParameterMgr->getForceUse(usage);
22020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
22120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
222a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffiestatus_t Engine::setDeviceConnectionState(const sp<DeviceDescriptor> devDesc,
223a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie                                          audio_policy_dev_state_t /*state*/)
22420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
225a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie    if (audio_is_output_device(devDesc->type())) {
226a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie        return mPolicyParameterMgr->setAvailableOutputDevices(
227a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie                    mApmObserver->getAvailableOutputDevices().types());
228a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie    } else if (audio_is_input_device(devDesc->type())) {
229a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie        return mPolicyParameterMgr->setAvailableInputDevices(
230a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie                    mApmObserver->getAvailableInputDevices().types());
231a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie    }
232a3e696da3872250bca66a62d93a3b6114e20c27dFrançois Gaffie    return BAD_TYPE;
23320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
23420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
23520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
23620f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieAudioPolicyManagerInterface *Engine::queryInterface()
23720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
23820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return &mManagerInterface;
23920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
24020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
24120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
24220f06f996337c9bf79d0b112083f6427a122ebabFrançois GaffieAudioPolicyPluginInterface *Engine::queryInterface()
24320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
24420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    return &mPluginInterface;
24520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}
24620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
24720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace audio_policy
24820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace android
24920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
25020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
251