diff --git a/frameworks/native/audiocapturer/include/audio_capturer_private.h b/frameworks/native/audiocapturer/include/audio_capturer_private.h index 9eb225bf14c3f75e7df9b0fae328b39bc1c039ec..c8450458aa3d951ffc8c44466bb879500fa457ef 100644 --- a/frameworks/native/audiocapturer/include/audio_capturer_private.h +++ b/frameworks/native/audiocapturer/include/audio_capturer_private.h @@ -153,6 +153,7 @@ private: void InitLatencyMeasurement(const AudioStreamParams &audioStreamParams); int32_t InitAudioStream(const AudioStreamParams &AudioStreamParams); int32_t InitAudioConcurrencyCallback(); + FastStatus GetFastStatusInner(); void FastStatusChangeCallback(FastStatus status); void CheckSignalData(uint8_t *buffer, size_t bufferSize) const; void ActivateAudioConcurrency(IAudioStream::StreamClass &streamClass); diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 74d8ff79eb0556705d4d6d1db75496720e0722fc..876d262353aea8be2ac62afb921732bf5a8ce201 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -425,9 +425,19 @@ int32_t AudioCapturerPrivate::SetInputDevice(DeviceType deviceType) const FastStatus AudioCapturerPrivate::GetFastStatus() { - std::shared_ptr currentStream = GetInnerStream(); - CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, FASTSTATUS_INVALID, "currentStream is nullptr"); - return currentStream->GetFastStatus(); + std::unique_lock lock(capturerMutex_, std::defer_lock); + if (callbackLoopTid_ != gettid()) { + lock.lock(); + } + + return GetFastStatusInner(); +} + +FastStatus AudioCapturerPrivate::GetFastStatusInner() +{ + // inner function. Must be called with AudioCapturerPrivate::capturerMutex_ held. + CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, FASTSTATUS_INVALID, "audioStream_ is nullptr"); + return audioStream_->GetFastStatus(); } int32_t AudioCapturerPrivate::InitAudioStream(const AudioStreamParams &audioStreamParams) @@ -699,7 +709,7 @@ int32_t AudioCapturerPrivate::CheckAndRestoreAudioCapturer(std::string callingFu interruptCbImpl->StartSwitch(); } - FastStatus fastStatus = GetFastStatus(); + FastStatus fastStatus = GetFastStatusInner(); // Switch to target audio stream. Deactivate audio interrupt if switch failed. AUDIO_INFO_LOG("Before %{public}s, restore audio capturer %{public}u", callingFunc.c_str(), sessionID_); if (!SwitchToTargetStream(targetClass, restoreInfo)) { @@ -1658,7 +1668,7 @@ int32_t AudioCapturerPrivate::InitAudioConcurrencyCallback() void AudioCapturerPrivate::FastStatusChangeCallback(FastStatus status) { - FastStatus newStatus = GetFastStatus(); + FastStatus newStatus = GetFastStatusInner(); if (newStatus != status) { if (fastStatusChangeCallback_ != nullptr) { fastStatusChangeCallback_->OnFastStatusChange(newStatus); diff --git a/frameworks/native/audiorenderer/include/audio_renderer_private.h b/frameworks/native/audiorenderer/include/audio_renderer_private.h index ff0ba99db40d44f120a3106820bac616cd9c940e..f0156836e54132c72c1c38d9127c22e4922e71a2 100644 --- a/frameworks/native/audiorenderer/include/audio_renderer_private.h +++ b/frameworks/native/audiorenderer/include/audio_renderer_private.h @@ -229,6 +229,7 @@ private: std::shared_ptr GetInnerStream() const; int32_t InitFormatUnsupportedErrorCallback(); int32_t SetPitch(float pitch); + FastStatus GetFastStatusInner(); void FastStatusChangeCallback(FastStatus status); std::shared_ptr audioInterruptCallback_ = nullptr; diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index e24ce8483f4f02b635274b0b7a7c9362aec6362c..e691ad820b998315bbb76448764a83635379ced1 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -920,7 +920,7 @@ int32_t AudioRendererPrivate::CheckAndRestoreAudioRenderer(std::string callingFu interruptCbImpl->StartSwitch(); } - FastStatus fastStatus = GetFastStatus(); + FastStatus fastStatus = GetFastStatusInner(); // Switch to target audio stream. Deactivate audio interrupt if switch failed. AUDIO_INFO_LOG("Before %{public}s, restore audiorenderer %{public}u", callingFunc.c_str(), sessionID_); if (!SwitchToTargetStream(targetClass, restoreInfo)) { @@ -2634,9 +2634,19 @@ int32_t AudioRendererPrivate::SetDefaultOutputDevice(DeviceType deviceType) FastStatus AudioRendererPrivate::GetFastStatus() { - std::shared_ptr currentStream = GetInnerStream(); - CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, FASTSTATUS_INVALID, "audioStream_ is nullptr"); - return currentStream->GetFastStatus(); + std::unique_lock lock(rendererMutex_, std::defer_lock); + if (callbackLoopTid_ != gettid()) { + lock.lock(); + } + + return GetFastStatusInner(); +} + +FastStatus AudioRendererPrivate::GetFastStatusInner() +{ + // inner function. Must be called with AudioRendererPrivate::rendererMutex_ held. + CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, FASTSTATUS_INVALID, "audioStream_ is nullptr"); + return audioStream_->GetFastStatus(); } // diffrence from GetAudioPosition only when set speed @@ -2661,7 +2671,7 @@ int32_t AudioRendererPrivate::InitFormatUnsupportedErrorCallback() void AudioRendererPrivate::FastStatusChangeCallback(FastStatus status) { - FastStatus newStatus = GetFastStatus(); + FastStatus newStatus = GetFastStatusInner(); if (newStatus != status) { if (fastStatusChangeCallback_ != nullptr) { fastStatusChangeCallback_->OnFastStatusChange(newStatus);