• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "DeviceDescriptor.h"
20 #include "AudioRoute.h"
21 #include <utils/RefBase.h>
22 #include <utils/String8.h>
23 #include <utils/Errors.h>
24 #include <utils/Vector.h>
25 #include <system/audio.h>
26 #include <cutils/config_utils.h>
27 #include <string>
28 
29 namespace android {
30 
31 class IOProfile;
32 class InputProfile;
33 class OutputProfile;
34 
35 typedef Vector<sp<IOProfile> > InputProfileCollection;
36 typedef Vector<sp<IOProfile> > OutputProfileCollection;
37 typedef Vector<sp<IOProfile> > IOProfileCollection;
38 
39 class HwModule : public RefBase
40 {
41 public:
42     explicit HwModule(const char *name, uint32_t halVersionMajor = 0, uint32_t halVersionMinor = 0);
43     ~HwModule();
44 
getName()45     const char *getName() const { return mName.string(); }
46 
getDeclaredDevices()47     const DeviceVector &getDeclaredDevices() const { return mDeclaredDevices; }
48     void setDeclaredDevices(const DeviceVector &devices);
getAllDevices()49     DeviceVector getAllDevices() const
50     {
51         DeviceVector devices = mDeclaredDevices;
52         devices.merge(mDynamicDevices);
53         return devices;
54     }
55     std::string getTagForDevice(audio_devices_t device,
56                                 const String8 &address = String8(),
57                                 audio_format_t codec = AUDIO_FORMAT_DEFAULT);
addDynamicDevice(const sp<DeviceDescriptor> & device)58     void addDynamicDevice(const sp<DeviceDescriptor> &device)
59     {
60         device->setDynamic();
61         mDynamicDevices.add(device);
62     }
63 
removeDynamicDevice(const sp<DeviceDescriptor> & device)64     bool removeDynamicDevice(const sp<DeviceDescriptor> &device)
65     {
66         return mDynamicDevices.remove(device) >= 0;
67     }
getDynamicDevices()68     DeviceVector getDynamicDevices() const { return mDynamicDevices; }
69 
getInputProfiles()70     const InputProfileCollection &getInputProfiles() const { return mInputProfiles; }
getOutputProfiles()71     const OutputProfileCollection &getOutputProfiles() const { return mOutputProfiles; }
72 
73     void setProfiles(const IOProfileCollection &profiles);
74 
setHalVersion(uint32_t major,uint32_t minor)75     void setHalVersion(uint32_t major, uint32_t minor) {
76         mHalVersion = (major << 8) | (minor & 0xff);
77     }
getHalVersionMajor()78     uint32_t getHalVersionMajor() const { return mHalVersion >> 8; }
getHalVersionMinor()79     uint32_t getHalVersionMinor() const { return mHalVersion & 0xff; }
80 
81     sp<DeviceDescriptor> getRouteSinkDevice(const sp<AudioRoute> &route) const;
82     DeviceVector getRouteSourceDevices(const sp<AudioRoute> &route) const;
getRoutes()83     const AudioRouteVector& getRoutes() const { return mRoutes; }
84     void setRoutes(const AudioRouteVector &routes);
85 
86     status_t addOutputProfile(const sp<IOProfile> &profile);
87     status_t addInputProfile(const sp<IOProfile> &profile);
88     status_t addProfile(const sp<IOProfile> &profile);
89 
90     status_t addOutputProfile(const std::string& name, const audio_config_t *config,
91             audio_devices_t device, const String8& address);
92     status_t removeOutputProfile(const std::string& name);
93     status_t addInputProfile(const std::string& name, const audio_config_t *config,
94             audio_devices_t device, const String8& address);
95     status_t removeInputProfile(const std::string& name);
96 
getHandle()97     audio_module_handle_t getHandle() const { return mHandle; }
98     void setHandle(audio_module_handle_t handle);
99 
findPortByTagName(const std::string & tagName)100     sp<PolicyAudioPort> findPortByTagName(const std::string &tagName) const
101     {
102         return findByTagName(mPorts, tagName);
103     }
104 
105     /**
106      * @brief supportsPatch checks if an audio patch between 2 ports beloging to this HwModule
107      * is supported by a HwModule. The ports and the route shall be declared in the
108      * audio_policy_configuration.xml file.
109      * @param srcPort (aka the source) to be considered
110      * @param dstPort (aka the sink) to be considered
111      * @return true if the HwModule supports the connection between the sink and the source,
112      * false otherwise
113      */
114     bool supportsPatch(const sp<PolicyAudioPort> &srcPort,
115                        const sp<PolicyAudioPort> &dstPort) const;
116 
117     // TODO remove from here (split serialization)
118     void dump(String8 *dst, int spaces) const;
119 
120 private:
121     void refreshSupportedDevices();
122 
123     const String8 mName; // base name of the audio HW module (primary, a2dp ...)
124     audio_module_handle_t mHandle;
125     OutputProfileCollection mOutputProfiles; // output profiles exposed by this module
126     InputProfileCollection mInputProfiles;  // input profiles exposed by this module
127     uint32_t mHalVersion; // audio HAL API version
128     DeviceVector mDeclaredDevices; // devices declared in audio_policy configuration file.
129     DeviceVector mDynamicDevices; /**< devices that can be added/removed at runtime (e.g. rsbumix)*/
130     AudioRouteVector mRoutes;
131     PolicyAudioPortVector mPorts;
132 };
133 
134 class HwModuleCollection : public Vector<sp<HwModule> >
135 {
136 public:
137     sp<HwModule> getModuleFromName(const char *name) const;
138 
139     /**
140      * @brief getModuleForDeviceType try to get a device from type / format on all modules
141      * @param device type to consider
142      * @param encodedFormat to consider
143      * @param[out] tagName if not null, if a matching device is found, will return the tagName
144      * of original device from XML file so that audio routes matchin rules work.
145      * @return valid module if considered device found, nullptr otherwise.
146      */
147     sp<HwModule> getModuleForDeviceType(audio_devices_t device,
148                                         audio_format_t encodedFormat,
149                                         std::string *tagName = nullptr) const;
150 
151     sp<HwModule> getModuleForDevice(const sp<DeviceDescriptor> &device,
152                                     audio_format_t encodedFormat) const;
153 
154     DeviceVector getAvailableDevicesFromModuleName(const char *name,
155                                                    const DeviceVector &availableDevices) const;
156 
157     /**
158      * @brief getDeviceDescriptor returns a device descriptor associated to the device type and
159      * device address (if matchAddress is true).
160      * It may loop twice on all modules to check if allowToCreate is true
161      *      -first loop will check if the device is found on a module since declared in the list
162      * of device port in configuration file
163      *      -(allowToCreate is true)second loop will check if the device is weakly supported by one
164      * or more profiles on a given module and will add as a supported device for this module.
165      *       The device will also be added to the dynamic list of device of this module
166      * @param type of the device requested
167      * @param address of the device requested
168      * @param name of the device that requested
169      * @param encodedFormat if not AUDIO_FORMAT_DEFAULT, must match one supported format
170      * @param matchAddress true if a strong match is required
171      * @param allowToCreate true if allowed to create dynamic device (e.g. hdmi, usb...)
172      * @return device descriptor associated to the type (and address if matchAddress is true)
173      */
174     sp<DeviceDescriptor> getDeviceDescriptor(const audio_devices_t type,
175                                              const char *address,
176                                              const char *name,
177                                              audio_format_t encodedFormat,
178                                              bool allowToCreate = false,
179                                              bool matchAddress = true) const;
180 
181     /**
182      * @brief createDevice creates a new device from the type and address given. It checks that
183      * according to the device type, a module is supporting this device (weak check).
184      * This concerns only dynamic device, aka device with a specific address and not
185      * already supported by module/underlying profiles.
186      * @param type of the device to be created
187      * @param address of the device to be created
188      * @param name of the device to be created
189      * @return device descriptor if a module is supporting this type, nullptr otherwise.
190      */
191     sp<DeviceDescriptor> createDevice(const audio_devices_t type,
192                                       const char *address,
193                                       const char *name,
194                                       const audio_format_t encodedFormat) const;
195 
196     /**
197      * @brief cleanUpForDevice: loop on all profiles of all modules to remove device from
198      * the list of supported device. If this device is a dynamic device (aka a device not in the
199      * xml file with a runtime address), it is also removed from the module collection of dynamic
200      * devices.
201      * @param device that has been disconnected
202      */
203     void cleanUpForDevice(const sp<DeviceDescriptor> &device);
204 
205     void dump(String8 *dst) const;
206 };
207 
208 } // namespace android
209