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