• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 OHOS_AVSESSION_SYSEVENT_H
17 #define OHOS_AVSESSION_SYSEVENT_H
18 
19 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
20 #include <mutex>
21 #include "avcontrol_command.h"
22 #include "hisysevent.h"
23 #include "timer.h"
24 #endif
25 
26 namespace OHOS::AVSession {
27 enum class Operation {
28     OPT_PLAY = 0,
29     OPT_PAUSE,
30     OPT_STOP,
31     OPT_PLAY_NEXT,
32     OPT_PLAY_PREVIOUS,
33     OPT_FAST_FORWARD,
34     OPT_REWIND,
35     OPT_SEEK,
36     OPT_SET_SPEED,
37     OPT_SET_LOOP_MODE,
38     OPT_SET_TARGET_LOOP_MODE,
39     OPT_TOGGLE_FAVORITE,
40     OPT_MEDIA_KEY_EVENT,
41     OPT_OUTPUT_DEVICE_CHANGED,
42     OPT_COMMAND_MAX,
43     OPT_CREATE_SESSION,
44     OPT_DELETE_SESSION,
45     OPT_ALL_CTRL_COMMAND,
46     OPT_SUCCESS_CTRL_COMMAND,
47 };
48 
49 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
50 enum MetadataQuality {
51     METADATA_QUALITY_NONE = 0,
52     METADATA_QUALITY_TITLE,
53     METADATA_QUALITY_IMG,
54     METADATA_QUALITY_BOTH,
55 };
56 
57 enum class SessionState {
58     STATE_CREATE = 0,
59     STATE_RELEASE,
60     STATE_INITIAL,
61 };
62 
63 class PlayingStateInfo {
64 public:
65     void updateState(SessionState state);
66     void updateMetaQuality(MetadataQuality metaQuality);
67     void updateCommandQuality(uint32_t commandQuality);
68     void updatePlaybackState(uint8_t playbackState);
69     void updateControl(uint8_t control, std::string callerBundleName);
70 
71     std::string bundleName_ = "";
72     std::string appVersion_ = "";
73     std::vector<uint8_t> state_;
74     std::vector<uint64_t> stateTime_;
75     std::vector<uint8_t> metaQuality_;
76     std::vector<uint64_t> metaQualityTime_;
77     std::vector<uint32_t> commandQuality_;
78     std::vector<uint64_t> commandQualityTime_;
79     std::vector<uint8_t> playbackState_;
80     std::vector<uint64_t> playbackStateTime_;
81     std::vector<uint8_t> control_;
82     std::vector<std::string> callerBundleName_;
83     std::vector<uint64_t> controlTime_;
84 private:
85     SessionState lastState_ = SessionState::STATE_INITIAL;
86     uint32_t lastCommandQuality_ = 0;
87     uint8_t lastPlaybackState_ = 0;
88     uint8_t lastControl_ = AVControlCommand::SESSION_CMD_MAX;
89     std::recursive_mutex lock_;
90 };
91 
92 class AVSessionSysEvent {
93 public:
94     struct LifeCycleInfo {
95         std::string bundleName_ = "";
96         bool appStatus_ = false;
97         int32_t sessionType_ = 0;
98         bool isCreateSession_ = false;
99     };
100 
101     struct ControllerCommandInfo {
102         std::string bundleName_ = "";
103         pid_t controllerPid_ = 0;
104         int32_t controllerCmd_ = 0;
105     };
106 
107     struct BackControlReportInfo {
108         std::string bundleName_ = "";
109         int32_t streamUsage_ = 0;
110         bool isBack_ = false;
111         int32_t playDuration_ = 0;
112         bool isAudioActive_ = false;
113         int32_t metaDataQuality_ = 0;
114         int32_t cmdQuality_ = 0;
115         int32_t playbackState_ = 0;
116     };
117 
118     static AVSessionSysEvent& GetInstance();
119 
120     template<typename... Types>
HiSysWriteFault(const std::string & eventName,Types...keyValues)121     static int HiSysWriteFault(const std::string& eventName, Types... keyValues)
122     {
123         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
124             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, keyValues...);
125     }
126 
127     template<typename... Types>
HiSysWriteStatistic(const std::string & eventName,Types...keyValues)128     static int HiSysWriteStatistic(const std::string& eventName, Types... keyValues)
129     {
130         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
131             OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, keyValues...);
132     }
133 
134     template<typename... Types>
HiSysWriteSecurity(const std::string & eventName,Types...keyValues)135     static int HiSysWriteSecurity(const std::string& eventName, Types... keyValues)
136     {
137         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
138             OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY, keyValues...);
139     }
140 
141     template<typename... Types>
HiSysWriteBehavior(const std::string & eventName,Types...keyValues)142     static int HiSysWriteBehavior(const std::string& eventName, Types... keyValues)
143     {
144         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
145             OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, keyValues...);
146     }
147 
148     void Reset();
149     void Regiter();
150     void Unregister();
151     void AddOperationCount(Operation operation);
152     void AddLifeCycleInfo(const std::string& bundleName, bool appStatus,
153         const int32_t& sessionType, bool isCreateSession);
154     void AddControllerCommandInfo(const std::string& bundleName, const pid_t& controllerPid,
155         const int32_t& controllerCmd, const int32_t& sessionType);
156     void AddLowQualityInfo(AVSessionSysEvent::BackControlReportInfo &reportInfo);
157     void SetAudioStatus(pid_t uid, int32_t rendererState);
158     int32_t GetAudioStatus(pid_t uid);
159     void ReportLowQuality();
160 
161     void ReportPlayingState(const std::string& bundleName);
162     void ReportPlayingStateAll();
163     void UpdateState(const std::string& bundleName, const std::string& appVersion, SessionState state);
164     void UpdateMetaQuality(const std::string& bundleName, MetadataQuality metaQuality);
165     void UpdateCommandQuality(const std::string& bundleName, uint32_t commandQuality);
166     void UpdatePlaybackState(const std::string& bundleName, uint8_t playbackState);
167     void UpdateControl(const std::string& bundleName, uint8_t control, std::string callerBundleName);
168 
169 private:
170     PlayingStateInfo* GetPlayingStateInfo(const std::string& bundleName);
171     std::map<pid_t, int32_t> audioStatuses_;
172     AVSessionSysEvent();
173     ~AVSessionSysEvent();
174     std::map<Operation, uint32_t> optCounts_;
175     std::unique_ptr<Utils::Timer> timer_;
176     uint32_t timerId_ = 0;
177     std::recursive_mutex lock_;
178     static constexpr uint32_t NOTIFY_TIME_INTERVAL = 1 * 60 * 60 * 1000; // retry after 1 hours
179     int32_t playingStateTriggerCount = 0;
180     std::list<AVSessionSysEvent::LifeCycleInfo> lifeCycleInfos_;
181     std::list<AVSessionSysEvent::ControllerCommandInfo> controllerCommandInfos_;
182     std::map<std::string, AVSessionSysEvent::BackControlReportInfo> lowQualityInfos_;
183     std::map<std::string, std::unique_ptr<PlayingStateInfo>> playingStateInfos_;
184     static constexpr float MULTIPLE = 1.0f;
185 };
186 #endif
187 
188 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
189 #define HISYSEVENT_FAULT(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteFault(eventName, __VA_ARGS__))
190 #define HISYSEVENT_STATISTIC(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteStatistic(eventName, __VA_ARGS__))
191 #define HISYSEVENT_SECURITY(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteSecurity(eventName, __VA_ARGS__))
192 #define HISYSEVENT_BEHAVIOR(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteBehavior(eventName, __VA_ARGS__))
193 #define HISYSEVENT_RESET AVSessionSysEvent::GetInstance().Reset()
194 #define HISYSEVENT_REGITER AVSessionSysEvent::GetInstance().Regiter()
195 #define HISYSEVENT_UNREGISTER AVSessionSysEvent::GetInstance().Unregister()
196 #define HISYSEVENT_ADD_OPERATION_COUNT(operation) AVSessionSysEvent::GetInstance().AddOperationCount(operation)
197 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(bundleName, controllerPid, controllerCmd, sessionType)           \
198     do {                                                                                                        \
199         AVSessionSysEvent::GetInstance().AddControllerCommandInfo(bundleName, controllerPid,                    \
200                                                                   controllerCmd, sessionType);                  \
201     } while (0)
202 
203 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(bundleName, appStatus, sessionType, isCreateSession)                     \
204     do {                                                                                                        \
205         AVSessionSysEvent::GetInstance().AddLifeCycleInfo(bundleName, appStatus, sessionType, isCreateSession); \
206     } while (0)
207 #define HISYSEVENT_GET_AUDIO_STATUS(uid) AVSessionSysEvent::GetInstance().GetAudioStatus(uid)
208 #define HISYSEVENT_SET_AUDIO_STATUS(uid, rendererState)                                                         \
209     do {                                                                                                        \
210         AVSessionSysEvent::GetInstance().SetAudioStatus(uid, rendererState);                                    \
211     } while (0)
212 
213 #else
214 #define HISYSEVENT_FAULT(...)
215 #define HISYSEVENT_STATISTIC(...)
216 #define HISYSEVENT_SECURITY(...)
217 #define HISYSEVENT_BEHAVIOR(...)
218 #define HISYSEVENT_RESET
219 #define HISYSEVENT_REGITER
220 #define HISYSEVENT_UNREGISTER
221 #define HISYSEVENT_ADD_OPERATION_COUNT(...)
222 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(...)
223 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(...)
224 #define HISYSEVENT_GET_AUDIO_STATUS(...)
225 #define HISYSEVENT_SET_AUDIO_STATUS(...)
226 #endif
227 } // namespace OHOS::AVSession
228 #endif // OHOS_AVSESSION_SYSEVENT_H