1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_
6 #define SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_
12 #include "base/containers/flat_map.h"
13 #include "base/memory/raw_ptr.h"
14 #include "base/sequence_checker.h"
15 #include "mojo/public/cpp/bindings/receiver.h"
16 #include "mojo/public/cpp/bindings/receiver_set.h"
17 #include "mojo/public/cpp/bindings/remote_set.h"
18 #include "services/media_session/public/cpp/media_metadata.h"
19 #include "services/media_session/public/mojom/media_controller.mojom.h"
20 #include "services/media_session/public/mojom/media_session.mojom.h"
21 #include "third_party/abseil-cpp/absl/types/optional.h"
23 namespace media_session {
25 class AudioFocusRequest;
27 // MediaController provides a control surface over Mojo for controlling a
28 // specific MediaSession. If |session_| is nullptr then all commands will be
29 // dropped. MediaController is also a MediaSessionObserver and will forward
30 // events to added observers.
31 class MediaController : public mojom::MediaController,
32 public mojom::MediaSessionObserver {
36 MediaController(const MediaController&) = delete;
37 MediaController& operator=(const MediaController&) = delete;
39 ~MediaController() override;
41 // mojom::MediaController overrides.
42 void Suspend() override;
43 void Resume() override;
45 void ToggleSuspendResume() override;
47 mojo::PendingRemote<mojom::MediaControllerObserver> observer) override;
48 void PreviousTrack() override;
49 void NextTrack() override;
50 void Seek(base::TimeDelta seek_time) override;
51 void ObserveImages(mojom::MediaSessionImageType type,
54 mojo::PendingRemote<mojom::MediaControllerImageObserver>
56 void SeekTo(base::TimeDelta seek_time) override;
57 void ScrubTo(base::TimeDelta seek_time) override;
58 void EnterPictureInPicture() override;
59 void ExitPictureInPicture() override;
60 void SetAudioSinkId(const absl::optional<std::string>& id) override;
61 void ToggleMicrophone() override;
62 void ToggleCamera() override;
63 void HangUp() override;
64 void Raise() override;
65 void SetMute(bool mute) override;
66 void RequestMediaRemoting() override;
67 void EnterAutoPictureInPicture() override;
69 // mojom::MediaSessionObserver overrides.
70 void MediaSessionInfoChanged(
71 mojom::MediaSessionInfoPtr session_info) override;
72 void MediaSessionMetadataChanged(
73 const absl::optional<MediaMetadata>&) override;
74 void MediaSessionActionsChanged(
75 const std::vector<mojom::MediaSessionAction>& action) override;
76 void MediaSessionImagesChanged(
77 const base::flat_map<mojom::MediaSessionImageType,
78 std::vector<MediaImage>>& images) override;
79 void MediaSessionPositionChanged(
80 const absl::optional<media_session::MediaPosition>& position) override;
82 void SetMediaSession(AudioFocusRequest* session);
83 void ClearMediaSession();
85 void BindToInterface(mojo::PendingReceiver<mojom::MediaController> receiver);
86 void FlushForTesting();
89 friend class MediaControllerTest;
91 class ImageObserverHolder;
93 // Removes unbound or faulty image observers.
94 void CleanupImageObservers();
98 // Holds mojo bindings for mojom::MediaController.
99 mojo::ReceiverSet<mojom::MediaController> receivers_;
101 // The current info for the |session_|.
102 mojom::MediaSessionInfoPtr session_info_;
104 // The current metadata for |session_|.
105 absl::optional<MediaMetadata> session_metadata_;
107 // The current actions for |session_|.
108 std::vector<mojom::MediaSessionAction> session_actions_;
110 // The current position for |session_|.
111 absl::optional<MediaPosition> session_position_;
113 // The current images for |session_|.
114 base::flat_map<mojom::MediaSessionImageType, std::vector<MediaImage>>
117 // Raw pointer to the media session we are controlling.
118 raw_ptr<AudioFocusRequest> session_ = nullptr;
120 // Observers that are observing |this|.
121 mojo::RemoteSet<mojom::MediaControllerObserver> observers_;
123 // Binding for |this| to act as an observer to |session_|.
124 mojo::Receiver<mojom::MediaSessionObserver> session_receiver_{this};
126 // Manages individual image observers.
127 std::vector<std::unique_ptr<ImageObserverHolder>> image_observers_;
129 // Protects |session_| as it is not thread safe.
130 SEQUENCE_CHECKER(sequence_checker_);
133 } // namespace media_session
135 #endif // SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_