From 9058f1555fc316b6e997831a489c9461adb58a37 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 10:56:42 +0800 Subject: [PATCH 01/10] add implement Signed-off-by: owenCreeper --- .../include/offline_audio_effect_chain_impl.h | 2 + .../offline_audio_effect_server_chain.h | 28 ++- .../src/offline_audio_effect_chain_impl.cpp | 22 +- .../src/offline_audio_effect_server_chain.cpp | 226 +++++++++++++----- ...offline_audio_effect_manager_unit_test.cpp | 95 +++++--- .../client/src/ipc_offline_stream_proxy.cpp | 2 +- 6 files changed, 266 insertions(+), 109 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h index 0376cf7b06..2de4ce01b2 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h @@ -50,6 +50,8 @@ private: uint8_t *inBufferBase_; uint8_t *outBufferBase_; std::shared_mutex bufferMutex_; + FILE *dumpFileIn_; + FILE *dumpFileOut_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h index 42250fb584..482539623a 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h @@ -35,13 +35,23 @@ namespace OHOS { namespace AudioStandard { using namespace std; + +struct OfflineEffectConfig { + uint32_t samplingRate; + uint32_t channels; + uint32_t format; +}; + +struct OfflineEffectIOConfig { + OfflineEffectConfig inputCfg; + OfflineEffectConfig outputCfg; +}; + class OfflineAudioEffectServerChain { public: OfflineAudioEffectServerChain(const string &chainName); ~OfflineAudioEffectServerChain(); - static int32_t InitEffectModel(); - static int32_t ReleaseEffectModel(); static int32_t GetOfflineAudioEffectChains(vector &chainNamesVector); int32_t Create(); @@ -52,19 +62,19 @@ public: int32_t Release(); private: - int32_t SetDeviceType(const DeviceType deviceType); - int32_t SetRenderStreamUsage(const StreamUsage usage); - int32_t SetCapturerSourceType(const SourceType sourceType); - int32_t Configure(); + void InitDump(); - static struct IEffectModel *model_; - static struct EffectInfo info_; struct IEffectControl *controller_ = nullptr; - struct ControllerId *controllerId_ = nullptr; + struct ControllerId controllerId_ = {}; shared_ptr serverBufferIn_ = nullptr; shared_ptr serverBufferOut_ = nullptr; + uint32_t inBufferSize_ = 0; + uint32_t outBufferSize_ = 0; string chainName_; mutex offlineChainMutex_; + OfflineEffectIOConfig offlineConfig_ = {}; + FILE *dumpFileIn_; + FILE *dumpFileOut_; }; } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp index bf68effe20..6fa2694d0c 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp @@ -22,6 +22,7 @@ #include "audio_errors.h" #include "audio_service_log.h" +#include "audio_utils.h" namespace OHOS { namespace AudioStandard { @@ -37,10 +38,24 @@ OfflineAudioEffectChainImpl::~OfflineAudioEffectChainImpl() Release(); } +void OfflineAudioEffectChainImpl::InitDump() +{ + static int32_t chainId = 0; + std::string dumpFileName = "OfflineEffectClient"; + std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; + std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; + DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpFileInName, &dumpFileIn_); + DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpFileOutName, &dumpFileOut_); + chainId++; +} + int32_t OfflineAudioEffectChainImpl::InitIpcChain() { CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); - return offlineStreamInClient_->CreateOfflineEffectChain(chainName_); + int32_t ret = offlineStreamInClient_->CreateOfflineEffectChain(chainName_); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitIpcChainFailed!"); + InitDump(); + return SUCCESS; } int32_t OfflineAudioEffectChainImpl::Configure(const AudioStreamInfo &inInfo, const AudioStreamInfo &outInfo) @@ -79,12 +94,17 @@ int32_t OfflineAudioEffectChainImpl::Process(uint8_t *inBuffer, int32_t inSize, CHECK_AND_RETURN_RET_LOG(inSize > 0 && inSize <= inBufferSize && outSize > 0 && outSize <= outBufferSize, ERR_INVALID_PARAM, "buffer size invalid"); CHECK_AND_RETURN_RET_LOG(inBuffer && outBuffer, ERR_INVALID_PARAM, "buffer ptr invalid"); + + DumpFileUtil::WriteDumpFile(dumpFileIn_, inBufferBase_, outSize); + int32_t ret = memcpy_s(inBufferBase_, inBufferSize, inBuffer, inSize); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "memcpy inbuffer failed"); ret = offlineStreamInClient_->ProcessOfflineEffectChain(inSize, outSize); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "process effect failed"); ret = memcpy_s(outBuffer, outSize, outBufferBase_, outSize); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "memcpy outBuffer failed"); + + DumpFileUtil::WriteDumpFile(dumpFileOut_, outBufferBase_, outSize); return SUCCESS; } diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp index 23ad7e3fa7..bea5272716 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp @@ -20,101 +20,186 @@ #include #include +#include #include #include -#include +#include +#include #include #include "securec.h" #include "audio_common_log.h" #include "audio_errors.h" +#include "audio_utils.h" using namespace OHOS::AudioStandard; namespace OHOS { namespace AudioStandard { namespace { - constexpr size_t DEFAULT_BUFFER_SIZE = 7680 * 2; - constexpr uint32_t SEND_COMMAND_LEN = 10; - constexpr uint32_t GET_BUFFER_LEN = 10; - static const std::string LIBNAME = "offline_record_algo"; - static const std::string UUID = "a953e8d6-fb7c-4684-9dc2-78be1a995bb2"; +constexpr uint32_t MAX_DESCRIPTOR_NUM = 20; +constexpr uint32_t MAX_CMD_LEN = 10; +constexpr uint32_t MAX_REPLY_LEN = 10; +constexpr uint32_t MAX_TIME_INTERVAL = 160; // ms +// key for effectName, value for (libName, effectId) +static std::map> g_chainName2infoMap; +static std::mutex g_chainMutex; } -struct IEffectModel *OfflineAudioEffectServerChain::model_; -struct EffectInfo OfflineAudioEffectServerChain::info_; +template +static inline void FreeIfNotNull(T*& ptr) { + if (ptr != nullptr) { + free(ptr); + ptr = nullptr; + } +} + +static inline int32_t GetByteSize(AudioSampleFormat format) { + static const std::unordered_map sizeMap = { + {SAMPLE_U8, 1}, + {SAMPLE_S16LE, 2}, + {SAMPLE_S24LE, 3}, + {SAMPLE_S32LE, 4}, + {SAMPLE_F32LE, 4} + }; + + auto it = sizeMap.find(format); + return (it != sizeMap.end()) ? it->second : 2; // Default size is 2 +} OfflineAudioEffectServerChain::OfflineAudioEffectServerChain(const std::string &chainName) : chainName_(chainName) {} OfflineAudioEffectServerChain::~OfflineAudioEffectServerChain() { - controller_ = nullptr; - controllerId_ = nullptr; + if (controller_) { + Release(); + } + FreeIfNotNull(controllerId_.libName); + FreeIfNotNull(controllerId_.effectId); serverBufferIn_ = nullptr; serverBufferOut_ = nullptr; } - -int32_t OfflineAudioEffectServerChain::InitEffectModel() + +static struct IEffectModel *InitEffectModel() { - model_ = IEffectModelGet(false); - info_.libName = strdup(LIBNAME.c_str()); - info_.effectId = strdup(UUID.c_str()); - info_.ioDirection = 1; - return SUCCESS; + static struct IEffectModel *effectModel = IEffectModelGet(false); + return effectModel; } -int32_t OfflineAudioEffectServerChain::ReleaseEffectModel() +static void InitControllerDescriptor() { - if (info_.libName != nullptr) { - free(info_.libName); - } - if (info_.effectId != nullptr) { - free(info_.effectId); + std::lock_guard maplock(g_chainMutex); + if (g_chainName2infoMap.size() > 0) { + return; } - if (model_ != nullptr) { - IEffectModelRelease(model_, false); + static uint32_t descsLen = MAX_DESCRIPTOR_NUM; + auto model = InitEffectModel(); + CHECK_AND_RETURN_LOG(model, "get all descriptor failed, effectmodel is nullptr"); + struct EffectControllerDescriptor descs[MAX_DESCRIPTOR_NUM]; + int32_t ret = model->GetAllEffectDescriptors(model, descs, &descsLen); + CHECK_AND_RETURN_LOG(model, "get all descriptor failed, errCode is %{public}d", ret); + for (uint32_t i = 0; i < descsLen; i++) { + g_chainName2infoMap.insert_or_assign(descs[i].effectName, + std::make_pair(std::string(descs[i].libName), std::string(descs[i].effectId))); + FreeIfNotNull(descs[i].effectName); + FreeIfNotNull(descs[i].libName); + FreeIfNotNull(descs[i].effectId); + FreeIfNotNull(descs[i].supplier); } - return SUCCESS; +} + +void OfflineAudioEffectServerChain::InitDump() +{ + static int32_t chainId = 0; + std::string dumpFileName = "OfflineEffectServer"; + std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; + std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; + DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, dumpFileInName, &dumpFileIn_); + DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, dumpFileOutName, &dumpFileOut_); + chainId++; } int32_t OfflineAudioEffectServerChain::GetOfflineAudioEffectChains(std::vector &chainNamesVector) { + InitControllerDescriptor(); + std::lock_guard maplock(g_chainMutex); + for (auto item : g_chainName2infoMap) { + chainNamesVector.emplace_back(item.first); + } AUDIO_INFO_LOG("GetOfflineAudioEffectChains done"); return SUCCESS; } int32_t OfflineAudioEffectServerChain::Create() { - AUDIO_INFO_LOG("Create %{public}s done", chainName_.c_str()); - return SUCCESS; -} + InitControllerDescriptor(); + std::lock_guard maplock(g_chainMutex); + auto mapIter = g_chainName2infoMap.find(chainName_); + CHECK_AND_RETURN_RET_LOG(mapIter != g_chainName2infoMap.end(), ERROR, + "create failed, no chain named %{public}s", chainName_.c_str()); + auto model = InitEffectModel(); + CHECK_AND_RETURN_RET_LOG(model, ERROR, "create failed, effectmodel is nullptr"); -int32_t OfflineAudioEffectServerChain::Configure() -{ - int8_t input[SEND_COMMAND_LEN] = {0}; - int8_t output[GET_BUFFER_LEN] = {0}; - uint32_t replyLen = GET_BUFFER_LEN; + // second.first for libName, second.second for effectId, 1 for ioDirection + // do not need to release char* in info + struct EffectInfo info = {&mapIter->second.first[0], &mapIter->second.second[0], 1}; - int32_t ret = controller_->SendCommand(controller_, AUDIO_EFFECT_COMMAND_SET_CONFIG, - input, SEND_COMMAND_LEN, output, &replyLen); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "send command AUDIO_EFFECT_COMMAND_SET_CONFIG failed"); + int32_t ret = model->CreateEffectController(model, &info, &controller_, &controllerId_); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, + "create %{public}s effect controller failed, errCode is %{public}d", chainName_.c_str(), ret); + + int8_t input[MAX_CMD_LEN] = {0}; + int8_t output[MAX_REPLY_LEN] = {0}; + uint32_t replyLen = MAX_REPLY_LEN; + + std::lock_guard lock(offlineChainMutex_); + CHECK_AND_RETURN_RET_LOG(controller_, ERROR, "enable failed, controller is nullptr"); + ret = controller_->SendCommand(controller_, AUDIO_EFFECT_COMMAND_ENABLE, + static_cast(input), MAX_CMD_LEN, output, &replyLen); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, + "%{public}s effect COMMAND_ENABLE failed, errCode is %{public}d", chainName_.c_str(), ret); + + InitDump(); + + AUDIO_INFO_LOG("Create %{public}s done", chainName_.c_str()); return SUCCESS; } int32_t OfflineAudioEffectServerChain::SetParam(AudioStreamInfo inInfo, AudioStreamInfo outInfo) { - AUDIO_INFO_LOG("%{public}d %{public}d %{public}hhu %{public}hhu %{public}" PRIu64 "StreamInfo set", + AUDIO_INFO_LOG("%{public}d %{public}d %{public}hhu %{public}hhu %{public}" PRIu64 " InStreamInfo set", inInfo.samplingRate, inInfo.encoding, inInfo.format, inInfo.channels, inInfo.channelLayout); - AUDIO_INFO_LOG("%{public}d %{public}d %{public}hhu %{public}hhu %{public}" PRIu64 "StreamInfo set", + AUDIO_INFO_LOG("%{public}d %{public}d %{public}hhu %{public}hhu %{public}" PRIu64 " OutStreamInfo set", outInfo.samplingRate, outInfo.encoding, outInfo.format, outInfo.channels, outInfo.channelLayout); + + offlineConfig_.inputCfg = {inInfo.samplingRate, inInfo.channels, inInfo.format}; + offlineConfig_.outputCfg = {outInfo.samplingRate, outInfo.channels, outInfo.format}; + + int8_t output[MAX_REPLY_LEN] = {0}; + uint32_t replyLen = MAX_REPLY_LEN; + + std::lock_guard lock(offlineChainMutex_); + CHECK_AND_RETURN_RET_LOG(controller_, ERROR, "configure failed, controller is nullptr"); + int32_t ret = controller_->SendCommand(controller_, AUDIO_EFFECT_COMMAND_SET_CONFIG, + reinterpret_cast(&offlineConfig_), sizeof(offlineConfig_), output, &replyLen); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, + "%{public}s effect COMMAND_SET_CONFIG failed, errCode is %{public}d", chainName_.c_str(), ret); + + inBufferSize_ = GetByteSize(inInfo.format) * inInfo.samplingRate * inInfo.channels * + MAX_TIME_INTERVAL / AUDIO_MS_PER_SECOND; + outBufferSize_ = GetByteSize(outInfo.format) * outInfo.samplingRate * outInfo.channels * + MAX_TIME_INTERVAL / AUDIO_MS_PER_SECOND; return SUCCESS; } int32_t OfflineAudioEffectServerChain::GetEffectBufferSize(uint32_t &inBufferSize, uint32_t &outBufferSize) { - inBufferSize = DEFAULT_BUFFER_SIZE; - outBufferSize = DEFAULT_BUFFER_SIZE; - AUDIO_INFO_LOG("GetEffectBufferSize in server done"); + CHECK_AND_RETURN_RET_LOG(inBufferSize_ != 0, ERROR, "inBufferSize_ do not init"); + CHECK_AND_RETURN_RET_LOG(outBufferSize_ != 0, ERROR, "inBufferSize_ do not init"); + inBufferSize = inBufferSize_; + outBufferSize = outBufferSize_; + AUDIO_INFO_LOG("GetEffectBufferSize in server done, inBufferSize_:%{public}u inBufferSize_:%{public}u", + inBufferSize_, outBufferSize_); return SUCCESS; } @@ -129,35 +214,48 @@ int32_t OfflineAudioEffectServerChain::Prepare(const std::shared_ptrGetSize() && outSize <= serverBufferOut_->GetSize(), - ERR_INVALID_PARAM, "inSize %{public}u or outSize %{public}u out of range", inSize, outSize); - uint8_t *bufIn = serverBufferIn_->GetBase(); - uint8_t *bufOut = serverBufferOut_->GetBase(); - for (uint32_t i = 0; i < outSize; i++) { - bufOut[i] = bufIn[i] << 1; - } - AUDIO_INFO_LOG("Process in server done"); - return SUCCESS; -} + CHECK_AND_RETURN_RET_LOG(serverBufferIn_ && serverBufferIn_->GetBase(), ERROR, "serverBufferIn_ is nullptr"); + CHECK_AND_RETURN_RET_LOG(serverBufferOut_ && serverBufferOut_->GetBase(), ERROR, "serverBufferOut_ is nullptr"); -int32_t OfflineAudioEffectServerChain::Release() -{ - AUDIO_INFO_LOG("Release in server success"); - return SUCCESS; -} + CHECK_AND_RETURN_RET_LOG(inSize <= inBufferSize_, ERROR, + "inSize %{public}u > serverInBufferSize %{public}u", inSize, inBufferSize_); + CHECK_AND_RETURN_RET_LOG(outSize <= outBufferSize_, ERROR, + "outSize %{public}u > serverOutBufferSize %{public}u", outSize, outBufferSize_); -int32_t OfflineAudioEffectServerChain::SetDeviceType(const DeviceType deviceType) -{ - return SUCCESS; -} + DumpFileUtil::WriteDumpFile(dumpFileIn_, serverBufferIn_->GetBase(), inSize); -int32_t OfflineAudioEffectServerChain::SetRenderStreamUsage(const StreamUsage usage) -{ + struct AudioEffectBuffer input; + struct AudioEffectBuffer output; + + input = {inSize / GetFormatByteSize(offlineConfig_.inputCfg.format), + GetFormatByteSize(offlineConfig_.inputCfg.format), + reinterpret_cast(serverBufferIn_->GetBase()), inSize}; + output = {}; + + std::lock_guard lock(offlineChainMutex_); + CHECK_AND_RETURN_RET_LOG(controller_, ERROR, "process failed, controller is nullptr"); + int32_t ret = controller_->EffectProcess(controller_, &input, &output); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "EffectProcess failed ret:%{public}d", ret); + ret = memcpy_s(reinterpret_cast(serverBufferOut_->GetBase()), outSize, + output.rawData, output.frameCount * GetFormatByteSize(offlineConfig_.outputCfg.format)); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "memcpy failed, ret:%{public}d", ret); + + DumpFileUtil::WriteDumpFile(dumpFileOut_, serverBufferOut_->GetBase(), outSize); return SUCCESS; } -int32_t OfflineAudioEffectServerChain::SetCapturerSourceType(const SourceType sourceType) +int32_t OfflineAudioEffectServerChain::Release() { + auto model = InitEffectModel(); + CHECK_AND_RETURN_RET_LOG(model, ERROR, "model is nullptr"); + + std::lock_guard lock(offlineChainMutex_); + int32_t ret = model->DestroyEffectController(model, &controllerId_); + controller_ = nullptr; + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, + "chainId:%{public}s release failed, errCode is %{public}d", controllerId_.effectId, ret); + + AUDIO_INFO_LOG("Release in server success"); return SUCCESS; } } // namespace AudioStandard diff --git a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp index 9d47ad76ca..8291616a03 100644 --- a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp +++ b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp @@ -25,7 +25,8 @@ using namespace std; namespace OHOS { namespace AudioStandard { namespace { - const std::string NORMAL_CHAIN_NAME = "abcdefg"; + const std::string INVALID_EFFECT_NAME = "0d000721"; + constexpr AudioStreamInfo NORMAL_STREAM_INFO( AudioSamplingRate::SAMPLE_RATE_48000, AudioEncodingType::ENCODING_PCM, AudioSampleFormat::SAMPLE_S16LE, AudioChannel::STEREO, AudioChannelLayout::CH_LAYOUT_STEREO); @@ -53,21 +54,27 @@ protected: shared_ptr chain_ = nullptr; }; -shared_ptr manager_ = nullptr; +shared_ptr g_manager = nullptr; +string g_normalName = ""; void OfflineAudioEffectChainUnitTest::SetUpTestCase(void) { - manager_ = make_shared(); + g_manager = make_shared(); + vector names; + names = g_manager->GetOfflineAudioEffectChains(); + if (names.size() > 0) { + g_normalName = names[0]; + } } void OfflineAudioEffectChainUnitTest::TearDownTestCase(void) { - manager_ = nullptr; + g_manager = nullptr; } void OfflineAudioEffectChainUnitTest::SetUp(void) { - chain_ = manager_->CreateOfflineAudioEffectChain(NORMAL_CHAIN_NAME); + chain_ = g_manager->CreateOfflineAudioEffectChain(g_normalName); } void OfflineAudioEffectChainUnitTest::TearDown(void) @@ -81,10 +88,10 @@ void OfflineAudioEffectChainUnitTest::TearDown(void) /** * @tc.name : Test GetOfflineAudioEffectChains API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectManager_001 + * @tc.number: OfflineAudioEffectg_manager001 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_001, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager001, TestSize.Level1) { auto manager = make_shared(); EXPECT_NE(nullptr, manager); @@ -94,14 +101,31 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_001, TestSiz /** * @tc.name : Test CreateOfflineAudioEffectChain API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectManager_002 + * @tc.number: OfflineAudioEffectg_manager002 + * @tc.desc : Test OfflineAudioEffectManager interface. + */ +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager002, TestSize.Level1) +{ + auto manager = make_shared(); + auto chain = manager->CreateOfflineAudioEffectChain(g_normalName); + if (g_normalName == "") { + EXPECT_EQ(nullptr, chain); + } else { + EXPECT_NE(nullptr, chain); + } +} + +/** + * @tc.name : Test CreateOfflineAudioEffectChain API + * @tc.type : FUNC + * @tc.number: OfflineAudioEffectg_manager003 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_002, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager003, TestSize.Level1) { auto manager = make_shared(); - auto chain = manager->CreateOfflineAudioEffectChain(NORMAL_CHAIN_NAME); - EXPECT_NE(nullptr, chain); + auto chain = manager->CreateOfflineAudioEffectChain(INVALID_EFFECT_NAME); + EXPECT_EQ(nullptr, chain); } /** @@ -112,9 +136,10 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_002, TestSiz */ HWTEST_F(OfflineAudioEffectChainUnitTest, OfflineAudioEffectChain_001, TestSize.Level1) { - EXPECT_NE(nullptr, chain_); - int32_t ret = chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO); - EXPECT_EQ(SUCCESS, ret); + if (chain_) { + int32_t ret = chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO); + EXPECT_EQ(SUCCESS, ret); + } } /** @@ -125,9 +150,10 @@ HWTEST_F(OfflineAudioEffectChainUnitTest, OfflineAudioEffectChain_001, TestSize. */ HWTEST_F(OfflineAudioEffectChainUnitTest, OfflineAudioEffectChain_002, TestSize.Level1) { - EXPECT_NE(nullptr, chain_); - EXPECT_EQ(SUCCESS, chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO)); - EXPECT_EQ(SUCCESS, chain_->Prepare()); + if (chain_) { + EXPECT_EQ(SUCCESS, chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO)); + EXPECT_EQ(SUCCESS, chain_->Prepare()); + } } /** @@ -140,24 +166,25 @@ HWTEST_F(OfflineAudioEffectChainUnitTest, OfflineAudioEffectChain_003, TestSize. { uint32_t inSize = 0; uint32_t outSize = 0; - EXPECT_NE(nullptr, chain_); - EXPECT_EQ(SUCCESS, chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO)); - EXPECT_EQ(SUCCESS, chain_->Prepare()); - EXPECT_EQ(SUCCESS, chain_->GetEffectBufferSize(inSize, outSize)); - EXPECT_GT(inSize, 0); - EXPECT_GT(outSize, 0); - uint8_t *inBuffer = new uint8_t[inSize]; - uint8_t *outBuffer = new uint8_t[outSize]; - for (uint32_t i = 0; i < inSize; i++) { - inBuffer[i] = 1; + if (chain_) { + EXPECT_EQ(SUCCESS, chain_->Configure(NORMAL_STREAM_INFO, NORMAL_STREAM_INFO)); + EXPECT_EQ(SUCCESS, chain_->Prepare()); + EXPECT_EQ(SUCCESS, chain_->GetEffectBufferSize(inSize, outSize)); + EXPECT_GT(inSize, 0); + EXPECT_GT(outSize, 0); + uint8_t *inBuffer = new uint8_t[inSize]; + uint8_t *outBuffer = new uint8_t[outSize]; + for (uint32_t i = 0; i < inSize; i++) { + inBuffer[i] = 1; + } + EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(nullptr, inSize, outBuffer, outSize)); + EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize + 1, outBuffer, outSize)); + EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize, nullptr, outSize)); + EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize, outBuffer, outSize + 1)); + EXPECT_EQ(SUCCESS, chain_->Process(inBuffer, inSize, outBuffer, outSize)); + delete []inBuffer; + delete []outBuffer; } - EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(nullptr, inSize, outBuffer, outSize)); - EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize + 1, outBuffer, outSize)); - EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize, nullptr, outSize)); - EXPECT_EQ(ERR_INVALID_PARAM, chain_->Process(inBuffer, inSize, outBuffer, outSize + 1)); - EXPECT_EQ(SUCCESS, chain_->Process(inBuffer, inSize, outBuffer, outSize)); - delete []inBuffer; - delete []outBuffer; } } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/client/src/ipc_offline_stream_proxy.cpp b/services/audio_service/client/src/ipc_offline_stream_proxy.cpp index 74b8f01b73..dd878a00c6 100644 --- a/services/audio_service/client/src/ipc_offline_stream_proxy.cpp +++ b/services/audio_service/client/src/ipc_offline_stream_proxy.cpp @@ -35,7 +35,7 @@ int32_t IpcOfflineStreamProxy::CreateOfflineEffectChain(const std::string &chain MessageOption option; CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(GetDescriptor()), ERROR, "Write descriptor failed!"); - + data.WriteString(chainName); int ret = Remote()->SendRequest(IpcOfflineStreamMsg::CREATE_OFFLINE_EFFECT_CHAIN, data, reply, option); CHECK_AND_RETURN_RET_LOG(ret == AUDIO_OK, ERR_OPERATION_FAILED, "Create failed, error: %{public}d", ret); -- Gitee From 8ee49a69812a7d1f79d21c9ca29c806b8ffb001d Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 11:13:39 +0800 Subject: [PATCH 02/10] fix compile Signed-off-by: owenCreeper --- .../include/offline_audio_effect_chain_impl.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h index 2de4ce01b2..68ee9ddea9 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h @@ -43,6 +43,8 @@ public: int32_t InitIpcChain(); private: + void InitDump(); + std::string chainName_; std::shared_ptr offlineStreamInClient_; std::shared_ptr clientBufferIn_; -- Gitee From 92a9bb4d3e72b141903c52050ab02ce24ecf1a25 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 11:19:57 +0800 Subject: [PATCH 03/10] coding style Signed-off-by: owenCreeper --- .../src/offline_audio_effect_server_chain.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp index bea5272716..b294859509 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp @@ -47,14 +47,16 @@ static std::mutex g_chainMutex; } template -static inline void FreeIfNotNull(T*& ptr) { +static inline void FreeIfNotNull(T*& ptr) +{ if (ptr != nullptr) { free(ptr); ptr = nullptr; } } -static inline int32_t GetByteSize(AudioSampleFormat format) { +static inline int32_t GetByteSize(AudioSampleFormat format) +{ static const std::unordered_map sizeMap = { {SAMPLE_U8, 1}, {SAMPLE_S16LE, 2}, -- Gitee From 6a495e83ccb2af9cc3a3159d115c0db2306e5226 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 11:27:31 +0800 Subject: [PATCH 04/10] fix comment Signed-off-by: owenCreeper --- .../offline_audio_effect_manager_unit_test.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp index 8291616a03..0a2b46eff0 100644 --- a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp +++ b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp @@ -88,10 +88,10 @@ void OfflineAudioEffectChainUnitTest::TearDown(void) /** * @tc.name : Test GetOfflineAudioEffectChains API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectg_manager001 + * @tc.number: OfflineAudioEffectManager001 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager001, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager001, TestSize.Level1) { auto manager = make_shared(); EXPECT_NE(nullptr, manager); @@ -101,10 +101,10 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager001, TestSi /** * @tc.name : Test CreateOfflineAudioEffectChain API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectg_manager002 + * @tc.number: OfflineAudioEffectManager002 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager002, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager002, TestSize.Level1) { auto manager = make_shared(); auto chain = manager->CreateOfflineAudioEffectChain(g_normalName); @@ -118,10 +118,10 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager002, TestSi /** * @tc.name : Test CreateOfflineAudioEffectChain API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectg_manager003 + * @tc.number: OfflineAudioEffectManager003 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectg_manager003, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager003, TestSize.Level1) { auto manager = make_shared(); auto chain = manager->CreateOfflineAudioEffectChain(INVALID_EFFECT_NAME); -- Gitee From 8cba14c681b2e2b09dccbdd34766ef7c26369be9 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 11:28:58 +0800 Subject: [PATCH 05/10] fix ut name Signed-off-by: owenCreeper --- .../unittest/offline_audio_effect_manager_unit_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp index 0a2b46eff0..01a1609510 100644 --- a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp +++ b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp @@ -91,7 +91,7 @@ void OfflineAudioEffectChainUnitTest::TearDown(void) * @tc.number: OfflineAudioEffectManager001 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager001, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_001, TestSize.Level1) { auto manager = make_shared(); EXPECT_NE(nullptr, manager); @@ -104,7 +104,7 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager001, TestSize * @tc.number: OfflineAudioEffectManager002 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager002, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_002, TestSize.Level1) { auto manager = make_shared(); auto chain = manager->CreateOfflineAudioEffectChain(g_normalName); @@ -121,7 +121,7 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager002, TestSize * @tc.number: OfflineAudioEffectManager003 * @tc.desc : Test OfflineAudioEffectManager interface. */ -HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager003, TestSize.Level1) +HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_003, TestSize.Level1) { auto manager = make_shared(); auto chain = manager->CreateOfflineAudioEffectChain(INVALID_EFFECT_NAME); -- Gitee From e22d7557435bab482366e312727aa6c2e6b0f5e8 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 12:00:02 +0800 Subject: [PATCH 06/10] add mutex Signed-off-by: owenCreeper --- .../include/offline_audio_effect_chain_impl.h | 2 +- .../src/offline_audio_effect_chain_impl.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h index 68ee9ddea9..16ce97e872 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h @@ -51,7 +51,7 @@ private: std::shared_ptr clientBufferOut_; uint8_t *inBufferBase_; uint8_t *outBufferBase_; - std::shared_mutex bufferMutex_; + std::mutex streamClientMutex_; FILE *dumpFileIn_; FILE *dumpFileOut_; }; diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp index 6fa2694d0c..f551e68dc5 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp @@ -51,6 +51,7 @@ void OfflineAudioEffectChainImpl::InitDump() int32_t OfflineAudioEffectChainImpl::InitIpcChain() { + std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); int32_t ret = offlineStreamInClient_->CreateOfflineEffectChain(chainName_); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitIpcChainFailed!"); @@ -60,13 +61,14 @@ int32_t OfflineAudioEffectChainImpl::InitIpcChain() int32_t OfflineAudioEffectChainImpl::Configure(const AudioStreamInfo &inInfo, const AudioStreamInfo &outInfo) { + std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); return offlineStreamInClient_->ConfigureOfflineEffectChain(inInfo, outInfo); } int32_t OfflineAudioEffectChainImpl::GetEffectBufferSize(uint32_t &inBufferSize, uint32_t &outBufferSize) { - std::shared_lock lock(bufferMutex_); + std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(clientBufferIn_ && clientBufferOut_, ERR_ILLEGAL_STATE, "buffer not prepared"); inBufferSize = clientBufferIn_->GetSize(); outBufferSize = clientBufferOut_->GetSize(); @@ -75,8 +77,8 @@ int32_t OfflineAudioEffectChainImpl::GetEffectBufferSize(uint32_t &inBufferSize, int32_t OfflineAudioEffectChainImpl::Prepare() { + std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); - std::lock_guard lock(bufferMutex_); int32_t ret = offlineStreamInClient_->PrepareOfflineEffectChain(clientBufferIn_, clientBufferOut_); inBufferBase_ = clientBufferIn_->GetBase(); outBufferBase_ = clientBufferOut_->GetBase(); @@ -85,8 +87,8 @@ int32_t OfflineAudioEffectChainImpl::Prepare() int32_t OfflineAudioEffectChainImpl::Process(uint8_t *inBuffer, int32_t inSize, uint8_t *outBuffer, int32_t outSize) { + std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); - std::lock_guard lock(bufferMutex_); CHECK_AND_RETURN_RET_LOG(inBufferBase_ && outBufferBase_ && clientBufferIn_ && clientBufferOut_, ERR_ILLEGAL_STATE, "buffer not prepared"); int32_t inBufferSize = clientBufferIn_->GetSize(); @@ -110,7 +112,7 @@ int32_t OfflineAudioEffectChainImpl::Process(uint8_t *inBuffer, int32_t inSize, void OfflineAudioEffectChainImpl::Release() { - std::lock_guard lock(bufferMutex_); + std::lock_guard lock(streamClientMutex_); clientBufferIn_ = nullptr; clientBufferOut_ = nullptr; inBufferBase_ = nullptr; -- Gitee From ce882655ab8622d1aa117aaf6ad0d1c5e760700b Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 12:00:46 +0800 Subject: [PATCH 07/10] adjust release order Signed-off-by: owenCreeper --- .../src/offline_audio_effect_chain_impl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp index f551e68dc5..e17bb9e298 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp @@ -113,14 +113,14 @@ int32_t OfflineAudioEffectChainImpl::Process(uint8_t *inBuffer, int32_t inSize, void OfflineAudioEffectChainImpl::Release() { std::lock_guard lock(streamClientMutex_); - clientBufferIn_ = nullptr; - clientBufferOut_ = nullptr; - inBufferBase_ = nullptr; - outBufferBase_ = nullptr; if (offlineStreamInClient_ != nullptr) { offlineStreamInClient_->ReleaseOfflineEffectChain(); offlineStreamInClient_ = nullptr; } + inBufferBase_ = nullptr; + outBufferBase_ = nullptr; + clientBufferIn_ = nullptr; + clientBufferOut_ = nullptr; } } // namespace AudioStandard } // namespace OHOS -- Gitee From 39f36107d6b718aa4e57d4e1fce2fb91f2d86650 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 12:32:23 +0800 Subject: [PATCH 08/10] fix bugs Signed-off-by: owenCreeper --- .../include/offline_audio_effect_chain_impl.h | 2 +- .../src/offline_audio_effect_chain_impl.cpp | 10 +++++----- .../src/offline_audio_effect_manager.cpp | 2 +- .../src/offline_audio_effect_server_chain.cpp | 13 +++++++------ .../offline_audio_effect_manager_unit_test.cpp | 6 +++--- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h index 16ce97e872..39a8f855b2 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h @@ -41,7 +41,7 @@ public: ~OfflineAudioEffectChainImpl(); - int32_t InitIpcChain(); + int32_t CreateEffectChain(); private: void InitDump(); diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp index e17bb9e298..936e972dc7 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp @@ -40,16 +40,16 @@ OfflineAudioEffectChainImpl::~OfflineAudioEffectChainImpl() void OfflineAudioEffectChainImpl::InitDump() { - static int32_t chainId = 0; + static uint32_t chainId = 0; std::string dumpFileName = "OfflineEffectClient"; - std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; - std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; + std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; + std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpFileInName, &dumpFileIn_); DumpFileUtil::OpenDumpFile(DUMP_CLIENT_PARA, dumpFileOutName, &dumpFileOut_); chainId++; } -int32_t OfflineAudioEffectChainImpl::InitIpcChain() +int32_t OfflineAudioEffectChainImpl::CreateEffectChain() { std::lock_guard lock(streamClientMutex_); CHECK_AND_RETURN_RET_LOG(offlineStreamInClient_, ERR_ILLEGAL_STATE, "offline stream is null!"); @@ -97,7 +97,7 @@ int32_t OfflineAudioEffectChainImpl::Process(uint8_t *inBuffer, int32_t inSize, ERR_INVALID_PARAM, "buffer size invalid"); CHECK_AND_RETURN_RET_LOG(inBuffer && outBuffer, ERR_INVALID_PARAM, "buffer ptr invalid"); - DumpFileUtil::WriteDumpFile(dumpFileIn_, inBufferBase_, outSize); + DumpFileUtil::WriteDumpFile(dumpFileIn_, inBufferBase_, inSize); int32_t ret = memcpy_s(inBufferBase_, inBufferSize, inBuffer, inSize); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "memcpy inbuffer failed"); diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_manager.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_manager.cpp index f34d96ce51..6112401d1b 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_manager.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_manager.cpp @@ -38,7 +38,7 @@ std::unique_ptr OfflineAudioEffectManager::CreateOfflin const std::string &chainName) { std::unique_ptr chain = std::make_unique(chainName); - int32_t ret = chain->InitIpcChain(); + int32_t ret = chain->CreateEffectChain(); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, nullptr, "create OfflineEffectChain failed, errcode is %{public}d", ret); return chain; } diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp index b294859509..737c66142b 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp @@ -40,7 +40,7 @@ namespace { constexpr uint32_t MAX_DESCRIPTOR_NUM = 20; constexpr uint32_t MAX_CMD_LEN = 10; constexpr uint32_t MAX_REPLY_LEN = 10; -constexpr uint32_t MAX_TIME_INTERVAL = 160; // ms +constexpr uint32_t MAX_TIME_INTERVAL_MS = 160; // ms // key for effectName, value for (libName, effectId) static std::map> g_chainName2infoMap; static std::mutex g_chainMutex; @@ -112,10 +112,10 @@ static void InitControllerDescriptor() void OfflineAudioEffectServerChain::InitDump() { - static int32_t chainId = 0; + static uint32_t chainId = 0; std::string dumpFileName = "OfflineEffectServer"; - std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; - std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; + std::string dumpFileInName = dumpFileName + "_" + std::to_string(chainId) + "_In.pcm"; + std::string dumpFileOutName = dumpFileName + "_" + std::to_string(chainId) + "_Out.pcm"; DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, dumpFileInName, &dumpFileIn_); DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, dumpFileOutName, &dumpFileOut_); chainId++; @@ -188,9 +188,9 @@ int32_t OfflineAudioEffectServerChain::SetParam(AudioStreamInfo inInfo, AudioStr "%{public}s effect COMMAND_SET_CONFIG failed, errCode is %{public}d", chainName_.c_str(), ret); inBufferSize_ = GetByteSize(inInfo.format) * inInfo.samplingRate * inInfo.channels * - MAX_TIME_INTERVAL / AUDIO_MS_PER_SECOND; + MAX_TIME_INTERVAL_MS / AUDIO_MS_PER_SECOND; outBufferSize_ = GetByteSize(outInfo.format) * outInfo.samplingRate * outInfo.channels * - MAX_TIME_INTERVAL / AUDIO_MS_PER_SECOND; + MAX_TIME_INTERVAL_MS / AUDIO_MS_PER_SECOND; return SUCCESS; } @@ -241,6 +241,7 @@ int32_t OfflineAudioEffectServerChain::Process(uint32_t inSize, uint32_t outSize ret = memcpy_s(reinterpret_cast(serverBufferOut_->GetBase()), outSize, output.rawData, output.frameCount * GetFormatByteSize(offlineConfig_.outputCfg.format)); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "memcpy failed, ret:%{public}d", ret); + FreeIfNotNull(output.rawData); DumpFileUtil::WriteDumpFile(dumpFileOut_, serverBufferOut_->GetBase(), outSize); return SUCCESS; diff --git a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp index 01a1609510..1fab9ec57a 100644 --- a/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp +++ b/frameworks/native/offlineaudioeffect/test/unittest/offline_audio_effect_manager_unit_test.cpp @@ -88,7 +88,7 @@ void OfflineAudioEffectChainUnitTest::TearDown(void) /** * @tc.name : Test GetOfflineAudioEffectChains API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectManager001 + * @tc.number: OfflineAudioEffectManager_001 * @tc.desc : Test OfflineAudioEffectManager interface. */ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_001, TestSize.Level1) @@ -101,7 +101,7 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_001, TestSiz /** * @tc.name : Test CreateOfflineAudioEffectChain API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectManager002 + * @tc.number: OfflineAudioEffectManager_002 * @tc.desc : Test OfflineAudioEffectManager interface. */ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_002, TestSize.Level1) @@ -118,7 +118,7 @@ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_002, TestSiz /** * @tc.name : Test CreateOfflineAudioEffectChain API * @tc.type : FUNC - * @tc.number: OfflineAudioEffectManager003 + * @tc.number: OfflineAudioEffectManager_003 * @tc.desc : Test OfflineAudioEffectManager interface. */ HWTEST(OfflineAudioEffectManagerUnitTest, OfflineAudioEffectManager_003, TestSize.Level1) -- Gitee From 5504b509194f46ca168fb96a6e16f029e3b191f7 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 12:44:43 +0800 Subject: [PATCH 09/10] add nullptr init Signed-off-by: owenCreeper --- .../include/offline_audio_effect_chain_impl.h | 14 +++++++------- .../include/offline_audio_effect_server_chain.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h index 39a8f855b2..36c5d54af8 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_chain_impl.h @@ -46,14 +46,14 @@ private: void InitDump(); std::string chainName_; - std::shared_ptr offlineStreamInClient_; - std::shared_ptr clientBufferIn_; - std::shared_ptr clientBufferOut_; - uint8_t *inBufferBase_; - uint8_t *outBufferBase_; + std::shared_ptr offlineStreamInClient_ = nullptr; + std::shared_ptr clientBufferIn_ = nullptr; + std::shared_ptr clientBufferOut_ = nullptr; + uint8_t *inBufferBase_ = nullptr; + uint8_t *outBufferBase_ = nullptr; std::mutex streamClientMutex_; - FILE *dumpFileIn_; - FILE *dumpFileOut_; + FILE *dumpFileIn_ = nullptr; + FILE *dumpFileOut_ = nullptr; }; } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h index 482539623a..7059a6544a 100644 --- a/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h +++ b/frameworks/native/offlineaudioeffect/include/offline_audio_effect_server_chain.h @@ -73,8 +73,8 @@ private: string chainName_; mutex offlineChainMutex_; OfflineEffectIOConfig offlineConfig_ = {}; - FILE *dumpFileIn_; - FILE *dumpFileOut_; + FILE *dumpFileIn_ = nullptr; + FILE *dumpFileOut_ = nullptr; }; } // namespace AudioStandard } // namespace OHOS -- Gitee From b933c98c72dd2e0c66bbfe1d46f95df4943b55d4 Mon Sep 17 00:00:00 2001 From: owenCreeper Date: Thu, 5 Dec 2024 12:58:12 +0800 Subject: [PATCH 10/10] add close dump Signed-off-by: owenCreeper --- .../offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp | 2 ++ .../src/offline_audio_effect_server_chain.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp index 936e972dc7..6214cf9229 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_chain_impl.cpp @@ -121,6 +121,8 @@ void OfflineAudioEffectChainImpl::Release() outBufferBase_ = nullptr; clientBufferIn_ = nullptr; clientBufferOut_ = nullptr; + DumpFileUtil::CloseDumpFile(&dumpFileIn_); + DumpFileUtil::CloseDumpFile(&dumpFileOut_); } } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp index 737c66142b..80359eeb88 100644 --- a/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp +++ b/frameworks/native/offlineaudioeffect/src/offline_audio_effect_server_chain.cpp @@ -80,6 +80,8 @@ OfflineAudioEffectServerChain::~OfflineAudioEffectServerChain() FreeIfNotNull(controllerId_.effectId); serverBufferIn_ = nullptr; serverBufferOut_ = nullptr; + DumpFileUtil::CloseDumpFile(&dumpFileIn_); + DumpFileUtil::CloseDumpFile(&dumpFileOut_); } static struct IEffectModel *InitEffectModel() -- Gitee