1 /* 2 * Copyright (c) 2024 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 #ifndef AUDIO_PERFORMANCE_MONITOR_H 16 #define AUDIO_PERFORMANCE_MONITOR_H 17 18 #include <cstdint> 19 #include <map> 20 #include <deque> 21 #include <mutex> 22 #include "audio_stream_info.h" 23 24 namespace OHOS { 25 namespace AudioStandard { 26 27 const int64_t AUDIO_NS_PER_MS = 1000 * 1000; 28 const int64_t INIT_LASTWRITTEN_TIME = -1; 29 const int64_t MIN_REPORT_INTERVAL_MS = 5 * 1000; // 5s 30 const int32_t JANK_POSITON_CODE = 0; // mark where jank position, 0 for fwk. 31 32 // jank defination: receiving not silent frame, then receive MIN_SILENCE_FRAME_COUNT <= y <= MAX_SILENCE_FRAME_COUNT 33 // underrun silent frames, and then receive normal not silent frame, in this case we will report SILENCE_EVENT 34 const uint32_t MIN_SILENCE_FRAME_COUNT = 1; 35 const uint32_t MAX_SILENCE_FRAME_COUNT = 20; 36 const size_t MAX_RECORD_QUEUE_SIZE = 30; 37 const size_t MAX_MAP_SIZE = 1024; 38 39 const int64_t NORMAL_MAX_LASTWRITTEN_TIME = 100; // 100 * AUDIO_NS_PER_MS 40 const int64_t FAST_MAX_LASTWRITTEN_TIME = 8; // 8 * AUDIO_NS_PER_MS 41 const int64_t VOIP_FAST_MAX_LASTWRITTEN_TIME = 25; // 25 * AUDIO_NS_PER_MS 42 43 enum DetectEvent : uint8_t { 44 OVERTIME_EVENT = 0, 45 SILENCE_EVENT = 1, 46 }; 47 48 enum AdapterType : uint8_t { 49 ADAPTER_TYPE_UNKNOWN = 0, 50 ADAPTER_TYPE_PRIMARY = 1, 51 ADAPTER_TYPE_DIRECT = 2, 52 ADAPTER_TYPE_MULTICHANNEL = 3, 53 ADAPTER_TYPE_FAST = 4, 54 ADAPTER_TYPE_REMOTE = 5, 55 ADAPTER_TYPE_BLUETOOTH = 6, 56 ADAPTER_TYPE_VOIP_FAST = 7, 57 ADAPTER_TYPE_HEARING_AID = 8, 58 ADAPTER_TYPE_MAX = 9, 59 }; 60 61 struct FrameRecordInfo { 62 uint64_t silenceStateCount = MAX_SILENCE_FRAME_COUNT + 1; 63 std::deque<bool> historyStateDeque{}; 64 AudioPipeType pipeType = PIPE_TYPE_UNKNOWN; 65 uint32_t tokenId = 0; 66 bool isRunning = false; 67 }; 68 69 class AudioPerformanceMonitor { 70 public: 71 static AudioPerformanceMonitor &GetInstance(); 72 73 // silence Monitor records if server gets valid data from client 74 void RecordSilenceState(uint32_t sessionId, bool isSilence, AudioPipeType pipeType, uint32_t uid); 75 void StartSilenceMonitor(uint32_t sessionId, uint32_t tokenId); 76 void PauseSilenceMonitor(uint32_t sessionId); 77 void DeleteSilenceMonitor(uint32_t sessionId); 78 79 void ReportWriteSlow(AdapterType adapterType, int32_t overtimeMs); 80 // overTime Monitor records the interval between two writes to HAL 81 void RecordTimeStamp(AdapterType adapterType, int64_t curTimeStamp); 82 void DeleteOvertimeMonitor(AdapterType adapterType); 83 84 void DumpMonitorInfo(std::string &dumpString); 85 86 private: 87 // all public funcs should hold this mutex 88 std::mutex monitorMutex_; 89 std::map<uint32_t /*sessionId*/, FrameRecordInfo> silenceDetectMap_{}; 90 std::map<AdapterType, int64_t /*lastWrittenTimeStamp*/> overTimeDetectMap_{}; 91 92 void JudgeNoise(uint32_t index, bool curState, uint32_t uid); 93 void ReportEvent(DetectEvent reasonCode, int32_t periodMs, AudioPipeType pipeType, AdapterType adapterType, 94 uint32_t uid = 0); 95 std::string GetRunningHapNames(AdapterType adapterType); 96 int64_t silenceLastReportTime_ = -1; 97 int64_t overTimeLastReportTime_ = -1; 98 99 std::map<AdapterType, int64_t> MAX_WRITTEN_INTERVAL { 100 {ADAPTER_TYPE_PRIMARY, NORMAL_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 100ms 101 {ADAPTER_TYPE_DIRECT, NORMAL_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 100ms 102 {ADAPTER_TYPE_MULTICHANNEL, NORMAL_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 100ms 103 {ADAPTER_TYPE_REMOTE, NORMAL_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 100ms 104 {ADAPTER_TYPE_BLUETOOTH, NORMAL_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 100ms 105 {ADAPTER_TYPE_FAST, FAST_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 8ms 106 {ADAPTER_TYPE_VOIP_FAST, VOIP_FAST_MAX_LASTWRITTEN_TIME * AUDIO_NS_PER_MS}, // 25ms 107 }; 108 109 std::map<AdapterType, AudioPipeType> PIPE_TYPE_MAP { 110 {ADAPTER_TYPE_UNKNOWN, PIPE_TYPE_UNKNOWN}, 111 {ADAPTER_TYPE_PRIMARY, PIPE_TYPE_NORMAL_OUT}, 112 {ADAPTER_TYPE_DIRECT, PIPE_TYPE_DIRECT_OUT}, 113 {ADAPTER_TYPE_MULTICHANNEL, PIPE_TYPE_MULTICHANNEL}, 114 {ADAPTER_TYPE_REMOTE, PIPE_TYPE_NORMAL_OUT}, 115 {ADAPTER_TYPE_BLUETOOTH, PIPE_TYPE_NORMAL_OUT}, 116 {ADAPTER_TYPE_FAST, PIPE_TYPE_LOWLATENCY_OUT}, 117 {ADAPTER_TYPE_VOIP_FAST, PIPE_TYPE_CALL_OUT}, 118 }; 119 }; 120 121 } // namespace AudioStandard 122 } // namespace OHOS 123 #endif // AUDIO_PERFORMANCE_MONITOR_H