1 /* 2 * Copyright (c) 2021-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 AUDIO_SERVER_DUMP_H 17 #define AUDIO_SERVER_DUMP_H 18 19 #include <vector> 20 #include <list> 21 #include <queue> 22 #include <map> 23 #include <pwd.h> 24 #include "securec.h" 25 #include "nocopyable.h" 26 27 #include <pulse/pulseaudio.h> 28 29 #include "audio_service_log.h" 30 #include "audio_timer.h" 31 #include "audio_errors.h" 32 33 namespace OHOS { 34 namespace AudioStandard { 35 36 static const int32_t AUDIO_DUMP_SUCCESS = 0; 37 static const int32_t AUDIO_DUMP_INIT_ERR = -1; 38 39 typedef struct { 40 std::string name; 41 pa_sample_spec sampleSpec; 42 } SinkSourceInfo; 43 44 typedef struct { 45 uint32_t userId; 46 uint32_t corked; // status 47 std::string sessionId; 48 std::string sessionStartTime; 49 std::string applicationName; 50 std::string processId; 51 std::string privacyType; 52 pa_sample_spec sampleSpec; 53 }InputOutputInfo; 54 55 typedef struct { 56 std::vector<SinkSourceInfo> sinkDevices; 57 std::vector<SinkSourceInfo> sourceDevices; 58 std::vector<InputOutputInfo> sinkInputs; 59 std::vector<InputOutputInfo> sourceOutputs; 60 } StreamData; 61 62 class AudioServerDump : public AudioTimer { 63 public: 64 DISALLOW_COPY_AND_MOVE(AudioServerDump); 65 66 AudioServerDump(); 67 ~AudioServerDump(); 68 int32_t Initialize(); 69 void AudioDataDump(std::string &dumpString, std::queue<std::u16string>& argQue); 70 virtual void OnTimeOut(); 71 72 private: 73 pa_threaded_mainloop *mainLoop; 74 pa_mainloop_api *api; 75 pa_context *context; 76 std::mutex ctrlMutex_; 77 78 bool isMainLoopStarted_; 79 bool isContextConnected_; 80 StreamData streamData_; 81 82 int32_t ConnectStreamToPA(); 83 void ResetPAAudioDump(); 84 85 void PlaybackSinkDump(std::string &dumpString); 86 void RecordSourceDump(std::string &dumpString); 87 void HDFModulesDump(std::string &dumpString); 88 void PolicyHandlerDump(std::string &dumpString); 89 void ArgDataDump(std::string &dumpString, std::queue<std::u16string>& argQue); 90 void ServerDataDump(std::string &dumpString); 91 void AudioCacheTimeDump(std::string &dumpString); 92 void AudioCacheMemoryDump(std::string &dumpString); 93 void AudioPerformMonitorDump(std::string &dumpString); 94 void HdiAdapterDump(std::string &dumpString); 95 void InitDumpFuncMap(); 96 void HelpInfoDump(std::string& dumpString); 97 static bool IsEndWith(const std::string &mainStr, const std::string &toMatch); 98 static bool IsValidModule(const std::string moduleName); 99 100 // Callbacks 101 static void PAContextStateCb(pa_context *context, void *userdata); 102 static void PASinkInfoCallback(pa_context *c, const pa_sink_info *i, int eol, void *userdata); 103 static void PASinkInputInfoCallback(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata); 104 static void PASourceInfoCallback(pa_context *c, const pa_source_info *i, int eol, void *userdata); 105 static void PASourceOutputInfoCallback(pa_context *c, const pa_source_output_info *i, int eol, void *userdata); 106 107 using DumpFunc = void(AudioServerDump::*)(std::string &dumpString); 108 std::map<std::u16string, DumpFunc> dumpFuncMap; 109 }; 110 } // namespace AudioStandard 111 } // namespace OHOS 112 #endif // AUDIO_SERVER_DUMP_H 113