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 "EngineDefinition.h"
2120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <Volume.h>
2220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <RoutingStrategy.h>
2320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie#include <map>
2420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
2520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace android
2620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
2720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffienamespace audio_policy
2820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
2920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie/**
3020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie * @tparam routing_strategy: Applicable strategy for this stream.
3120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie */
3220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietemplate <>
3320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieclass Element<audio_stream_type_t>
3420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie{
3520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate:
3620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    typedef std::map<Volume::device_category, VolumeCurvePoints> VolumeProfiles;
3720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    typedef VolumeProfiles::iterator VolumeProfileIterator;
3820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    typedef VolumeProfiles::const_iterator VolumeProfileConstIterator;
3920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
4020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffiepublic:
4120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element(const std::string &name)
4220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie        : mName(name),
4320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie          mApplicableStrategy(STRATEGY_MEDIA),
4420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie          mIndexMin(0),
4520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie          mIndexMax(1)
4620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    {}
4720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    ~Element() {}
4820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
4920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
5020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Returns identifier of this policy element
5120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     *
5220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * @returns string representing the name of this policy element
5320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
5420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    const std::string &getName() const { return mName; }
5520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
5620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
5720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    * Set the unique identifier for this policy element.
5820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    *
5920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    * @tparam Key type of the unique identifier.
6020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    * @param[in] identifier to be set.
6120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    *
6220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    * @return NO_ERROR if the identifier is valid and set correctly, error code otherwise.
6320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    */
6420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t setIdentifier(audio_stream_type_t identifier);
6520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
6620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
6720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * @return the unique identifier of this policy element.
6820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
6920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    audio_stream_type_t getIdentifier() const { return mIdentifier; }
7020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
7120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
7220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * A Policy element may implement getter/setter function for a given property.
7320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Property may be routing_strategy, audio_stream_type_t, audio_usage_t, audio_source_t
7420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * or a string.
7520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
7620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Property>
7720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Property get() const;
7820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
7920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    template <typename Property>
8020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t set(Property property);
8120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t setVolumeProfile(Volume::device_category category, const VolumeCurvePoints &points);
8320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    float volIndexToDb(Volume::device_category deviceCategory, int indexInUi);
8520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    status_t initVolume(int indexMin, int indexMax);
8720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
8820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffieprivate:
8920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /* Copy facilities are put private to disable copy. */
9020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element(const Element &object);
9120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    Element &operator=(const Element &object);
9220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
9320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    std::string mName; /**< Unique literal Identifier of a policy base element*/
9420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    audio_stream_type_t mIdentifier; /**< Unique numerical Identifier of a policy base element*/
9520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
9620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    routing_strategy mApplicableStrategy; /**< Applicable strategy for this stream. */
9720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
9820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    /**
9920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Collection of volume profiles indexed by the stream type.
10020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * Volume is the only reason why the stream profile was not removed from policy when introducing
10120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     * attributes.
10220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie     */
10320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    VolumeProfiles mVolumeProfiles;
10420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    int mIndexMin;
10620f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
10720f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie    int mIndexMax;
10820f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie};
10920f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11020f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffietypedef Element<audio_stream_type_t> Stream;
11120f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11220f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace audio_policy
11320f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie} // namespace android
11420f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
11520f06f996337c9bf79d0b112083f6427a122ebabFrançois Gaffie
116