• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "hisysevent.h"
22 #include "timer.h"
23 #endif
24 
25 namespace OHOS::AVSession {
26 enum class Operation {
27     OPT_PLAY = 0,
28     OPT_PAUSE,
29     OPT_STOP,
30     OPT_PLAY_NEXT,
31     OPT_PLAY_PREVIOUS,
32     OPT_FAST_FORWARD,
33     OPT_REWIND,
34     OPT_SEEK,
35     OPT_SET_SPEED,
36     OPT_SET_LOOP_MODE,
37     OPT_SET_TARGET_LOOP_MODE,
38     OPT_TOGGLE_FAVORITE,
39     OPT_MEDIA_KEY_EVENT,
40     OPT_OUTPUT_DEVICE_CHANGED,
41     OPT_COMMAND_MAX,
42     OPT_CREATE_SESSION,
43     OPT_DELETE_SESSION,
44     OPT_ALL_CTRL_COMMAND,
45     OPT_SUCCESS_CTRL_COMMAND,
46 };
47 
48 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
49 class AVSessionSysEvent {
50 public:
51     struct LifeCycleInfo {
52         std::string bundleName_;
53         bool appStatus_;
54         int32_t sessionType_;
55         bool isCreateSession_;
56     };
57 
58     struct ControllerCommandInfo {
59         std::string bundleName_;
60         pid_t controllerPid_;
61         int32_t controllerCmd_;
62     };
63 
64     struct BackControlReportInfo {
65         std::string bundleName_;
66         int32_t streamUsage_;
67         bool isBack_;
68         int32_t playDuration_;
69         bool isAudioActive_;
70         int32_t metaDataQuality_;
71         int32_t cmdQuality_;
72         int32_t playbackState_;
73     };
74 
75     static AVSessionSysEvent& GetInstance();
76 
77     template<typename... Types>
HiSysWriteFault(const std::string & eventName,Types...keyValues)78     static int HiSysWriteFault(const std::string& eventName, Types... keyValues)
79     {
80         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
81             OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, keyValues...);
82     }
83 
84     template<typename... Types>
HiSysWriteStatistic(const std::string & eventName,Types...keyValues)85     static int HiSysWriteStatistic(const std::string& eventName, Types... keyValues)
86     {
87         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
88             OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, keyValues...);
89     }
90 
91     template<typename... Types>
HiSysWriteSecurity(const std::string & eventName,Types...keyValues)92     static int HiSysWriteSecurity(const std::string& eventName, Types... keyValues)
93     {
94         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
95             OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY, keyValues...);
96     }
97 
98     template<typename... Types>
HiSysWriteBehavior(const std::string & eventName,Types...keyValues)99     static int HiSysWriteBehavior(const std::string& eventName, Types... keyValues)
100     {
101         return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName,
102             OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, keyValues...);
103     }
104 
105     void Reset();
106     void Regiter();
107     void Unregister();
108     void AddOperationCount(Operation operation);
109     void AddLifeCycleInfo(const std::string& bundleName, bool appStatus,
110         const int32_t& sessionType, bool isCreateSession);
111     void AddControllerCommandInfo(const std::string& bundleName, const pid_t& controllerPid,
112         const int32_t& controllerCmd, const int32_t& sessionType);
113     void AddLowQualityInfo(AVSessionSysEvent::BackControlReportInfo &reportInfo);
114     void SetAudioStatus(pid_t uid, int32_t rendererState);
115     int32_t GetAudioStatus(pid_t uid);
116     void ReportLowQuality();
117 
118 private:
119     std::map<pid_t, int32_t> audioStatuses_;
120     AVSessionSysEvent();
121     std::map<Operation, uint32_t> optCounts_;
122     std::unique_ptr<Utils::Timer> timer_;
123     uint32_t timerId_;
124     std::recursive_mutex lock_;
125     static constexpr uint32_t NOTIFY_TIME_INTERVAL = 1 * 60 * 60 * 1000; // retry after 1 hours
126     std::list<AVSessionSysEvent::LifeCycleInfo> lifeCycleInfos_;
127     std::list<AVSessionSysEvent::ControllerCommandInfo> controllerCommandInfos_;
128     std::map<std::string, AVSessionSysEvent::BackControlReportInfo> lowQualityInfos_;
129     static constexpr float MULTIPLE = 1.0f;
130 };
131 #endif
132 
133 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL
134 #define HISYSEVENT_FAULT(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteFault(eventName, __VA_ARGS__))
135 #define HISYSEVENT_STATISTIC(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteStatistic(eventName, __VA_ARGS__))
136 #define HISYSEVENT_SECURITY(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteSecurity(eventName, __VA_ARGS__))
137 #define HISYSEVENT_BEHAVIOR(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteBehavior(eventName, __VA_ARGS__))
138 #define HISYSEVENT_RESET AVSessionSysEvent::GetInstance().Reset()
139 #define HISYSEVENT_REGITER AVSessionSysEvent::GetInstance().Regiter()
140 #define HISYSEVENT_UNREGISTER AVSessionSysEvent::GetInstance().Unregister()
141 #define HISYSEVENT_ADD_OPERATION_COUNT(operation) AVSessionSysEvent::GetInstance().AddOperationCount(operation)
142 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(bundleName, controllerPid, controllerCmd, sessionType)           \
143     do {                                                                                                        \
144         AVSessionSysEvent::GetInstance().AddControllerCommandInfo(bundleName, controllerPid,                    \
145                                                                   controllerCmd, sessionType);                  \
146     } while (0)
147 
148 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(bundleName, appStatus, sessionType, isCreateSession)                     \
149     do {                                                                                                        \
150         AVSessionSysEvent::GetInstance().AddLifeCycleInfo(bundleName, appStatus, sessionType, isCreateSession); \
151     } while (0)
152 #define HISYSEVENT_GET_AUDIO_STATUS(uid) AVSessionSysEvent::GetInstance().GetAudioStatus(uid)
153 #define HISYSEVENT_SET_AUDIO_STATUS(uid, rendererState)                                                         \
154     do {                                                                                                        \
155         AVSessionSysEvent::GetInstance().SetAudioStatus(uid, rendererState);                                    \
156     } while (0)
157 
158 #else
159 #define HISYSEVENT_FAULT(...)
160 #define HISYSEVENT_STATISTIC(...)
161 #define HISYSEVENT_SECURITY(...)
162 #define HISYSEVENT_BEHAVIOR(...)
163 #define HISYSEVENT_RESET
164 #define HISYSEVENT_REGITER
165 #define HISYSEVENT_UNREGISTER
166 #define HISYSEVENT_ADD_OPERATION_COUNT(...)
167 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(...)
168 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(...)
169 #define HISYSEVENT_GET_AUDIO_STATUS(...)
170 #define HISYSEVENT_SET_AUDIO_STATUS(...)
171 #endif
172 } // namespace OHOS::AVSession
173 #endif // OHOS_AVSESSION_SYSEVENT_H