Fix emulator build error
[platform/framework/web/chromium-efl.git] / services / media_session / media_controller.h
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.
4
5 #ifndef SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_
6 #define SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_
7
8 #include <memory>
9 #include <utility>
10 #include <vector>
11
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"
22
23 namespace media_session {
24
25 class AudioFocusRequest;
26
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 {
33  public:
34   MediaController();
35
36   MediaController(const MediaController&) = delete;
37   MediaController& operator=(const MediaController&) = delete;
38
39   ~MediaController() override;
40
41   // mojom::MediaController overrides.
42   void Suspend() override;
43   void Resume() override;
44   void Stop() override;
45   void ToggleSuspendResume() override;
46   void AddObserver(
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,
52                      int minimum_size_px,
53                      int desired_size_px,
54                      mojo::PendingRemote<mojom::MediaControllerImageObserver>
55                          observer) override;
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;
68
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;
81
82   void SetMediaSession(AudioFocusRequest* session);
83   void ClearMediaSession();
84
85   void BindToInterface(mojo::PendingReceiver<mojom::MediaController> receiver);
86   void FlushForTesting();
87
88  private:
89   friend class MediaControllerTest;
90
91   class ImageObserverHolder;
92
93   // Removes unbound or faulty image observers.
94   void CleanupImageObservers();
95
96   void Reset();
97
98   // Holds mojo bindings for mojom::MediaController.
99   mojo::ReceiverSet<mojom::MediaController> receivers_;
100
101   // The current info for the |session_|.
102   mojom::MediaSessionInfoPtr session_info_;
103
104   // The current metadata for |session_|.
105   absl::optional<MediaMetadata> session_metadata_;
106
107   // The current actions for |session_|.
108   std::vector<mojom::MediaSessionAction> session_actions_;
109
110   // The current position for |session_|.
111   absl::optional<MediaPosition> session_position_;
112
113   // The current images for |session_|.
114   base::flat_map<mojom::MediaSessionImageType, std::vector<MediaImage>>
115       session_images_;
116
117   // Raw pointer to the media session we are controlling.
118   raw_ptr<AudioFocusRequest> session_ = nullptr;
119
120   // Observers that are observing |this|.
121   mojo::RemoteSet<mojom::MediaControllerObserver> observers_;
122
123   // Binding for |this| to act as an observer to |session_|.
124   mojo::Receiver<mojom::MediaSessionObserver> session_receiver_{this};
125
126   // Manages individual image observers.
127   std::vector<std::unique_ptr<ImageObserverHolder>> image_observers_;
128
129   // Protects |session_| as it is not thread safe.
130   SEQUENCE_CHECKER(sequence_checker_);
131 };
132
133 }  // namespace media_session
134
135 #endif  // SERVICES_MEDIA_SESSION_MEDIA_CONTROLLER_H_