From 11a302fa6d964561450dc3591c2e1448fe82b82d Mon Sep 17 00:00:00 2001 From: zhanghuiming Date: Sun, 17 Aug 2025 12:37:23 +0000 Subject: [PATCH] support client force normal when create Signed-off-by: zhanghuiming Change-Id: I960afd7145f5003de2035b754df9710b30fef22f --- .../audiorenderer/src/audio_renderer.cpp | 4 +-- .../native/audiocommon/include/audio_info.h | 3 ++ .../service_main/src/audio_core_service.cpp | 7 +++++ .../src/audio_core_service_unit_test.cpp | 28 +++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 25bfe9f673..f933333854 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -2261,7 +2261,7 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla switchInfo.sessionId = switchInfo.params.originalSessionId; streamDesc->sessionId_ = switchInfo.params.originalSessionId; } - streamDesc->rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL; + streamDesc->rendererInfo_.forceToNormal = true; streamDesc->routeFlag_ = AUDIO_FLAG_NONE; int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag, switchInfo.params.originalSessionId, networkId); @@ -2932,12 +2932,12 @@ int32_t AudioRendererPrivate::HandleCreateFastStreamError(AudioStreamParams &aud AUDIO_INFO_LOG("Create fast Stream fail, play by normal stream."); IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM; isFastRenderer_ = false; - rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL; // Create stream desc and pipe std::shared_ptr streamDesc = ConvertToStreamDescriptor(audioStreamParams); uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL; std::string networkId = LOCAL_NETWORK_ID; + streamDesc->rendererInfo_.forceToNormal = true; int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag, audioStreamParams.originalSessionId, networkId); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed"); diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index d984c5f385..f1082be699 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -598,6 +598,7 @@ enum AudioLoopbackEqualizerPreset { struct AudioRendererInfo : public Parcelable { ContentType contentType = CONTENT_TYPE_UNKNOWN; StreamUsage streamUsage = STREAM_USAGE_UNKNOWN; + bool forceToNormal = false; int32_t rendererFlags = AUDIO_FLAG_NORMAL; AudioVolumeMode volumeMode = AUDIOSTREAM_VOLUMEMODE_SYSTEM_GLOBAL; std::string sceneType = ""; @@ -635,6 +636,7 @@ struct AudioRendererInfo : public Parcelable { { return parcel.WriteInt32(static_cast(contentType)) && parcel.WriteInt32(static_cast(streamUsage)) + && parcel.WriteBool(forceToNormal) && parcel.WriteInt32(rendererFlags) && parcel.WriteInt32(originalFlag) && parcel.WriteString(sceneType) @@ -659,6 +661,7 @@ struct AudioRendererInfo : public Parcelable { { contentType = static_cast(parcel.ReadInt32()); streamUsage = static_cast(parcel.ReadInt32()); + forceToNormal = parcel.ReadBool(); rendererFlags = parcel.ReadInt32(); originalFlag = parcel.ReadInt32(); sceneType = parcel.ReadString(); 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 7aba9e07f2..aba6c18502 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 @@ -297,6 +297,13 @@ bool AudioCoreService::IsForcedNormal(std::shared_ptr &st void AudioCoreService::UpdatePlaybackStreamFlag(std::shared_ptr &streamDesc, bool isCreateProcess) { CHECK_AND_RETURN_LOG(streamDesc, "Input param error"); + + if (isCreateProcess && streamDesc->rendererInfo_.forceToNormal) { + AUDIO_INFO_LOG("client force create normal"); + streamDesc->audioFlag_ = AUDIO_OUTPUT_FLAG_NORMAL; + return; + } + // fast/normal has done in audioRendererPrivate CHECK_AND_RETURN_LOG(IsForcedNormal(streamDesc) == false, "Forced normal cases"); diff --git a/services/audio_policy/test/unittest/audio_core_service_unit_test/src/audio_core_service_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_unit_test/src/audio_core_service_unit_test.cpp index 13715214ba..3b0bb02e04 100644 --- a/services/audio_policy/test/unittest/audio_core_service_unit_test/src/audio_core_service_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_unit_test/src/audio_core_service_unit_test.cpp @@ -817,6 +817,34 @@ HWTEST_F(AudioCoreServiceUnitTest, IsStreamSupportMultiChannel_002, TestSize.Lev EXPECT_EQ(GetServerPtr()->coreService_->IsStreamSupportMultiChannel(streamDesc), false); } +/** + * @tc.name : Test AudioCoreServiceUnit + * @tc.number : UpdatePlaybackStreamFlag_001 + * @tc.desc : Test UpdatePlaybackStreamFlag interface - when streamDesc is null, return flag normal. + */ +HWTEST_F(AudioCoreServiceUnitTest, UpdatePlaybackStreamFlag_001, TestSize.Level1) +{ + ASSERT_NE(nullptr, GetServerPtr()); + std::shared_ptr streamDesc = std::make_shared(); + streamDesc->rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL; + + bool isCreateProcess = true; + GetServerPtr()->coreService_->UpdatePlaybackStreamFlag(streamDesc, isCreateProcess); + EXPECT_EQ(streamDesc->audioFlag_, AUDIO_OUTPUT_FLAG_NORMAL); + + streamDesc->rendererInfo_.forceToNormal = true; + GetServerPtr()->coreService_->UpdatePlaybackStreamFlag(streamDesc, isCreateProcess); + EXPECT_EQ(streamDesc->audioFlag_, AUDIO_OUTPUT_FLAG_NORMAL); + + isCreateProcess = false; + GetServerPtr()->coreService_->UpdatePlaybackStreamFlag(streamDesc, isCreateProcess); + EXPECT_EQ(streamDesc->audioFlag_, AUDIO_OUTPUT_FLAG_NORMAL); + + streamDesc->rendererInfo_.forceToNormal = false; + GetServerPtr()->coreService_->UpdatePlaybackStreamFlag(streamDesc, isCreateProcess); + EXPECT_EQ(streamDesc->audioFlag_, AUDIO_OUTPUT_FLAG_NORMAL); +} + /** * @tc.name : Test AudioCoreServiceUnit * @tc.number : SetFlagForSpecialStream_001 -- Gitee