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