• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2018 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 <string>
20  #include <vector>
21  
22  #include <android/media/audio/common/AudioHalEngineConfig.h>
23  #include <system/audio.h>
24  #include <utils/Errors.h>
25  
26  struct _xmlNode;
27  struct _xmlDoc;
28  
29  /**
30   * AudioAttributes custom tag to identify internal strategies, whose volumes are exclusively
31   * controlled by AudioPolicyManager
32   */
33  #define AUDIO_TAG_APM_RESERVED_INTERNAL "reserved_internal_strategy"
34  
35  namespace android {
36  namespace engineConfig {
37  
38  /** Default path of audio policy usages configuration file. */
39  constexpr char DEFAULT_PATH[] = "/vendor/etc/audio_policy_engine_configuration.xml";
40  
41  using AttributesVector = std::vector<audio_attributes_t>;
42  using StreamVector = std::vector<audio_stream_type_t>;
43  
44  struct AttributesGroup {
45      audio_stream_type_t stream;
46      std::string volumeGroup;
47      AttributesVector attributesVect;
48  };
49  
50  using AttributesGroups = std::vector<AttributesGroup>;
51  
52  struct CurvePoint {
53      int index;
54      int attenuationInMb;
55  };
56  using CurvePoints = std::vector<CurvePoint>;
57  
58  struct VolumeCurve {
59      std::string deviceCategory;
60      CurvePoints curvePoints;
61  };
62  using VolumeCurves = std::vector<VolumeCurve>;
63  
64  struct VolumeGroup {
65      std::string name;
66      int indexMin;
67      int indexMax;
68      VolumeCurves volumeCurves;
69  };
70  using VolumeGroups = std::vector<VolumeGroup>;
71  
72  struct ProductStrategy {
73      std::string name;
74      AttributesGroups attributesGroups;
75  };
76  
77  using ProductStrategies = std::vector<ProductStrategy>;
78  
79  using ValuePair = std::tuple<uint64_t, uint32_t, std::string>;
80  using ValuePairs = std::vector<ValuePair>;
81  
82  struct CriterionType
83  {
84      std::string name;
85      bool isInclusive;
86      ValuePairs valuePairs;
87  };
88  
89  using CriterionTypes = std::vector<CriterionType>;
90  
91  struct Criterion
92  {
93      std::string name;
94      std::string typeName;
95      std::string defaultLiteralValue;
96  };
97  
98  using Criteria = std::vector<Criterion>;
99  
100  struct Config {
101      float version;
102      ProductStrategies productStrategies;
103      Criteria criteria;
104      CriterionTypes criterionTypes;
105      VolumeGroups volumeGroups;
106  };
107  
108  /** Result of `parse(const char*)` */
109  struct ParsingResult {
110      /** Parsed config, nullptr if the xml lib could not load the file */
111      std::unique_ptr<Config> parsedConfig;
112      size_t nbSkippedElement; //< Number of skipped invalid product strategies
113  };
114  
115  /** Parses the provided audio policy usage configuration.
116   * @return audio policy usage @see Config
117   */
118  ParsingResult parse(const char* path = DEFAULT_PATH);
119  android::status_t parseLegacyVolumes(VolumeGroups &volumeGroups);
120  ParsingResult convert(const ::android::media::audio::common::AudioHalEngineConfig& aidlConfig);
121  // Exposed for testing.
122  android::status_t parseLegacyVolumeFile(const char* path, VolumeGroups &volumeGroups);
123  
124  } // namespace engineConfig
125  } // namespace android
126