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 µphoneBlockedInfo) = 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