• 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 
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