1 /* 2 * Copyright (c) 2024 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_INTERRUPT_SERVICE_H 17 #define ST_AUDIO_INTERRUPT_SERVICE_H 18 19 #include <mutex> 20 #include <list> 21 #include <set> 22 #include <functional> 23 #include <unordered_map> 24 25 #include "iremote_object.h" 26 27 #include "i_audio_interrupt_event_dispatcher.h" 28 #include "audio_interrupt_info.h" 29 #include "audio_policy_server_handler.h" 30 #include "audio_policy_server.h" 31 #include "audio_session_service.h" 32 #include "client_type_manager.h" 33 #include "audio_interrupt_dfx_collector.h" 34 #include "audio_zone_info.h" 35 #include "audio_interrupt_zone.h" 36 #include "audio_info.h" 37 #include "istandard_audio_service.h" 38 39 namespace OHOS { 40 namespace AudioStandard { 41 42 class AudioPolicyServerHandler; 43 44 class SessionTimeOutCallback; 45 46 class AudioInterruptService : public std::enable_shared_from_this<AudioInterruptService>, 47 public IAudioInterruptEventDispatcher, 48 public SessionTimeOutCallback { 49 public: 50 AudioInterruptService(); 51 virtual ~AudioInterruptService(); 52 53 const sptr<IStandardAudioService> GetAudioServerProxy(); 54 55 // callback run in handler thread 56 void DispatchInterruptEventWithStreamId( 57 uint32_t streamId, InterruptEventInternal &interruptEvent) override; 58 59 void Init(sptr<AudioPolicyServer> server); 60 void AddDumpInfo(std::unordered_map<int32_t, std::shared_ptr<AudioInterruptZone>> &audioInterruptZonesMapDump); 61 void SetCallbackHandler(std::shared_ptr<AudioPolicyServerHandler> handler); 62 63 // interfaces of SessionTimeOutCallback 64 void OnSessionTimeout(const int32_t pid) override; 65 66 // interfaces for AudioSessionService 67 int32_t ActivateAudioSession(const int32_t zoneId, const int32_t callerPid, 68 const AudioSessionStrategy &strategy, const bool isStandalone = false); 69 bool IsSessionNeedToFetchOutputDevice(const int32_t callerPid); 70 int32_t DeactivateAudioSession(const int32_t zoneId, const int32_t callerPid); 71 bool IsAudioSessionActivated(const int32_t callerPid); 72 73 // deprecated interrupt interfaces 74 int32_t SetAudioManagerInterruptCallback(const sptr<IRemoteObject> &object); 75 int32_t UnsetAudioManagerInterruptCallback(); 76 int32_t RequestAudioFocus(const int32_t clientId, const AudioInterrupt &audioInterrupt); 77 int32_t AbandonAudioFocus(const int32_t clientId, const AudioInterrupt &audioInterrupt); 78 79 // modern interrupt interfaces 80 int32_t SetAudioInterruptCallback(const int32_t zoneId, const uint32_t streamId, 81 const sptr<IRemoteObject> &object, uint32_t uid); 82 int32_t UnsetAudioInterruptCallback(const int32_t zoneId, const uint32_t streamId); 83 bool AudioInterruptIsActiveInFocusList(const int32_t zoneId, const uint32_t incomingStreamId); 84 int32_t ActivateAudioInterrupt( 85 const int32_t zoneId, const AudioInterrupt &audioInterrupt, const bool isUpdatedAudioStrategy = false); 86 int32_t DeactivateAudioInterrupt(const int32_t zoneId, const AudioInterrupt &audioInterrupt); 87 bool IsCapturerFocusAvailable(int32_t zoneId, const AudioCapturerInfo &capturerInfo); 88 int32_t ClearAudioFocusBySessionID(const int32_t &sessionID); 89 90 // preempt audio focus interfaces 91 int32_t ActivatePreemptMode(); 92 int32_t DeactivatePreemptMode(); 93 94 // zone debug interfaces 95 int32_t FindZoneByPid(int32_t pid); 96 int32_t CreateAudioInterruptZone(const int32_t zoneId, AudioZoneFocusStrategy focusStrategy = 97 AudioZoneFocusStrategy::LOCAL_FOCUS_STRATEGY); 98 int32_t ReleaseAudioInterruptZone(const int32_t zoneId, GetZoneIdFunc func); 99 int32_t MigrateAudioInterruptZone(const int32_t zoneId, GetZoneIdFunc func); 100 int32_t InjectInterruptToAudioZone(const int32_t zoneId, const AudioFocusList &interrupts); 101 int32_t InjectInterruptToAudioZone(const int32_t zoneId, const std::string &deviceTag, 102 const AudioFocusList &interrupts); 103 int32_t GetAudioFocusInfoList(const int32_t zoneId, AudioFocusList &focusInfoList); 104 int32_t GetAudioFocusInfoList(const int32_t zoneId, const std::string &deviceTag, 105 AudioFocusList &focusInfoList); 106 107 int32_t SetAudioFocusInfoCallback(const int32_t zoneId, const sptr<IRemoteObject> &object); 108 int32_t GetStreamTypePriority(AudioStreamType streamType); 109 AudioStreamType GetStreamInFocus(const int32_t zoneId); 110 AudioStreamType GetStreamInFocusByUid(const int32_t uid, const int32_t zoneId); 111 int32_t GetSessionInfoInFocus(AudioInterrupt &audioInterrupt, const int32_t zoneId); 112 void ClearAudioFocusInfoListOnAccountsChanged(const int32_t &id); 113 int32_t ClearAudioFocusInfoList(); 114 void AudioInterruptZoneDump(std::string &dumpString); 115 void AudioSessionInfoDump(std::string &dumpString); 116 AudioScene GetHighestPriorityAudioScene(const int32_t zoneId) const; 117 // for audiosessionv2 118 int32_t SetAudioSessionScene(int32_t callerPid, AudioSessionScene scene); 119 std::set<int32_t> GetStreamIdsForAudioSessionByStreamUsage( 120 const int32_t zoneId, const std::set<StreamUsage> &streamUsageSet); 121 std::set<int32_t> GetStreamIdsForAudioSessionByDeviceType(const int32_t zoneId, DeviceType deviceType); 122 std::vector<int32_t> GetAudioSessionUidList(int32_t zoneId); 123 StreamUsage GetAudioSessionStreamUsage(int32_t callerPid); 124 125 void ProcessRemoteInterrupt(std::set<int32_t> streamIds, InterruptEventInternal interruptEvent); 126 int32_t SetQueryBundleNameListCallback(const sptr<IRemoteObject> &object); 127 void RegisterDefaultVolumeTypeListener(); 128 129 void RemoveExistingFocus( 130 const int32_t appUid, std::unordered_set<int32_t> &uidActivedSessions); 131 void ResumeFocusByStreamId( 132 const int32_t streamId, const InterruptEventInternal interruptEventResume); 133 private: 134 static constexpr int32_t ZONEID_DEFAULT = 0; 135 static constexpr int32_t ZONEID_INVALID = -1; 136 static constexpr float DUCK_FACTOR = 0.2f; 137 static constexpr int32_t DEFAULT_APP_PID = -1; 138 static constexpr int64_t OFFLOAD_NO_SESSION_ID = -1; 139 static constexpr int32_t STREAM_DEFAULT_PRIORITY = 100; 140 141 using InterruptIterator = std::list<std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator>; 142 143 // Inner class for death handler 144 class AudioInterruptDeathRecipient : public IRemoteObject::DeathRecipient { 145 public: 146 explicit AudioInterruptDeathRecipient( 147 const std::shared_ptr<AudioInterruptService> &service, 148 uint32_t streamId); 149 virtual ~AudioInterruptDeathRecipient() = default; 150 151 DISALLOW_COPY_AND_MOVE(AudioInterruptDeathRecipient); 152 153 void OnRemoteDied(const wptr<IRemoteObject> &remote); 154 155 private: 156 const std::weak_ptr<AudioInterruptService> service_; 157 const uint32_t streamId_; 158 }; 159 160 // Inner class for callback 161 class AudioInterruptClient { 162 public: 163 explicit AudioInterruptClient( 164 const std::shared_ptr<AudioInterruptCallback> &callback, 165 const sptr<IRemoteObject> &object, 166 const sptr<AudioInterruptDeathRecipient> &deathRecipient); 167 virtual ~AudioInterruptClient(); 168 169 DISALLOW_COPY_AND_MOVE(AudioInterruptClient); 170 171 void OnInterrupt(const InterruptEventInternal &interruptEvent); 172 173 void SetCallingUid(uint32_t uid); 174 uint32_t GetCallingUid(); 175 176 private: 177 const std::shared_ptr<AudioInterruptCallback> callback_; 178 const sptr<IRemoteObject> object_; 179 sptr<AudioInterruptDeathRecipient> deathRecipient_; 180 uint32_t callingUid_ = 0; 181 }; 182 183 // deprecated interrupt interfaces 184 void NotifyFocusGranted(const int32_t clientId, const AudioInterrupt &audioInterrupt); 185 int32_t NotifyFocusAbandoned(const int32_t clientId, const AudioInterrupt &audioInterrupt); 186 int32_t AbandonAudioFocusInternal(const int32_t clientId, const AudioInterrupt &audioInterrupt); 187 188 // modern interrupt interfaces 189 int32_t ActivateAudioInterruptInternal(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 190 const bool isUpdatedAudioStrategy, bool &updateScene); 191 int32_t ActivateAudioInterruptCoreProcedure(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 192 const bool isUpdatedAudioStrategy, bool &updateScene); 193 void ProcessAudioScene(const AudioInterrupt &audioInterrupt, const uint32_t &incomingStreamId, 194 const int32_t &zoneId, bool &shouldReturnSuccess); 195 bool IsAudioSourceConcurrency(const SourceType &existSourceType, const SourceType &incomingSourceType, 196 const std::vector<SourceType> &existConcurrentSources, 197 const std::vector<SourceType> &incomingConcurrentSources); 198 void UpdateFocusStrategy(const std::string &bundleName, 199 AudioFocusEntry &focusEntry, bool isExistMediaStream, bool isIncomingMediaStream); 200 bool IsMediaStream(AudioStreamType audioStreamType); 201 std::string GetRealBundleName(uint32_t uid); 202 void UpdateAudioFocusStrategy(const AudioInterrupt ¤tInterrupt, const AudioInterrupt &incomingInterrupt, 203 AudioFocusEntry &focusEntry); 204 void UpdateMuteAudioFocusStrategy(const AudioInterrupt ¤tInterrupt, const AudioInterrupt &incomingInterrupt, 205 AudioFocusEntry &focusEntry); 206 bool FocusEntryContinue(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 207 AudioFocusEntry &focusEntry, const AudioInterrupt &incomingInterrupt); 208 int32_t ProcessFocusEntry(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 209 void SendInterruptEventToIncomingStream(InterruptEventInternal &interruptEvent, 210 const AudioInterrupt &incomingInterrupt); 211 void AddToAudioFocusInfoList(std::shared_ptr<AudioInterruptZone> &audioInterruptZone, 212 const int32_t &zoneId, const AudioInterrupt &incomingInterrupt, const AudioFocuState &incomingState); 213 void HandleIncomingState(const int32_t &zoneId, const AudioFocuState &incomingState, 214 InterruptEventInternal &interruptEvent, const AudioInterrupt &incomingInterrupt); 215 void ProcessExistInterrupt(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator 216 &iterActive, AudioFocusEntry &focusEntry, const AudioInterrupt &incomingInterrupt, 217 bool &removeFocusInfo, InterruptEventInternal &interruptEvent); 218 void ProcessActiveInterrupt(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 219 std::list<std::pair<AudioInterrupt, AudioFocuState>> GetAudioFocusInfoList(const int32_t zoneId); 220 void ResumeAudioFocusList(const int32_t zoneId, bool isSessionTimeout = false); 221 bool EvaluateWhetherContinue(const AudioInterrupt &incoming, const AudioInterrupt 222 &inprocessing, AudioFocusEntry &focusEntry, bool bConcurrency); 223 std::list<std::pair<AudioInterrupt, AudioFocuState>> SimulateFocusEntry(const int32_t zoneId); 224 void SendActiveInterruptEvent(const uint32_t activeStreamId, const InterruptEventInternal &interruptEvent, 225 const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt); 226 void DeactivateAudioInterruptInternal(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 227 bool isSessionTimeout = false); 228 void SendInterruptEvent(AudioFocuState oldState, AudioFocuState newState, 229 std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, bool &removeFocusInfo); 230 void SendInterruptEventCallback(const InterruptEventInternal &interruptEvent, 231 const uint32_t &streamId, const AudioInterrupt &audioInterrupt); 232 bool IsSameAppInShareMode(const AudioInterrupt incomingInterrupt, const AudioInterrupt activeInterrupt); 233 void UpdateAudioSceneFromInterrupt(const AudioScene audioScene, AudioInterruptChangeType changeType, 234 int32_t zoneId = ZONEID_DEFAULT); 235 void SendFocusChangeEvent(const int32_t zoneId, int32_t callbackCategory, const AudioInterrupt &audioInterrupt); 236 void SendActiveVolumeTypeChangeEvent(const int32_t zoneId); 237 void RemoveClient(const int32_t zoneId, uint32_t streamId); 238 void RemoveFocusInfo(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 239 std::list<std::pair<AudioInterrupt, AudioFocuState>> &tmpFocusInfoList, 240 std::shared_ptr<AudioInterruptZone> &zoneInfo, 241 std::list<int32_t> &removeFocusInfoPidList); 242 void PrintLogsOfFocusStrategyBaseMusic(const AudioInterrupt &audioInterrupt); 243 void UpdateMicFocusStrategy(SourceType existSourceType, SourceType incomingSourceType, 244 const std::string &bundleName, AudioFocusEntry &focusEntry); 245 bool CheckWindowState(const int32_t pid); 246 void UpdateWindowFocusStrategy(const int32_t ¤tPid, const int32_t &incomingPid, 247 const AudioStreamType &existStreamType, const AudioStreamType &incomingStreamType, 248 AudioFocusEntry &focusTypess); 249 bool IsMicSource(SourceType sourceType); 250 251 // zone debug interfaces 252 void WriteFocusMigrateEvent(const int32_t &toZoneId); 253 void WriteServiceStartupError(); 254 255 // interfaces about audio session. 256 void AddActiveInterruptToSession(const int32_t callerPid); 257 void RemovePlaceholderInterruptForSession(const int32_t callerPid, bool isSessionTimeout = false); 258 bool CanMixForSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 259 const AudioFocusEntry &focusEntry); 260 bool CanMixForIncomingSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 261 const AudioFocusEntry &focusEntry); 262 bool CanMixForActiveSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 263 const AudioFocusEntry &focusEntry); 264 bool IsIncomingStreamLowPriority(const AudioFocusEntry &focusEntry); 265 bool IsActiveStreamLowPriority(const AudioFocusEntry &focusEntry); 266 void UpdateHintTypeForExistingSession(const AudioInterrupt &incomingInterrupt, AudioFocusEntry &focusEntry); 267 void HandleSessionTimeOutEvent(const int32_t pid); 268 int32_t GetAudioSessionZoneidByPid(const int32_t pid); 269 bool HandleLowPriorityEvent(const int32_t pid, const uint32_t streamId); 270 void SendSessionTimeOutStopEvent(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 271 const std::list<std::pair<AudioInterrupt, AudioFocuState>> &audioFocusInfoList); 272 bool ShouldCallbackToClient(uint32_t uid, int32_t streamId, InterruptEventInternal &interruptEvent); 273 274 AudioFocuState GetNewIncomingState(InterruptHint hintType, AudioFocuState oldState); 275 void RemoveAllPlaceholderInterrupt(std::list<int32_t> &removeFocusInfoPidList); 276 bool IsLowestPriorityRecording(const AudioInterrupt &audioInterrupt); 277 bool IsRecordingInterruption(const AudioInterrupt &audioInterrupt); 278 void SetSessionMuteState(uint32_t sessionId, bool insert, bool muteFlag); 279 void SetLatestMuteState(const InterruptEventInternal &interruptEvent, const uint32_t &streamId); 280 void CheckIncommingFoucsValidity(AudioFocusEntry &focusEntry, const AudioInterrupt &incomingInterrupt, 281 std::vector<SourceType> incomingConcurrentSources); 282 bool IsCanMixInterrupt(const AudioInterrupt &incomingInterrupt, 283 const AudioInterrupt &activeInterrupt); 284 bool HadVoipStatus(const AudioInterrupt &audioInterrupt, const std::list<std::pair<AudioInterrupt, AudioFocuState>> 285 &audioFocusInfoList); 286 287 AudioStreamType GetStreamInFocusInternal(const int32_t uid, const int32_t zoneId); 288 289 bool CheckAudioSessionExistence(const AudioInterrupt &incomingInterrupt, AudioFocusEntry &focusEntry); 290 291 bool SwitchHintType(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 292 InterruptEventInternal &interruptEvent, std::list<std::pair<AudioInterrupt, AudioFocuState>> &tmpFocusInfoList); 293 294 bool IsHandleIter(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 295 AudioFocuState oldState, std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterNew); 296 uint8_t GetAppState(int32_t appPid); 297 void WriteStartDfxMsg(InterruptDfxBuilder &dfxBuilder, const AudioInterrupt &audioInterrupt); 298 void WriteStopDfxMsg(const AudioInterrupt &audioInterrupt); 299 void WriteSessionTimeoutDfxEvent(const int32_t pid); 300 301 bool AudioFocusInfoListRemovalCondition(const AudioInterrupt &audioInterrupt, 302 const std::pair<AudioInterrupt, AudioFocuState> &audioFocus); 303 AudioScene RefreshAudioSceneFromAudioInterrupt(const AudioInterrupt &audioInterrupt, 304 AudioScene &highestPriorityAudioScene); 305 306 void HandleAppStreamType(const int32_t zoneId, AudioInterrupt &audioInterrupt); 307 bool IsGameAvoidCallbackCase(const AudioInterrupt &audioInterrupt); 308 void ResetNonInterruptControl(AudioInterrupt audioInterrupt); 309 ClientType GetClientTypeByStreamId(int32_t streamId); 310 // for audiosessionv2 311 int32_t ProcessFocusEntryForAudioSession(const int32_t zoneId, const int32_t callerPid, bool &updateScene); 312 bool ShouldBypassAudioSessionFocus(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 313 void DeactivateAudioSessionFakeInterrupt( 314 const int32_t zoneId, const int32_t callerPid, bool isSessionTimeout = false); 315 void DispatchInterruptEventForAudioSession( 316 InterruptEventInternal &interruptEvent, const AudioInterrupt &audioInterrupt) override; 317 void DeactivateAudioSessionInFakeFocusMode(const int32_t pid, InterruptHint hintType); 318 void SendAudioSessionInterruptEventCallback( 319 const InterruptEventInternal &interruptEvent, const AudioInterrupt &audioInterrupt); 320 void TryHandleStreamCallbackInSession(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 321 bool HasAudioSessionFakeInterrupt(const int32_t zoneId, const int32_t callerPid); 322 int32_t HandleExistStreamsForSession(const int32_t zoneId, const int32_t callerPid, bool &updateScene); 323 AudioScene GetHighestPriorityAudioSceneFromAudioSession( 324 const AudioInterrupt &audioInterrupt, const AudioScene &audioScene) const; 325 void DelayToDeactivateStreamsInAudioSession( 326 const int32_t zoneId, const int32_t callerPid, const std::vector<AudioInterrupt> &streamsInSession); 327 328 int32_t ProcessActiveStreamFocus(std::list<std::pair<AudioInterrupt, AudioFocuState>> &audioFocusInfoList, 329 const AudioInterrupt &incomingInterrupt, AudioFocuState &incomingState, 330 std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &activeInterrupt); 331 void ReportRecordGetFocusFail(const AudioInterrupt &incomingInterrupt, 332 const AudioInterrupt &activeInterrupt, int32_t reason); 333 334 // interrupt members 335 sptr<AudioPolicyServer> policyServer_; 336 std::shared_ptr<AudioPolicyServerHandler> handler_; 337 std::shared_ptr<AudioSessionService> sessionService_; 338 friend class AudioInterruptZoneManager; 339 AudioInterruptZoneManager zoneManager_; 340 341 std::map<std::pair<AudioFocusType, AudioFocusType>, AudioFocusEntry> focusCfgMap_ = {}; 342 std::unordered_map<int32_t, std::shared_ptr<AudioInterruptZone>> zonesMap_; 343 344 std::map<int32_t, std::shared_ptr<AudioInterruptClient>> interruptClients_; 345 346 // deprecated interrupt members 347 std::unique_ptr<AudioInterrupt> focussedAudioInterruptInfo_; 348 int32_t clientOnFocus_ = 0; 349 350 // preempt audio focus mode flag 351 bool isPreemptMode_ = false; 352 353 std::mutex mutex_; 354 mutable int32_t ownerPid_ = 0; 355 mutable int32_t ownerUid_ = 0; 356 std::unique_ptr<AudioInterruptDfxCollector> dfxCollector_; 357 sptr<IStandardAudioPolicyManagerListener> queryBundleNameListCallback_ = nullptr; 358 AudioStreamType activeStreamType_ = STREAM_MUSIC; 359 360 // settingsdata members 361 AudioStreamType defaultVolumeType_ = STREAM_MUSIC; 362 363 std::mutex audioServerProxyMutex_; 364 }; 365 } // namespace AudioStandard 366 } // namespace OHOS 367 368 #endif // ST_AUDIO_INTERRUPT_SERVICE_H 369