diff --git a/services/audio_engine/manager/include/hpae_inner_capturer_manager.h b/services/audio_engine/manager/include/hpae_inner_capturer_manager.h index 8b255314a470b32d04f98a5886acfd158c1d0bb2..e5a6022c1f756128879915ffd9fdc5f74d77b1b4 100644 --- a/services/audio_engine/manager/include/hpae_inner_capturer_manager.h +++ b/services/audio_engine/manager/include/hpae_inner_capturer_manager.h @@ -115,7 +115,7 @@ private: void AddSingleNodeToSinkInner(const std::shared_ptr &node, bool isConnect = true); void MoveAllStreamToNewSinkInner(const std::string &sinkName, const std::vector &moveIds, MoveSessionType moveType); - void InitSinkInner(bool isReload = false); + int32_t InitSinkInner(bool isReload = false); uint32_t sinkInputNodeCounter_ = 0; int32_t sceneTypeToProcessClusterCount_ = 0; std::atomic isInit_ = false; diff --git a/services/audio_engine/manager/include/hpae_offload_renderer_manager.h b/services/audio_engine/manager/include/hpae_offload_renderer_manager.h index 9730763225f774662f9da039faf9ae3d5d52cd38..9228e5821e7bc1d054d03d02ec472b35b82a8cb9 100644 --- a/services/audio_engine/manager/include/hpae_offload_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_offload_renderer_manager.h @@ -104,7 +104,7 @@ private: void AddSingleNodeToSink(const std::shared_ptr &node, bool isConnect = true); void MoveAllStreamToNewSink(const std::string &sinkName, const std::vector &moveIds, MoveSessionType moveType); - void InitSinkInner(bool isReload = false); + int32_t InitSinkInner(bool isReload = false); void UpdateAppsUid(); HpaeRenderSessionInfo sessionInfo_; diff --git a/services/audio_engine/manager/include/hpae_renderer_manager.h b/services/audio_engine/manager/include/hpae_renderer_manager.h index 55b180f44cbf26863f2cd1e129e60359d925eb9d..c038241fa3043c9824aa2bf173a571da75a9d634 100644 --- a/services/audio_engine/manager/include/hpae_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_renderer_manager.h @@ -124,7 +124,8 @@ private: bool SetSessionFade(uint32_t sessionId, IOperation operation); void CreateDefaultProcessCluster(HpaeNodeInfo &nodeInfo); void CreateOutputClusterNodeInfo(HpaeNodeInfo &nodeInfo); - void InitManager(bool isReload = false); + int32_t InitManager(bool isReload = false); + void InitDefaultNodeInfo(); void MoveStreamSync(uint32_t sessionId, const std::string &sinkName); void UpdateAppsUid(); int32_t HandlePriPaPower(uint32_t sessionId); diff --git a/services/audio_engine/manager/src/hpae_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_capturer_manager.cpp index 4aa8d2f2303ca8be3721b9fe19def9507fd3852c..e01e5ebb868efb6294539f598b39a69cc11c97d6 100644 --- a/services/audio_engine/manager/src/hpae_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_capturer_manager.cpp @@ -655,6 +655,10 @@ int32_t HpaeCapturerManager::InitCapturerManager() HpaeNodeInfo nodeInfo; HpaeNodeInfo ecNodeInfo; HpaeNodeInfo micRefNodeInfo; + if (sourceInfo_.frameLen == 0) { + AUDIO_ERR_LOG("FrameLen is 0"); + return ERROR; + } nodeInfo.deviceClass = sourceInfo_.deviceClass; nodeInfo.channels = sourceInfo_.channels; nodeInfo.format = sourceInfo_.format; diff --git a/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp index 8188d99650525f394a18926819afca9e37d6acb3..6649c943df301d222aa36b3eeeb8e2292acc2df4 100644 --- a/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp @@ -269,9 +269,15 @@ int32_t HpaeInnerCapturerManager::Init(bool isReload) return SUCCESS; } -void HpaeInnerCapturerManager::InitSinkInner(bool isReload) +int32_t HpaeInnerCapturerManager::InitSinkInner(bool isReload) { Trace trace("HpaeInnerCapturerManager::InitSinkInner"); + if (sinkInfo_.frameLen == 0) { + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, + sinkInfo_.deviceName, ERR_INVALID_PARAM); + AUDIO_ERR_LOG("FrameLen is 0"); + return ERROR; + } HpaeNodeInfo nodeInfo; nodeInfo.channels = sinkInfo_.channels; nodeInfo.format = sinkInfo_.format; @@ -286,6 +292,7 @@ void HpaeInnerCapturerManager::InitSinkInner(bool isReload) hpaeInnerCapSinkNode_->InnerCapturerSinkInit(); isInit_.store(true); TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT :INIT_DEVICE_RESULT, sinkInfo_.deviceName, SUCCESS); + return SUCCESS; } bool HpaeInnerCapturerManager::DeactivateThread() diff --git a/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp index cbba12e6759950c205638b8a099c77073f86d698..e03b3ad6dd1e2163c2e7ceab321abdfd7476f85a 100644 --- a/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp @@ -420,10 +420,16 @@ int32_t HpaeOffloadRendererManager::Init(bool isReload) return SUCCESS; } -void HpaeOffloadRendererManager::InitSinkInner(bool isReload) +int32_t HpaeOffloadRendererManager::InitSinkInner(bool isReload) { AUDIO_INFO_LOG("HpaeOffloadRendererManager::init"); HpaeNodeInfo nodeInfo; + if (sinkInfo_.frameLen == 0) { + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, + sinkInfo_.deviceName, ERR_INVALID_PARAM); + AUDIO_ERR_LOG("FrameLen is 0"); + return ERROR; + } nodeInfo.channels = sinkInfo_.channels; nodeInfo.format = sinkInfo_.format; nodeInfo.frameLen = sinkInfo_.frameLen; @@ -453,6 +459,7 @@ void HpaeOffloadRendererManager::InitSinkInner(bool isReload) isInit_.store(true); TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, sinkInfo_.deviceName, ret); AUDIO_INFO_LOG("HpaeOffloadRendererManager::inited"); + return SUCCESS; } bool HpaeOffloadRendererManager::DeactivateThread() diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index d47d5a968dcc96f00514b6994b62e5b887157f67..527d71e7889fea0d0c84bb8eea6018679a464464 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -866,10 +866,16 @@ int32_t HpaeRendererManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, b return SUCCESS; } -void HpaeRendererManager::InitManager(bool isReload) +int32_t HpaeRendererManager::InitManager(bool isReload) { AUDIO_INFO_LOG("init devicename:%{public}s", sinkInfo_.deviceName.c_str()); HpaeNodeInfo nodeInfo; + if (sinkInfo_.frameLen == 0) { + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, + sinkInfo_.deviceName, ERR_INVALID_PARAM); + AUDIO_ERR_LOG("FrameLen is 0"); + return ERROR; + } nodeInfo.channels = sinkInfo_.channels; nodeInfo.format = sinkInfo_.format; nodeInfo.frameLen = sinkInfo_.frameLen; @@ -899,24 +905,29 @@ void HpaeRendererManager::InitManager(bool isReload) attr.filePath = sinkInfo_.filePath.c_str(); attr.aux = sinkInfo_.splitMode.c_str(); if (!sceneClusterMap_.count(HPAE_SCENE_EFFECT_NONE)) { - HpaeNodeInfo defaultNodeInfo; - defaultNodeInfo.frameLen = (uint32_t)DEFAULT_EFFECT_FRAME_LEN; - defaultNodeInfo.samplingRate = (AudioSamplingRate)DEFAULT_EFFECT_RATE; - defaultNodeInfo.format = AudioSampleFormat::INVALID_WIDTH; - defaultNodeInfo.channels = STEREO; - defaultNodeInfo.channelLayout = AudioChannelLayout::CH_LAYOUT_STEREO; - defaultNodeInfo.streamType = STREAM_DEFAULT; - defaultNodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE; - defaultNodeInfo.deviceNetId = sinkInfo_.deviceNetId; - defaultNodeInfo.deviceClass = sinkInfo_.deviceClass; - defaultNodeInfo.statusCallback = weak_from_this(); - sceneClusterMap_[HPAE_SCENE_EFFECT_NONE] = std::make_shared(defaultNodeInfo, sinkInfo_); - sceneTypeToProcessClusterCountMap_[HPAE_SCENE_EFFECT_NONE] = 1; + InitDefaultNodeInfo(); } - ret = outputCluster_->Init(attr); isInit_.store(ret == SUCCESS); TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT :INIT_DEVICE_RESULT, sinkInfo_.deviceName, ret); + return SUCCESS; +} + +void HpaeRendererManager::InitDefaultNodeInfo() +{ + HpaeNodeInfo defaultNodeInfo; + defaultNodeInfo.frameLen = (uint32_t)DEFAULT_EFFECT_FRAME_LEN; + defaultNodeInfo.samplingRate = (AudioSamplingRate)DEFAULT_EFFECT_RATE; + defaultNodeInfo.format = AudioSampleFormat::INVALID_WIDTH; + defaultNodeInfo.channels = STEREO; + defaultNodeInfo.channelLayout = AudioChannelLayout::CH_LAYOUT_STEREO; + defaultNodeInfo.streamType = STREAM_DEFAULT; + defaultNodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE; + defaultNodeInfo.deviceNetId = sinkInfo_.deviceNetId; + defaultNodeInfo.deviceClass = sinkInfo_.deviceClass; + defaultNodeInfo.statusCallback = weak_from_this(); + sceneClusterMap_[HPAE_SCENE_EFFECT_NONE] = std::make_shared(defaultNodeInfo, sinkInfo_); + sceneTypeToProcessClusterCountMap_[HPAE_SCENE_EFFECT_NONE] = 1; } void HpaeRendererManager::CreateOutputClusterNodeInfo(HpaeNodeInfo &nodeInfo) diff --git a/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp b/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp index 9f016d74c6dff9f891bd4e085fec842870093c45..ba976085c2f97b3112c7ddf568aa97c58ab03f64 100644 --- a/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp @@ -948,6 +948,21 @@ HWTEST_F(HpaeCapturerManagerTest, SendRequestInner_001, TestSize.Level1) capturerManager->SendRequest(request, "unit_test_send_request"); EXPECT_EQ(capturerManager->DeInit(), SUCCESS); } + +/** + * @tc.name : Test InitCapturerManager_001 + * @tc.type : FUNC + * @tc.number: InitCapturerManager_001 + * @tc.desc : Test InitCapturerManager when frameLen is 0. + */ +HWTEST_F(HpaeCapturerManagerTest, InitCapturerManager_001, TestSize.Level1) +{ + HpaeSourceInfo sourceInfo; + InitSourceInfo(sourceInfo); + sourceInfo.frameLen = 0; + std::shared_ptr capturerManager = std::make_shared(sourceInfo); + EXPECT_EQ(capturerManager->InitCapturerManager(), ERROR); +} } // namespace HPAE } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp b/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp index 161fcbfd1f53c3955d2e6430caa0d49c487d8086..a9013402a3c8d2ac07a49d4f883fa2e2b04d0b72 100644 --- a/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp @@ -649,6 +649,22 @@ HWTEST_F(HpaeInnerCapturerManagerUnitTest, MoveAllStreamToNewSinkInner_001, Test hpaeInnerCapturerManager_->MoveAllStreamToNewSinkInner("", moveids, MOVE_PREFER); EXPECT_EQ(hpaeInnerCapturerManager_->DeInit(), SUCCESS); } + +/** + * @tc.name : Test InitSinkInner + * @tc.type : FUNC + * @tc.number: InitSinkInner_001 + * @tc.desc : Test InitSinkInner. + */ +HWTEST_F(HpaeInnerCapturerManagerUnitTest, InitSinkInner_001, TestSize.Level0) +{ + HpaeSinkInfo sinkInfo = GetInCapSinkInfo(); + sinkInfo.frameLen = 0; + bool isReload = 1; + hpaeInnerCapturerManager_ = std::make_shared(sinkInfo); + hpaeInnerCapturerManager_->InitSinkInner(isReload); + EXPECT_EQ(hpaeInnerCapturerManager_->IsInit(), false); +} } // namespace HPAE } // namespace OHOS::AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp b/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp index 90d641e558409c8bff5d7e13b531a410b5486de8..0aebe98810fdb3b544d65d8c2da3d36c5a488e6a 100644 --- a/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp @@ -1612,4 +1612,54 @@ HWTEST_F(HpaeRendererManagerTest, SendRequestInner_002, TestSize.Level1) hpaeRendererManager->SendRequest(request, "unit_test_send_request"); EXPECT_EQ(hpaeRendererManager->DeInit(), SUCCESS); } + +/** + * @tc.name : Test InitSinkInner_001 + * @tc.type : FUNC + * @tc.number: InitSinkInner_001 + * @tc.desc : Test InitSinkInner when frameLen is 0. + */ +HWTEST_F(HpaeRendererManagerTest, InitSinkInner_001, TestSize.Level1) +{ + HpaeSinkInfo sinkInfo; + sinkInfo.deviceNetId = DEFAULT_TEST_DEVICE_NETWORKID; + sinkInfo.deviceClass = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.adapterName = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.filePath = g_rootPath + "constructHpaeRendererManagerTest.pcm"; + sinkInfo.frameLen = 0; + sinkInfo.samplingRate = SAMPLE_RATE_48000; + sinkInfo.format = SAMPLE_F32LE; + sinkInfo.channels = STEREO; + sinkInfo.deviceType = DEVICE_TYPE_SPEAKER; + std::shared_ptr hpaeRendererManager = + std::make_shared(sinkInfo); + bool isReload = 1; + hpaeRendererManager->InitSinkInner(isReload); + EXPECT_EQ(hpaeRendererManager->IsInit(), false); +} + +/** + * @tc.name : Test InitManager_001 + * @tc.type : FUNC + * @tc.number: InitManager_001 + * @tc.desc : Test InitManager when frameLen is 0. + */ +HWTEST_F(HpaeRendererManagerTest, InitManager_001, TestSize.Level1) +{ + HpaeSinkInfo sinkInfo; + sinkInfo.deviceNetId = DEFAULT_TEST_DEVICE_NETWORKID; + sinkInfo.deviceClass = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.adapterName = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.filePath = g_rootPath + "constructHpaeRendererManagerTest.pcm"; + sinkInfo.frameLen = 0; + sinkInfo.samplingRate = SAMPLE_RATE_48000; + sinkInfo.format = SAMPLE_F32LE; + sinkInfo.channels = STEREO; + sinkInfo.deviceType = DEVICE_TYPE_SPEAKER; + std::shared_ptr hpaeRendererManager = + std::make_shared(sinkInfo); + bool isReload = 1; + hpaeRendererManager->InitManager(isReload); + EXPECT_EQ(hpaeRendererManager->IsInit(), false); +} } // namespace \ No newline at end of file diff --git a/test/fuzztest/hpaeinnercapturermanager_fuzzer/hpaeinnercapturermanager_fuzzer.cpp b/test/fuzztest/hpaeinnercapturermanager_fuzzer/hpaeinnercapturermanager_fuzzer.cpp index 99041b410af4d51394957b6b20a54a45178d8213..2215d337ee2bc3a4f26ebbe43afa8cc8224b390b 100644 --- a/test/fuzztest/hpaeinnercapturermanager_fuzzer/hpaeinnercapturermanager_fuzzer.cpp +++ b/test/fuzztest/hpaeinnercapturermanager_fuzzer/hpaeinnercapturermanager_fuzzer.cpp @@ -38,6 +38,8 @@ static size_t g_pos; const size_t THRESHOLD = 10; const uint32_t DEFAULT_FRAME_LENGTH1 = 960; const uint32_t DEFAULT_FRAME_LENGTH2 = 882; +const uint32_t AUDIO_PER_SECOND_MS = 1000; +const uint32_t LIMIT_SIZE = 20; static std::string g_rootPath = "/data/"; static std::string g_rootCapturerPath = "/data/source_file_io_48000_2_s16le.pcm"; const char* DEFAULT_TEST_DEVICE_CLASS = "file_io"; @@ -132,7 +134,7 @@ HpaeStreamInfo GetInCapPlayStreamInfo() HpaeStreamInfo streamInfo; streamInfo.channels = STEREO; streamInfo.samplingRate = SAMPLE_RATE_44100; - streamInfo.frameLen = GetData(); + streamInfo.frameLen = SAMPLE_RATE_48000 / AUDIO_PER_SECOND_MS * (GetData() % LIMIT_SIZE + 1); streamInfo.format = SAMPLE_S16LE; streamInfo.sessionId = DEFAULT_SESSION_ID; streamInfo.streamType = STREAM_MUSIC; @@ -146,7 +148,7 @@ HpaeStreamInfo GetInCapPlayFuzzStreamInfo() HpaeStreamInfo streamInfo; streamInfo.channels = STEREO; streamInfo.samplingRate = SAMPLE_RATE_44100; - streamInfo.frameLen = GetData(); + streamInfo.frameLen = SAMPLE_RATE_48000 / AUDIO_PER_SECOND_MS * (GetData() % LIMIT_SIZE + 1); streamInfo.format = SAMPLE_S16LE; streamInfo.sessionId = GetData(); streamInfo.streamType = STREAM_MUSIC;