diff --git a/services/audio_engine/manager/include/hpae_manager.h b/services/audio_engine/manager/include/hpae_manager.h index 695756e7612eea591105a52ac1457cababa69383..96c737fe635d6c4aa86560903ed3c869090ba0eb 100644 --- a/services/audio_engine/manager/include/hpae_manager.h +++ b/services/audio_engine/manager/include/hpae_manager.h @@ -198,7 +198,7 @@ private: std::shared_ptr GetRendererManagerById(uint32_t sessionId); std::shared_ptr GetCapturerManagerById(uint32_t sessionId); - std::shared_ptr GetRendererManagerByNmae(const std::string &sinkName); + std::shared_ptr GetRendererManagerByName(const std::string &sinkName); std::shared_ptr GetCapturerManagerByName(const std::string &sourceName); void AddStreamToCollection(const HpaeStreamInfo &streamInfo); diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index 8d76d7fc29b4581691e68d6f96a5f972d2b22a93..6021962d88465c1e93f80b52bd3c659344d95cd7 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -466,7 +466,7 @@ int32_t HpaeManager::CloseOutAudioPort(std::string &sinkName) return SUCCESS; } if (sinkName == defaultSink_ && defaultSink_ != DEFAULT_SINK_NAME) { - if (GetRendererManagerByNmae(DEFAULT_SINK_NAME) != nullptr) { + if (GetRendererManagerByName(DEFAULT_SINK_NAME) != nullptr) { AUDIO_INFO_LOG("reset default sink to primary."); defaultSink_ = DEFAULT_SINK_NAME; } else { @@ -528,7 +528,7 @@ int32_t HpaeManager::SetDefaultSink(std::string name) AUDIO_INFO_LOG("sink is same as default sink"); return; } - std::shared_ptr rendererManager = GetRendererManagerByNmae(defaultSink_); + std::shared_ptr rendererManager = GetRendererManagerByName(defaultSink_); if (rendererManager == nullptr) { AUDIO_INFO_LOG("default sink not exist, set default sink direct"); defaultSink_ = name; @@ -704,9 +704,10 @@ int32_t HpaeManager::MoveSinkInputByIndexOrName(uint32_t sinkInputId, uint32_t s return; } - if (!SafeGetMap(rendererManagerMap_, sinkName)) { - AUDIO_ERR_LOG("move session:%{public}u failed, can not find sink:%{public}s.", sinkInputId, - sinkName.c_str()); + std::shared_ptr rendererManager = GetRendererManagerByName(sinkName); + if (rendererManager == nullptr || !rendererManager->IsInit()) { + AUDIO_ERR_LOG("move session:%{public}u failed, can not find sink:%{public}s or sink is not open.", + sinkInputId, sinkName.c_str()); if (auto serviceCallback = serviceCallback_.lock()) { serviceCallback->OnMoveSinkInputByIndexOrNameCb(ERROR_INVALID_PARAM); } @@ -806,7 +807,7 @@ void HpaeManager::HandleMoveSinkInput(const std::shared_ptr s { uint32_t sessionId = sinkInputNode->GetNodeInfo().sessionId; AUDIO_INFO_LOG("handle move session:%{public}u to new sink:%{public}s", sessionId, sinkName.c_str()); - std::shared_ptr rendererManager = GetRendererManagerByNmae(sinkName); + std::shared_ptr rendererManager = GetRendererManagerByName(sinkName); if (rendererManager == nullptr) { AUDIO_ERR_LOG("handle move session:%{public}u failed,can not find sink by name:%{public}s", sessionId, sinkName.c_str()); @@ -977,10 +978,10 @@ void HpaeManager::HandleInitDeviceResult(std::string deviceName, int32_t result) serviceCallback->OnOpenAudioPortCb(sourceNameSourceIdMap_[deviceName]); } else { AUDIO_ERR_LOG("device:%{public}s is not exist.", deviceName.c_str()); - serviceCallback->OnOpenAudioPortCb(ERROR); + serviceCallback->OnOpenAudioPortCb(SINK_INVALID_ID); } } else if (serviceCallback) { - serviceCallback->OnOpenAudioPortCb(ERROR); + serviceCallback->OnOpenAudioPortCb(SINK_INVALID_ID); AUDIO_INFO_LOG("HandleInitDeviceResult deviceName:%{public}s " "result:%{public}d error", deviceName.c_str(), @@ -1111,7 +1112,7 @@ void HpaeManager::DestroyCapture(uint32_t sessionId) } std::string captureName = capturerIdSourceNameMap_[sessionId]; if (INNER_SOURCE_TYPE_SET.count(capturerIdStreamInfoMap_[sessionId].streamInfo.sourceType) != 0) { - std::shared_ptr renderManager = GetRendererManagerByNmae(captureName); + std::shared_ptr renderManager = GetRendererManagerByName(captureName); if (renderManager != nullptr) { renderManager->DestroyStream(sessionId); } @@ -1538,7 +1539,7 @@ int32_t HpaeManager::GetSessionInfo( return SUCCESS; } -std::shared_ptr HpaeManager::GetRendererManagerByNmae(const std::string &sinkName) +std::shared_ptr HpaeManager::GetRendererManagerByName(const std::string &sinkName) { if (!SafeGetMap(rendererManagerMap_, sinkName)) { AUDIO_WARNING_LOG("can not find sinkName: %{public}s ", sinkName.c_str()); @@ -1559,7 +1560,7 @@ std::shared_ptr HpaeManager::GetCapturerManagerByName(cons std::shared_ptr HpaeManager::GetRendererManagerById(uint32_t sessionId) { if (rendererIdSinkNameMap_.find(sessionId) != rendererIdSinkNameMap_.end()) { - return GetRendererManagerByNmae(rendererIdSinkNameMap_[sessionId]); + return GetRendererManagerByName(rendererIdSinkNameMap_[sessionId]); } AUDIO_WARNING_LOG("can not find renderer by sessionId: %{public}u", sessionId); return nullptr; diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index 9dbaaa4e4fa1191afcdc91a4a2566b2d8bd2a1bf..bc2f357694995fc453042d7cd6c98065767e4576 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -62,7 +62,7 @@ int32_t HpaeRendererManager::CreateInputSession(const HpaeStreamInfo &streamInfo if (sinkInfo_.lib == "libmodule-split-stream-sink.z.so") { nodeInfo.sceneType = TransStreamUsageToSplitSceneType(streamInfo.effectInfo.streamUsage, sinkInfo_.splitMode); } else { - nodeInfo.sceneType = TransStreamTypeToSceneType(streamInfo.streamType); + nodeInfo.sceneType = TransEffectSceneToSceneType(streamInfo.effectInfo.effectScene); } if (IsMchDevice()) { nodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE; diff --git a/services/audio_engine/node/include/hpae_gain_node.h b/services/audio_engine/node/include/hpae_gain_node.h index 40e395884e06b2e0714a281d4ff927c19e079f6a..0ad55ac803e19c05f11fd58fa8ecc5688e4d25fa 100644 --- a/services/audio_engine/node/include/hpae_gain_node.h +++ b/services/audio_engine/node/include/hpae_gain_node.h @@ -45,6 +45,7 @@ private: bool fadeInState_ = false; FadeOutState fadeOutState_ = FadeOutState::NO_FADEOUT; IOperation operation_; + uint32_t pushFrameNum_ = 0; void DoGain(HpaePcmBuffer *input, uint32_t frameLen, uint32_t channelCount); void DoFading(HpaePcmBuffer *input); void SlienceData(HpaePcmBuffer *pcmBuffer); diff --git a/services/audio_engine/node/include/hpae_node_common.h b/services/audio_engine/node/include/hpae_node_common.h index ed78fe25a06c3219685696090b4a461d6cb817bb..8d1a032842363d1fb72fe41d51814baebd0157ab 100644 --- a/services/audio_engine/node/include/hpae_node_common.h +++ b/services/audio_engine/node/include/hpae_node_common.h @@ -24,6 +24,7 @@ namespace AudioStandard { namespace HPAE { bool CheckHpaeNodeInfoIsSame(HpaeNodeInfo &preNodeInfo, HpaeNodeInfo &curNodeInfo); HpaeProcessorType TransStreamTypeToSceneType(AudioStreamType streamType); +HpaeProcessorType TransEffectSceneToSceneType(AudioEffectScene effectScene); HpaeProcessorType TransSourceTypeToSceneType(SourceType sourceType); bool CheckSceneTypeNeedEc(HpaeProcessorType processorType); bool CheckSceneTypeNeedMicRef(HpaeProcessorType processorType); diff --git a/services/audio_engine/node/src/hpae_gain_node.cpp b/services/audio_engine/node/src/hpae_gain_node.cpp index 9d49fc27986f3d01dfe4bcac6fc4831a66a7eb33..068852b3ed8d6682290b71467e87d893b0a1c32a 100644 --- a/services/audio_engine/node/src/hpae_gain_node.cpp +++ b/services/audio_engine/node/src/hpae_gain_node.cpp @@ -38,6 +38,7 @@ static constexpr float FADE_LOW = 0.0f; static constexpr float FADE_HIGH = 1.0f; static constexpr float SHORT_FADE_PERIOD = 0.005f; // 5ms fade for 10ms < playback duration <= 40ms static constexpr float EPSILON = 1e-6f; +static constexpr uint32_t FADE_OUT_PUSH_NUM = 4; HpaeGainNode::HpaeGainNode(HpaeNodeInfo &nodeInfo) : HpaeNode(nodeInfo), HpaePluginNode(nodeInfo) { @@ -176,11 +177,12 @@ void HpaeGainNode::DoFading(HpaePcmBuffer *input) } if (fadeOutState_ == FadeOutState::DO_FADEOUT) { AUDIO_INFO_LOG("GainNode: fade out started!"); + pushFrameNum_ = 0; ProcessVol(data, byteLength, rawFormat, FADE_HIGH, FADE_LOW); fadeOutState_ = FadeOutState::DONE_FADEOUT; return; } - if (fadeOutState_ == FadeOutState::DONE_FADEOUT) { + if (fadeOutState_ == FadeOutState::DONE_FADEOUT && pushFrameNum_++ == FADE_OUT_PUSH_NUM) { AUDIO_INFO_LOG("fade out done, session %{public}d callback to update status", GetSessionId()); auto statusCallback = GetNodeStatusCallback().lock(); CHECK_AND_RETURN_LOG(statusCallback != nullptr, "statusCallback is null, cannot callback"); diff --git a/services/audio_engine/node/src/hpae_node_common.cpp b/services/audio_engine/node/src/hpae_node_common.cpp index 882ae72d13de8a44410f7c9883e3adf6dc512296..c64956ad9a9c7629d17f5d4300ca28a5704c990b 100644 --- a/services/audio_engine/node/src/hpae_node_common.cpp +++ b/services/audio_engine/node/src/hpae_node_common.cpp @@ -39,6 +39,16 @@ static std::map g_streamTypeToSceneTypeMap = {STREAM_MEDIA, HPAE_SCENE_OTHERS} }; +static std::map g_effectSceneToProcessorTypeMap = { + {SCENE_OTHERS, HPAE_SCENE_OTHERS}, + {SCENE_MUSIC, HPAE_SCENE_MUSIC}, + {SCENE_MOVIE, HPAE_SCENE_MOVIE}, + {SCENE_GAME, HPAE_SCENE_GAME}, + {SCENE_SPEECH, HPAE_SCENE_SPEECH}, + {SCENE_RING, HPAE_SCENE_RING}, + {SCENE_VOIP_DOWN, HPAE_SCENE_VOIP_DOWN} +}; + static std::unordered_map g_sourceTypeToSceneTypeMap = { {SOURCE_TYPE_MIC, HPAE_SCENE_RECORD}, {SOURCE_TYPE_CAMCORDER, HPAE_SCENE_RECORD}, @@ -121,6 +131,15 @@ HpaeProcessorType TransStreamTypeToSceneType(AudioStreamType streamType) } } +HpaeProcessorType TransEffectSceneToSceneType(AudioEffectScene effectScene) +{ + if (g_effectSceneToProcessorTypeMap.find(effectScene) == g_effectSceneToProcessorTypeMap.end()) { + return HPAE_SCENE_EFFECT_NONE; + } else { + return g_effectSceneToProcessorTypeMap[effectScene]; + } +} + HpaeProcessorType TransSourceTypeToSceneType(SourceType sourceType) { if (g_sourceTypeToSceneTypeMap.find(sourceType) == g_sourceTypeToSceneTypeMap.end()) {