diff --git a/services/audio_engine/manager/src/hpae_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_capturer_manager.cpp index 58493bc9c3baf100d53d70aa68ecaf4c066fafeb..50d326c361bedee6c22ca61620815d6f0b631b16 100644 --- a/services/audio_engine/manager/src/hpae_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_capturer_manager.cpp @@ -187,6 +187,7 @@ int32_t HpaeCapturerManager::DeleteOutputSession(uint32_t sessionId) void HpaeCapturerManager::SetSessionState(uint32_t sessionId, HpaeSessionState capturerState) { sessionNodeMap_[sessionId].state = capturerState; + sourceOutputNodeMap_[sessionId]->SetState(capturerState); } int32_t HpaeCapturerManager::CreateStream(const HpaeStreamInfo &streamInfo) @@ -429,7 +430,9 @@ void HpaeCapturerManager::Process() if (IsRunning()) { UpdateAppsUidAndSessionId(); for (const auto &sourceOutputNodePair : sourceOutputNodeMap_) { - sourceOutputNodePair.second->DoProcess(); + if (sourceOutputNodePair.second->GetState() == HPAE_SESSION_RUNNING) { + sourceOutputNodePair.second->DoProcess(); + } } } } @@ -439,10 +442,9 @@ void HpaeCapturerManager::UpdateAppsUidAndSessionId() appsUid_.clear(); sessionsId_.clear(); for (const auto &sourceOutputNodePair : sourceOutputNodeMap_) { - if (sessionNodeMap_.find(sourceOutputNodePair.first) != sessionNodeMap_.end() && - sessionNodeMap_[sourceOutputNodePair.first].state == HPAE_SESSION_RUNNING) { + if (sourceOutputNodePair.second->GetState() == HPAE_SESSION_RUNNING) { appsUid_.emplace_back(sourceOutputNodePair.second->GetAppUid()); - sessionsId_.emplace_back(sourceOutputNodePair.first); + sessionsId_.emplace_back(static_cast(sourceOutputNodePair.first)); } } if (SafeGetMap(sourceInputClusterMap_, mainMicType_) && sourceInputClusterMap_[mainMicType_]) { diff --git a/services/audio_engine/node/include/hpae_source_output_node.h b/services/audio_engine/node/include/hpae_source_output_node.h index 5ea19c420762b83d1095e4770c86f83693108709..e28fb33906050fc79ba6bb5ccc3e02a9c21d4d51 100644 --- a/services/audio_engine/node/include/hpae_source_output_node.h +++ b/services/audio_engine/node/include/hpae_source_output_node.h @@ -39,6 +39,8 @@ public: void DisConnectWithInfo( const std::shared_ptr> &preNode, HpaeNodeInfo &nodeInfo) override; bool RegisterReadCallback(const std::weak_ptr &callback); + int32_t SetState(HpaeSessionState captureState); + HpaeSessionState GetState(); void SetAppUid(int32_t appUid); int32_t GetAppUid(); private: @@ -50,6 +52,7 @@ private: std::vector sourceOutputData_; std::vector interleveData_; std::atomic framesRead_; + HpaeSessionState state_ = HPAE_SESSION_NEW; uint64_t totalFrames_; int32_t appUid_ = -1; #ifdef ENABLE_HOOK_PCM diff --git a/services/audio_engine/node/src/hpae_source_output_node.cpp b/services/audio_engine/node/src/hpae_source_output_node.cpp index 474bd7971fbb5f8cd6bed6c8d19949d96b59dbd1..08367dfdc095bb2f0d06e9e45b7e3dd2e0e0cb6f 100644 --- a/services/audio_engine/node/src/hpae_source_output_node.cpp +++ b/services/audio_engine/node/src/hpae_source_output_node.cpp @@ -22,6 +22,7 @@ #include "hpae_format_convert.h" #include "audio_errors.h" #include "audio_utils.h" +#include "hpae_node_common.h" namespace OHOS { namespace AudioStandard { @@ -153,6 +154,20 @@ void HpaeSourceOutputNode::DisConnectWithInfo(const std::shared_ptrSession[%{public}u - %{public}d] state change:[%{public}s]-->[%{public}s]", + GetDeviceClass().c_str(), GetSessionId(), GetStreamType(), ConvertSessionState2Str(state_).c_str(), + ConvertSessionState2Str(captureState).c_str()); + state_ = captureState; + return SUCCESS; +} + +HpaeSessionState HpaeSourceOutputNode::GetState() +{ + return state_; +} + void HpaeSourceOutputNode::SetAppUid(int32_t appUid) { appUid_ = appUid; 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 4ce0517092e939dd585c5375863833bf9e762d2a..02053a3d9cd75bf007f5aef51735d81d57be0e87 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 @@ -115,6 +115,7 @@ TEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerInitTest) std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_EQ(capturerManager->Init() == SUCCESS, true); + EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); } TEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerCreateDestoryStreamTest) @@ -156,6 +157,7 @@ TEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerCreateDestoryStreamTest) WaitForMsgProcessing(capturerManager); EXPECT_EQ( capturerManager->GetSourceOutputInfo(streamInfo.sessionId, sourceOutputInfo) == ERR_INVALID_OPERATION, true); + EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); } static void StateControlTest(std::shared_ptr &capturerManager, HpaeStreamInfo &streamInfo, @@ -237,6 +239,7 @@ TEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerStartStopTest) EXPECT_EQ(readDataCb.use_count() == 1, true); StateControlTest(capturerManager, streamInfo, sourceOutputInfo); + EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); } static void InitReloadSourceInfo(HpaeSourceInfo &sourceInfo, HpaeSourceInfo &newSourceInfo) @@ -300,6 +303,7 @@ TEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerReloadTest) EXPECT_EQ(capturerManager->ReloadCaptureManager(newSourceInfo) == SUCCESS, true); WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->GetSourceOutputInfo(streamInfo.sessionId, sourceOutputInfo) == SUCCESS, true); + EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); } } // namespace HPAE } // namespace AudioStandard diff --git a/services/audio_engine/test/unittest/node/hpae_capture_effect_node_test.cpp b/services/audio_engine/test/unittest/node/hpae_capture_effect_node_test.cpp index aebd75974e68398312e5ef7842a1449b8d753a91..f3865c7796608d627c2c11e508d7967837174f5a 100644 --- a/services/audio_engine/test/unittest/node/hpae_capture_effect_node_test.cpp +++ b/services/audio_engine/test/unittest/node/hpae_capture_effect_node_test.cpp @@ -166,6 +166,7 @@ TEST_F(HpaeCaptureEffectNodeTest, HpaeCaptureEffectNodeTest_002) hpaeCaptureEffectNode->DisConnectWithInfo(hpaeSourceInputCluster, nodeInfo); EXPECT_EQ(hpaeSourceInputCluster->GetSourceInputNodeUseCount(), 1); hpaeSourceInputCluster->CapturerSourceStop(); + hpaeSourceInputCluster->CapturerSourceDeInit(); } TEST_F(HpaeCaptureEffectNodeTest, HpaeCaptureEffectNodeTest_003) diff --git a/services/audio_engine/test/unittest/node/hpae_source_input_cluster_test.cpp b/services/audio_engine/test/unittest/node/hpae_source_input_cluster_test.cpp index 7595e3085f9781ccf9af60a4621572e6a9186ef9..13a3e4b6ad9e77ffcbc16b7f8c7db0b8e4948271 100644 --- a/services/audio_engine/test/unittest/node/hpae_source_input_cluster_test.cpp +++ b/services/audio_engine/test/unittest/node/hpae_source_input_cluster_test.cpp @@ -123,6 +123,7 @@ TEST_F(HpaeSourceInputClusterTest, testWriteDataToSourceInputDataCase) } EXPECT_EQ(hpaeSourceInputCluster->CapturerSourceStop(), SUCCESS); EXPECT_EQ(hpaeSourceInputCluster->GetSourceState() == STREAM_MANAGER_SUSPENDED, true); + EXPECT_EQ(hpaeSourceInputCluster->CapturerSourceDeInit(), SUCCESS); } TEST_F(HpaeSourceInputClusterTest, testInterfaces) diff --git a/services/audio_engine/test/unittest/node/hpae_source_input_node_test.cpp b/services/audio_engine/test/unittest/node/hpae_source_input_node_test.cpp index 599e2becc5f22d51f9d7a8e650a32ef6d7c92cd0..0769ee1c0c1fd779ea15c2879316941aa771d1af 100644 --- a/services/audio_engine/test/unittest/node/hpae_source_input_node_test.cpp +++ b/services/audio_engine/test/unittest/node/hpae_source_input_node_test.cpp @@ -152,6 +152,7 @@ TEST_F(HpaeSourceInputNodeTest, testWriteDataToSourceInputDataCase) } EXPECT_EQ(hpaeSoruceInputNode->CapturerSourceStop(), SUCCESS); EXPECT_EQ(hpaeSoruceInputNode->GetSourceState() == STREAM_MANAGER_SUSPENDED, true); + EXPECT_EQ(hpaeSoruceInputNode->CapturerSourceDeInit(), SUCCESS); } TEST_F(HpaeSourceInputNodeTest, testInterfaces_001) @@ -234,6 +235,7 @@ TEST_F(HpaeSourceInputNodeTest, testInterfaces_002) EXPECT_NE(hpaeSoruceInputNode->CapturerSourceInit(attr), SUCCESS); EXPECT_NE(hpaeSoruceInputNode->CapturerSourceStart(), SUCCESS); EXPECT_NE(hpaeSoruceInputNode->CapturerSourceStop(), SUCCESS); + EXPECT_NE(hpaeSoruceInputNode->CapturerSourceDeInit(), SUCCESS); } } // namespace HPAE } // namespace AudioStandard diff --git a/services/audio_service/server/src/capturer_in_server.cpp b/services/audio_service/server/src/capturer_in_server.cpp index e74ee5b4457097d9cd0d911ce9bafed348e023aa..2248ef67eb2464059913b65fe8722b578ab4169d 100644 --- a/services/audio_service/server/src/capturer_in_server.cpp +++ b/services/audio_service/server/src/capturer_in_server.cpp @@ -368,6 +368,7 @@ int32_t CapturerInServer::OnReadData(size_t length) int32_t CapturerInServer::OnReadData(int8_t *outputData, size_t requestDataLen) { + CHECK_AND_RETURN_RET_LOG(status_ == I_STATUS_STARTED, ERR_READ_FAILED, "CapturerInServer is not started"); CHECK_AND_RETURN_RET_LOG(requestDataLen >= spanSizeInBytes_, ERR_READ_FAILED, "Length %{public}zu is less than spanSizeInBytes %{public}zu", requestDataLen, spanSizeInBytes_); std::shared_ptr stateListener = streamListener_.lock();