diff --git a/content/browser/media/session/media_session_controller.cc b/content/browser/media/session/media_session_controller.cc index 7dc38071e39e8843414977f429bd10bea1ef8545..32205d24d6805b52622383ed9449dc7e136c98e4 100644 --- a/content/browser/media/session/media_session_controller.cc +++ b/content/browser/media/session/media_session_controller.cc @@ -35,6 +35,9 @@ void MediaSessionController::SetMetadata( bool has_audio, bool has_video, media::MediaContentType media_content_type) { +#if defined(OHOS_MEDIA_POLICY) + media_session_->SetMediaContentType(media_content_type); +#endif has_audio_ = has_audio; has_video_ = has_video; media_content_type_ = media_content_type; diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h index a87a4d66b1f9b7ca54c093d4fd2034caa1b5214f..6ef8f6f00a55dadab292293669fd6490a831637f 100644 --- a/content/browser/media/session/media_session_impl.h +++ b/content/browser/media/session/media_session_impl.h @@ -33,6 +33,9 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h" #include "third_party/blink/public/mojom/mediasession/media_session.mojom.h" +#if defined(OHOS_MEDIA_POLICY) +#include "media/base/media_content_type.h" +#endif // defined(OHOS_MEDIA_POLICY) #if BUILDFLAG(IS_ANDROID) #include "base/android/scoped_java_ref.h" @@ -372,6 +375,8 @@ class MediaSessionImpl : public MediaSession, void SetWebviewShowForVideo(bool show); bool IsEndOfMedia(); void SetEndOfMedia(bool end_of_media); + void SetMediaContentType(media::MediaContentType media_content_type) { media_content_type_ = media_content_type; } + media::MediaContentType getMediaContentType() { return media_content_type_; } std::unordered_set activeAudioStream_; int audioResumeInterval_ = 0; @@ -615,6 +620,10 @@ class MediaSessionImpl : public MediaSession, base::flat_map image_cache_; }; +#if defined(OHOS_MEDIA_POLICY) + media::MediaContentType media_content_type_; +#endif + // Returns the PageData for the specified |page|. PageData& GetPageData(content::Page& page) const; diff --git a/media/audio/ohos/ohos_audio_output_stream.cc b/media/audio/ohos/ohos_audio_output_stream.cc index 8e7ad85ba0f27e5e957eda2c77b29e2be557dbf7..8b10bb58a99a33d8e576fd22248ce9204d72e9d1 100644 --- a/media/audio/ohos/ohos_audio_output_stream.cc +++ b/media/audio/ohos/ohos_audio_output_stream.cc @@ -43,6 +43,10 @@ int32_t AudioRendererOptions::GetRenderFlags() { return renderer_flags_; } +AudioAdapterConcurrencyMode AudioRendererOptions::GetConcurrencyMode() { + return concurrency_mode_; +} + AudioRendererCallback::AudioRendererCallback( content::MediaSessionImpl* media_session, const scoped_refptr& task_runner) @@ -218,6 +222,15 @@ bool OHOSAudioOutputStream::Open() { ? AudioAdapterStreamUsage::STREAM_USAGE_VOICE_COMMUNICATION : AudioAdapterStreamUsage::STREAM_USAGE_MEDIA; rendererOptions->renderer_flags_ = 0; + rendererOptions->concurrency_mode_ = AudioAdapterConcurrencyMode::INVALID; + if (weakMediaSession_) { + media::MediaContentType contentType = weakMediaSession_.get()->getMediaContentType(); + if (contentType == media::MediaContentType::Transient) { + rendererOptions->concurrency_mode_ = AudioAdapterConcurrencyMode::DUCK_OTHERS; + } else if (contentType == media::MediaContentType::Snippet) { + rendererOptions->concurrency_mode_ = AudioAdapterConcurrencyMode::PAUSE_OTHERS; + } + } if (!InitRender(rendererOptions)) { return false; diff --git a/media/audio/ohos/ohos_audio_output_stream.h b/media/audio/ohos/ohos_audio_output_stream.h index e0bb8856279e5b474c6b9af205ddad5af91e14c5..2197e75ebfd60d484b173bbc99f298cbfd3990a3 100644 --- a/media/audio/ohos/ohos_audio_output_stream.h +++ b/media/audio/ohos/ohos_audio_output_stream.h @@ -45,6 +45,8 @@ class AudioRendererOptions : public AudioRendererOptionsAdapter { int32_t GetRenderFlags() override; + AudioAdapterConcurrencyMode GetConcurrencyMode() override; + private: friend class OHOSAudioOutputStream; AudioAdapterSamplingRate rate_; @@ -54,6 +56,7 @@ class AudioRendererOptions : public AudioRendererOptionsAdapter { AudioAdapterContentType content_type_; AudioAdapterStreamUsage stream_usage_; int32_t renderer_flags_; + AudioAdapterConcurrencyMode concurrency_mode_; }; class AudioRendererCallback : public AudioRendererCallbackAdapter { diff --git a/media/base/media_content_type.cc b/media/base/media_content_type.cc index 5e0c1421ef3b578268d438cbd69a93812e8b5c19..64d916f8009514edada570855f1455f0ac2c313e 100644 --- a/media/base/media_content_type.cc +++ b/media/base/media_content_type.cc @@ -8,9 +8,18 @@ namespace media { namespace { const int kMinimumContentDurationSecs = 5; +#if defined(OHOS_MEDIA_POLICY) +const int kSnippetContentDurationSecs = 60; +#endif // defined(OHOS_MEDIA_POLICY) } // anonymous namespace MediaContentType DurationToMediaContentType(base::TimeDelta duration) { +#if defined(OHOS_MEDIA_POLICY) + if (duration > base::Seconds(kMinimumContentDurationSecs) && + duration <= base::Seconds(kSnippetContentDurationSecs)) { + return MediaContentType::Snippet; + } +#endif // defined(OHOS_MEDIA_POLICY) // A zero duration indicates that the duration is unknown. "Persistent" type // should be used in this case. return (duration.is_zero() || diff --git a/media/base/media_content_type.h b/media/base/media_content_type.h index 4e3e127c9df48b9d5240ec3187f3d4ff87c401b7..0f990c695ea4a30fffbf4bf2e80b7f8c713f311a 100644 --- a/media/base/media_content_type.h +++ b/media/base/media_content_type.h @@ -21,6 +21,9 @@ enum class MediaContentType { // Type indicating that a player is a Pepper instance. MediaSession may duck // the player instead of pausing it. Pepper, +#if defined(OHOS_MEDIA_POLICY) + Snippet, +#endif // defined(OHOS_MEDIA_POLICY) // Type indicating that a player cannot be controlled. MediaSession will take // audio focus when the player joins but will not let it respond to audio // focus changes.