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#include "Element.h" 2020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Stream.h" 2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Strategy.h" 2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "Usage.h" 2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include "InputSource.h" 2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <utils/Errors.h> 2520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <system/audio.h> 2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <utils/Log.h> 2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <map> 2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <stdint.h> 2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <string> 3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace android 3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace audio_policy 3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie/** 3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Collection of policy element as a map indexed with a their UID type. 3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam Key type of the policy element indexing the collection. 4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Policy Element supported are: 4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Strategy 4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Stream 4320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - InputSource 4420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Usage. 4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <typename Key> 4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass Collection : public std::map<Key, Element<Key> *> 4820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{ 4920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate: 508649a34c282954ccb64a507b1085313e3ceafc38François Gaffie typedef std::map<Key, Element<Key> *> Base; 5120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie typedef Element<Key> T; 5220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie typedef typename std::map<Key, T *>::iterator CollectionIterator; 5320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie typedef typename std::map<Key, T *>::const_iterator CollectionConstIterator; 5420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 5520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiepublic: 5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie Collection() 5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 5820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie collectionSupported(); 5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /** 6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Add a policy element to the collection. Policy elements are streams, strategies, input 6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * sources, ... Compile time error generated if called with not supported collection. 6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * It also set the key as the unique identifier of the policy element. 6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam Key indexing the collection of policy element. 6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @param[in] name of the policy element to find. 6820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @param[in] key to be used to index this new policy element. 6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @return NO_ERROR if the policy element has been successfully added to the collection. 7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie status_t add(const std::string &name, Key key) 7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 7420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if ((*this).find(key) != (*this).end()) { 7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGW("%s: element %s already added", __FUNCTION__, name.c_str()); 7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return BAD_VALUE; 7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie (*this)[key] = new T(name); 7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie ALOGD("%s: adding element %s to collection", __FUNCTION__, name.c_str()); 8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return (*this)[key]->setIdentifier(key); 8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /** 8420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Get a policy element from the collection by its key. Policy elements are streams, strategies, 8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * input sources, ... Compile time error generated if called with not supported collection. 8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam Key indexing the collection of policy element. 8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @param[in] key of the policy element to find. 8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @return valid pointer on policy element if found, NULL otherwise. 9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 9220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie T *get(Key key) const 9320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 9420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie CollectionConstIterator it = (*this).find(key); 9520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return (it == (*this).end()) ? NULL : it->second; 9620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 9720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 9820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /** 9920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Find a policy element from the collection by its name. Policy elements are streams, 10020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * strategies, input sources, ... 10120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Compile time error generated if called with not supported collection. 10220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 10320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam Key indexing the collection of policy element. 10420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @param[in] name of the policy element to find. 10520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @param[in] elementsMap maps of policy elements to search into. 10620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 10720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @return valid pointer on element if found, NULL otherwise. 10820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 10920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie T *findByName(const std::string &name) const 11020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 11120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 11220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie CollectionConstIterator it; 11320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie for (it = (*this).begin(); it != (*this).end(); ++it) { 11420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie T *element = it->second; 11520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie if (element->getName() == name) { 11620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return element; 11720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 11820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 11920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie return NULL; 12020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 12120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 12220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /** 12320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * Removes all the elements from the list and destroy them. 12420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 12520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie void clear() 12620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie { 12720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie CollectionIterator it; 12820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie for (it = (*this).begin(); it != (*this).end(); ++it) { 12920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie delete it->second; 13020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 1318649a34c282954ccb64a507b1085313e3ceafc38François Gaffie Base::clear(); 13220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie } 13320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 13420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate: 13520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie /** 13620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * provide a compile time error if no specialization is provided for a given type. 13720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * 13820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam T: type of the policyElement. Policy Element supported are: 13920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Strategy 14020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Stream 14120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - InputSource 14220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * - Usage. 14320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */ 14420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie struct collectionSupported; 14520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie}; 14620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 14720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 14820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct Collection<audio_stream_type_t>::collectionSupported {}; 14920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 15020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct Collection<std::string>::collectionSupported {}; 15120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 15220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct Collection<audio_usage_t>::collectionSupported {}; 15320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 15420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct Collection<audio_source_t>::collectionSupported {}; 15520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <> 15620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiestruct Collection<routing_strategy>::collectionSupported {}; 15720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 15820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietypedef Collection<routing_strategy> StrategyCollection; 15920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietypedef Collection<audio_stream_type_t> StreamCollection; 16020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietypedef Collection<audio_usage_t> UsageCollection; 16120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietypedef Collection<audio_source_t> InputSourceCollection; 16220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie 16320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace audio_policy 16420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace android 165