• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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