diff --git a/frameworks/native/audiocapturer/include/audio_capturer_private.h b/frameworks/native/audiocapturer/include/audio_capturer_private.h index 8f87d88b652942d3c3aec85ae5b1b1c4305bc461..ce3f3113afbc7581020a391856b2ebb33f7cc1a6 100644 --- a/frameworks/native/audiocapturer/include/audio_capturer_private.h +++ b/frameworks/native/audiocapturer/include/audio_capturer_private.h @@ -169,6 +169,7 @@ private: IAudioStream::StreamClass SetCaptureInfo(AudioStreamParams &audioStreamParams); std::shared_ptr GetStreamDescBySwitchInfo( const IAudioStream::SwitchInfo &switchInfo, const RestoreInfo &restoreInfo); + int32_t HandleCreateFastStreamError(AudioStreamParams &audioStreamParams); std::shared_ptr inputDeviceChangeCallback_ = nullptr; bool isSwitching_ = false; mutable std::shared_mutex switchStreamMutex_; diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 62f2e425485b7794fbde0a6bdcf7072e109d54d2..8e2c87b88858d051f1d27afe92b3cf7011cd48c1 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -305,14 +305,7 @@ int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params) ret = InitAudioStream(audioStreamParams); // When the fast stream creation fails, a normal stream is created if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) { - AUDIO_INFO_LOG("Create fast Stream fail, record by normal stream"); - streamClass = IAudioStream::PA_STREAM; - audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_, appInfo_.appUid); - CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Get normal record stream failed"); - ret = InitAudioStream(audioStreamParams); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init normal audio stream failed"); - audioStream_->SetCaptureMode(CAPTURE_MODE_CALLBACK); - callbackLoopTid_ = audioStream_->GetCallbackLoopTid(); + ret = HandleCreateFastStreamError(audioStreamParams); } CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed"); @@ -363,6 +356,7 @@ std::shared_ptr AudioCapturerPrivate::ConvertToStreamDesc streamDesc->appInfo_ = appInfo_; streamDesc->callerUid_ = static_cast(getuid()); streamDesc->callerPid_ = static_cast(getpid()); + streamDesc->sessionId_ = audioStreamParams.originalSessionId; return streamDesc; } @@ -1517,6 +1511,12 @@ bool AudioCapturerPrivate::FinishOldStream(IAudioStream::StreamClass targetClass bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo, CapturerState previousState, IAudioStream::SwitchInfo &switchInfo) { + std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); + uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; + int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( + streamDesc, flag, switchInfo.params.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateCapturerClient failed"); + bool switchResult = false; std::shared_ptr oldAudioStream = nullptr; std::shared_ptr newAudioStream = IAudioStream::GetRecordStream(targetClass, switchInfo.params, @@ -1528,6 +1528,11 @@ bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla int32_t initResult = SetSwitchInfo(switchInfo, newAudioStream); if (initResult != SUCCESS && switchInfo.capturerInfo.originalFlag != AUDIO_FLAG_NORMAL) { AUDIO_ERR_LOG("Re-create stream failed, crate normal ipc stream"); + streamDesc->capturerInfo_.capturerFlags = AUDIO_FLAG_FORCED_NORMAL; + int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( + streamDesc, flag, switchInfo.params.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed"); + newAudioStream = IAudioStream::GetRecordStream(IAudioStream::PA_STREAM, switchInfo.params, switchInfo.eStreamType, appInfo_.appUid); CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed"); @@ -1608,13 +1613,6 @@ bool AudioCapturerPrivate::SwitchToTargetStream(IAudioStream::StreamClass target switchResult = FinishOldStream(targetClass, restoreInfo, previousState, switchInfo); CHECK_AND_RETURN_RET_LOG(switchResult, false, "Finish old stream failed"); - // Create stream and pipe - std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); - uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; - int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( - streamDesc, flag, switchInfo.params.originalSessionId); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateCapturerClient failed"); - // Create and start new stream. switchResult = GenerateNewStream(targetClass, restoreInfo, previousState, switchInfo); CHECK_AND_RETURN_RET_LOG(switchResult, false, "Generate new stream failed"); @@ -2061,5 +2059,28 @@ int32_t AudioCapturerPrivate::CheckAndStopAudioCapturer(std::string callingFunc) Stop(); return SUCCESS; } + +int32_t AudioCapturerPrivate::HandleCreateFastStreamError(AudioStreamParams &audioStreamParams) +{ + AUDIO_INFO_LOG("Create fast Stream fail, record by normal stream"); + IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM; + capturerInfo_.capturerFlags = AUDIO_FLAG_FORCED_NORMAL; + + // Create stream desc and pipe + std::shared_ptr streamDesc = ConvertToStreamDescriptor(audioStreamParams); + uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; + int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient(streamDesc, flag, + audioStreamParams.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateCapturerClient failed"); + AUDIO_INFO_LOG("Create normal capturer, id: %{public}u", audioStreamParams.originalSessionId); + + audioStream_ = IAudioStream::GetRecordStream(streamClass, audioStreamParams, audioStreamType_, appInfo_.appUid); + CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Get normal record stream failed"); + ret = InitAudioStream(audioStreamParams); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Init normal audio stream failed"); + audioStream_->SetCaptureMode(CAPTURE_MODE_CALLBACK); + callbackLoopTid_ = audioStream_->GetCallbackLoopTid(); + return ret; +} } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index e5273d449544d6e73a32427ac1704626fafa403b..db9f9e0ec74b1151a15d806e142b389bacd00038 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -234,6 +234,7 @@ private: int32_t SetPitch(float pitch); FastStatus GetFastStatusInner(); void FastStatusChangeCallback(FastStatus status); + int32_t HandleCreateFastStreamError(AudioStreamParams &audioStreamParams, AudioStreamType audioStreamType); std::shared_ptr audioInterruptCallback_ = nullptr; std::shared_ptr audioStreamCallback_ = nullptr; diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index a7cfb6276305f973ee590a0c809ee3bc299feca3..181fe91d709ca9fee413ab445a94e5d2ccfc6b80 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -610,17 +610,7 @@ int32_t AudioRendererPrivate::SetParams(const AudioRendererParams params) ret = InitAudioStream(audioStreamParams); // When the fast stream creation fails, a normal stream is created if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) { - AUDIO_INFO_LOG("Create fast Stream fail, play by normal stream."); - streamClass = IAudioStream::PA_STREAM; - isFastRenderer_ = false; - audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType, - appInfo_.appUid); - CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, - ERR_INVALID_PARAM, "SetParams GetPlayBackStream failed when create normal stream."); - ret = InitAudioStream(audioStreamParams); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed"); - audioStream_->SetRenderMode(RENDER_MODE_CALLBACK); - callbackLoopTid_ = audioStream_->GetCallbackLoopTid(); + ret = HandleCreateFastStreamError(audioStreamParams, audioStreamType); } CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetAudioStreamInfo Failed"); @@ -684,6 +674,7 @@ std::shared_ptr AudioRendererPrivate::ConvertToStreamDesc streamDesc->appInfo_ = appInfo_; streamDesc->callerUid_ = static_cast(getuid()); streamDesc->callerPid_ = static_cast(getpid()); + streamDesc->sessionId_ = audioStreamParams.originalSessionId; return streamDesc; } @@ -2087,6 +2078,12 @@ bool AudioRendererPrivate::FinishOldStream(IAudioStream::StreamClass targetClass bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo, RendererState previousState, IAudioStream::SwitchInfo &switchInfo) { + std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); + uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL; + int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient( + streamDesc, flag, switchInfo.params.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed"); + bool switchResult = false; std::shared_ptr oldAudioStream = nullptr; // create new IAudioStream @@ -2100,6 +2097,11 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla switchResult = SetSwitchInfo(switchInfo, newAudioStream); if (!switchResult && switchInfo.rendererInfo.originalFlag != AUDIO_FLAG_NORMAL) { AUDIO_ERR_LOG("Re-create stream failed, create normal ipc stream"); + streamDesc->rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL; + int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag, + switchInfo.params.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed"); + newAudioStream = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, switchInfo.params, switchInfo.eStreamType, appInfo_.appUid); targetClass = IAudioStream::PA_STREAM; @@ -2188,13 +2190,6 @@ bool AudioRendererPrivate::SwitchToTargetStream(IAudioStream::StreamClass target switchResult = FinishOldStream(targetClass, restoreInfo, previousState, switchInfo); CHECK_AND_RETURN_RET_LOG(switchResult, false, "Finish old stream failed"); - // Create stream and pipe - std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); - uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL; - int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient( - streamDesc, flag, switchInfo.params.originalSessionId); - CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed"); - // Create and start new stream. switchResult = GenerateNewStream(targetClass, restoreInfo, previousState, switchInfo); CHECK_AND_RETURN_RET_LOG(switchResult, false, "Generate new stream failed"); @@ -2761,5 +2756,30 @@ int32_t AudioRendererPrivate::CheckAndStopAudioRenderer(std::string callingFunc) Stop(); return SUCCESS; } + +int32_t AudioRendererPrivate::HandleCreateFastStreamError(AudioStreamParams &audioStreamParams, + AudioStreamType audioStreamType) +{ + 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; + int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag, + audioStreamParams.originalSessionId); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed"); + AUDIO_INFO_LOG("Create normal renderer, id: %{public}u", audioStreamParams.originalSessionId); + + audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType, appInfo_.appUid); + CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Re-create normal stream failed."); + ret = InitAudioStream(audioStreamParams); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed"); + audioStream_->SetRenderMode(RENDER_MODE_CALLBACK); + callbackLoopTid_ = audioStream_->GetCallbackLoopTid(); + return ret; +} } // namespace AudioStandard } // namespace OHOS 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 13db0d3a6d971e88e44837e9fd324f9c64a2e631..8593dff62dd5d1c4234a548983f1a907cbedb394 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 @@ -268,6 +268,7 @@ void AudioCoreService::UpdatePlaybackStreamFlag(std::shared_ptrnewDeviceDescs_.front()->deviceType_); // fast/normal has done in audioRendererPrivate if (streamDesc->rendererInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL || + streamDesc->rendererInfo_.rendererFlags == AUDIO_FLAG_FORCED_NORMAL || (streamDesc->rendererInfo_.streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION && streamDesc->rendererInfo_.samplingRate != SAMPLE_RATE_48000)) { streamDesc->audioFlag_ = AUDIO_OUTPUT_FLAG_NORMAL; @@ -334,7 +335,8 @@ AudioFlag AudioCoreService::SetFlagForSpecialStream(std::shared_ptr streamDesc) { - if (streamDesc->capturerInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL) { + if (streamDesc->capturerInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL || + streamDesc->capturerInfo_.capturerFlags == AUDIO_FLAG_FORCED_NORMAL) { streamDesc->audioFlag_ = AUDIO_INPUT_FLAG_NORMAL; AUDIO_INFO_LOG("Forced normal cases"); return;