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