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