diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index 9a308e50566cbd0c56dd1d4c5c39a015eb972258..a890507875f011419b760758d1a2b495c398fd2a 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -242,6 +242,8 @@ private: int32_t HandleCreateFastStreamError(AudioStreamParams &audioStreamParams, AudioStreamType audioStreamType); int32_t StartSwitchProcess(RestoreInfo &restoreInfo, IAudioStream::StreamClass &targetClass, std::string callingFunc); + void SetReleaseFlagWithLock(bool releaseFlag); + void SetReleaseFlagNoLock(bool releaseFlag); std::shared_ptr audioInterruptCallback_ = nullptr; std::shared_ptr audioStreamCallback_ = nullptr; @@ -289,6 +291,7 @@ private: AudioLoopThread taskLoop_ = AudioLoopThread("OS_Recreate"); int32_t audioHapticsSyncId_ = 0; + bool releaseFlag_ = false; }; class AudioRendererInterruptCallbackImpl : public AudioInterruptCallback { diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 48a35078c7dc378bf3674e926ec56f1582d73391..6ea82e4d44aa24505bdf1b95b2464b7331db69fe 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -917,6 +917,7 @@ int32_t AudioRendererPrivate::StartSwitchProcess(RestoreInfo &restoreInfo, IAudi std::unique_lock lock; if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks lock = std::unique_lock(rendererMutex_); + CHECK_AND_RETURN_RET_LOG(releaseFlag_ == false, SUCCESS, "In renderer release, return"); } // Block interrupt calback, avoid pausing wrong stream. @@ -963,6 +964,7 @@ int32_t AudioRendererPrivate::CheckAndRestoreAudioRenderer(std::string callingFu std::unique_lock lock; if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks lock = std::unique_lock(rendererMutex_); + CHECK_AND_RETURN_RET_LOG(releaseFlag_ == false, SUCCESS, "In renderer release, return"); } // Return in advance if there's no need for restore. @@ -1274,11 +1276,28 @@ bool AudioRendererPrivate::Stop() return result; } +void AudioRendererPrivate::SetReleaseFlagWithLock(bool releaseFlag) +{ + std::unique_lock lock(rendererMutex_); + releaseFlag_ = releaseFlag; +} + +void AudioRendererPrivate::SetReleaseFlagNoLock(bool releaseFlag) +{ + releaseFlag_ = releaseFlag; +} + bool AudioRendererPrivate::Release() { Trace trace("KeyAction AudioRenderer::Release " + std::to_string(sessionID_)); + std::unique_lock lock; if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks + SetReleaseFlagWithLock(true); + auto audioStreamInner = GetInnerStream(); + if (audioStreamInner != nullptr) { + audioStreamInner->JoinCallbackLoop(); + } lock = std::unique_lock(rendererMutex_); } AUDIO_WARNING_LOG("StreamClientState for Renderer::Release. id: %{public}u", sessionID_); @@ -1286,6 +1305,7 @@ bool AudioRendererPrivate::Release() abortRestore_ = true; if (audioStream_ == nullptr) { AUDIO_ERR_LOG("audioStream is null"); + SetReleaseFlagNoLock(false); return true; } bool result = audioStream_->ReleaseAudioStream(); @@ -1303,6 +1323,7 @@ bool AudioRendererPrivate::Release() for (auto id : usedSessionId_) { AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(id); } + SetReleaseFlagNoLock(false); lock.unlock(); RemoveRendererPolicyServiceDiedCallback();