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