media_player_impl.h 3.7 KB

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