1 // Copyright 2020 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 
5 #ifndef FUCHSIA_ENGINE_BROWSER_MEDIA_PLAYER_IMPL_H_
6 #define FUCHSIA_ENGINE_BROWSER_MEDIA_PLAYER_IMPL_H_
7 
8 #include <fuchsia/media/sessions2/cpp/fidl.h>
9 #include <lib/fidl/cpp/binding.h>
10 #include <lib/fidl/cpp/interface_request.h>
11 #include <string>
12 
13 #include "base/callback.h"
14 #include "base/macros.h"
15 #include "fuchsia/engine/web_engine_export.h"
16 #include "mojo/public/cpp/bindings/receiver.h"
17 #include "services/media_session/public/mojom/media_session.mojom.h"
18 
19 namespace content {
20 class MediaSession;
21 }
22 
23 class WEB_ENGINE_EXPORT MediaPlayerImpl
24     : public fuchsia::media::sessions2::Player,
25       public media_session::mojom::MediaSessionObserver {
26  public:
27   // |media_session| must out-live |this|.
28   // |on_disconnect| will be invoked when |request| disconnects, and should
29   // clean up |this|, and any references to it.
30   MediaPlayerImpl(
31       content::MediaSession* media_session,
32       fidl::InterfaceRequest<fuchsia::media::sessions2::Player> request,
33       base::OnceClosure on_disconnect);
34   ~MediaPlayerImpl() final;
35 
36   MediaPlayerImpl(const MediaPlayerImpl&) = delete;
37   MediaPlayerImpl& operator=(const MediaPlayerImpl&) = delete;
38 
39   // fuchsia::media::sessions2::Player implementation.
40   void WatchInfoChange(WatchInfoChangeCallback info_change_callback) final;
41 
42   // fuchsia::media::sessions2::PlayerControl implementation.
43   void Play() final;
44   void Pause() final;
45   void Stop() final;
46   void Seek(zx_duration_t position) final;
47   void SkipForward() final;
48   void SkipReverse() final;
49   void NextItem() final;
50   void PrevItem() final;
51   void SetPlaybackRate(float playback_rate) final;
52   void SetRepeatMode(fuchsia::media::sessions2::RepeatMode repeat_mode) final;
53   void SetShuffleMode(bool shuffle_on) final;
54   void BindVolumeControl(
55       fidl::InterfaceRequest<fuchsia::media::audio::VolumeControl>
56           volume_control_request) final;
57 
58  private:
59   // media_session::mojom::MediaSessionObserver implementation.
60   void MediaSessionInfoChanged(
61       media_session::mojom::MediaSessionInfoPtr info) final;
62   void MediaSessionMetadataChanged(
63       const base::Optional<media_session::MediaMetadata>& metadata) final;
64   void MediaSessionActionsChanged(
65       const std::vector<media_session::mojom::MediaSessionAction>& action)
66       final;
67   void MediaSessionImagesChanged(
68       const base::flat_map<media_session::mojom::MediaSessionImageType,
69                            std::vector<media_session::MediaImage>>& images)
70       final;
71   void MediaSessionPositionChanged(
72       const base::Optional<media_session::MediaPosition>& position) final;
73 
74   // Sends changes accumulated in |pending_info_delta_|, if any, to the
75   // |pending_info_change_callback_|, if it is set.
76   void MaybeSendPlayerInfoDelta();
77 
78   // Reports the specified |status| to the client and calls |on_disconnect_|.
79   void ReportErrorAndDisconnect(zx_status_t status);
80 
81   content::MediaSession* const media_session_;
82 
83   // Invoked when |binding_| becomes disconnected.
84   base::OnceClosure on_disconnect_;
85 
86   // Binding through which control requests are received from the client.
87   fidl::Binding<fuchsia::media::sessions2::Player> binding_;
88 
89   // Binding through which notifications are received from the MediaSession.
90   mojo::Receiver<media_session::mojom::MediaSessionObserver> observer_receiver_;
91 
92   // Pending PlayerInfo deltas and info-change callback.
93   WatchInfoChangeCallback pending_info_change_callback_;
94   fuchsia::media::sessions2::PlayerInfoDelta pending_info_delta_;
95 };
96 
97 #endif  // FUCHSIA_ENGINE_BROWSER_MEDIA_PLAYER_IMPL_H_
98