media_controller.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2018 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_MEDIA_CONTROLLER_H_
  5. #define SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_
  6. #include <memory>
  7. #include <utility>
  8. #include <vector>
  9. #include "base/containers/flat_map.h"
  10. #include "base/memory/raw_ptr.h"
  11. #include "base/sequence_checker.h"
  12. #include "mojo/public/cpp/bindings/receiver.h"
  13. #include "mojo/public/cpp/bindings/receiver_set.h"
  14. #include "mojo/public/cpp/bindings/remote_set.h"
  15. #include "services/media_session/public/cpp/media_metadata.h"
  16. #include "services/media_session/public/mojom/media_controller.mojom.h"
  17. #include "services/media_session/public/mojom/media_session.mojom.h"
  18. #include "third_party/abseil-cpp/absl/types/optional.h"
  19. namespace media_session {
  20. class AudioFocusRequest;
  21. // MediaController provides a control surface over Mojo for controlling a
  22. // specific MediaSession. If |session_| is nullptr then all commands will be
  23. // dropped. MediaController is also a MediaSessionObserver and will forward
  24. // events to added observers.
  25. class MediaController : public mojom::MediaController,
  26. public mojom::MediaSessionObserver {
  27. public:
  28. MediaController();
  29. MediaController(const MediaController&) = delete;
  30. MediaController& operator=(const MediaController&) = delete;
  31. ~MediaController() override;
  32. // mojom::MediaController overrides.
  33. void Suspend() override;
  34. void Resume() override;
  35. void Stop() override;
  36. void ToggleSuspendResume() override;
  37. void AddObserver(
  38. mojo::PendingRemote<mojom::MediaControllerObserver> observer) override;
  39. void PreviousTrack() override;
  40. void NextTrack() override;
  41. void Seek(base::TimeDelta seek_time) override;
  42. void ObserveImages(mojom::MediaSessionImageType type,
  43. int minimum_size_px,
  44. int desired_size_px,
  45. mojo::PendingRemote<mojom::MediaControllerImageObserver>
  46. observer) override;
  47. void SeekTo(base::TimeDelta seek_time) override;
  48. void ScrubTo(base::TimeDelta seek_time) override;
  49. void EnterPictureInPicture() override;
  50. void ExitPictureInPicture() override;
  51. void SetAudioSinkId(const absl::optional<std::string>& id) override;
  52. void ToggleMicrophone() override;
  53. void ToggleCamera() override;
  54. void HangUp() override;
  55. void Raise() override;
  56. void SetMute(bool mute) override;
  57. // mojom::MediaSessionObserver overrides.
  58. void MediaSessionInfoChanged(
  59. mojom::MediaSessionInfoPtr session_info) override;
  60. void MediaSessionMetadataChanged(
  61. const absl::optional<MediaMetadata>&) override;
  62. void MediaSessionActionsChanged(
  63. const std::vector<mojom::MediaSessionAction>& action) override;
  64. void MediaSessionImagesChanged(
  65. const base::flat_map<mojom::MediaSessionImageType,
  66. std::vector<MediaImage>>& images) override;
  67. void MediaSessionPositionChanged(
  68. const absl::optional<media_session::MediaPosition>& position) override;
  69. void SetMediaSession(AudioFocusRequest* session);
  70. void ClearMediaSession();
  71. void BindToInterface(mojo::PendingReceiver<mojom::MediaController> receiver);
  72. void FlushForTesting();
  73. private:
  74. friend class MediaControllerTest;
  75. class ImageObserverHolder;
  76. // Removes unbound or faulty image observers.
  77. void CleanupImageObservers();
  78. void Reset();
  79. // Holds mojo bindings for mojom::MediaController.
  80. mojo::ReceiverSet<mojom::MediaController> receivers_;
  81. // The current info for the |session_|.
  82. mojom::MediaSessionInfoPtr session_info_;
  83. // The current metadata for |session_|.
  84. absl::optional<MediaMetadata> session_metadata_;
  85. // The current actions for |session_|.
  86. std::vector<mojom::MediaSessionAction> session_actions_;
  87. // The current position for |session_|.
  88. absl::optional<MediaPosition> session_position_;
  89. // The current images for |session_|.
  90. base::flat_map<mojom::MediaSessionImageType, std::vector<MediaImage>>
  91. session_images_;
  92. // Raw pointer to the media session we are controlling.
  93. raw_ptr<AudioFocusRequest> session_ = nullptr;
  94. // Observers that are observing |this|.
  95. mojo::RemoteSet<mojom::MediaControllerObserver> observers_;
  96. // Binding for |this| to act as an observer to |session_|.
  97. mojo::Receiver<mojom::MediaSessionObserver> session_receiver_{this};
  98. // Manages individual image observers.
  99. std::vector<std::unique_ptr<ImageObserverHolder>> image_observers_;
  100. // Protects |session_| as it is not thread safe.
  101. SEQUENCE_CHECKER(sequence_checker_);
  102. };
  103. } // namespace media_session
  104. #endif // SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_