From 55c598df50adf0560617116bc9dd8c2a76f64322 Mon Sep 17 00:00:00 2001 From: linyuanpeng Date: Tue, 14 May 2024 21:03:23 +0800 Subject: [PATCH] dfx hidumper and pcm dump for effect Signed-off-by: linyuanpeng --- .../audioeffect/include/audio_effect_chain.h | 3 + .../audioeffect/src/audio_effect_chain.cpp | 38 +++++++++- .../native/audioutils/include/audio_utils.h | 2 +- .../native/audioutils/src/audio_utils.cpp | 3 +- .../server/include/audio_policy_server.h | 1 + .../include/service/audio_policy_service.h | 6 +- .../server/src/audio_policy_server.cpp | 8 ++ .../src/service/audio_policy_service.cpp | 74 ++++++++++++++++++- .../src/audio_spatial_channel_converter.cpp | 1 + 9 files changed, 125 insertions(+), 11 deletions(-) diff --git a/frameworks/native/audioeffect/include/audio_effect_chain.h b/frameworks/native/audioeffect/include/audio_effect_chain.h index 68549edff5..668a26debb 100644 --- a/frameworks/native/audioeffect/include/audio_effect_chain.h +++ b/frameworks/native/audioeffect/include/audio_effect_chain.h @@ -17,6 +17,7 @@ #define AUDIO_EFFECT_CHAIN_H #include "audio_effect.h" +#include "audio_utils.h" #ifdef SENSOR_ENABLE #include "audio_head_tracker.h" @@ -68,6 +69,8 @@ private: AudioEffectConfig ioBufferConfig_; AudioBuffer audioBufIn_; AudioBuffer audioBufOut_; + FILE *dumpFileInput_ = nullptr; + FILE *dumpFileOutput_ = nullptr; #ifdef SENSOR_ENABLE std::shared_ptr headTracker_; diff --git a/frameworks/native/audioeffect/src/audio_effect_chain.cpp b/frameworks/native/audioeffect/src/audio_effect_chain.cpp index 42e0ede725..62c5c0a112 100644 --- a/frameworks/native/audioeffect/src/audio_effect_chain.cpp +++ b/frameworks/native/audioeffect/src/audio_effect_chain.cpp @@ -47,6 +47,16 @@ AudioEffectChain::AudioEffectChain(std::string scene, std::shared_ptr(bufIn), inTotlen); + if (IsEmptyEffectHandles()) { - size_t totlen = frameLen * ioBufferConfig_.outputCfg.channels * sizeof(float); - CHECK_AND_RETURN_LOG(memcpy_s(bufOut, totlen, bufIn, totlen) == 0, "memcpy error in apply effect"); + CHECK_AND_RETURN_LOG(memcpy_s(bufOut, outTotlen, bufIn, outTotlen) == 0, "memcpy error in apply effect"); + DumpFileUtil::WriteDumpFile(dumpFileOutput_, static_cast(bufOut), outTotlen); return; } @@ -245,9 +273,11 @@ void AudioEffectChain::ApplyEffectChain(float *bufIn, float *bufOut, uint32_t fr count++; } if ((count & 1) == 0) { - size_t totlen = frameLen * ioBufferConfig_.outputCfg.channels * sizeof(float); - CHECK_AND_RETURN_LOG(memcpy_s(bufOut, totlen, bufIn, totlen), "memcpy error when last copy"); + CHECK_AND_RETURN_LOG(memcpy_s(bufOut, outTotlen, bufIn, outTotlen) == 0, "memcpy error when last copy"); } + + // dump pcm for bufOut + DumpFileUtil::WriteDumpFile(dumpFileOutput_, static_cast(bufOut), outTotlen); } bool AudioEffectChain::IsEmptyEffectHandles() diff --git a/frameworks/native/audioutils/include/audio_utils.h b/frameworks/native/audioutils/include/audio_utils.h index de2a08f019..f21e171e1e 100644 --- a/frameworks/native/audioutils/include/audio_utils.h +++ b/frameworks/native/audioutils/include/audio_utils.h @@ -141,7 +141,7 @@ enum AudioDumpFileType { AUDIO_PULSE = 2, }; -const std::string DUMP_SERVER_PARA = "sys.audio.dump.writehdi.enable"; +const std::string DUMP_SERVER_PARA = "sys.audio.dump.writeserver.enable"; const std::string DUMP_CLIENT_PARA = "sys.audio.dump.writeclient.enable"; const std::string DUMP_PULSE_DIR = "/data/data/.pulse_dir/"; const std::string DUMP_SERVICE_DIR = "/data/local/tmp/"; diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index 64662aec27..d793227df7 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -587,7 +587,8 @@ void DumpFileUtil::OpenDumpFile(std::string para, std::string fileName, FILE **f if (para == DUMP_SERVER_PARA) { if (fileName == DUMP_BLUETOOTH_RENDER_SINK_FILENAME || fileName == DUMP_RENDER_SINK_FILENAME || - fileName == DUMP_CAPTURER_SOURCE_FILENAME || fileName == DUMP_OFFLOAD_RENDER_SINK_FILENAME) { + fileName == DUMP_CAPTURER_SOURCE_FILENAME || fileName == DUMP_OFFLOAD_RENDER_SINK_FILENAME || + fileName.find("effect") != std::string::npos) { // special name for audio effect *file = DumpFileUtil::OpenDumpFileInner(para, fileName, AUDIO_PULSE); return; } diff --git a/services/audio_policy/server/include/audio_policy_server.h b/services/audio_policy/server/include/audio_policy_server.h index 7428a3e0ca..c6cb8a37be 100644 --- a/services/audio_policy/server/include/audio_policy_server.h +++ b/services/audio_policy/server/include/audio_policy_server.h @@ -397,6 +397,7 @@ public: void AudioStreamDump(std::string &dumpString); void OffloadStatusDump(std::string &dumpString); void XmlParsedDataMapDump(std::string &dumpString); + void EffectManagerInfoDump(std::string &dumpString); protected: void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; diff --git a/services/audio_policy/server/include/service/audio_policy_service.h b/services/audio_policy/server/include/service/audio_policy_service.h index ae218547af..8264437a3f 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -334,7 +334,7 @@ public: std::vector> GetPreferredInputDeviceDescriptors(AudioCapturerInfo &captureInfo, std::string networkId = LOCAL_NETWORK_ID); - void GetEffectManagerInfo(OriginalEffectConfig& oriEffectConfig, std::vector& availableEffects); + void GetEffectManagerInfo(); float GetMinStreamVolume(void); @@ -464,6 +464,7 @@ public: void GetCapturerStreamDump(std::string &dumpString); void GetSafeVolumeDump(std::string &dumpString); void GetOffloadStatusDump(std::string &dumpString); + void EffectManagerInfoDump(std::string &dumpString); std::vector> GetDumpDevices(DeviceFlag deviceFlag); std::vector> GetDumpDeviceInfo(std::string &dumpString, DeviceFlag deviceFlag); bool IsStreamSupported(AudioStreamType streamType); @@ -949,6 +950,9 @@ private: DeviceType priorityOutputDevice_; DeviceType priorityInputDevice_; ConnectType conneceType_; + + SupportedEffectConfig supportedEffectConfig_; + ConverterConfig converterConfig_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/audio_policy_server.cpp b/services/audio_policy/server/src/audio_policy_server.cpp index 64c0e3c519..110b8de8a5 100644 --- a/services/audio_policy/server/src/audio_policy_server.cpp +++ b/services/audio_policy/server/src/audio_policy_server.cpp @@ -1414,6 +1414,7 @@ void AudioPolicyServer::InitPolicyDumpMap() dumpFuncMap[u"-apc"] = &AudioPolicyServer::AudioPolicyParserDump; dumpFuncMap[u"-s"] = &AudioPolicyServer::AudioStreamDump; dumpFuncMap[u"-xp"] = &AudioPolicyServer::XmlParsedDataMapDump; + dumpFuncMap[u"-e"] = &AudioPolicyServer::EffectManagerInfoDump; } void AudioPolicyServer::PolicyDataDump(std::string &dumpString) @@ -1425,6 +1426,7 @@ void AudioPolicyServer::PolicyDataDump(std::string &dumpString) AudioPolicyParserDump(dumpString); AudioStreamDump(dumpString); XmlParsedDataMapDump(dumpString); + EffectManagerInfoDump(dumpString); } void AudioPolicyServer::AudioDevicesDump(std::string &dumpString) @@ -1462,6 +1464,11 @@ void AudioPolicyServer::XmlParsedDataMapDump(std::string &dumpString) audioPolicyService_.XmlParsedDataMapDump(dumpString); } +void AudioPolicyServer::EffectManagerInfoDump(std::string &dumpString) +{ + audioPolicyService_.EffectManagerInfoDump(dumpString); +} + void AudioPolicyServer::ArgInfoDump(std::string &dumpString, std::queue &argQue) { dumpString += "AudioPolicyServer Data Dump:\n\n"; @@ -1498,6 +1505,7 @@ void AudioPolicyServer::InfoDumpHelp(std::string &dumpString) AppendFormat(dumpString, " -apc\t\t\t|dump audio policy config xml parser info\n"); AppendFormat(dumpString, " -s\t\t\t|dump stream info\n"); AppendFormat(dumpString, " -xp\t\t\t|dump xml data map\n"); + AppendFormat(dumpString, " -e\t\t\t|dump audio effect manager Info\n"); } int32_t AudioPolicyServer::GetAudioLatencyFromXml() diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index 1800c87dac..7a928c83c5 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -3810,11 +3810,10 @@ void AudioPolicyService::LoadEffectLibrary() AudioSpatializationService::GetAudioSpatializationService().Init(supportedEffectConfig.effectChains); } -void AudioPolicyService::GetEffectManagerInfo(OriginalEffectConfig& oriEffectConfig, - std::vector& availableEffects) +void AudioPolicyService::GetEffectManagerInfo() { - audioEffectManager_.GetOriginalEffectConfig(oriEffectConfig); - audioEffectManager_.GetAvailableEffects(availableEffects); + converterConfig_ = GetConverterConfig(); + audioEffectManager_.GetSupportedEffectConfig(supportedEffectConfig_); } void AudioPolicyService::AddAudioDevice(AudioModuleInfo& moduleInfo, InternalDeviceType devType) @@ -6459,6 +6458,73 @@ void AudioPolicyService::XmlParsedDataMapDump(std::string &dumpString) } } +static void StreamEffectSceneInfoDump(string &dumpString, const ProcessNew &processNew, const string processType) +{ + int32_t count; + AppendFormat(dumpString, "- %d %s supported :\n", processNew.stream.size(), processType.c_str()); + + for (Stream x : processNew.stream) { + AppendFormat(dumpString, " %s stream scene = %s \n", processType.c_str(), x.scene.c_str()); + count = 0; + for (StreamEffectMode mode : x.streamEffectMode) { + count++; + AppendFormat(dumpString, " - modeName%d = %s \n", count, mode.mode.c_str()); + int32_t n = 0; + for (Device deviceInfo : mode.devicePort) { + n++; + AppendFormat(dumpString, " - device%d type = %s \n", n, deviceInfo.type.c_str()); + AppendFormat(dumpString, " - device%d chain = %s \n", n, deviceInfo.chain.c_str()); + } + } + dumpString += "\n"; + } +} + +void AudioPolicyService::EffectManagerInfoDump(string &dumpString) +{ + int32_t count = 0; + GetEffectManagerInfo(); + GetAudioAdapterInfos(adapterInfoMap_); + + dumpString += "==== Audio Effect Manager INFO ====\n"; + + // effectChain info + count = 0; + AppendFormat(dumpString, "- system support %d effectChain(s):\n", + supportedEffectConfig_.effectChains.size()); + for (EffectChain x : supportedEffectConfig_.effectChains) { + count++; + AppendFormat(dumpString, " effectChain%d :\n", count); + AppendFormat(dumpString, " - effectChain name = %s \n", x.name.c_str()); + int32_t countEffect = 0; + for (string effectUnit : x.apply) { + countEffect++; + AppendFormat(dumpString, " - effectUnit%d = %s \n", countEffect, effectUnit.c_str()); + } + dumpString += "\n"; + } + + // converter info + AppendFormat(dumpString, "- system support audio converter for special streams:\n"); + AppendFormat(dumpString, " - converter name: %s\n", converterConfig_.library.name.c_str()); + AppendFormat(dumpString, " - converter out channel layout: %" PRId64 "\n", + converterConfig_.outChannelLayout); + dumpString += "\n"; + + // preProcess info + StreamEffectSceneInfoDump(dumpString, supportedEffectConfig_.preProcessNew, "preProcess"); + dumpString += "\n"; + // postProcess info + StreamEffectSceneInfoDump(dumpString, supportedEffectConfig_.postProcessNew, "postProcess"); + + // postProcess scene maping + AppendFormat(dumpString, "- postProcess scene maping config:\n"); + for (SceneMappingItem it: supportedEffectConfig_.postProcessSceneMap) { + AppendFormat(dumpString, " - streamUsage: %s = %s \n", it.name.c_str(), it.sceneType.c_str()); + } + dumpString += "\n"; +} + void AudioPolicyService::GetGroupInfoDump(std::string &dumpString) { dumpString += "\nVolume GroupInfo:\n"; diff --git a/services/audio_service/client/src/audio_spatial_channel_converter.cpp b/services/audio_service/client/src/audio_spatial_channel_converter.cpp index 059d0224ff..83035debc8 100644 --- a/services/audio_service/client/src/audio_spatial_channel_converter.cpp +++ b/services/audio_service/client/src/audio_spatial_channel_converter.cpp @@ -198,6 +198,7 @@ bool LibLoader::LoadLibrary(const std::string &relativePath) noexcept libHandle_ = dlopen(absolutePath.c_str(), 1); CHECK_AND_RETURN_RET_LOG(libHandle_, false, " dlopen lib %{public}s Fail", relativePath.c_str()); AUDIO_INFO_LOG(" dlopen lib %{public}s successful", relativePath.c_str()); + dlerror(); // clear error, only need to check libHandle_ is not nullptr AudioEffectLibrary *audioEffectLibHandle = static_cast(dlsym(libHandle_, AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR)); -- Gitee