1 /* 2 * Copyright (c) 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 #include "daudio_hidumper.h" 17 18 #include "daudio_constants.h" 19 #include "daudio_errorcode.h" 20 #include "daudio_log.h" 21 #include "daudio_util.h" 22 23 #undef DH_LOG_TAG 24 #define DH_LOG_TAG "DaudioHidumper" 25 26 namespace OHOS { 27 namespace DistributedHardware { 28 IMPLEMENT_SINGLE_INSTANCE(DaudioHidumper); 29 30 namespace { 31 const std::string ARGS_HELP = "-h"; 32 const std::string ARGS_SOURCE_DEVID = "--sourceDevId"; 33 const std::string ARGS_SINK_INFO = "--sinkInfo"; 34 const std::string ARGS_ABILITY = "--ability"; 35 const std::string ARGS_DUMP_AUDIO_DATA_START = "--startDump"; 36 const std::string ARGS_DUMP_AUDIO_DATA_STOP = "--stopDump"; 37 38 const std::map<std::string, HidumpFlag> ARGS_MAP = { 39 { ARGS_HELP, HidumpFlag::GET_HELP }, 40 { ARGS_SOURCE_DEVID, HidumpFlag::GET_SOURCE_DEVID }, 41 { ARGS_SINK_INFO, HidumpFlag::GET_SINK_INFO }, 42 { ARGS_ABILITY, HidumpFlag::GET_ABILITY }, 43 { ARGS_DUMP_AUDIO_DATA_START, HidumpFlag::DUMP_AUDIO_DATA_START }, 44 { ARGS_DUMP_AUDIO_DATA_STOP, HidumpFlag::DUMP_AUDIO_DATA_STOP }, 45 }; 46 } 47 DaudioHidumper()48 DaudioHidumper::DaudioHidumper() 49 { 50 DHLOGI("Distributed audio hidumper constructed."); 51 } 52 ~DaudioHidumper()53 DaudioHidumper::~DaudioHidumper() 54 { 55 DHLOGI("Distributed audio hidumper deconstructed."); 56 } 57 Dump(const std::vector<std::string> & args,std::string & result)58 bool DaudioHidumper::Dump(const std::vector<std::string> &args, std::string &result) 59 { 60 result.clear(); 61 int32_t argsSize = static_cast<int32_t>(args.size()); 62 DHLOGI("Distributed audio hidumper dump args.size():%{public}d", argsSize); 63 for (int32_t i = 0; i < argsSize; i++) { 64 DHLOGD("Distributed audio hidumper dump args[%{public}d]: %{public}s.", i, args.at(i).c_str()); 65 } 66 67 if (args.empty()) { 68 ShowHelp(result); 69 return true; 70 } else if (args.size() > 1) { 71 ShowIllegalInfomation(result); 72 return true; 73 } 74 75 return ProcessDump(args[0], result) == DH_SUCCESS; 76 } 77 ProcessDump(const std::string & args,std::string & result)78 int32_t DaudioHidumper::ProcessDump(const std::string &args, std::string &result) 79 { 80 DHLOGI("Process dump."); 81 HidumpFlag hf = HidumpFlag::UNKNOWN; 82 auto operatorIter = ARGS_MAP.find(args); 83 if (operatorIter != ARGS_MAP.end()) { 84 hf = operatorIter->second; 85 } 86 87 if (hf == HidumpFlag::GET_HELP) { 88 ShowHelp(result); 89 return DH_SUCCESS; 90 } 91 result.clear(); 92 switch (hf) { 93 case HidumpFlag::GET_SOURCE_DEVID: { 94 return GetSourceDevId(result); 95 } 96 case HidumpFlag::GET_SINK_INFO: { 97 return GetSinkInfo(result); 98 } 99 case HidumpFlag::GET_ABILITY: { 100 return GetAbilityInfo(result); 101 } 102 case HidumpFlag::DUMP_AUDIO_DATA_START: { 103 return StartDumpData(result); 104 } 105 case HidumpFlag::DUMP_AUDIO_DATA_STOP: { 106 return StopDumpData(result); 107 } 108 default: { 109 return ShowIllegalInfomation(result); 110 } 111 } 112 } 113 GetSourceDevId(std::string & result)114 int32_t DaudioHidumper::GetSourceDevId(std::string &result) 115 { 116 DHLOGI("Get source devId dump."); 117 std::string sourceDevId = ""; 118 int32_t ret = GetLocalDeviceNetworkId(sourceDevId); 119 if (ret != DH_SUCCESS) { 120 DHLOGE("Get local network id failed."); 121 result.append("sourceDevId: ").append(""); 122 return ret; 123 } 124 result.append("sourceDevId: ").append(GetAnonyString(sourceDevId)); 125 return DH_SUCCESS; 126 } 127 GetSinkInfo(std::string & result)128 int32_t DaudioHidumper::GetSinkInfo(std::string &result) 129 { 130 DHLOGI("Get sink info dump."); 131 132 audioManager_ = IAudioManager::Get("daudio_primary_service", false); 133 if (audioManager_ == nullptr) { 134 return ERR_DH_AUDIO_NULLPTR; 135 } 136 int32_t ret = audioManager_->GetAllAdapters(adapterdesc_); 137 if (ret != DH_SUCCESS) { 138 DHLOGE("Get all adapters failed."); 139 return ERR_DH_AUDIO_NULLPTR; 140 } 141 for (uint32_t index = 0; index < adapterdesc_.size(); index++) { 142 AudioAdapterDescriptor desc = adapterdesc_[index]; 143 result.append("sinkDevId: ").append(GetAnonyString(desc.adapterName)).append(" portId: "); 144 for (uint32_t i = 0; i < desc.ports.size(); i++) { 145 result.append(std::to_string(desc.ports[i].portId)).append(" "); 146 } 147 } 148 149 return DH_SUCCESS; 150 } 151 GetAbilityInfo(std::string & result)152 int32_t DaudioHidumper::GetAbilityInfo(std::string &result) 153 { 154 DHLOGI("Obtaining capability information."); 155 std::vector<DHItem> abilityInfo = DAudioHandler::GetInstance().ablityForDump(); 156 for (DHItem dhItem : abilityInfo) { 157 if (dhItem.dhId == DEFAULT_SPK_DHID) { 158 result.append("spkAbilityInfo:").append(dhItem.attrs).append(" "); 159 } 160 if (dhItem.dhId == DEFAULT_MIC_DHID) { 161 result.append("micAbilityInfo:").append(dhItem.attrs).append(" "); 162 } 163 } 164 return DH_SUCCESS; 165 } 166 StartDumpData(std::string & result)167 int32_t DaudioHidumper::StartDumpData(std::string &result) 168 { 169 if (access(DUMP_FILE_PATH.c_str(), 0) < 0) { 170 if (mkdir(DUMP_FILE_PATH.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) { 171 DHLOGE("Create dir error"); 172 return ERR_DH_AUDIO_FAILED; 173 } 174 } 175 DHLOGI("Start dump audio data."); 176 result.append("start dump..."); 177 dumpAudioDataFlag_ = true; 178 return DH_SUCCESS; 179 } 180 StopDumpData(std::string & result)181 int32_t DaudioHidumper::StopDumpData(std::string &result) 182 { 183 DHLOGI("Stop dump audio data."); 184 result.append("stop dump..."); 185 dumpAudioDataFlag_ = false; 186 return DH_SUCCESS; 187 } 188 QueryDumpDataFlag()189 bool DaudioHidumper::QueryDumpDataFlag() 190 { 191 return dumpAudioDataFlag_; 192 } 193 ShowHelp(std::string & result)194 void DaudioHidumper::ShowHelp(std::string &result) 195 { 196 DHLOGI("Show help."); 197 result.append("Usage:dump <command> [options]\n") 198 .append("Description:\n") 199 .append("-h ") 200 .append(": show help\n") 201 .append("--sourceDevId ") 202 .append(": dump audio sourceDevId in the system\n") 203 .append("--sinkInfo ") 204 .append(": dump sink info in the system\n") 205 .append("--ability ") 206 .append(": dump current ability of the audio in the system\n") 207 .append("--startDump") 208 .append(": start dump audio data in the system /data/data/daudio\n") 209 .append("--stopDump") 210 .append(": stop dump audio data in the system\n"); 211 } 212 ShowIllegalInfomation(std::string & result)213 int32_t DaudioHidumper::ShowIllegalInfomation(std::string &result) 214 { 215 DHLOGI("Show illegal information."); 216 result.append("unknown command, -h for help."); 217 return DH_SUCCESS; 218 } 219 } // namespace DistributedHardware 220 } // namespace OHOS