diff --git a/frameworks/native/hdiadapter_new/include/manager/hdi_adapter_manager.h b/frameworks/native/hdiadapter_new/include/manager/hdi_adapter_manager.h index 33f529c004d4d31135b39e29d2eb160aed0d9ec3..7407d89dfd76ff3845c85ed691e171890b3017cd 100644 --- a/frameworks/native/hdiadapter_new/include/manager/hdi_adapter_manager.h +++ b/frameworks/native/hdiadapter_new/include/manager/hdi_adapter_manager.h @@ -71,10 +71,16 @@ public: const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); void RegistSinkCallback(HdiAdapterCallbackType type, IAudioSinkCallback *cb, const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); + void RegistSinkCallbackGenerator(HdiAdapterCallbackType type, + const std::function(uint32_t)> cbGenerator, + const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); void RegistSourceCallback(HdiAdapterCallbackType type, std::shared_ptr cb, const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); void RegistSourceCallback(HdiAdapterCallbackType type, IAudioSourceCallback *cb, const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); + void RegistSourceCallbackGenerator(HdiAdapterCallbackType type, + const std::function(uint32_t)> cbGenerator, + const std::function &limitFunc = [](uint32_t id) -> bool { return false; }); void DumpInfo(std::string &dumpString); diff --git a/frameworks/native/hdiadapter_new/include/util/callback_wrapper.h b/frameworks/native/hdiadapter_new/include/util/callback_wrapper.h index fca5d7c258035ddc013ea38835125855d2bfb5cb..42bf6fa1c8e5e41c5f7f34e5e0f50c7df4a881a4 100644 --- a/frameworks/native/hdiadapter_new/include/util/callback_wrapper.h +++ b/frameworks/native/hdiadapter_new/include/util/callback_wrapper.h @@ -31,7 +31,9 @@ public: void RegistCallback(uint32_t type, std::shared_ptr cb); void RegistCallback(uint32_t type, IAudioSinkCallback *cb); - std::shared_ptr GetCallback(uint32_t type); + void RegistCallbackGenerator(uint32_t type, + std::function(uint32_t)> cbGenerator); + std::shared_ptr GetCallback(uint32_t type, uint32_t renderId); IAudioSinkCallback *GetRawCallback(uint32_t type); void OnRenderSinkParamChange(const std::string &networkId, const AudioParamKey key, @@ -41,8 +43,10 @@ public: private: std::unordered_map > cbs_; std::unordered_map rawCbs_; + std::unordered_map(uint32_t)> > cbGenerators_; std::mutex cbMtx_; std::mutex rawCbMtx_; + std::mutex cbGeneratorMtx_; }; class SourceCallbackWrapper : public IAudioSourceCallback { @@ -52,7 +56,9 @@ public: void RegistCallback(uint32_t type, std::shared_ptr cb); void RegistCallback(uint32_t type, IAudioSourceCallback *cb); - std::shared_ptr GetCallback(uint32_t type); + void RegistCallbackGenerator(uint32_t type, + std::function(uint32_t)> cbGenerator); + std::shared_ptr GetCallback(uint32_t type, uint32_t captureId); IAudioSourceCallback *GetRawCallback(uint32_t type); void OnCaptureSourceParamChange(const std::string &networkId, const AudioParamKey key, @@ -63,8 +69,10 @@ public: private: std::unordered_map > cbs_; std::unordered_map rawCbs_; + std::unordered_map(uint32_t)> > cbGenerators_; std::mutex cbMtx_; std::mutex rawCbMtx_; + std::mutex cbGeneratorMtx_; }; } // namespace AudioStandard diff --git a/frameworks/native/hdiadapter_new/manager/hdi_adapter_manager.cpp b/frameworks/native/hdiadapter_new/manager/hdi_adapter_manager.cpp index e0f64ad3852df1d4198dbc1fcfb46bcd9d8b8639..c52451c66d6b327b3744c0e8a409540ea15197e1 100644 --- a/frameworks/native/hdiadapter_new/manager/hdi_adapter_manager.cpp +++ b/frameworks/native/hdiadapter_new/manager/hdi_adapter_manager.cpp @@ -269,6 +269,17 @@ void HdiAdapterManager::RegistSinkCallback(HdiAdapterCallbackType type, IAudioSi AUDIO_INFO_LOG("regist sink callback succ, type: %{public}u", type); } +void HdiAdapterManager::RegistSinkCallbackGenerator(HdiAdapterCallbackType type, + const std::function(uint32_t)> cbGenerator, + const std::function &limitFunc) +{ + CHECK_AND_RETURN_LOG(cbGenerator, "callback generator of type %{public}u is nullptr", type); + + sinkCbs_.RegistCallbackGenerator(type, cbGenerator); + cbLimitFunc_[HDI_ID_BASE_RENDER][type] = limitFunc; + AUDIO_INFO_LOG("regist sink callback generator succ, type: %{public}u", type); +} + void HdiAdapterManager::RegistSourceCallback(HdiAdapterCallbackType type, std::shared_ptr cb, const std::function &limitFunc) { @@ -289,6 +300,17 @@ void HdiAdapterManager::RegistSourceCallback(HdiAdapterCallbackType type, IAudio AUDIO_INFO_LOG("regist source callback succ, type: %{public}u", type); } +void HdiAdapterManager::RegistSourceCallbackGenerator(HdiAdapterCallbackType type, + const std::function(uint32_t)> cbGenerator, + const std::function &limitFunc) +{ + CHECK_AND_RETURN_LOG(cbGenerator, "callback generator of type %{public}u is nullptr", type); + + sourceCbs_.RegistCallbackGenerator(type, cbGenerator); + cbLimitFunc_[HDI_ID_BASE_CAPTURE][type] = limitFunc; + AUDIO_INFO_LOG("regist source callback generator succ, type: %{public}u", type); +} + void HdiAdapterManager::DumpInfo(std::string &dumpString) { dumpString += "- adapter\n"; @@ -376,7 +398,7 @@ void HdiAdapterManager::DoRegistSinkCallback(uint32_t id, std::shared_ptr SinkCallbackWrapper::GetCallback(uint32_t type) +void SinkCallbackWrapper::RegistCallbackGenerator(uint32_t type, + std::function(uint32_t)> cbGenerator) +{ + CHECK_AND_RETURN_LOG(type < HDI_CB_TYPE_NUM, "invalid type %{public}u", type); + CHECK_AND_RETURN_LOG(cbGenerator, "callback generator is nullptr"); + std::lock_guard lock(cbGeneratorMtx_); + cbGenerators_[type] = cbGenerator; +} + +std::shared_ptr SinkCallbackWrapper::GetCallback(uint32_t type, uint32_t renderId) { CHECK_AND_RETURN_RET_LOG(type < HDI_CB_TYPE_NUM, nullptr, "invalid type %{public}u", type); - CHECK_AND_RETURN_RET(cbs_.count(type), nullptr); - std::lock_guard lock(cbMtx_); - return cbs_[type]; + std::lock_guard cbLock(cbMtx_); + if (cbs_.count(type)) { + return cbs_[type]; + } + std::lock_guard cbGeneratorLock(cbGeneratorMtx_); + if (cbGenerators_.count(type) && cbGenerators_[type]) { + return cbGenerators_[type](renderId); + } + return nullptr; } IAudioSinkCallback *SinkCallbackWrapper::GetRawCallback(uint32_t type) @@ -106,12 +121,27 @@ void SourceCallbackWrapper::RegistCallback(uint32_t type, IAudioSourceCallback * rawCbs_[type] = cb; } -std::shared_ptr SourceCallbackWrapper::GetCallback(uint32_t type) +void SourceCallbackWrapper::RegistCallbackGenerator(uint32_t type, + std::function(uint32_t)> cbGenerator) +{ + CHECK_AND_RETURN_LOG(type < HDI_CB_TYPE_NUM, "invalid type %{public}u", type); + CHECK_AND_RETURN_LOG(cbGenerator, "callback generator is nullptr"); + std::lock_guard lock(cbGeneratorMtx_); + cbGenerators_[type] = cbGenerator; +} + +std::shared_ptr SourceCallbackWrapper::GetCallback(uint32_t type, uint32_t captureId) { CHECK_AND_RETURN_RET_LOG(type < HDI_CB_TYPE_NUM, nullptr, "invalid type %{public}u", type); - CHECK_AND_RETURN_RET(cbs_.count(type), nullptr); - std::lock_guard lock(cbMtx_); - return cbs_[type]; + std::lock_guard cbLock(cbMtx_); + if (cbs_.count(type)) { + return cbs_[type]; + } + std::lock_guard cbGeneratorLock(cbGeneratorMtx_); + if (cbGenerators_.count(type) && cbGenerators_[type]) { + return cbGenerators_[type](captureId); + } + return nullptr; } IAudioSourceCallback *SourceCallbackWrapper::GetRawCallback(uint32_t type) diff --git a/services/audio_service/server/include/audio_server.h b/services/audio_service/server/include/audio_server.h index 44d19a8bef12d7d04c2087dea1909a2e15f065fd..7e07dac5b6f04e9b07f5894248af95b2d0f5adf1 100644 --- a/services/audio_service/server/include/audio_server.h +++ b/services/audio_service/server/include/audio_server.h @@ -152,7 +152,7 @@ public: bool GetEffectOffloadEnabled() override; - void OnCapturerState(bool isActive, int32_t num); + void OnCapturerState(bool isActive, size_t preNum, size_t curNum); // IAudioServerInnerCall int32_t SetSinkRenderEmpty(const std::string &devceClass, int32_t durationUs) final; diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index ce967f414f3ffb8a6b62c8f635287c1d764ea5d4..1b302052adbab09e11ea144129de4f45d3ee1583 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -229,27 +229,37 @@ static void UpdatePrimaryInstance(std::shared_ptr &sink, class CapturerStateOb final : public IAudioSourceCallback { public: - explicit CapturerStateOb(std::function callback) : callback_(callback) + explicit CapturerStateOb(uint32_t captureId, std::function callback) + : captureId_(captureId), callback_(callback) { - num_ = count_.fetch_add(1, std::memory_order_relaxed); } ~CapturerStateOb() override final { - count_.fetch_sub(1, std::memory_order_relaxed); } void OnCaptureState(bool isActive) override final { - callback_(isActive, num_); + std::lock_guard lock(captureIdMtx_); + auto preNum = captureIds_.size(); + if (isActive) { + captureIds_.insert(captureId_); + } else { + captureIds_.erase(captureId_); + } + auto curNum = captureIds_.size(); + AUDIO_INFO_LOG("captureId: %{public}u, preNum: %{public}zu, curNum: %{public}zu, isActive: %{public}d", + captureId_, preNum, curNum, isActive); + callback_(isActive, preNum, curNum); } private: - static inline std::atomic count_ = 0; - int32_t num_; + static inline std::unordered_set captureIds_; + static inline std::mutex captureIdMtx_; + uint32_t captureId_; // callback to audioserver - std::function callback_; + std::function callback_; }; REGISTER_SYSTEM_ABILITY_BY_ID(AudioServer, AUDIO_DISTRIBUTED_SERVICE_ID, true) @@ -1607,7 +1617,7 @@ void AudioServer::OnWakeupClose() callback->OnWakeupClose(); } -void AudioServer::OnCapturerState(bool isActive, int32_t num) +void AudioServer::OnCapturerState(bool isActive, size_t preNum, size_t curNum) { AUDIO_DEBUG_LOG("OnCapturerState Callback start"); std::shared_ptr callback = nullptr; @@ -1618,20 +1628,8 @@ void AudioServer::OnCapturerState(bool isActive, int32_t num) // Ensure that the send callback is not executed concurrently std::lock_guard lockCb(onCapturerStateCbMutex_); - - uint64_t previousStateFlag; - uint64_t currentStateFlag; - if (isActive) { - uint64_t tempFlag = static_cast(1) << num; - previousStateFlag = capturerStateFlag_.fetch_or(tempFlag); - currentStateFlag = previousStateFlag | tempFlag; - } else { - uint64_t tempFlag = ~(static_cast(1) << num); - previousStateFlag = capturerStateFlag_.fetch_and(tempFlag); - currentStateFlag = previousStateFlag & tempFlag; - } - bool previousState = previousStateFlag; - bool currentState = currentStateFlag; + bool previousState = preNum; + bool currentState = curNum; if (previousState == currentState) { // state not change, need not trigger callback @@ -1643,7 +1641,7 @@ void AudioServer::OnCapturerState(bool isActive, int32_t num) int64_t stamp = ClockTime::GetCurNano(); callback->OnCapturerState(isActive); stamp = (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND; - AUDIO_INFO_LOG("isActive:%{public}d num:%{public}d cb cost[%{public}" PRId64 "]", isActive, num, stamp); + AUDIO_INFO_LOG("isActive:%{public}d cb cost[%{public}" PRId64 "]", isActive, stamp); } int32_t AudioServer::SetParameterCallback(const sptr& object) @@ -1929,12 +1927,15 @@ void AudioServer::RegisterAudioCapturerSourceCallback() } return false; }; - std::shared_ptr callback = make_shared( - [this] (bool isActive, int32_t num) { - this->OnCapturerState(isActive, num); - } - ); - HdiAdapterManager::GetInstance().RegistSourceCallback(HDI_CB_CAPTURE_STATE, callback, limitFunc); + std::function(uint32_t)> callbackGenerator = [this](uint32_t captureId) -> + std::shared_ptr { + return std::make_shared(captureId, + [this] (bool isActive, size_t preNum, size_t curNum) { + this->OnCapturerState(isActive, preNum, curNum); + } + ); + }; + HdiAdapterManager::GetInstance().RegistSourceCallbackGenerator(HDI_CB_CAPTURE_STATE, callbackGenerator, limitFunc); } void AudioServer::RegisterAudioRendererSinkCallback() diff --git a/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp b/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp index 9434b75d21e7a3e79eba6a7c534fbf195e96c9b4..30d174219194cf432e38cb53493c39f83a5fee2b 100644 --- a/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_server_unit_test/src/audio_server_unit_test.cpp @@ -936,8 +936,8 @@ HWTEST_F(AudioServerUnitTest, AudioServerCreateAudioStream_001, TestSize.Level1) audioServer->OnRenderSinkParamChange("", key, "", ""); audioServer->OnCaptureSourceParamChange("", key, "", ""); audioServer->OnWakeupClose(); - audioServer->OnCapturerState(true, 1); - audioServer->OnCapturerState(false, 1); + audioServer->OnCapturerState(true, 0, 1); + audioServer->OnCapturerState(false, 1, 0); int32_t res = audioServer->SetParameterCallback(remoteObject); EXPECT_EQ(res, ERR_INVALID_PARAM); res = audioServer->SetWakeupSourceCallback(remoteObject);