audio_focus_request.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef SERVICES_MEDIA_SESSION_AUDIO_FOCUS_REQUEST_H_
  5. #define SERVICES_MEDIA_SESSION_AUDIO_FOCUS_REQUEST_H_
  6. #include "base/callback_forward.h"
  7. #include "base/memory/weak_ptr.h"
  8. #include "mojo/public/cpp/bindings/receiver.h"
  9. #include "mojo/public/cpp/bindings/remote.h"
  10. #include "services/media_session/public/mojom/audio_focus.mojom.h"
  11. #include "services/media_session/public/mojom/media_controller.mojom.h"
  12. namespace media_session {
  13. using GetMediaImageBitmapCallback = base::OnceCallback<void(const SkBitmap&)>;
  14. class AudioFocusManager;
  15. struct EnforcementState;
  16. class MediaController;
  17. class AudioFocusRequest : public mojom::AudioFocusRequestClient {
  18. public:
  19. AudioFocusRequest(
  20. base::WeakPtr<AudioFocusManager> owner,
  21. mojo::PendingReceiver<mojom::AudioFocusRequestClient> receiver,
  22. mojo::PendingRemote<mojom::MediaSession> session,
  23. mojom::MediaSessionInfoPtr session_info,
  24. mojom::AudioFocusType audio_focus_type,
  25. const base::UnguessableToken& id,
  26. const std::string& source_name,
  27. const base::UnguessableToken& group_id,
  28. const base::UnguessableToken& identity);
  29. AudioFocusRequest(const AudioFocusRequest&) = delete;
  30. AudioFocusRequest& operator=(const AudioFocusRequest&) = delete;
  31. ~AudioFocusRequest() override;
  32. // mojom::AudioFocusRequestClient.
  33. void RequestAudioFocus(mojom::MediaSessionInfoPtr session_info,
  34. mojom::AudioFocusType type,
  35. RequestAudioFocusCallback callback) override;
  36. void AbandonAudioFocus() override;
  37. void MediaSessionInfoChanged(mojom::MediaSessionInfoPtr info) override;
  38. // The current audio focus type that this request has.
  39. mojom::AudioFocusType audio_focus_type() const { return audio_focus_type_; }
  40. void set_audio_focus_type(mojom::AudioFocusType type) {
  41. audio_focus_type_ = type;
  42. }
  43. // Returns whether the underyling media session is currently suspended.
  44. bool IsSuspended() const;
  45. // Returns the state of this audio focus request.
  46. mojom::AudioFocusRequestStatePtr ToAudioFocusRequestState() const;
  47. // Bind a mojo media controller to control the underlying media session.
  48. void BindToMediaController(
  49. mojo::PendingReceiver<mojom::MediaController> receiver);
  50. // Suspends the underlying media session.
  51. void Suspend(const EnforcementState& state);
  52. // If the underlying media session previously suspended this session then this
  53. // will resume it and apply any delayed action.
  54. void ReleaseTransientHold();
  55. // Perform a UI action (play/pause/stop). This may be delayed if the service
  56. // has transiently suspended the session.
  57. void PerformUIAction(mojom::MediaSessionAction action);
  58. // Retrieves the bitmap associated with a |image|.
  59. void GetMediaImageBitmap(const MediaImage& image,
  60. int minimum_size_px,
  61. int desired_size_px,
  62. GetMediaImageBitmapCallback callback);
  63. mojom::MediaSession* ipc() { return session_.get(); }
  64. const mojom::MediaSessionInfoPtr& info() const { return session_info_; }
  65. const base::UnguessableToken& id() const { return id_; }
  66. const std::string& source_name() const { return source_name_; }
  67. const base::UnguessableToken& group_id() const { return group_id_; }
  68. const base::UnguessableToken& identity() const { return identity_; }
  69. private:
  70. void SetSessionInfo(mojom::MediaSessionInfoPtr session_info);
  71. void OnConnectionError();
  72. void OnImageDownloaded(GetMediaImageBitmapCallback callback,
  73. const SkBitmap& bitmap);
  74. bool encountered_error_ = false;
  75. bool was_suspended_ = false;
  76. std::unique_ptr<MediaController> controller_;
  77. mojo::Remote<mojom::MediaSession> session_;
  78. mojom::MediaSessionInfoPtr session_info_;
  79. mojom::AudioFocusType audio_focus_type_;
  80. mojo::Receiver<mojom::AudioFocusRequestClient> receiver_;
  81. // The action to apply when the transient hold is released.
  82. absl::optional<mojom::MediaSessionAction> delayed_action_;
  83. // The ID of the audio focus request.
  84. base::UnguessableToken const id_;
  85. // The name of the source that created this audio focus request (used for
  86. // metrics).
  87. std::string const source_name_;
  88. // The group ID of the audio focus request.
  89. base::UnguessableToken const group_id_;
  90. // The identity that requested audio focus.
  91. base::UnguessableToken const identity_;
  92. // Weak pointer to the owning |AudioFocusManager| instance.
  93. const base::WeakPtr<AudioFocusManager> owner_;
  94. };
  95. } // namespace media_session
  96. #endif // SERVICES_MEDIA_SESSION_AUDIO_FOCUS_REQUEST_H_