diff --git a/frameworks/native/audiocapturer/include/audio_capturer_private.h b/frameworks/native/audiocapturer/include/audio_capturer_private.h index 8fb3aac934279f08880eaf6325f30a9203691ede..ce3b532401b6ea558626b4ed5b3d3a52f62a7b16 100644 --- a/frameworks/native/audiocapturer/include/audio_capturer_private.h +++ b/frameworks/native/audiocapturer/include/audio_capturer_private.h @@ -138,7 +138,7 @@ private: int32_t CheckAndStopAudioCapturer(std::string callingFunc); int32_t InitAudioInterruptCallback(); std::shared_ptr ConvertToStreamDescriptor(const AudioStreamParams &audioStreamParams); - void SetClientInfo(uint32_t flag, IAudioStream::StreamClass &streamClass); + IAudioStream::StreamClass DecideStreamClassAndUpdateCapturerInfo(uint32_t flag); int32_t InitInputDeviceChangeCallback(); int32_t SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr audioStream); void InitSwitchInfo(IAudioStream::StreamClass targetClass, IAudioStream::SwitchInfo &info); diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 435b1e6b6f0aa3c8e87f8f2719ed0f5200db61b3..43b64def719559acec035e07db92056c4094d7e4 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -310,7 +310,7 @@ int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params) AUDIO_INFO_LOG("StreamClientState for Capturer::CreateClient. id %{public}u, flag :%{public}u", audioStreamParams.originalSessionId, flag); - SetClientInfo(flag, streamClass); + streamClass = DecideStreamClassAndUpdateCapturerInfo(flag); // check AudioStreamParams for fast stream if (audioStream_ == nullptr) { audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_, @@ -377,24 +377,27 @@ std::shared_ptr AudioCapturerPrivate::ConvertToStreamDesc return streamDesc; } -void AudioCapturerPrivate::SetClientInfo(uint32_t flag, IAudioStream::StreamClass &streamClass) +IAudioStream::StreamClass AudioCapturerPrivate::DecideStreamClassAndUpdateCapturerInfo(uint32_t flag) { + IAudioStream::StreamClass ret = IAudioStream::StreamClass::PA_STREAM; if (flag & AUDIO_INPUT_FLAG_FAST) { if (flag & AUDIO_INPUT_FLAG_VOIP) { - streamClass = IAudioStream::StreamClass::VOIP_STREAM; capturerInfo_.originalFlag = AUDIO_FLAG_VOIP_FAST; capturerInfo_.capturerFlags = AUDIO_FLAG_VOIP_FAST; capturerInfo_.pipeType = PIPE_TYPE_CALL_IN; + ret = IAudioStream::StreamClass::VOIP_STREAM; } else { - streamClass = IAudioStream::StreamClass::FAST_STREAM; capturerInfo_.capturerFlags = AUDIO_FLAG_MMAP; capturerInfo_.pipeType = PIPE_TYPE_LOWLATENCY_IN; + ret = IAudioStream::StreamClass::FAST_STREAM; } } else { - streamClass = IAudioStream::StreamClass::PA_STREAM; - capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL; - capturerInfo_.pipeType = PIPE_TYPE_NORMAL_IN; + capturerInfo_.capturerFlags = AUDIO_FLAG_NORMAL; + capturerInfo_.pipeType = PIPE_TYPE_NORMAL_IN; } + AUDIO_INFO_LOG("Route flag: %{public}u, streamClass: %{public}d, capturerFlags: %{public}d, pipeType: %{public}d", + flag, ret, capturerInfo_.capturerFlags, capturerInfo_.pipeType); + return ret; } int32_t AudioCapturerPrivate::InitInputDeviceChangeCallback() @@ -710,8 +713,7 @@ int32_t AudioCapturerPrivate::CheckAndRestoreAudioCapturer(std::string callingFu // Get restore info and target stream class for switching. RestoreInfo restoreInfo; audioStream_->GetRestoreInfo(restoreInfo); - IAudioStream::StreamClass targetClass = IAudioStream::StreamClass::PA_STREAM; - SetClientInfo(restoreInfo.routeFlag, targetClass); + IAudioStream::StreamClass targetClass = DecideStreamClassAndUpdateCapturerInfo(restoreInfo.routeFlag); if (restoreStatus == NEED_RESTORE_TO_NORMAL) { restoreInfo.targetStreamFlag = AUDIO_FLAG_FORCED_NORMAL; } @@ -1532,7 +1534,7 @@ bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateCapturerClient failed"); bool switchResult = false; - std::shared_ptr oldAudioStream = nullptr; + targetClass = DecideStreamClassAndUpdateCapturerInfo(flag); std::shared_ptr newAudioStream = IAudioStream::GetRecordStream(targetClass, switchInfo.params, switchInfo.eStreamType, appInfo_.appUid); CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "GetRecordStream failed."); @@ -1559,7 +1561,7 @@ bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla CHECK_AND_RETURN_RET_LOG(initResult == SUCCESS, false, "Init ipc strean failed"); } - oldAudioStream = audioStream_; + std::shared_ptr oldAudioStream = audioStream_; // Operation of replace audioStream_ must be performed before StartAudioStream. // Otherwise GetBufferDesc will return the buffer pointer of oldStream (causing Use-After-Free). audioStream_ = newAudioStream; diff --git a/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_extra_plus_unit_test.cpp b/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_extra_plus_unit_test.cpp index 19bbdd4c2bae5e0e3bf39b488f7d7650e5cc9fd9..b0762efb66398a2890b51d1f543f12870f5dc3a0 100644 --- a/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_extra_plus_unit_test.cpp +++ b/frameworks/native/audiocapturer/test/unittest/capturer_test/src/audio_capturer_extra_plus_unit_test.cpp @@ -522,7 +522,7 @@ HWTEST(AudioCapturerUnitTest, AudioCapturerPrivate_024, TestSize.Level1) * @tc.name : Test AudioCapturerPrivate API * @tc.type : FUNC * @tc.number: AudioCapturerPrivate_025 - * @tc.desc : Test AudioCapturerPrivate::SetClientInfo + * @tc.desc : Test AudioCapturerPrivate::DecideStreamClassAndUpdateCapturerInfo */ HWTEST(AudioCapturerUnitTest, AudioCapturerPrivate_025, TestSize.Level1) { @@ -531,10 +531,8 @@ HWTEST(AudioCapturerUnitTest, AudioCapturerPrivate_025, TestSize.Level1) ASSERT_NE(capturer, nullptr); uint32_t flag = 0x6000; - IAudioStream::StreamClass streamClass = IAudioStream::StreamClass::PA_STREAM; - - capturer->SetClientInfo(flag, streamClass); - EXPECT_EQ(capturer->capturerInfo_.pipeType, PIPE_TYPE_CALL_IN); + IAudioStream::StreamClass streamClass = capturer->DecideStreamClassAndUpdateCapturerInfo(flag); + EXPECT_EQ(streamClass, IAudioStream::StreamClass::VOIP_STREAM); } /** diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index a3d8fc717ae1aa73894f08230e7e5985dfd94a1a..377d34f75010facd141a5460f48310abcc4a5837 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -201,7 +201,7 @@ private: std::shared_ptr ConvertToStreamDescriptor(const AudioStreamParams &audioStreamParams); std::shared_ptr GetStreamDescBySwitchInfo( const IAudioStream::SwitchInfo &switchInfo, const RestoreInfo &restoreInfo); - void SetClientInfo(uint32_t flag, IAudioStream::StreamClass &streamClass); + IAudioStream::StreamClass DecideStreamClassAndUpdateRendererInfo(uint32_t flag); int32_t InitAudioInterruptCallback(bool isRestoreAudio = false); int32_t InitOutputDeviceChangeCallback(); void InitAudioRouteCallback(); diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 94735bd51858239b49036eab409eafb2536fbd22..5fa3ccce3a19892dcbc393dca50648df8ef3bc12 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -709,7 +709,7 @@ int32_t AudioRendererPrivate::PrepareAudioStream(AudioStreamParams &audioStreamP HILOG_COMM_INFO("StreamClientState for Renderer::CreateClient. id %{public}u, flag: %{public}u", audioStreamParams.originalSessionId, flag); - SetClientInfo(flag, streamClass); + streamClass = DecideStreamClassAndUpdateRendererInfo(flag); if (audioStream_ == nullptr) { audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType, @@ -742,45 +742,42 @@ std::shared_ptr AudioRendererPrivate::ConvertToStreamDesc return streamDesc; } -void AudioRendererPrivate::SetClientInfo(uint32_t flag, IAudioStream::StreamClass &streamClass) +IAudioStream::StreamClass AudioRendererPrivate::DecideStreamClassAndUpdateRendererInfo(uint32_t flag) { + IAudioStream::StreamClass ret = IAudioStream::StreamClass::PA_STREAM; if (flag & AUDIO_OUTPUT_FLAG_FAST) { if (flag & AUDIO_OUTPUT_FLAG_VOIP) { - streamClass = IAudioStream::StreamClass::VOIP_STREAM; rendererInfo_.originalFlag = AUDIO_FLAG_VOIP_FAST; rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_FAST; rendererInfo_.pipeType = PIPE_TYPE_LOWLATENCY_OUT; + ret = IAudioStream::StreamClass::VOIP_STREAM; } else { - streamClass = IAudioStream::StreamClass::FAST_STREAM; rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_FAST; rendererInfo_.pipeType = PIPE_TYPE_LOWLATENCY_OUT; + ret = IAudioStream::StreamClass::FAST_STREAM; } } else if (flag & AUDIO_OUTPUT_FLAG_DIRECT) { if (flag & AUDIO_OUTPUT_FLAG_VOIP) { - streamClass = IAudioStream::StreamClass::PA_STREAM; rendererInfo_.originalFlag = AUDIO_FLAG_VOIP_DIRECT; rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_DIRECT; rendererInfo_.pipeType = PIPE_TYPE_CALL_OUT; } else { - streamClass = IAudioStream::StreamClass::PA_STREAM; rendererInfo_.rendererFlags = AUDIO_FLAG_DIRECT; rendererInfo_.pipeType = PIPE_TYPE_DIRECT_OUT; } } else if (flag & AUDIO_OUTPUT_FLAG_LOWPOWER) { - streamClass = IAudioStream::StreamClass::PA_STREAM; rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL; rendererInfo_.pipeType = PIPE_TYPE_OFFLOAD; } else if (flag & AUDIO_OUTPUT_FLAG_MULTICHANNEL) { - streamClass = IAudioStream::StreamClass::PA_STREAM; rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL; rendererInfo_.pipeType = PIPE_TYPE_MULTICHANNEL; } else { - streamClass = IAudioStream::StreamClass::PA_STREAM; rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL; rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT; } AUDIO_INFO_LOG("Route flag: %{public}u, streamClass: %{public}d, rendererFlag: %{public}d, pipeType: %{public}d", - flag, streamClass, rendererInfo_.rendererFlags, rendererInfo_.pipeType); + flag, ret, rendererInfo_.rendererFlags, rendererInfo_.pipeType); + return ret; } int32_t AudioRendererPrivate::GetParams(AudioRendererParams ¶ms) const @@ -1013,7 +1010,7 @@ int32_t AudioRendererPrivate::CheckAndRestoreAudioRenderer(std::string callingFu // Get restore info and target stream class for switching. audioStream_->GetRestoreInfo(restoreInfo); - SetClientInfo(restoreInfo.routeFlag, targetClass); + targetClass = DecideStreamClassAndUpdateRendererInfo(restoreInfo.routeFlag); if (restoreStatus == NEED_RESTORE_TO_NORMAL) { restoreInfo.targetStreamFlag = AUDIO_FLAG_FORCED_NORMAL; } @@ -2267,8 +2264,8 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed"); bool switchResult = false; - std::shared_ptr oldAudioStream = nullptr; // create new IAudioStream + targetClass = DecideStreamClassAndUpdateRendererInfo(flag); std::shared_ptr newAudioStream = IAudioStream::GetPlaybackStream(targetClass, switchInfo.params, switchInfo.eStreamType, appInfo_.appUid); CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "SetParams GetPlayBackStream failed."); @@ -2301,7 +2298,7 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla switchResult = SetSwitchInfo(switchInfo, newAudioStream); CHECK_AND_RETURN_RET_LOG(switchResult, false, "Init ipc stream failed"); } - oldAudioStream = audioStream_; + std::shared_ptr oldAudioStream = audioStream_; // Update audioStream_ to newAudioStream in both AudioRendererPrivate and AudioInterruptCallbackImpl. // Operation of replace audioStream_ must be performed before StartAudioStream. // Otherwise GetBufferDesc will return the buffer pointer of oldStream (causing Use-After-Free). diff --git a/frameworks/native/audiorenderer/test/unittest/renderer_test/src/audio_renderer_setter_unit_test.cpp b/frameworks/native/audiorenderer/test/unittest/renderer_test/src/audio_renderer_setter_unit_test.cpp index 0a096315a91cade71f0e96f79c8a72a803f6555f..28924a8fcec5b88c7491ed01e6b31891b243f0e1 100644 --- a/frameworks/native/audiorenderer/test/unittest/renderer_test/src/audio_renderer_setter_unit_test.cpp +++ b/frameworks/native/audiorenderer/test/unittest/renderer_test/src/audio_renderer_setter_unit_test.cpp @@ -1705,10 +1705,10 @@ HWTEST(AudioRendererUnitTest, SetAudioPrivacyType_001, TestSize.Level1) /** * @tc.name : Test AudioRendererPrivate - * @tc.number: SetClientInfo_001 - * @tc.desc : Test SetClientInfo API + * @tc.number: DecideStreamClassAndUpdateRendererInfo_001 + * @tc.desc : Test DecideStreamClassAndUpdateRendererInfo API */ -HWTEST(AudioRendererUnitTest, SetClientInfo_001, TestSize.Level1) +HWTEST(AudioRendererUnitTest, DecideStreamClassAndUpdateRendererInfo_001, TestSize.Level1) { AppInfo appInfo = {}; std::shared_ptr audioRendererPrivate = @@ -1716,23 +1716,23 @@ HWTEST(AudioRendererUnitTest, SetClientInfo_001, TestSize.Level1) uint32_t flag = AUDIO_OUTPUT_FLAG_FAST; IAudioStream::StreamClass streamClass; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::FAST_STREAM); flag = AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_VOIP; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::VOIP_STREAM); flag = AUDIO_OUTPUT_FLAG_DIRECT; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::PA_STREAM); flag = AUDIO_OUTPUT_FLAG_MULTICHANNEL; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::PA_STREAM); flag = AUDIO_FLAG_NONE; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::PA_STREAM); } @@ -2437,10 +2437,10 @@ HWTEST(AudioRendererUnitTest, Audio_Renderer_SwitchToTargetStream_002, TestSize. /** * @tc.name : Test AudioRendererPrivate - * @tc.number: SetClientInfo_002 - * @tc.desc : Test SetClientInfo API + * @tc.number: DecideStreamClassAndUpdateRendererInfo_002 + * @tc.desc : Test DecideStreamClassAndUpdateRendererInfo API */ -HWTEST(AudioRendererUnitTest, SetClientInfo_002, TestSize.Level1) +HWTEST(AudioRendererUnitTest, DecideStreamClassAndUpdateRendererInfo_002, TestSize.Level1) { AppInfo appInfo = {}; std::shared_ptr audioRendererPrivate = @@ -2448,11 +2448,11 @@ HWTEST(AudioRendererUnitTest, SetClientInfo_002, TestSize.Level1) uint32_t flag = AUDIO_OUTPUT_FLAG_DIRECT; IAudioStream::StreamClass streamClass; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::PA_STREAM); flag = AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_VOIP; - audioRendererPrivate->SetClientInfo(flag, streamClass); + streamClass = audioRendererPrivate->DecideStreamClassAndUpdateRendererInfo(flag); EXPECT_EQ(streamClass, IAudioStream::StreamClass::PA_STREAM); } } // namespace AudioStandard diff --git a/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp b/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp index 2bfdd3cf01cb972089d0ec5c712decedd93f988d..b68a61ad2028e622b3cfb898649e75cc9183af89 100644 --- a/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp +++ b/services/audio_service/test/unittest/client/capturer_in_client_unit_test.cpp @@ -251,6 +251,7 @@ void Init(std::shared_ptr capturerInClientInner) size_t size = 8 * 1024; capturerInClientInner->clientSpanSizeInByte_ = size; capturerInClientInner->ringCache_ = std::make_unique(size); + capturerInClientInner->clientBuffer_ = OHAudioBuffer::CreateFromLocal(VALUE_FIF, VALUE_FIVE, VALUE_FOUR); } /**