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