diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index 4c2056f8aeba45773e784121c0c5a8547b70d96a..a483f6cf52e3cb48989dda1900cd766f9cc4528a 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -59,6 +59,7 @@ constexpr int32_t AUDIO_FLAG_VKB_FAST = 1025; constexpr int32_t AUDIO_USAGE_NORMAL = 0; constexpr int32_t AUDIO_USAGE_VOIP = 1; constexpr uint32_t STREAM_FLAG_FAST = 1; +constexpr uint32_t DEFAULT_SUSPEND_TIME_IN_MS = 3000; constexpr float MAX_STREAM_SPEED_LEVEL = 4.0f; constexpr float MIN_STREAM_SPEED_LEVEL = 0.125f; constexpr float NORMAL_STREAM_SPEED_LEVEL = 1.0f; diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index d77e83445c5e287dbf326a8939e036d1f5f89ac2..8ec539fd117dbffd1bbe6b62329c6f0ec7e39fe3 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -33,7 +33,6 @@ namespace OHOS { namespace AudioStandard { namespace HPAE { namespace { -constexpr uint32_t DEFAULT_SUSPEND_TIME_IN_MS = 3000; // 3s to stop hdi static inline const std::unordered_set INNER_SOURCE_TYPE_SET = { SOURCE_TYPE_PLAYBACK_CAPTURE, SOURCE_TYPE_REMOTE_CAST}; } // namespace @@ -267,7 +266,6 @@ int32_t HpaeManager::ReloadRenderManager(const AudioModuleInfo &audioModuleInfo, { HpaeSinkInfo sinkInfo; sinkInfo.sinkId = sinkNameSinkIdMap_[audioModuleInfo.name]; - sinkInfo.suspendTime = DEFAULT_SUSPEND_TIME_IN_MS; int32_t ret = TransModuleInfoToHpaeSinkInfo(audioModuleInfo, sinkInfo); if (ret != SUCCESS) { OnCallbackOpenOrReloadFailed(isReload); @@ -283,7 +281,6 @@ int32_t HpaeManager::CreateRendererManager(const AudioModuleInfo &audioModuleInf sinkSourceIndex_.fetch_add(1); HpaeSinkInfo sinkInfo; sinkInfo.sinkId = sinkSourceIndex; - sinkInfo.suspendTime = DEFAULT_SUSPEND_TIME_IN_MS; int32_t ret = TransModuleInfoToHpaeSinkInfo(audioModuleInfo, sinkInfo); if (ret != SUCCESS) { OnCallbackOpenOrReloadFailed(isReload); diff --git a/services/audio_engine/node/src/hpae_node_common.cpp b/services/audio_engine/node/src/hpae_node_common.cpp index 83beabdc4e0169039198d59b3305627706758171..648d9740c578cfac52939f475a4a19261d37f350 100644 --- a/services/audio_engine/node/src/hpae_node_common.cpp +++ b/services/audio_engine/node/src/hpae_node_common.cpp @@ -297,9 +297,11 @@ int32_t TransModuleInfoToHpaeSinkInfo(const AudioModuleInfo &audioModuleInfo, Hp } sinkInfo.deviceNetId = audioModuleInfo.networkId; sinkInfo.deviceClass = audioModuleInfo.className; - AUDIO_INFO_LOG("HpaeManager::deviceNetId: %{public}s, deviceClass: %{public}s", + sinkInfo.suspendTime = audioModuleInfo.suspendIdleTimeout; + AUDIO_INFO_LOG("HpaeManager::deviceNetId: %{public}s, deviceClass: %{public}s, suspend_time: %{public}u", sinkInfo.deviceNetId.c_str(), - sinkInfo.deviceClass.c_str()); + sinkInfo.deviceClass.c_str(), + sinkInfo.suspendTime); sinkInfo.adapterName = audioModuleInfo.adapterName; sinkInfo.lib = audioModuleInfo.lib; sinkInfo.splitMode = audioModuleInfo.extra; diff --git a/services/audio_policy/common/include/audio_module_info.h b/services/audio_policy/common/include/audio_module_info.h index 572cdb166c00f1431eed0c38d4209d495bec7d76..ca1b96f165c7cc03d193889ec3aa09d97964b17d 100644 --- a/services/audio_policy/common/include/audio_module_info.h +++ b/services/audio_policy/common/include/audio_module_info.h @@ -135,6 +135,7 @@ struct AudioModuleInfo { std::string micRefRate; std::string micRefFormat; std::string micRefChannels; + uint32_t suspendIdleTimeout = DEFAULT_SUSPEND_TIME_IN_MS; std::list ports; std::string extra; diff --git a/services/audio_policy/server/domain/pipe/include/audio_definition_adapter_info.h b/services/audio_policy/server/domain/pipe/include/audio_definition_adapter_info.h index f13f73c15647534e2975793cc280337b4c8a5511..e38ee7f9606fc612cc899f18778c03a4f0c60b07 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_definition_adapter_info.h +++ b/services/audio_policy/server/domain/pipe/include/audio_definition_adapter_info.h @@ -143,6 +143,7 @@ public: AudioPreloadType preloadAttr_ = PRELOAD_TYPE_UNKNOWN; uint32_t supportFlags_ = AUDIO_FLAG_NONE; + uint32_t suspendIdleTimeout_ = DEFAULT_SUSPEND_TIME_IN_MS; int32_t audioUsage_ = AUDIO_USAGE_NORMAL; bool supportEncodingEac3_ = false; diff --git a/services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp b/services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp index 8e9289d252a60709d73aaa20a645501cde5b6228..806fb3cda246f63eb6656eb69ddbd21f066a5504 100644 --- a/services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp +++ b/services/audio_policy/server/infra/config/parser/src/audio_policy_config_parser.cpp @@ -27,6 +27,19 @@ namespace AudioStandard { static const char *ENCODING_EAC3_NAME = "eac3"; static const char *FAST_DISTRIBUTE_TAG = "fast_distributed"; +static bool IsNumber(const std::string& str) +{ + if (str.empty()) { + return false; + } + for (auto c : str) { + if (!isdigit(c)) { + return false; + } + } + return true; +} + // LCOV_EXCL_START bool AudioPolicyConfigParser::LoadConfiguration() { @@ -294,6 +307,10 @@ void AudioPolicyConfigParser::ParseAttributeByName(AttributeInfo &attributeInfo, } } else if (attributeInfo.name_ == "preload") { pipeInfo->preloadAttr_ = AudioDefinitionPolicyUtils::preloadStrToEnum[attributeInfo.value_]; + } else if (attributeInfo.name_ == "suspend_idle_timeout") { + std::string value = attributeInfo.value_; + pipeInfo->suspendIdleTimeout_ = + IsNumber(value) ? static_cast(stoi(value)) : DEFAULT_SUSPEND_TIME_IN_MS; } } @@ -701,6 +718,7 @@ void AudioPolicyConfigParser::GetCommontAudioModuleInfo(std::shared_ptrpaProp_.fixedLatency_; audioModuleInfo.renderInIdleState = pipeInfo->paProp_.renderInIdleState_; + audioModuleInfo.suspendIdleTimeout = pipeInfo->suspendIdleTimeout_; } std::string AudioPolicyConfigParser::GetAudioModuleInfoName(std::string &pipeInfoName,