diff --git a/content/browser/media/session/media_session_controller.cc b/content/browser/media/session/media_session_controller.cc index 7dc38071e39e8843414977f429bd10bea1ef8545..fb1ebe503047b7ea6284ff418f9f0130d7c05e78 100644 --- a/content/browser/media/session/media_session_controller.cc +++ b/content/browser/media/session/media_session_controller.cc @@ -38,12 +38,17 @@ void MediaSessionController::SetMetadata( has_audio_ = has_audio; has_video_ = has_video; media_content_type_ = media_content_type; + LOG(INFO) << "MediaSessionController mediaContentType is:" << static_cast(media_content_type_); AddOrRemovePlayer(); } bool MediaSessionController::OnPlaybackStarted() { is_paused_ = false; is_playback_in_progress_ = true; +#if defined(OHOS_MEDIA_POLICY) + media_session_->SetPlayingState(true); + LOG(INFO) << "MediaSessionController OnPlaybackStarted SetPlayingState true"; +#endif return AddOrRemovePlayer(); } @@ -195,7 +200,10 @@ bool MediaSessionController::IsPictureInPictureAvailable(int player_id) const { void MediaSessionController::OnPlaybackPaused(bool reached_end_of_stream) { is_paused_ = true; - +#if defined(OHOS_MEDIA_POLICY) + media_session_->SetPlayingState(false); + LOG(INFO) << "MediaSessionController OnPlaybackStarted SetPlayingState false"; +#endif if (reached_end_of_stream) { #if defined(OHOS_MEDIA_AVSESSION) if (media_session_) { @@ -271,9 +279,31 @@ bool MediaSessionController::IsMediaSessionNeeded() const { return has_audio_ && !web_contents_->IsAudioMuted(); } +#if defined(OHOS_MEDIA_POLICY) +void MediaSessionController::SetSessionStateIfNeed(bool isNeedMediaSession) +{ + if (!media_session_) { + return; + } + if (media_content_type_ == media::MediaContentType::OneShot) { + LOG(INFO) << "MediaSessionController contentType is oneShot, don't control mediaSession"; + return; + } + if (isNeedMediaSession) { + LOG(INFO) << "MediaSessionController media has mediaSession"; + media_session_->SetSessionState(MediaSessionImpl::NWebMediaSessionState::NEED); + } else { + LOG(INFO) << "MediaSessionController media is preloading, has no mediaSession"; + media_session_->SetSessionState(MediaSessionImpl::NWebMediaSessionState::NONEED); + } +} +#endif + bool MediaSessionController::AddOrRemovePlayer() { const bool needs_session = IsMediaSessionNeeded(); - +#if defined(OHOS_MEDIA_POLICY) + SetSessionStateIfNeed(needs_session); +#endif if (needs_session) { // Attempt to add a session even if we already have one. MediaSession // expects AddPlayer() to be called after OnPlaybackPaused() to reactivate diff --git a/content/browser/media/session/media_session_controller.h b/content/browser/media/session/media_session_controller.h index f58424ed863c8b5a3f558cebc57c026bd6c82894..f456880791d03fafbc6a7e355b59eeb3cfceab53 100644 --- a/content/browser/media/session/media_session_controller.h +++ b/content/browser/media/session/media_session_controller.h @@ -116,6 +116,11 @@ class CONTENT_EXPORT MediaSessionController private: bool IsMediaSessionNeeded() const; +#if defined(OHOS_MEDIA_POLICY) + // Set whether to the HTML play can be used to control media + void SetSessionStateIfNeed(bool isNeedMediaSession); +#endif + // Determines whether a session is needed and adds or removes the player // accordingly. bool AddOrRemovePlayer(); diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index 95725c12b6c22a7892fc657c017a2e9b67d5883e..0bc96ee8ffaf505467d77c749d9fc25aa9c0396d 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc @@ -1342,6 +1342,32 @@ void MediaSessionImpl::SetEndOfMedia(bool end_of_media) session_ohos_->SetEndOfMedia(end_of_media); } } + +bool MediaSessionImpl::GetPlayingState() +{ + return isPlayingState_; +} + +void MediaSessionImpl::SetPlayingState(bool playingState) +{ + isPlayingState_ = playingState; +} + +bool MediaSessionImpl::GetMuteState() +{ + return is_muted_; +} + +void MediaSessionImpl::SetSessionState(MediaSessionImpl::NWebMediaSessionState sessionState) +{ + sessionState_ = sessionState; +} + +MediaSessionImpl::NWebMediaSessionState MediaSessionImpl::GetSessionState() +{ + return sessionState_; +} + #endif // OHOS_MEDIA_POLICY void MediaSessionImpl::ExitPictureInPicture() { diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h index a87a4d66b1f9b7ca54c093d4fd2034caa1b5214f..5074196dbb4c73f5e1f82987c061f89c6d3ece43 100644 --- a/content/browser/media/session/media_session_impl.h +++ b/content/browser/media/session/media_session_impl.h @@ -365,18 +365,27 @@ class MediaSessionImpl : public MediaSession, #if defined(OHOS_MEDIA_POLICY) public: enum NWebPlaybackState { NONE, PLAYING, PAUSED, STOP }; - + enum NWebMediaSessionState { NOINITIAL, NONEED, NEED }; NWebPlaybackState NWebGetState(); + void SetWebviewShow(bool show); void SetWebviewShowForAudio(bool show); void SetWebviewShowForVideo(bool show); bool IsEndOfMedia(); void SetEndOfMedia(bool end_of_media); + bool GetPlayingState(); + void SetPlayingState(bool playingState); + bool GetMuteState(); + + void SetSessionState(NWebMediaSessionState sessionState); + NWebMediaSessionState GetSessionState(); std::unordered_set activeAudioStream_; int audioResumeInterval_ = 0; bool audioExclusive_ = true; + bool isPlayingState_ = false; base::WeakPtrFactory weakMediaSessionFactory_; + NWebMediaSessionState sessionState_ = NWebMediaSessionState::NOINITIAL; #endif // defined(OHOS_MEDIA_POLICY) private: diff --git a/media/audio/ohos/ohos_audio_output_stream.cc b/media/audio/ohos/ohos_audio_output_stream.cc index 8e7ad85ba0f27e5e957eda2c77b29e2be557dbf7..58f9f8b65e45e6f97b34a96d57ff18e9a8d600b4 100644 --- a/media/audio/ohos/ohos_audio_output_stream.cc +++ b/media/audio/ohos/ohos_audio_output_stream.cc @@ -387,6 +387,11 @@ bool OHOSAudioOutputStream::InitRender( } bool OHOSAudioOutputStream::StartRender() { + if (IsPreloadOrMutedMediaMode()) { + audio_renderer_->SetAudioSilentMode(true); + LOG(INFO) << "OHOSAudioOutputStream SetAudioSilentMode true"; + isSilentMode_ = true; + } if (!audio_renderer_->Start()) { LOG(ERROR) << "ohos audio render start failed"; if (!audio_renderer_->Release()) { @@ -465,6 +470,7 @@ void OHOSAudioOutputStream::PumpSamples() { int32_t bytesSingle = audio_renderer_->Write(audio_data_[active_buffer_index_] + bytesWritten, num_filled_bytes - bytesWritten); + SetUpAudioSilentState(); if (bytesSingle <= 0) { LOG(DEBUG) << "Audio renderer write audio data failed"; if (!audio_renderer_->IsRendererStateRunning()) { @@ -524,6 +530,43 @@ void OHOSAudioOutputStream::PumpSamples() { SchedulePumpSamples(now); } +void OHOSAudioOutputStream::SetUpAudioSilentState() +{ + if (!weakMediaSession_ || !audio_renderer_) { + LOG(ERROR) << "OHOSAudioOutputStream: Try to set audio silent but get mediaSession or audioRender failed!"; + return; + } + if (isSilentMode_) { + bool is_playing = weakMediaSession_.get()->GetPlayingState(); + bool is_muted = weakMediaSession_.get()->GetMuteState(); + if (is_playing && !is_muted) { + audio_renderer_->SetAudioSilentMode(false); + LOG(INFO) << "OHOSAudioOutputStream SetAudioSilentMode false!"; + isSilentMode_ = false; + } + } +} + +bool OHOSAudioOutputStream::IsPreloadOrMutedMediaMode() +{ + if (!weakMediaSession_) { + return false; + } + + content::MediaSessionImpl::NWebMediaSessionState sessionState = weakMediaSession_.get()->GetSessionState(); + bool is_muted = weakMediaSession_.get()->GetMuteState(); + LOG(INFO) << "OHOSAudioOutputStream sessionState:" << static_cast(sessionState) + << ", mutedMode:" << is_muted; + + bool is_preload = false; + if (sessionState == content::MediaSessionImpl::NWebMediaSessionState::NOINITIAL) { + return false; + } else if (sessionState == content::MediaSessionImpl::NWebMediaSessionState::NONEED) { + is_preload = true; + } + return is_preload || is_muted; +} + void OHOSAudioOutputStream::SchedulePumpSamples(base::TimeTicks now) { // the audio syterm also have a schedule to read the data, // so we need to write it faster to solve underrun problem. diff --git a/media/audio/ohos/ohos_audio_output_stream.h b/media/audio/ohos/ohos_audio_output_stream.h index e0bb8856279e5b474c6b9af205ddad5af91e14c5..68ac384a1d35dd65ad9e86a8a2054d7d70a4659b 100644 --- a/media/audio/ohos/ohos_audio_output_stream.h +++ b/media/audio/ohos/ohos_audio_output_stream.h @@ -135,6 +135,12 @@ class OHOSAudioOutputStream : public AudioOutputStream { // Called in Close(); void ReleaseAudioBuffer(); + // Call to set audio_render silentMode + void SetUpAudioSilentState(); + + // Call to determine whether media is preload + bool IsPreloadOrMutedMediaMode(); + bool InitRender(const std::shared_ptr options); bool StartRender(); @@ -184,6 +190,8 @@ class OHOSAudioOutputStream : public AudioOutputStream { bool isSuspended_ = false; + bool isSilentMode_ = false; + scoped_refptr main_task_runner_; std::shared_ptr outputChangeCallback_ = nullptr;