diff --git a/frameworks/native/hdiadapter_new/BUILD.gn b/frameworks/native/hdiadapter_new/BUILD.gn index de68690665171224d7c038e702947e1ee5220306..46ce74d7826f543efed828b12fd726bb0a8b9db0 100644 --- a/frameworks/native/hdiadapter_new/BUILD.gn +++ b/frameworks/native/hdiadapter_new/BUILD.gn @@ -66,6 +66,7 @@ ohos_shared_library("hdiadapter_new") { "source/file_audio_capture_source.cpp", "source/wakeup_audio_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 140390d8c761186e0b2cbe356bf6e2661321909d..3fd4006663201fe8f2eaf9846a25c70e596980e0 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 { @@ -108,7 +109,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; 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 43568e05e3d0e4cac8953b3268a9bbbd4624db1b..cf2ae0acd4c216b54574b7da931fe5516b90a7e0 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 { @@ -90,7 +91,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_ = {}; @@ -110,6 +111,9 @@ private: int captureFrameNum_ = 0; FILE *dumpFile_ = nullptr; std::string dumpFileName_ = ""; + // for dfx log + std::string logUtilsTag_ = "RemoteAudioSource"; + mutable int64_t volumeDataCount_ = 0; 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..d9c91f3f7725fccd18446f9160227cf7b68ce9b2 --- /dev/null +++ b/frameworks/native/hdiadapter_new/include/util/hdi_dfx_utils.h @@ -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 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 { +class HdiDfxUtils { +public: + static void PrintVolumeInfo(char *data, uint64_t &len, const IAudioSourceAttr &attr, std::string logUtilsTag, + int64_t volumeDataCount); + static void DumpData(char *data, uint64_t &len, FILE *dumpFile, std::string dumpFileName); +}; +} // 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 c32ed4c20d65a572116ed85f0efacb57e8fed714..9bcdf9933657b305207d7f7c05343deeadc2fa18 100644 --- a/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp +++ b/frameworks/native/hdiadapter_new/source/audio_capture_source.cpp @@ -354,7 +354,8 @@ int32_t AudioCaptureSource::CaptureFrame(char *frame, uint64_t requestBytes, uin } CheckLatencySignal(reinterpret_cast(frame), replyBytes); - DumpData(frame, replyBytes); + HdiDfxUtils::PrintVolumeInfo(frame, replyBytes, attr_, logUtilsTag_, volumeDataCount_); + HdiDfxUtils::DumpData(frame, replyBytes, dumpFile_, dumpFileName_); CheckUpdateState(frame, requestBytes); stamp = (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND; int64_t stampThreshold = 50; // 50ms @@ -398,7 +399,8 @@ 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::PrintVolumeInfo(fdesc->frame, replyBytes, attr_, logUtilsTag_, volumeDataCount_); + HdiDfxUtils::DumpData(fdesc->frame, replyBytes, dumpFile_, dumpFileName_); } } if (frameInfo.frameEc != nullptr) { @@ -1280,18 +1282,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 265b5b7069263cc949873dd0d2d7ad095bdf7b50..d291d1d808dafda375190e07a1e2f3539708aba1 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); @@ -71,9 +72,13 @@ 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_); + 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, dumpFileName_, &dumpFile_); if (!captureInited_.load()) { int32_t ret = CreateCapture(); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_NOT_STARTED, "create capture fail"); @@ -93,6 +98,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 +118,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 +136,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 +154,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 +166,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 +184,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 +192,8 @@ 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::PrintVolumeInfo(frame, replyBytes, attr_, logUtilsTag_, volumeDataCount_); + HdiDfxUtils::DumpData(frame, replyBytes, dumpFile_, dumpFileName_); CheckUpdateState(frame, requestBytes); return SUCCESS; } @@ -408,6 +420,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..53879ba76c07854678a08a434d7d6bd852f0ef62 --- /dev/null +++ b/frameworks/native/hdiadapter_new/util/hdi_dfx_utils.cpp @@ -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 LOG_TAG +#define LOG_TAG "HdiDfxUtils" +#endif + +#include "util/hdi_dfx_utils.h" + +namespace OHOS { +namespace AudioStandard { +void HdiDfxUtils::PrintVolumeInfo(char *data, uint64_t &len, const IAudioSourceAttr &attr, std::string logUtilsTag, + int64_t volumeDataCount) +{ + 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, logUtilsTag, volumeDataCount); +} + +void HdiDfxUtils::DumpData(char *data, uint64_t &len, FILE *dumpFile, std::string dumpFileName) +{ + CHECK_AND_RETURN(AudioDump::GetInstance().GetVersionType() == DumpFileUtil::BETA_VERSION); + DumpFileUtil::WriteDumpFile(dumpFile, static_cast(data), len); + AudioCacheMgr::GetInstance().CacheData(dumpFileName, static_cast(data), len); +} +} // namespace AudioStandard +} // namespace OHOS