diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 25bfe9f673970db5315b19864ae780c0eecbebde..f933333854c81b07f0cf3cdd3eebc0f9dd1ff77b 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 d984c5f3857342036547b4b8b5e10a04efe41fef..f1082be699288a23a0f4befdc6caf14fb9b741b8 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 7aba9e07f2271bd620e9cca464ec968588bd99b4..aba6c18502143af3ebb093db6d353b44e04185fa 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 13715214ba6748fed0b2abf9755ca2c1cc20cf0f..3b0bb02e04447f8fc964edee6a8daad097d6a3da 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