• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ST_AUDIO_SYSTEM_MANAGER_EXT_H
17 #define ST_AUDIO_SYSTEM_MANAGER_EXT_H
18 
19 #include <cstdlib>
20 #include <list>
21 #include <map>
22 #include <mutex>
23 #include <vector>
24 #include <unordered_map>
25 
26 #include "parcel.h"
27 #include "audio_stutter.h"
28 #include "audio_device_descriptor.h"
29 #include "audio_stream_change_info.h"
30 #include "audio_interrupt_callback.h"
31 #include "audio_group_manager.h"
32 #include "audio_routing_manager.h"
33 #include "audio_policy_interface.h"
34 #include "audio_workgroup_ipc.h"
35 
36 namespace OHOS {
37 namespace AudioStandard {
38 
39 struct AudioSpatialEnabledStateForDevice {
40     std::shared_ptr<AudioDeviceDescriptor> deviceDescriptor;
41     bool enabled;
42 };
43 
44 struct DistributedRoutingInfo {
45     std::shared_ptr<AudioDeviceDescriptor> descriptor;
46     CastType type;
47 };
48 
49 class InterruptGroupInfo;
50 class InterruptGroupInfo : public Parcelable {
51     friend class AudioSystemManager;
52 public:
53     int32_t interruptGroupId_ = 0;
54     int32_t mappingId_ = 0;
55     std::string groupName_;
56     std::string networkId_;
57     ConnectType connectType_ = CONNECT_TYPE_LOCAL;
58     InterruptGroupInfo();
59     InterruptGroupInfo(int32_t interruptGroupId, int32_t mappingId, std::string groupName, std::string networkId,
60         ConnectType type);
61     virtual ~InterruptGroupInfo();
62     bool Marshalling(Parcel &parcel) const override;
63     static InterruptGroupInfo *Unmarshalling(Parcel &parcel);
64 };
65 
66 class VolumeGroupInfo;
67 class VolumeGroupInfo : public Parcelable {
68     friend class AudioSystemManager;
69 public:
70     int32_t volumeGroupId_ = 0;
71     int32_t mappingId_ = 0;
72     std::string groupName_;
73     std::string networkId_;
74     ConnectType connectType_ = CONNECT_TYPE_LOCAL;
75 
76     /**
77      * @brief Volume group info.
78      *
79      * @since 9
80      */
81     VolumeGroupInfo();
82 
83     /**
84      * @brief Volume group info.
85      *
86      * @param volumeGroupId volumeGroupId
87      * @param mappingId mappingId
88      * @param groupName groupName
89      * @param networkId networkId
90      * @param type type
91      * @since 9
92      */
93     VolumeGroupInfo(int32_t volumeGroupId, int32_t mappingId, std::string groupName, std::string networkId,
94         ConnectType type);
95     virtual ~VolumeGroupInfo();
96 
97     /**
98      * @brief Marshall.
99      *
100      * @since 8
101      * @return bool
102      */
103     bool Marshalling(Parcel &parcel) const override;
104 
105     /**
106      * @brief Unmarshall.
107      *
108      * @since 8
109      * @return Returns volume group info
110      */
111     static VolumeGroupInfo *Unmarshalling(Parcel &parcel);
112 };
113 
114 /**
115  * Describes the mic phone blocked device information.
116  *
117  * @since 13
118  */
119 struct MicrophoneBlockedInfo : public Parcelable {
120     DeviceBlockStatus blockStatus;
121     std::vector<std::shared_ptr<AudioDeviceDescriptor>> devices;
122     static constexpr int32_t DEVICE_CHANGE_VALID_SIZE = 128;
123 
SetClientInfoMicrophoneBlockedInfo124     void SetClientInfo(std::shared_ptr<AudioDeviceDescriptor::ClientInfo> clientInfo) const
125     {
126         for (auto &dev : devices) {
127             if (dev != nullptr) {
128                 dev->SetClientInfo(clientInfo);
129             }
130         }
131     }
132 
MarshallingMicrophoneBlockedInfo133     bool Marshalling(Parcel &parcel) const override
134     {
135         parcel.WriteInt32(static_cast<int32_t>(blockStatus));
136         int32_t size = static_cast<int32_t>(devices.size());
137         parcel.WriteInt32(size);
138         for (auto &dev : devices) {
139             if (dev == nullptr) {
140                 return false;
141             }
142             dev->Marshalling(parcel);
143         }
144         return true;
145     }
146 
UnmarshallingMicrophoneBlockedInfo147     static MicrophoneBlockedInfo *Unmarshalling(Parcel &parcel)
148     {
149         auto info = new(std::nothrow) MicrophoneBlockedInfo();
150         if (info == nullptr) {
151             return nullptr;
152         }
153 
154         info->blockStatus = static_cast<DeviceBlockStatus>(parcel.ReadInt32());
155         int32_t size = parcel.ReadInt32();
156         if (size < 0 || size >= DEVICE_CHANGE_VALID_SIZE) {
157             delete info;
158             return nullptr;
159         }
160         for (int32_t i = 0; i < size; i++) {
161             auto device = AudioDeviceDescriptor::Unmarshalling(parcel);
162             if (device != nullptr) {
163                 info->devices.emplace_back(std::shared_ptr<AudioDeviceDescriptor>(device));
164             }
165         }
166         return info;
167     }
168 };
169 
170 /**
171  * @brief AudioRendererFilter is used for select speficed AudioRenderer.
172  */
173 class AudioRendererFilter;
174 class AudioRendererFilter : public Parcelable {
175     friend class AudioSystemManager;
176 public:
177     AudioRendererFilter();
178     virtual ~AudioRendererFilter();
179 
180     int32_t uid = -1;
181     AudioRendererInfo rendererInfo = {};
182     AudioStreamType streamType = AudioStreamType::STREAM_DEFAULT;
183     int32_t streamId = -1;
184 
185     bool Marshalling(Parcel &parcel) const override;
186     static AudioRendererFilter* Unmarshalling(Parcel &parcel);
187 };
188 
189 /**
190  * @brief AudioCapturerFilter is used for select speficed audiocapturer.
191  */
192 class AudioCapturerFilter;
193 class AudioCapturerFilter : public Parcelable {
194     friend class AudioSystemManager;
195 public:
196     AudioCapturerFilter();
197     virtual ~AudioCapturerFilter();
198 
199     int32_t uid = -1;
200     AudioCapturerInfo capturerInfo = {SOURCE_TYPE_INVALID, 0};
201 
202     bool Marshalling(Parcel &parcel) const override;
203     static AudioCapturerFilter *Unmarshalling(Parcel &in);
204 };
205 
206 // AudioManagerCallback OnInterrupt is added to handle compilation error in call manager
207 // Once call manager adapt to new interrupt APIs, this will be removed
208 class AudioManagerCallback {
209 public:
210     virtual ~AudioManagerCallback() = default;
211     /**
212      * Called when an interrupt is received.
213      *
214      * @param interruptAction Indicates the InterruptAction information needed by client.
215      * For details, refer InterruptAction struct in audio_info.h
216      */
217     virtual void OnInterrupt(const InterruptAction &interruptAction) = 0;
218     std::mutex cbMutex_;
219 };
220 
221 class AudioManagerInterruptCallbackImpl : public AudioInterruptCallback {
222 public:
223     explicit AudioManagerInterruptCallbackImpl();
224     virtual ~AudioManagerInterruptCallbackImpl();
225 
226     /**
227      * Called when an interrupt is received.
228      *
229      * @param interruptAction Indicates the InterruptAction information needed by client.
230      * For details, refer InterruptAction struct in audio_info.h
231      * @since 7
232      */
233     void OnInterrupt(const InterruptEventInternal &interruptEvent) override;
234     void SaveCallback(const std::weak_ptr<AudioManagerCallback> &callback);
235 private:
236     std::weak_ptr<AudioManagerCallback> callback_;
237     std::shared_ptr<AudioManagerCallback> cb_;
238 };
239 
240 class AudioQueryBundleNameListCallback {
241 public:
242     virtual ~AudioQueryBundleNameListCallback() = default;
243     virtual bool OnQueryBundleNameIsInList(const std::string &bundleName, const std::string &listType) = 0;
244 };
245 
246 class AudioManagerAvailableDeviceChangeCallback {
247 public:
248     virtual ~AudioManagerAvailableDeviceChangeCallback() = default;
249     /**
250      * Called when an interrupt is received.
251      *
252      * @param deviceChangeAction Indicates the DeviceChangeAction information needed by client.
253      * For details, refer DeviceChangeAction struct
254      * @since 11
255      */
256     virtual void OnAvailableDeviceChange(const AudioDeviceUsage usage,
257         const DeviceChangeAction &deviceChangeAction) = 0;
258 };
259 
260 class AudioManagerMicrophoneBlockedCallback {
261 public:
262     virtual ~AudioManagerMicrophoneBlockedCallback() = default;
263     /**
264      * Called when micro phone is blocked.
265      *
266      * @param microphoneBlockedInfo Indicates the MisPhoneBlockedInfo information needed by client.
267      * For details, refer MisPhoneBlockedInfo struct
268      * @since 13
269      */
270     virtual void OnMicrophoneBlocked(const MicrophoneBlockedInfo &microphoneBlockedInfo) = 0;
271 };
272 
273 class AudioParameterCallback {
274 public:
275     virtual ~AudioParameterCallback() = default;
276     /**
277      * @brief AudioParameterCallback will be executed when parameter change.
278      *
279      * @param networkId networkId
280      * @param key  Audio paramKey
281      * @param condition condition
282      * @param value value
283      * @since 9
284      */
285     virtual void OnAudioParameterChange(const std::string networkId, const AudioParamKey key,
286         const std::string& condition, const std::string& value) = 0;
287 };
288 
289 class AudioCapturerSourceCallback {
290 public:
291     virtual ~AudioCapturerSourceCallback() = default;
292     virtual void OnCapturerState(bool isActive) = 0;
293 };
294 
295 class WakeUpSourceCloseCallback {
296 public:
297     virtual ~WakeUpSourceCloseCallback() = default;
298     virtual void OnWakeupClose() = 0;
299 };
300 
301 class WakeUpSourceCallback : public AudioCapturerSourceCallback, public WakeUpSourceCloseCallback {
302 public:
303     virtual ~WakeUpSourceCallback() = default;
304     // Stop all listening capturers from sending false callbacks;
305     // when all capturers have stopped, allow one capturer to start sending true callbacks
306     virtual void OnCapturerState(bool isActive) = 0;
307     virtual void OnWakeupClose() = 0;
308 };
309 
310 class AudioPreferredOutputDeviceChangeCallback;
311 
312 class AudioDistributedRoutingRoleCallback {
313 public:
314     virtual ~AudioDistributedRoutingRoleCallback() = default;
315 
316     /**
317      * Called when audio device descriptor change.
318      *
319      * @param descriptor Indicates the descriptor needed by client.
320      * For details, refer AudioDeviceDescriptor in audio_system_manager.h
321      * @since 9
322      */
323     virtual void OnDistributedRoutingRoleChange(
324         std::shared_ptr<AudioDeviceDescriptor>descriptor, const CastType type) = 0;
325     std::mutex cbMutex_;
326 };
327 
328 class AudioDistributedRoutingRoleCallbackImpl : public AudioDistributedRoutingRoleCallback {
329 public:
330     explicit AudioDistributedRoutingRoleCallbackImpl();
331     virtual ~AudioDistributedRoutingRoleCallbackImpl();
332 
333     /**
334      * Called when audio device descriptor change.
335      *
336      * @param descriptor Indicates the descriptor needed by client.
337      * For details, refer AudioDeviceDescriptor in audio_system_manager.h
338      * @since 9
339      */
340     void OnDistributedRoutingRoleChange(
341         std::shared_ptr<AudioDeviceDescriptor>descriptor, const CastType type) override;
342     void SaveCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback);
343     void RemoveCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback);
344 private:
345     std::list<std::shared_ptr<AudioDistributedRoutingRoleCallback>> callbackList_;
346     std::shared_ptr<AudioDistributedRoutingRoleCallback> cb_;
347     std::mutex cbListMutex_;
348 };
349 
350 class AudioDeviceAnahs {
351 public:
352     virtual ~AudioDeviceAnahs() = default;
353 
354     virtual int32_t OnExtPnpDeviceStatusChanged(std::string anahsStatus, std::string anahsShowType) = 0;
355 };
356 
357 
358 class AudioRendererDataTransferStateChangeCallback {
359 public:
360     virtual ~AudioRendererDataTransferStateChangeCallback() = default;
361 
362     virtual void OnDataTransferStateChange(const AudioRendererDataTransferStateChangeInfo &info) = 0;
363 
364     virtual void OnMuteStateChange(const int32_t &uid, const uint32_t &sessionId, const bool &isMuted) = 0;
365 };
366 
367 class AudioWorkgroupChangeCallback {
368 public:
369     virtual ~AudioWorkgroupChangeCallback() = default;
370     virtual void OnWorkgroupChange(const AudioWorkgroupChangeInfo &info) = 0;
371 };
372 } // namespace AudioStandard
373 } // namespace OHOS
374 #endif // ST_AUDIO_SYSTEM_MANAGER_EXT_H
375