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 21 #include "iremote_object.h" 22 23 #include "i_audio_interrupt_event_dispatcher.h" 24 #include "audio_interrupt_info.h" 25 #include "audio_policy_server_handler.h" 26 #include "audio_policy_server.h" 27 #include "audio_session_service.h" 28 #include "audio_interrupt_zone.h" 29 #include "client_type_manager.h" 30 #include "audio_interrupt_dfx_collector.h" 31 32 namespace OHOS { 33 namespace AudioStandard { 34 class AudioPolicyServerHandler; 35 36 class SessionTimeOutCallback; 37 38 class AudioInterruptService : public std::enable_shared_from_this<AudioInterruptService>, 39 public IAudioInterruptEventDispatcher, 40 public SessionTimeOutCallback { 41 public: 42 AudioInterruptService(); 43 virtual ~AudioInterruptService(); 44 45 const sptr<IStandardAudioService> GetAudioServerProxy(); 46 47 // callback run in handler thread 48 void DispatchInterruptEventWithStreamId( 49 uint32_t streamId, InterruptEventInternal &interruptEvent) override; 50 51 void Init(sptr<AudioPolicyServer> server); 52 void AddDumpInfo(std::unordered_map<int32_t, std::shared_ptr<AudioInterruptZone>> &audioInterruptZonesMapDump); 53 void SetCallbackHandler(std::shared_ptr<AudioPolicyServerHandler> handler); 54 55 // interfaces of SessionTimeOutCallback 56 void OnSessionTimeout(const int32_t pid) override; 57 58 // interfaces for AudioSessionService 59 int32_t ActivateAudioSession(const int32_t callerPid, const AudioSessionStrategy &strategy); 60 int32_t DeactivateAudioSession(const int32_t callerPid); 61 bool IsAudioSessionActivated(const int32_t callerPid); 62 63 // deprecated interrupt interfaces 64 int32_t SetAudioManagerInterruptCallback(const sptr<IRemoteObject> &object); 65 int32_t UnsetAudioManagerInterruptCallback(); 66 int32_t RequestAudioFocus(const int32_t clientId, const AudioInterrupt &audioInterrupt); 67 int32_t AbandonAudioFocus(const int32_t clientId, const AudioInterrupt &audioInterrupt); 68 69 // modern interrupt interfaces 70 int32_t SetAudioInterruptCallback(const int32_t zoneId, const uint32_t streamId, 71 const sptr<IRemoteObject> &object, uint32_t uid); 72 int32_t UnsetAudioInterruptCallback(const int32_t zoneId, const uint32_t streamId); 73 bool AudioInterruptIsActiveInFocusList(const int32_t zoneId, const uint32_t incomingStreamId); 74 int32_t ActivateAudioInterrupt( 75 const int32_t zoneId, const AudioInterrupt &audioInterrupt, const bool isUpdatedAudioStrategy = false); 76 int32_t DeactivateAudioInterrupt(const int32_t zoneId, const AudioInterrupt &audioInterrupt); 77 void ResetNonInterruptControl(uint32_t streamId); 78 79 // zone debug interfaces 80 int32_t CreateAudioInterruptZone(const int32_t zoneId, AudioZoneFocusStrategy focusStrategy = 81 AudioZoneFocusStrategy::LOCAL_FOCUS_STRATEGY); 82 int32_t ReleaseAudioInterruptZone(const int32_t zoneId, GetZoneIdFunc func); 83 int32_t MigrateAudioInterruptZone(const int32_t zoneId, GetZoneIdFunc func); 84 int32_t InjectInterruptToAudiotZone(const int32_t zoneId, const AudioFocusList &interrupts); 85 int32_t InjectInterruptToAudiotZone(const int32_t zoneId, const std::string &deviceTag, 86 const AudioFocusList &interrupts); 87 int32_t GetAudioFocusInfoList(const int32_t zoneId, AudioFocusList &focusInfoList); 88 int32_t GetAudioFocusInfoList(const int32_t zoneId, const std::string &deviceTag, 89 AudioFocusList &focusInfoList); 90 91 int32_t SetAudioFocusInfoCallback(const int32_t zoneId, const sptr<IRemoteObject> &object); 92 int32_t GetStreamTypePriority(AudioStreamType streamType); 93 unordered_map<AudioStreamType, int> GetStreamPriorityMap() const; 94 AudioStreamType GetStreamInFocus(const int32_t zoneId); 95 AudioStreamType GetStreamInFocusByUid(const int32_t uid, const int32_t zoneId); 96 int32_t GetSessionInfoInFocus(AudioInterrupt &audioInterrupt, const int32_t zoneId); 97 void ClearAudioFocusInfoListOnAccountsChanged(const int &id); 98 void AudioInterruptZoneDump(std::string &dumpString); 99 void AudioSessionInfoDump(std::string &dumpString); 100 AudioScene GetHighestPriorityAudioScene(const int32_t zoneId) const; 101 ClientType GetClientTypeByStreamId(int32_t streamId); 102 void ProcessRemoteInterrupt(std::set<int32_t> streamIds, InterruptEventInternal interruptEvent); 103 104 private: 105 static constexpr int32_t ZONEID_DEFAULT = 0; 106 static constexpr float DUCK_FACTOR = 0.2f; 107 static constexpr int32_t DEFAULT_APP_PID = -1; 108 static constexpr int64_t OFFLOAD_NO_SESSION_ID = -1; 109 static constexpr int32_t STREAM_DEFAULT_PRIORITY = 100; 110 std::mutex audioServerProxyMutex_; 111 void HandleAppStreamType(AudioInterrupt &audioInterrupt); 112 113 // Inner class for death handler 114 class AudioInterruptDeathRecipient : public IRemoteObject::DeathRecipient { 115 public: 116 explicit AudioInterruptDeathRecipient( 117 const std::shared_ptr<AudioInterruptService> &service, 118 uint32_t streamId); 119 virtual ~AudioInterruptDeathRecipient() = default; 120 121 DISALLOW_COPY_AND_MOVE(AudioInterruptDeathRecipient); 122 123 void OnRemoteDied(const wptr<IRemoteObject> &remote); 124 125 private: 126 const std::weak_ptr<AudioInterruptService> service_; 127 const uint32_t streamId_; 128 }; 129 130 // Inner class for callback 131 class AudioInterruptClient { 132 public: 133 explicit AudioInterruptClient( 134 const std::shared_ptr<AudioInterruptCallback> &callback, 135 const sptr<IRemoteObject> &object, 136 const sptr<AudioInterruptDeathRecipient> &deathRecipient); 137 virtual ~AudioInterruptClient(); 138 139 DISALLOW_COPY_AND_MOVE(AudioInterruptClient); 140 141 void OnInterrupt(const InterruptEventInternal &interruptEvent); 142 143 void SetCallingUid(uint32_t uid); 144 uint32_t GetCallingUid(); 145 146 private: 147 const std::shared_ptr<AudioInterruptCallback> callback_; 148 const sptr<IRemoteObject> object_; 149 sptr<AudioInterruptDeathRecipient> deathRecipient_; 150 uint32_t callingUid_ = 0; 151 }; 152 153 // deprecated interrupt interfaces 154 void NotifyFocusGranted(const int32_t clientId, const AudioInterrupt &audioInterrupt); 155 int32_t NotifyFocusAbandoned(const int32_t clientId, const AudioInterrupt &audioInterrupt); 156 int32_t AbandonAudioFocusInternal(const int32_t clientId, const AudioInterrupt &audioInterrupt); 157 158 // modern interrupt interfaces 159 int32_t ActivateAudioInterruptInternal(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 160 const bool isUpdatedAudioStrategy, bool &updateScene); 161 void ProcessAudioScene(const AudioInterrupt &audioInterrupt, const uint32_t &incomingStreamId, 162 const int32_t &zoneId, bool &shouldReturnSuccess); 163 bool IsAudioSourceConcurrency(const SourceType &existSourceType, const SourceType &incomingSourceType, 164 const std::vector<SourceType> &existConcurrentSources, 165 const std::vector<SourceType> &incomingConcurrentSources); 166 int32_t ProcessFocusEntry(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 167 void SendInterruptEventToIncomingStream(InterruptEventInternal &interruptEvent, 168 const AudioInterrupt &incomingInterrupt); 169 void AddToAudioFocusInfoList(std::shared_ptr<AudioInterruptZone> &audioInterruptZone, 170 const int32_t &zoneId, const AudioInterrupt &incomingInterrupt, const AudioFocuState &incomingState); 171 void HandleIncomingState(const int32_t &zoneId, const AudioFocuState &incomingState, 172 InterruptEventInternal &interruptEvent, const AudioInterrupt &incomingInterrupt); 173 void ProcessExistInterrupt(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator 174 &iterActive, AudioFocusEntry &focusEntry, const AudioInterrupt &incomingInterrupt, 175 bool &removeFocusInfo, InterruptEventInternal &interruptEvent); 176 void ProcessActiveInterrupt(const int32_t zoneId, const AudioInterrupt &incomingInterrupt); 177 void ResumeAudioFocusList(const int32_t zoneId, bool isSessionTimeout = false); 178 bool EvaluateWhetherContinue(const AudioInterrupt &incoming, const AudioInterrupt 179 &inprocessing, AudioFocusEntry &focusEntry, bool bConcurrency); 180 std::list<std::pair<AudioInterrupt, AudioFocuState>> SimulateFocusEntry(const int32_t zoneId); 181 void SendActiveInterruptEvent(const uint32_t activeStreamId, const InterruptEventInternal &interruptEvent, 182 const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt); 183 void DeactivateAudioInterruptInternal(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 184 bool isSessionTimeout = false); 185 void SendInterruptEvent(AudioFocuState oldState, AudioFocuState newState, 186 std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, bool &removeFocusInfo); 187 void SendInterruptEventCallback(const InterruptEventInternal &interruptEvent, 188 const uint32_t &streamId, const AudioInterrupt &audioInterrupt); 189 bool IsSameAppInShareMode(const AudioInterrupt incomingInterrupt, const AudioInterrupt activeInterrupt); 190 void UpdateAudioSceneFromInterrupt(const AudioScene audioScene, AudioInterruptChangeType changeType); 191 void SendFocusChangeEvent(const int32_t zoneId, int32_t callbackCategory, const AudioInterrupt &audioInterrupt); 192 void RemoveClient(const int32_t zoneId, uint32_t streamId); 193 void RemoveFocusInfo(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 194 std::list<std::pair<AudioInterrupt, AudioFocuState>> &tmpFocusInfoList, 195 std::shared_ptr<AudioInterruptZone> &zoneInfo, 196 std::list<int32_t> &removeFocusInfoPidList); 197 198 // zone debug interfaces 199 void WriteFocusMigrateEvent(const int32_t &toZoneId); 200 void WriteServiceStartupError(); 201 202 // interfaces about audio session. 203 void AddActiveInterruptToSession(const int32_t callerPid); 204 void RemovePlaceholderInterruptForSession(const int32_t callerPid, bool isSessionTimeout = false); 205 bool CanMixForSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 206 const AudioFocusEntry &focusEntry); 207 bool CanMixForIncomingSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 208 const AudioFocusEntry &focusEntry); 209 bool CanMixForActiveSession(const AudioInterrupt &incomingInterrupt, const AudioInterrupt &activeInterrupt, 210 const AudioFocusEntry &focusEntry); 211 bool IsIncomingStreamLowPriority(const AudioFocusEntry &focusEntry); 212 bool IsActiveStreamLowPriority(const AudioFocusEntry &focusEntry); 213 void UpdateHintTypeForExistingSession(const AudioInterrupt &incomingInterrupt, AudioFocusEntry &focusEntry); 214 void HandleSessionTimeOutEvent(const int32_t pid); 215 bool HandleLowPriorityEvent(const int32_t pid, const uint32_t streamId); 216 void SendSessionTimeOutStopEvent(const int32_t zoneId, const AudioInterrupt &audioInterrupt, 217 const std::list<std::pair<AudioInterrupt, AudioFocuState>> &audioFocusInfoList); 218 bool ShouldCallbackToClient(uint32_t uid, int32_t streamId, InterruptEventInternal &interruptEvent); 219 220 AudioFocuState GetNewIncomingState(InterruptHint hintType, AudioFocuState oldState); 221 void RemoveAllPlaceholderInterrupt(std::list<int32_t> &removeFocusInfoPidList); 222 bool IsLowestPriorityRecording(const AudioInterrupt &audioInterrupt); 223 bool IsRecordingInterruption(const AudioInterrupt &audioInterrupt); 224 void CheckIncommingFoucsValidity(AudioFocusEntry &focusEntry, const AudioInterrupt &incomingInterrupt, 225 std::vector<SourceType> incomingConcurrentSources); 226 bool IsCanMixInterrupt(const AudioInterrupt &incomingInterrupt, 227 const AudioInterrupt &activeInterrupt); 228 bool HadVoipStatus(const AudioInterrupt &audioInterrupt, const std::list<std::pair<AudioInterrupt, AudioFocuState>> 229 &audioFocusInfoList); 230 231 AudioStreamType GetStreamInFocusInternal(const int32_t uid, const int32_t zoneId); 232 233 bool CheckAudioSessionExistence(const AudioInterrupt &incomingInterrupt, AudioFocusEntry &focusEntry); 234 235 void SwitchHintType(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 236 InterruptEventInternal &interruptEvent, std::list<std::pair<AudioInterrupt, AudioFocuState>> &tmpFocusInfoList); 237 238 bool IsHandleIter(std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterActive, 239 AudioFocuState oldState, std::list<std::pair<AudioInterrupt, AudioFocuState>>::iterator &iterNew); 240 uint8_t GetAppState(int32_t appPid); 241 void WriteStartDfxMsg(InterruptDfxBuilder &dfxBuilder, const AudioInterrupt &audioInterrupt); 242 void WriteStopDfxMsg(const AudioInterrupt &audioInterrupt); 243 void WriteSessionTimeoutDfxEvent(const int32_t pid); 244 245 bool AudioFocusInfoListRemovalCondition(const AudioInterrupt &audioInterrupt, 246 const std::pair<AudioInterrupt, AudioFocuState> &audioFocus); 247 AudioScene RefreshAudioSceneFromAudioInterrupt(const AudioInterrupt &audioInterrupt, 248 AudioScene &highestPriorityAudioScene); 249 250 // interrupt members 251 sptr<AudioPolicyServer> policyServer_; 252 std::shared_ptr<AudioPolicyServerHandler> handler_; 253 std::shared_ptr<AudioSessionService> sessionService_; 254 friend class AudioInterruptZoneManager; 255 AudioInterruptZoneManager zoneManager_; 256 257 std::map<std::pair<AudioFocusType, AudioFocusType>, AudioFocusEntry> focusCfgMap_ = {}; 258 std::unordered_map<int32_t, std::shared_ptr<AudioInterruptZone>> zonesMap_; 259 260 std::map<int32_t, std::shared_ptr<AudioInterruptClient>> interruptClients_; 261 262 // deprecated interrupt members 263 std::unique_ptr<AudioInterrupt> focussedAudioInterruptInfo_; 264 int32_t clientOnFocus_ = 0; 265 266 std::mutex mutex_; 267 mutable int32_t ownerPid_ = 0; 268 mutable int32_t ownerUid_ = 0; 269 std::unique_ptr<AudioInterruptDfxCollector> dfxCollector_; 270 }; 271 } // namespace AudioStandard 272 } // namespace OHOS 273 274 #endif // ST_AUDIO_INTERRUPT_SERVICE_H 275