Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #pragma once
     18 
     19 #include "AudioPolicyConfig.h"
     20 #include <utils/StrongPointer.h>
     21 #include <utils/Errors.h>
     22 #include <utils/RefBase.h>
     23 #include <string>
     24 #include <sstream>
     25 #include <fstream>
     26 
     27 struct _xmlNode;
     28 struct _xmlDoc;
     29 
     30 namespace android {
     31 
     32 struct AudioGainTraits
     33 {
     34     static const char *const tag;
     35     static const char *const collectionTag;
     36 
     37     struct Attributes
     38     {
     39         static const char mode[]; /**< gain modes supported, e.g. AUDIO_GAIN_MODE_CHANNELS. */
     40         /** controlled channels, needed if mode AUDIO_GAIN_MODE_CHANNELS. */
     41         static const char channelMask[];
     42         static const char minValueMB[]; /**< min value in millibel. */
     43         static const char maxValueMB[]; /**< max value in millibel. */
     44         static const char defaultValueMB[]; /**< default value in millibel. */
     45         static const char stepValueMB[]; /**< step value in millibel. */
     46         static const char minRampMs[]; /**< needed if mode AUDIO_GAIN_MODE_RAMP. */
     47         static const char maxRampMs[]; /**< .needed if mode AUDIO_GAIN_MODE_RAMP */
     48     };
     49 
     50     typedef AudioGain Element;
     51     typedef sp<Element> PtrElement;
     52     typedef AudioGainCollection Collection;
     53     typedef void *PtrSerializingCtx;
     54 
     55     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
     56                                 PtrSerializingCtx serializingContext);
     57 
     58     // Gain has no child
     59 };
     60 
     61 // A profile section contains a name,  one audio format and the list of supported sampling rates
     62 // and channel masks for this format
     63 struct AudioProfileTraits
     64 {
     65     static const char *const tag;
     66     static const char *const collectionTag;
     67 
     68     struct Attributes
     69     {
     70         static const char name[];
     71         static const char samplingRates[];
     72         static const char format[];
     73         static const char channelMasks[];
     74     };
     75 
     76     typedef AudioProfile Element;
     77     typedef sp<AudioProfile> PtrElement;
     78     typedef AudioProfileVector Collection;
     79     typedef void *PtrSerializingCtx;
     80 
     81     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
     82                                 PtrSerializingCtx serializingContext);
     83 };
     84 
     85 struct MixPortTraits
     86 {
     87     static const char *const tag;
     88     static const char *const collectionTag;
     89 
     90     struct Attributes
     91     {
     92         static const char name[];
     93         static const char role[];
     94         static const char flags[];
     95     };
     96 
     97     typedef IOProfile Element;
     98     typedef sp<Element> PtrElement;
     99     typedef IOProfileCollection Collection;
    100     typedef void *PtrSerializingCtx;
    101 
    102     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
    103                                 PtrSerializingCtx serializingContext);
    104 
    105     // Children are: GainTraits
    106 };
    107 
    108 struct DevicePortTraits
    109 {
    110     static const char *const tag;
    111     static const char *const collectionTag;
    112 
    113     struct Attributes
    114     {
    115         static const char tagName[]; /**<  <device tag name>: any string without space. */
    116         static const char type[]; /**< <device type>. */
    117         static const char role[]; /**< <device role: sink or source>. */
    118         static const char roleSource[]; /**< <attribute role source value>. */
    119         static const char address[]; /**< optional: device address, char string less than 64. */
    120     };
    121     typedef DeviceDescriptor Element;
    122     typedef sp<DeviceDescriptor> PtrElement;
    123     typedef DeviceVector Collection;
    124     typedef void *PtrSerializingCtx;
    125 
    126     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
    127                                 PtrSerializingCtx serializingContext);
    128     // Children are: GainTraits (optionnal)
    129 };
    130 
    131 struct RouteTraits
    132 {
    133     static const char *const tag;
    134     static const char *const collectionTag;
    135 
    136     struct Attributes
    137     {
    138         static const char type[]; /**< <route type>: mix or mux. */
    139         static const char typeMix[]; /**< type attribute mix value. */
    140         static const char sink[]; /**< <sink: involved in this route>. */
    141         static const char sources[]; /**< sources: all source that can be involved in this route. */
    142     };
    143     typedef AudioRoute Element;
    144     typedef sp<AudioRoute> PtrElement;
    145     typedef AudioRouteVector Collection;
    146     typedef HwModule *PtrSerializingCtx;
    147 
    148     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
    149                                 PtrSerializingCtx ctx);
    150 };
    151 
    152 struct ModuleTraits
    153 {
    154     static const char *const tag;
    155     static const char *const collectionTag;
    156 
    157     static const char *const childAttachedDevicesTag;
    158     static const char *const childAttachedDeviceTag;
    159     static const char *const childDefaultOutputDeviceTag;
    160 
    161     struct Attributes
    162     {
    163         static const char name[];
    164         static const char version[];
    165     };
    166 
    167     typedef HwModule Element;
    168     typedef sp<Element> PtrElement;
    169     typedef HwModuleCollection Collection;
    170     typedef AudioPolicyConfig *PtrSerializingCtx;
    171 
    172     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
    173                                 PtrSerializingCtx serializingContext);
    174 
    175     // Children are: mixPortTraits, devicePortTraits and routeTraits
    176     // Need to call deserialize on each child
    177 };
    178 
    179 struct GlobalConfigTraits
    180 {
    181     static const char *const tag;
    182 
    183     struct Attributes
    184     {
    185         static const char speakerDrcEnabled[];
    186     };
    187 
    188     static status_t deserialize(const _xmlNode *root, AudioPolicyConfig &config);
    189 };
    190 
    191 struct VolumeTraits
    192 {
    193     static const char *const tag;
    194     static const char *const collectionTag;
    195     static const char *const volumePointTag;
    196 
    197     struct Attributes
    198     {
    199         static const char stream[];
    200         static const char deviceCategory[];
    201         static const char reference[];
    202     };
    203 
    204     typedef VolumeCurve Element;
    205     typedef sp<VolumeCurve> PtrElement;
    206     typedef VolumeCurvesCollection Collection;
    207     typedef void *PtrSerializingCtx;
    208 
    209     static status_t deserialize(_xmlDoc *doc, const _xmlNode *root, PtrElement &element,
    210                                 PtrSerializingCtx serializingContext);
    211 
    212     // No Child
    213 };
    214 
    215 class PolicySerializer
    216 {
    217 private:
    218     static const char *const rootName;
    219 
    220     static const char *const versionAttribute;
    221     static const uint32_t gMajor; /**< the major number of the policy xml format version. */
    222     static const uint32_t gMinor; /**< the minor number of the policy xml format version. */
    223 
    224 public:
    225     PolicySerializer();
    226     status_t deserialize(const char *str, AudioPolicyConfig &config);
    227 
    228 private:
    229     typedef AudioPolicyConfig Element;
    230 
    231     std::string mRootElementName;
    232     std::string mVersion;
    233 
    234     // Children are: ModulesTraits, VolumeTraits
    235 };
    236 
    237 }; // namespace android
    238