diff --git a/services/audio_policy/common/include/audio_service_enum.h b/services/audio_policy/common/include/audio_service_enum.h index 7a22f39689d2e96c15ee1e156bacd04064f7af9a..a8d3f6222ba3bfe7415e52a0034676673bc20fa3 100644 --- a/services/audio_policy/common/include/audio_service_enum.h +++ b/services/audio_policy/common/include/audio_service_enum.h @@ -24,6 +24,11 @@ enum SessionOperation : uint32_t { SESSION_OPERATION_STOP, SESSION_OPERATION_RELEASE, }; + +enum SessionOperationMsg : uint32_t { + SESSION_OP_MSG_DEFAULT = 0, + SESSION_OP_MSG_REMOVE_PIPE = 1, +}; } // namespace AudioStandard } // namespace OHOS #endif // AUDIO_SERVICE_ENUM_H diff --git a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h index d8ca9574e9878da96f6babb656db70a4441cea92..ea97a7c1be4b4db1b6a8598c6e5797c8b00e91d1 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h +++ b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h @@ -46,6 +46,7 @@ public: const std::vector> GetPipeList(); std::vector> GetUnusedPipe(); + std::vector> GetUnusedRecordPipe(); std::shared_ptr GetPipeinfoByNameAndFlag(const std::string adapterName, const uint32_t routeFlag); std::string GetAdapterNameBySessionId(uint32_t sessionId); std::shared_ptr GetProcessDeviceInfoBySessionId(uint32_t sessionId); @@ -83,6 +84,7 @@ public: private: bool IsSpecialPipe(uint32_t routeFlag); + bool IsNormalRecordPipe(std::shared_ptr pipeInfo); std::shared_ptr GetPipeByModuleAndFlag(const std::string moduleName, const uint32_t routeFlag); std::unordered_map> modemCommunicationIdMap_{}; diff --git a/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp b/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp index 54dbc024bf08e24d8f55e36ac2af3a0c7634038b..d794ccbfebb0f2b850165ffcacf45f9d4f54a6f8 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp @@ -167,9 +167,9 @@ int32_t AudioCapturerSession::OnCapturerSessionAdded(uint64_t sessionID, Session AUDIO_INFO_LOG("Current source: %{public}d, target: %{public}d", audioEcManager_.GetSourceOpened(), targetSource); if (audioEcManager_.GetSourceOpened() == SOURCE_TYPE_INVALID) { - // normal source is not opened before - audioEcManager_.PrepareAndOpenNormalSource(sessionInfo, targetInfo, targetSource); - audioEcManager_.SetOpenedNormalSourceSessionId(sessionID); + // normal source is not opened before -- it should not be happen!! + AUDIO_ERR_LOG("Record route should not be opened here!"); + return ERROR_ILLEGAL_STATE; } else if (IsHigherPrioritySource(targetSource, audioEcManager_.GetSourceOpened())) { // reload if higher source come audioEcManager_.ReloadNormalSource(sessionInfo, targetInfo, targetSource); diff --git a/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp b/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp index b4176c3cd197738e07f01423a311843c386b1769..70bcc3b89debe86215c51eb27da0c952d110b80f 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp @@ -195,7 +195,8 @@ int32_t AudioIOHandleMap::OpenPortAndInsertIOHandle(const std::string &moduleNam pipeInfo->routeFlag_ = AUDIO_OUTPUT_FLAG_NORMAL; } else { pipeInfo->pipeRole_ = PIPE_ROLE_INPUT; - pipeInfo->routeFlag_ = AUDIO_INPUT_FLAG_NORMAL; + pipeInfo->routeFlag_ = moduleInfo.sourceType == std::to_string(SourceType::SOURCE_TYPE_WAKEUP) ? + AUDIO_INPUT_FLAG_WAKEUP : AUDIO_INPUT_FLAG_NORMAL; } pipeInfo->adapterName_ = moduleInfo.adapterName; pipeInfo->moduleInfo_ = moduleInfo; diff --git a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp index d39b32a9dbbd567c38bdda5822156d7456b94482..282b9090401e6e06ec9a011e0746ea9b8056f8a1 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp @@ -149,6 +149,19 @@ std::vector> AudioPipeManager::GetUnusedPipe() return newList; } +std::vector> AudioPipeManager::GetUnusedRecordPipe() +{ + std::unique_lock pLock(pipeListLock_); + std::vector> unusedPipeList; + for (auto pipe : curPipeList_) { + CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr"); + if (pipe->pipeRole_ == PIPE_ROLE_INPUT && pipe->streamDescriptors_.empty() && IsNormalRecordPipe(pipe)) { + unusedPipeList.push_back(pipe); + } + } + return unusedPipeList; +} + bool AudioPipeManager::IsSpecialPipe(uint32_t routeFlag) { AUDIO_INFO_LOG("Flag %{public}d", routeFlag); @@ -160,6 +173,16 @@ bool AudioPipeManager::IsSpecialPipe(uint32_t routeFlag) return false; } +bool AudioPipeManager::IsNormalRecordPipe(std::shared_ptr pipeInfo) +{ + CHECK_AND_RETURN_RET_LOG(pipeInfo != nullptr, false, "Pipe info is null"); + if ((pipeInfo->adapterName_ == PRIMARY_CLASS && pipeInfo->routeFlag_ == AUDIO_INPUT_FLAG_NORMAL) || + (pipeInfo->adapterName_ == USB_CLASS && pipeInfo->routeFlag_ == AUDIO_INPUT_FLAG_NORMAL)) { + return true; + } + return false; +} + std::shared_ptr AudioPipeManager::GetPipeinfoByNameAndFlag( const std::string adapterName, const uint32_t routeFlag) { diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service.h b/services/audio_policy/server/service/service_main/include/audio_core_service.h index adffd72ff8a3819f9aa662a7dacd437c903c45ba..89585a2ec8bccbcf5d1475d3be8e9f7f8e9df7bd 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service.h @@ -60,7 +60,8 @@ public: std::shared_ptr streamDesc, uint32_t &flag, uint32_t &sessionId); // ICoreServiceProvider - int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) override; + int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg = SESSION_OP_MSG_DEFAULT) override; int32_t SetDefaultOutputDevice(const DeviceType deviceType, const uint32_t sessionId, const StreamUsage streamUsage, bool isRunning) override; std::string GetAdapterNameBySessionId(uint32_t sessionId) override; @@ -156,7 +157,7 @@ private: int32_t StartClient(uint32_t sessionId); int32_t PauseClient(uint32_t sessionId); int32_t StopClient(uint32_t sessionId); - int32_t ReleaseClient(uint32_t sessionId); + int32_t ReleaseClient(uint32_t sessionId, SessionOperationMsg opMsg = SESSION_OP_MSG_DEFAULT); // ICoreServiceProvider from EventEntry int32_t SetDefaultOutputDevice( @@ -290,6 +291,7 @@ private: void ProcessInputPipeNew(std::shared_ptr pipeInfo, uint32_t &flag); void ProcessInputPipeUpdate(std::shared_ptr pipeInfo, uint32_t &flag); void RemoveUnusedPipe(); + void RemoveUnusedRecordPipe(); void MoveStreamSink(std::shared_ptr streamDesc, std::shared_ptr pipeInfo, const AudioStreamDeviceChangeReasonExt reason); void MoveToNewOutputDevice(std::shared_ptr streamDesc, diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp index 6d0fc05f8327c6ea44fe75d1639bb364e039257d..bc229883e640a5302c1a3ea5a18717745f812853 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp @@ -435,7 +435,7 @@ int32_t AudioCoreService::StopClient(uint32_t sessionId) return SUCCESS; } -int32_t AudioCoreService::ReleaseClient(uint32_t sessionId) +int32_t AudioCoreService::ReleaseClient(uint32_t sessionId, SessionOperationMsg opMsg) { if (pipeManager_->IsModemCommunicationIdExist(sessionId)) { AUDIO_INFO_LOG("Modem communication, sessionId %{public}u", sessionId); @@ -448,6 +448,9 @@ int32_t AudioCoreService::ReleaseClient(uint32_t sessionId) pipeManager_->RemoveClient(sessionId); audioOffloadStream_.ResetOffloadStatus(sessionId); RemoveUnusedPipe(); + if (opMsg == SESSION_OP_MSG_REMOVE_PIPE) { + RemoveUnusedRecordPipe(); + } DeleteSessionId(sessionId); return SUCCESS; diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_entry.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_entry.cpp index a80fab87022cdbf99b2477b66c35bcf70d381775..b6a3faa8cfbe8db858f4d636c13abddf13532ffb 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_entry.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_entry.cpp @@ -43,6 +43,18 @@ static const char *SessionOperationToString(SessionOperation operation) } } +static const char *SessionOperationMsgToString(SessionOperationMsg opMsg) +{ + switch (opMsg) { + case SESSION_OP_MSG_DEFAULT: + return "MSG_DEFAULT"; + case SESSION_OP_MSG_REMOVE_PIPE: + return "MSG_REMOVE_REC_PIPE"; + default: + return "MSG_UNKNOWN"; + } +} + AudioCoreService::EventEntry::EventEntry(std::shared_ptr coreService) : coreService_(coreService) { AUDIO_INFO_LOG("Ctor"); @@ -79,11 +91,12 @@ int32_t AudioCoreService::EventEntry::CreateCapturerClient( return SUCCESS; } -int32_t AudioCoreService::EventEntry::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) +int32_t AudioCoreService::EventEntry::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg) { std::lock_guard lock(eventMutex_); - AUDIO_INFO_LOG("withlock sessionId %{public}u, operation %{public}s", - sessionId, SessionOperationToString(operation)); + AUDIO_INFO_LOG("withlock sessionId %{public}u, operation %{public}s, msg %{public}s", + sessionId, SessionOperationToString(operation), SessionOperationMsgToString(opMsg)); switch (operation) { case SESSION_OPERATION_START: return coreService_->StartClient(sessionId); @@ -92,7 +105,7 @@ int32_t AudioCoreService::EventEntry::UpdateSessionOperation(uint32_t sessionId, case SESSION_OPERATION_STOP: return coreService_->StopClient(sessionId); case SESSION_OPERATION_RELEASE: - return coreService_->ReleaseClient(sessionId); + return coreService_->ReleaseClient(sessionId, opMsg); default: return SUCCESS; } diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp index f583877a15b6aa0a1ac796f223fcdc49829a2b13..01337b2a1112502110575dc8438396cde724d7ef 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp @@ -742,7 +742,8 @@ void AudioCoreService::ProcessInputPipeUpdate(std::shared_ptr pip void AudioCoreService::RemoveUnusedPipe() { std::vector> pipeInfos = pipeManager_->GetUnusedPipe(); - for (auto &pipeInfo : pipeInfos) { + for (auto pipeInfo : pipeInfos) { + CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr"); AUDIO_INFO_LOG("[PipeExecInfo] Remove and close Pipe %{public}s", pipeInfo->ToString().c_str()); if (pipeInfo->routeFlag_ & AUDIO_OUTPUT_FLAG_LOWPOWER) { DelayReleaseOffloadPipe(pipeInfo->id_, pipeInfo->paIndex_); @@ -753,6 +754,17 @@ void AudioCoreService::RemoveUnusedPipe() } } +void AudioCoreService::RemoveUnusedRecordPipe() +{ + std::vector> pipeInfos = pipeManager_->GetUnusedRecordPipe(); + for (auto pipeInfo : pipeInfos) { + CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr"); + AUDIO_INFO_LOG("[PipeExecInfo] Remove and close Pipe %{public}s", pipeInfo->ToString().c_str()); + audioPolicyManager_.CloseAudioPort(pipeInfo->id_, pipeInfo->paIndex_); + pipeManager_->RemoveAudioPipeInfo(pipeInfo); + } +} + std::string AudioCoreService::GetAdapterNameBySessionId(uint32_t sessionId) { AUDIO_INFO_LOG("SessionId %{public}u", sessionId); diff --git a/services/audio_service/client/include/core_service_provider_stub.h b/services/audio_service/client/include/core_service_provider_stub.h index 687d1b7eb9b06e204e9dd5b18a97eb41f18ca971..38eda514fcfeab66e833faab6217789fd799c145 100644 --- a/services/audio_service/client/include/core_service_provider_stub.h +++ b/services/audio_service/client/include/core_service_provider_stub.h @@ -38,7 +38,7 @@ public: ~CoreServiceProviderWrapper(); CoreServiceProviderWrapper(ICoreServiceProvider *coreServiceWorker); - int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) override; + int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, SessionOperationMsg opMsg) override; int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice, const uint32_t sessionID, const StreamUsage streamUsage, bool isRunning) override; std::string GetAdapterNameBySessionId(uint32_t sessionId) override; diff --git a/services/audio_service/client/src/core_service_provider_stub.cpp b/services/audio_service/client/src/core_service_provider_stub.cpp index 60f7d03d05bc32f7c329727a89ec1ddea7f90dbd..8062634470bb6f2d0b5c62c54b3ea60419b4257d 100644 --- a/services/audio_service/client/src/core_service_provider_stub.cpp +++ b/services/audio_service/client/src/core_service_provider_stub.cpp @@ -60,7 +60,8 @@ int32_t CoreServiceProviderStub::HandleUpdateSessionOperation(MessageParcel &dat { uint32_t sessionId = data.ReadUint32(); SessionOperation operation = static_cast(data.ReadUint32()); - int32_t ret = UpdateSessionOperation(sessionId, operation); + SessionOperationMsg opMsg = static_cast(data.ReadUint32()); + int32_t ret = UpdateSessionOperation(sessionId, operation, opMsg); reply.WriteInt32(ret); return AUDIO_OK; } @@ -111,10 +112,11 @@ CoreServiceProviderWrapper::CoreServiceProviderWrapper(ICoreServiceProvider *cor { } -int32_t CoreServiceProviderWrapper::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) +int32_t CoreServiceProviderWrapper::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg) { CHECK_AND_RETURN_RET_LOG(coreServiceWorker_ != nullptr, AUDIO_INIT_FAIL, "coreServiceWorker_ is null"); - return coreServiceWorker_->UpdateSessionOperation(sessionId, operation); + return coreServiceWorker_->UpdateSessionOperation(sessionId, operation, opMsg); } int32_t CoreServiceProviderWrapper::SetDefaultOutputDevice(const DeviceType defaultOutputDevice, diff --git a/services/audio_service/common/include/i_core_service_provider.h b/services/audio_service/common/include/i_core_service_provider.h index 8140b7cdd687fba7c6c79948a2a06eec3b127ad9..9307d1186290e89adcc2ebbe5e39197f157130a4 100644 --- a/services/audio_service/common/include/i_core_service_provider.h +++ b/services/audio_service/common/include/i_core_service_provider.h @@ -26,7 +26,8 @@ namespace OHOS { namespace AudioStandard { class ICoreServiceProvider { public: - virtual int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) = 0; + virtual int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg) = 0; virtual int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice, const uint32_t sessionID, const StreamUsage streamUsage, bool isRunning) = 0; virtual std::string GetAdapterNameBySessionId(uint32_t sessionID) = 0; diff --git a/services/audio_service/server/include/core_service_handler.h b/services/audio_service/server/include/core_service_handler.h index 01884d0129662cb7936875f570880f4a6adb00e0..74544b6e0721407a6dd090423d88c73bc2de98a9 100644 --- a/services/audio_service/server/include/core_service_handler.h +++ b/services/audio_service/server/include/core_service_handler.h @@ -34,7 +34,8 @@ public: // would be called only once int32_t ConfigCoreServiceProvider(const sptr policyProvider); - int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation); + int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg = SESSION_OP_MSG_DEFAULT); int32_t SetDefaultOutputDevice( const DeviceType defaultOutputDevice, const uint32_t sessionID, const StreamUsage streamUsage, bool isRunning); std::string GetAdapterNameBySessionId(uint32_t sessionId); diff --git a/services/audio_service/server/include/core_service_provider_proxy.h b/services/audio_service/server/include/core_service_provider_proxy.h index 30c3b3399d3b6ff7109f8ea9e8b8ebab6bf8c16e..db8309a613219ba50c2f7658c2175ad51d5c4b12 100644 --- a/services/audio_service/server/include/core_service_provider_proxy.h +++ b/services/audio_service/server/include/core_service_provider_proxy.h @@ -25,7 +25,7 @@ public: explicit CoreServiceProviderProxy(const sptr& impl); virtual ~CoreServiceProviderProxy(); - int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) override; + int32_t UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, SessionOperationMsg opMsg) override; int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice, const uint32_t sessionID, const StreamUsage streamUsage, bool isRunning) override; std::string GetAdapterNameBySessionId(uint32_t sessionId) override; diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 22be1a54a9beca07eca4352a718d0c56cfe29170..cd3a87e6a3219d17f8e10585851b98388964b0c0 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -258,7 +258,8 @@ PipeInfoGuard::PipeInfoGuard(uint32_t sessionId) PipeInfoGuard::~PipeInfoGuard() { if (releaseFlag_) { - CoreServiceHandler::GetInstance().UpdateSessionOperation(sessionId_, SESSION_OPERATION_RELEASE); + CoreServiceHandler::GetInstance().UpdateSessionOperation(sessionId_, SESSION_OPERATION_RELEASE, + SESSION_OP_MSG_REMOVE_PIPE); } } diff --git a/services/audio_service/server/src/core_service_handler.cpp b/services/audio_service/server/src/core_service_handler.cpp index bacabe65fd7521d41a37e8811f85633a897485fd..cc6c75c4cf09c442c1811970e7699cf95930bc4b 100644 --- a/services/audio_service/server/src/core_service_handler.cpp +++ b/services/audio_service/server/src/core_service_handler.cpp @@ -55,10 +55,11 @@ int32_t CoreServiceHandler::ConfigCoreServiceProvider(const sptrUpdateSessionOperation(sessionId, operation); + return iCoreServiceProvider_->UpdateSessionOperation(sessionId, operation, opMsg); } int32_t CoreServiceHandler::SetDefaultOutputDevice(const DeviceType defaultOutputDevice, const uint32_t sessionID, diff --git a/services/audio_service/server/src/core_service_provider_proxy.cpp b/services/audio_service/server/src/core_service_provider_proxy.cpp index 7d0ccb677db68c4b9aa9281aa49bef6b513ceb02..ca795079b40178856d91ae30c18d75496bbeb742 100644 --- a/services/audio_service/server/src/core_service_provider_proxy.cpp +++ b/services/audio_service/server/src/core_service_provider_proxy.cpp @@ -31,7 +31,8 @@ CoreServiceProviderProxy::~CoreServiceProviderProxy() { } -int32_t CoreServiceProviderProxy::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation) +int32_t CoreServiceProviderProxy::UpdateSessionOperation(uint32_t sessionId, SessionOperation operation, + SessionOperationMsg opMsg) { MessageParcel data; MessageParcel reply; @@ -40,6 +41,7 @@ int32_t CoreServiceProviderProxy::UpdateSessionOperation(uint32_t sessionId, Ses CHECK_AND_RETURN_RET_LOG(data.WriteInterfaceToken(GetDescriptor()), ERROR, "Write descriptor failed!"); data.WriteUint32(sessionId); data.WriteUint32(operation); + data.WriteUint32(opMsg); int ret = Remote()->SendRequest(ICoreServiceProviderMsg::UPDATE_SESSION_OPERATION, data, reply, option); CHECK_AND_RETURN_RET_LOG(ret == AUDIO_OK, ERR_OPERATION_FAILED, "failed, error: %{public}d", ret);