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_TOGGLE_FAVORITE, 38 OPT_MEDIA_KEY_EVENT, 39 OPT_OUTPUT_DEVICE_CHANGED, 40 OPT_COMMAND_MAX, 41 OPT_CREATE_SESSION, 42 OPT_DELETE_SESSION, 43 OPT_ALL_CTRL_COMMAND, 44 OPT_SUCCESS_CTRL_COMMAND, 45 }; 46 47 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL 48 class AVSessionSysEvent { 49 public: 50 struct LifeCycleInfo { 51 std::string bundleName_; 52 bool appStatus_; 53 int32_t sessionType_; 54 bool isCreateSession_; 55 }; 56 57 struct ControllerCommandInfo { 58 std::string bundleName_; 59 pid_t controllerPid_; 60 int32_t controllerCmd_; 61 }; 62 63 static AVSessionSysEvent& GetInstance(); 64 65 template<typename... Types> HiSysWriteFault(const std::string & eventName,Types...keyValues)66 static int HiSysWriteFault(const std::string& eventName, Types... keyValues) 67 { 68 return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName, 69 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT, keyValues...); 70 } 71 72 template<typename... Types> HiSysWriteStatistic(const std::string & eventName,Types...keyValues)73 static int HiSysWriteStatistic(const std::string& eventName, Types... keyValues) 74 { 75 return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName, 76 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, keyValues...); 77 } 78 79 template<typename... Types> HiSysWriteSecurity(const std::string & eventName,Types...keyValues)80 static int HiSysWriteSecurity(const std::string& eventName, Types... keyValues) 81 { 82 return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName, 83 OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY, keyValues...); 84 } 85 86 template<typename... Types> HiSysWriteBehavior(const std::string & eventName,Types...keyValues)87 static int HiSysWriteBehavior(const std::string& eventName, Types... keyValues) 88 { 89 return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::AV_SESSION, eventName, 90 OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, keyValues...); 91 } 92 93 void Reset(); 94 void Regiter(); 95 void Unregister(); 96 void AddOperationCount(Operation operation); 97 void AddLifeCycleInfo(const std::string& bundleName, bool appStatus, 98 const int32_t& sessionType, bool isCreateSession); 99 void AddControllerCommandInfo(const std::string& bundleName, const pid_t& controllerPid, 100 const int32_t& controllerCmd, const int32_t& sessionType); 101 void SetAudioStatus(pid_t uid, int32_t rendererState); 102 int32_t GetAudioStatus(pid_t uid); 103 104 private: 105 std::map<pid_t, int32_t> audioStatuses_; 106 AVSessionSysEvent(); 107 std::map<Operation, uint32_t> optCounts_; 108 std::unique_ptr<Utils::Timer> timer_; 109 uint32_t timerId_; 110 std::recursive_mutex lock_; 111 static constexpr uint32_t NOTIFY_TIME_INTERVAL = 1 * 60 * 60 * 1000; // retry after 1 hours 112 std::list<AVSessionSysEvent::LifeCycleInfo> lifeCycleInfos_; 113 std::list<AVSessionSysEvent::ControllerCommandInfo> controllerCommandInfos_; 114 static constexpr float MULTIPLE = 1.0f; 115 }; 116 #endif 117 118 #ifdef ENABLE_AVSESSION_SYSEVENT_CONTROL 119 #define HISYSEVENT_FAULT(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteFault(eventName, __VA_ARGS__)) 120 #define HISYSEVENT_STATISTIC(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteStatistic(eventName, __VA_ARGS__)) 121 #define HISYSEVENT_SECURITY(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteSecurity(eventName, __VA_ARGS__)) 122 #define HISYSEVENT_BEHAVIOR(eventName, ...) ((void)AVSessionSysEvent::HiSysWriteBehavior(eventName, __VA_ARGS__)) 123 #define HISYSEVENT_RESET AVSessionSysEvent::GetInstance().Reset() 124 #define HISYSEVENT_REGITER AVSessionSysEvent::GetInstance().Regiter() 125 #define HISYSEVENT_UNREGISTER AVSessionSysEvent::GetInstance().Unregister() 126 #define HISYSEVENT_ADD_OPERATION_COUNT(operation) AVSessionSysEvent::GetInstance().AddOperationCount(operation) 127 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(bundleName, controllerPid, controllerCmd, sessionType) \ 128 do { \ 129 AVSessionSysEvent::GetInstance().AddControllerCommandInfo(bundleName, controllerPid, \ 130 controllerCmd, sessionType); \ 131 } while (0) 132 133 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(bundleName, appStatus, sessionType, isCreateSession) \ 134 do { \ 135 AVSessionSysEvent::GetInstance().AddLifeCycleInfo(bundleName, appStatus, sessionType, isCreateSession); \ 136 } while (0) 137 #define HISYSEVENT_GET_AUDIO_STATUS(uid) AVSessionSysEvent::GetInstance().GetAudioStatus(uid) 138 #define HISYSEVENT_SET_AUDIO_STATUS(uid, rendererState) \ 139 do { \ 140 AVSessionSysEvent::GetInstance().SetAudioStatus(uid, rendererState); \ 141 } while (0) 142 143 #else 144 #define HISYSEVENT_FAULT(...) 145 #define HISYSEVENT_STATISTIC(...) 146 #define HISYSEVENT_SECURITY(...) 147 #define HISYSEVENT_BEHAVIOR(...) 148 #define HISYSEVENT_RESET 149 #define HISYSEVENT_REGITER 150 #define HISYSEVENT_UNREGISTER 151 #define HISYSEVENT_ADD_OPERATION_COUNT(...) 152 #define HISYSEVENT_ADD_CONTROLLER_COMMAND_INFO(...) 153 #define HISYSEVENT_ADD_LIFE_CYCLE_INFO(...) 154 #define HISYSEVENT_GET_AUDIO_STATUS(...) 155 #define HISYSEVENT_SET_AUDIO_STATUS(...) 156 #endif 157 } // namespace OHOS::AVSession 158 #endif // OHOS_AVSESSION_SYSEVENT_H