• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &currentInterrupt, const AudioInterrupt &incomingInterrupt,
203         AudioFocusEntry &focusEntry);
204     void UpdateMuteAudioFocusStrategy(const AudioInterrupt &currentInterrupt, 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 &currentPid, 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