diff --git a/frameworks/native/hdiadapter_new/BUILD.gn b/frameworks/native/hdiadapter_new/BUILD.gn index c179377adcc8309b4b4bb34bb6689acbdc55e873..28c40d88f05be8890e344a694517ac02f1c6da5f 100644 --- a/frameworks/native/hdiadapter_new/BUILD.gn +++ b/frameworks/native/hdiadapter_new/BUILD.gn @@ -67,6 +67,7 @@ ohos_shared_library("hdiadapter_new") { "source/wakeup_audio_capture_source.cpp", "source/va_capture_source.cpp", "util/callback_wrapper.cpp", + "util/hdi_dfx_utils.cpp", "util/id_handler.cpp", "util/ring_buffer_handler.cpp", ] diff --git a/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h b/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h index 5940f82b5d132dcbb01c8c65e601d5403d785d8e..1d5be1aba5f48d0fbbd5ba304c2faa38410ff0fd 100644 --- a/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h +++ b/frameworks/native/hdiadapter_new/include/source/audio_capture_source.h @@ -26,6 +26,7 @@ #include "util/audio_running_lock.h" #include "util/ring_buffer_handler.h" #include "util/callback_wrapper.h" +#include "util/hdi_dfx_utils.h" #include "audio_primary_source_clock.h" namespace OHOS { @@ -109,7 +110,6 @@ private: void CaptureThreadLoop(void); int32_t UpdateActiveDeviceWithoutLock(DeviceType inputDevice); int32_t DoStop(void); - void DumpData(char *frame, uint64_t &replyBytes); void InitRunningLock(void); void CheckAcousticEchoCancelerSupported(int32_t sourcetype, int32_t &hdiAudioInputType); bool IsCaptureInvalid(void) override; @@ -160,8 +160,7 @@ private: int captureFrameNum_ = 0; // for dfx log int32_t logMode_ = 0; - std::string logUtilsTag_ = ""; - mutable int64_t volumeDataCount_ = 0; + DfxAttr dfxAttr_ = {}; // for ec and mic_ref std::unique_ptr captureThread_ = nullptr; bool isCaptureThreadRunning_ = false; @@ -169,8 +168,6 @@ private: #ifdef FEATURE_POWER_MANAGER std::shared_ptr runningLock_; #endif - FILE *dumpFile_ = nullptr; - std::string dumpFileName_ = ""; DeviceType currentActiveDevice_ = DEVICE_TYPE_INVALID; AudioScene currentAudioScene_ = AUDIO_SCENE_INVALID; std::atomic muteState_ = false; diff --git a/frameworks/native/hdiadapter_new/include/source/remote_audio_capture_source.h b/frameworks/native/hdiadapter_new/include/source/remote_audio_capture_source.h index 791ce063f5b08b945896d6619e061149b6a20cb2..f7a979889d152fbb5e3e53d28479f55fc585a400 100644 --- a/frameworks/native/hdiadapter_new/include/source/remote_audio_capture_source.h +++ b/frameworks/native/hdiadapter_new/include/source/remote_audio_capture_source.h @@ -22,6 +22,7 @@ #include #include "adapter/i_device_manager.h" #include "util/callback_wrapper.h" +#include "util/hdi_dfx_utils.h" namespace OHOS { namespace AudioStandard { @@ -91,7 +92,7 @@ private: static constexpr uint16_t GET_MAX_AMPLITUDE_FRAMES_THRESHOLD = 10; static constexpr int32_t HALF_FACTOR = 2; static constexpr uint32_t AUDIO_BUFFER_SIZE = 16 * 1024; - static constexpr const char *DUMP_REMOTE_CAPTURE_SOURCE_FILENAME = "dump_remote_audiosource.pcm"; + static constexpr const char *DUMP_REMOTE_CAPTURE_SOURCE_FILENAME = "dump_remote_audiosource"; const std::string deviceNetworkId_ = ""; IAudioSourceAttr attr_ = {}; @@ -109,8 +110,8 @@ private: int64_t last10FrameStartTime_ = 0; bool startUpdate_ = false; int captureFrameNum_ = 0; - FILE *dumpFile_ = nullptr; - std::string dumpFileName_ = ""; + // for dfx log + DfxAttr dfxAttr_ = {}; bool muteState_ = false; }; diff --git a/frameworks/native/hdiadapter_new/include/util/hdi_dfx_utils.h b/frameworks/native/hdiadapter_new/include/util/hdi_dfx_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..06dd6e0a920408b029c95db99d737ed9aca58364 --- /dev/null +++ b/frameworks/native/hdiadapter_new/include/util/hdi_dfx_utils.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef HDI_DFX_UTILS_H +#define HDI_DFX_UTILS_H + +#include "audio_dump_pcm.h" +#include "audio_utils.h" +#include "volume_tools.h" +#include "common/hdi_adapter_type.h" + +namespace OHOS { +namespace AudioStandard { +typedef struct DfxAttr { + std::string logUtilsTag_ = ""; + mutable int64_t volumeDataCount_ = 0; + FILE *dumpFile_ = nullptr; + std::string dumpFileName_ = ""; +} DfxAttr; + +class HdiDfxUtils { +public: + static void DumpData(char *data, uint64_t &len, const IAudioSourceAttr &attr, DfxAttr &dfxAttr); +}; +} // namespace AudioStandard +} // namespace OHOS + +#endif // HDI_DFX_UTILS_H diff --git a/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp b/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp index ffc3d0292bd50b356844457f924e1ca08f6c1b13..984f1368065d20b1f13c06d0514b9ffd1a71011f 100644 --- a/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp +++ b/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp @@ -91,7 +91,8 @@ AudioCaptureSource::AudioCaptureSource(const uint32_t captureId, const std::stri AudioCaptureSource::~AudioCaptureSource() { isCaptureThreadRunning_ = false; - AUDIO_INFO_LOG("[%{public}s] volumeDataCount: %{public}" PRId64, logUtilsTag_.c_str(), volumeDataCount_); + AUDIO_INFO_LOG("[%{public}s] volumeDataCount: %{public}" PRId64, dfxAttr_.logUtilsTag_.c_str(), + dfxAttr_.volumeDataCount_); CapturerClockManager::GetInstance().DeleteAudioSourceClock(captureId_); } @@ -156,7 +157,7 @@ void AudioCaptureSource::DeInit(void) callback->OnWakeupClose(); } currentActiveDevice_ = DEVICE_TYPE_INVALID; - DumpFileUtil::CloseDumpFile(&dumpFile_); + DumpFileUtil::CloseDumpFile(&dfxAttr_.dumpFile_); } bool AudioCaptureSource::IsInited(void) @@ -207,11 +208,11 @@ int32_t AudioCaptureSource::Start(void) InitRunningLock(); // eg: primary_source_0_20240527202236189_44100_2_1.pcm - dumpFileName_ = halName_ + "_source_" + std::to_string(attr_.sourceType) + "_" + GetTime() + "_" + + dfxAttr_.dumpFileName_ = halName_ + "_source_" + std::to_string(attr_.sourceType) + "_" + GetTime() + "_" + std::to_string(attr_.sampleRate) + "_" + std::to_string(attr_.channel) + "_" + std::to_string(attr_.format) + ".pcm"; - DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_SERVER_PARA, dumpFileName_, &dumpFile_); - logUtilsTag_ = "AudioSource"; + DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_SERVER_PARA, dfxAttr_.dumpFileName_, &dfxAttr_.dumpFile_); + dfxAttr_.logUtilsTag_ = "AudioSource"; if (started_.load()) { return SUCCESS; @@ -355,7 +356,7 @@ int32_t AudioCaptureSource::CaptureFrame(char *frame, uint64_t requestBytes, uin } CheckLatencySignal(reinterpret_cast(frame), replyBytes); - DumpData(frame, replyBytes); + HdiDfxUtils::DumpData(frame, replyBytes, attr_, dfxAttr_); CheckUpdateState(frame, requestBytes); stamp = (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND; int64_t stampThreshold = 50; // 50ms @@ -411,7 +412,7 @@ int32_t AudioCaptureSource::CaptureFrameWithEc(FrameDesc *fdesc, uint64_t &reply AUDIO_ERR_LOG("copy desc fail"); } else { replyBytes = (attr_.sourceType == SOURCE_TYPE_EC) ? 0 : fdesc->frameLen; - DumpData(fdesc->frame, replyBytes); + HdiDfxUtils::DumpData(fdesc->frame, replyBytes, attr_, dfxAttr_); } } if (frameInfo.frameEc != nullptr) { @@ -1303,18 +1304,6 @@ int32_t AudioCaptureSource::DoStop(void) return SUCCESS; } -void AudioCaptureSource::DumpData(char *frame, uint64_t &replyBytes) -{ - BufferDesc buffer = { reinterpret_cast(frame), replyBytes, replyBytes }; - AudioStreamInfo streamInfo(static_cast(attr_.sampleRate), AudioEncodingType::ENCODING_PCM, - static_cast(attr_.format), static_cast(attr_.channel)); - VolumeTools::DfxOperation(buffer, streamInfo, logUtilsTag_, volumeDataCount_); - if (AudioDump::GetInstance().GetVersionType() == DumpFileUtil::BETA_VERSION) { - DumpFileUtil::WriteDumpFile(dumpFile_, frame, replyBytes); - AudioCacheMgr::GetInstance().CacheData(dumpFileName_, static_cast(frame), replyBytes); - } -} - void AudioCaptureSource::SetDmDeviceType(uint16_t dmDeviceType, DeviceType deviceType) { std::lock_guard lock(statusMutex_); diff --git a/frameworks/native/hdiadapter_new/source/remote_audio_capture_source.cpp b/frameworks/native/hdiadapter_new/source/remote_audio_capture_source.cpp index 56b9858a03e4fb62e201c97827bc880f6cd421a1..bbf99f6f7df81396a19fc80c5b603ede25c599b0 100644 --- a/frameworks/native/hdiadapter_new/source/remote_audio_capture_source.cpp +++ b/frameworks/native/hdiadapter_new/source/remote_audio_capture_source.cpp @@ -53,6 +53,7 @@ int32_t RemoteAudioCaptureSource::Init(const IAudioSourceAttr &attr) void RemoteAudioCaptureSource::DeInit(void) { + Trace trace("RemoteAudioCaptureSource::DeInit"); AUDIO_INFO_LOG("in"); sourceInited_.store(false); captureInited_.store(false); @@ -60,7 +61,7 @@ void RemoteAudioCaptureSource::DeInit(void) paused_.store(false); DestroyCapture(); - DumpFileUtil::CloseDumpFile(&dumpFile_); + DumpFileUtil::CloseDumpFile(&dfxAttr_.dumpFile_); AUDIO_INFO_LOG("end"); } @@ -71,9 +72,14 @@ bool RemoteAudioCaptureSource::IsInited(void) int32_t RemoteAudioCaptureSource::Start(void) { + Trace trace("RemoteAudioCaptureSource::Start"); AUDIO_INFO_LOG("in"); std::lock_guard lock(createCaptureMutex_); - DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_SERVER_PARA, DUMP_REMOTE_CAPTURE_SOURCE_FILENAME, &dumpFile_); + dfxAttr_.dumpFileName_ = std::string(DUMP_REMOTE_CAPTURE_SOURCE_FILENAME) + "_" + GetTime() + "_" + + std::to_string(attr_.sampleRate) + "_" + std::to_string(attr_.channel) + "_" + + std::to_string(attr_.format) + ".pcm"; + DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_SERVER_PARA, dfxAttr_.dumpFileName_, &dfxAttr_.dumpFile_); + dfxAttr_.logUtilsTag_ = "RemoteAudioSource"; if (!captureInited_.load()) { int32_t ret = CreateCapture(); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "create capture fail"); @@ -93,6 +99,7 @@ int32_t RemoteAudioCaptureSource::Start(void) int32_t RemoteAudioCaptureSource::Stop(void) { + Trace trace("RemoteAudioCaptureSource::Stop"); AUDIO_INFO_LOG("in"); if (!started_.load()) { AUDIO_INFO_LOG("already stopped"); @@ -112,6 +119,7 @@ int32_t RemoteAudioCaptureSource::Stop(void) int32_t RemoteAudioCaptureSource::Resume(void) { + Trace trace("RemoteAudioCaptureSource::Resume"); AUDIO_INFO_LOG("in"); CHECK_AND_RETURN_RET_LOG(started_.load(), ERR_ILLEGAL_STATE, "not start, invalid state"); @@ -129,6 +137,7 @@ int32_t RemoteAudioCaptureSource::Resume(void) int32_t RemoteAudioCaptureSource::Pause(void) { + Trace trace("RemoteAudioCaptureSource::Pause"); AUDIO_INFO_LOG("in"); CHECK_AND_RETURN_RET_LOG(started_.load(), ERR_ILLEGAL_STATE, "not start, invalid state"); @@ -146,6 +155,7 @@ int32_t RemoteAudioCaptureSource::Pause(void) int32_t RemoteAudioCaptureSource::Flush(void) { + Trace trace("RemoteAudioCaptureSource::Flush"); AUDIO_INFO_LOG("in"); CHECK_AND_RETURN_RET_LOG(started_.load(), ERR_ILLEGAL_STATE, "not start, invalid state"); @@ -157,6 +167,7 @@ int32_t RemoteAudioCaptureSource::Flush(void) int32_t RemoteAudioCaptureSource::Reset(void) { + Trace trace("RemoteAudioCaptureSource::Reset"); AUDIO_INFO_LOG("in"); CHECK_AND_RETURN_RET_LOG(started_.load(), ERR_ILLEGAL_STATE, "not start, invalid state"); @@ -174,6 +185,7 @@ int32_t RemoteAudioCaptureSource::CaptureFrame(char *frame, uint64_t requestByte return ERR_ILLEGAL_STATE; } + Trace trace("RemoteAudioCaptureSource::CaptureFrame"); std::vector bufferVec(requestBytes); int32_t ret = audioCapture_->CaptureFrame(bufferVec, replyBytes); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_READ_FAILED, "fail, ret: %{public}x", ret); @@ -181,7 +193,7 @@ int32_t RemoteAudioCaptureSource::CaptureFrame(char *frame, uint64_t requestByte CHECK_AND_RETURN_RET_LOG(ret == EOK, ERR_OPERATION_FAILED, "copy fail, error code: %{public}d", ret); replyBytes = requestBytes; - DumpFileUtil::WriteDumpFile(dumpFile_, frame, requestBytes); + HdiDfxUtils::DumpData(frame, replyBytes, attr_, dfxAttr_); CheckUpdateState(frame, requestBytes); return SUCCESS; } @@ -415,6 +427,7 @@ void RemoteAudioCaptureSource::InitDeviceDesc(struct AudioDeviceDescriptor &devi int32_t RemoteAudioCaptureSource::CreateCapture(void) { + Trace trace("RemoteAudioCaptureSource::CreateCapture"); struct AudioSampleAttributes param; struct AudioDeviceDescriptor deviceDesc; InitAudioSampleAttr(param); diff --git a/frameworks/native/hdiadapter_new/util/hdi_dfx_utils.cpp b/frameworks/native/hdiadapter_new/util/hdi_dfx_utils.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e77e9bcfd5875be8ceeff91795db51b3f5652564 --- /dev/null +++ b/frameworks/native/hdiadapter_new/util/hdi_dfx_utils.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LOG_TAG +#define LOG_TAG "HdiDfxUtils" +#endif + +#include "util/hdi_dfx_utils.h" + +namespace OHOS { +namespace AudioStandard { +void HdiDfxUtils::DumpData(char *data, uint64_t &len, const IAudioSourceAttr &attr, DfxAttr &dfxAttr) +{ + BufferDesc buffer = { reinterpret_cast(data), len, len }; + AudioStreamInfo streamInfo(static_cast(attr.sampleRate), AudioEncodingType::ENCODING_PCM, + static_cast(attr.format), static_cast(attr.channel)); + VolumeTools::DfxOperation(buffer, streamInfo, dfxAttr.logUtilsTag_, dfxAttr.volumeDataCount_); + CHECK_AND_RETURN(AudioDump::GetInstance().GetVersionType() == DumpFileUtil::BETA_VERSION); + DumpFileUtil::WriteDumpFile(dfxAttr.dumpFile_, static_cast(data), len); + AudioCacheMgr::GetInstance().CacheData(dfxAttr.dumpFileName_, static_cast(data), len); +} +} // namespace AudioStandard +} // namespace OHOS