1 // Copyright 2019 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_AUDIO_FOCUS_REQUEST_H_
6 #define SERVICES_MEDIA_SESSION_AUDIO_FOCUS_REQUEST_H_
8 #include "base/functional/callback_forward.h"
9 #include "base/memory/weak_ptr.h"
10 #include "mojo/public/cpp/bindings/receiver.h"
11 #include "mojo/public/cpp/bindings/remote.h"
12 #include "services/media_session/public/mojom/audio_focus.mojom.h"
13 #include "services/media_session/public/mojom/media_controller.mojom.h"
15 namespace media_session {
17 using GetMediaImageBitmapCallback = base::OnceCallback<void(const SkBitmap&)>;
19 class AudioFocusManager;
20 struct EnforcementState;
21 class MediaController;
23 class AudioFocusRequest : public mojom::AudioFocusRequestClient {
26 base::WeakPtr<AudioFocusManager> owner,
27 mojo::PendingReceiver<mojom::AudioFocusRequestClient> receiver,
28 mojo::PendingRemote<mojom::MediaSession> session,
29 mojom::MediaSessionInfoPtr session_info,
30 mojom::AudioFocusType audio_focus_type,
31 const base::UnguessableToken& id,
32 const std::string& source_name,
33 const base::UnguessableToken& group_id,
34 const base::UnguessableToken& identity);
36 AudioFocusRequest(const AudioFocusRequest&) = delete;
37 AudioFocusRequest& operator=(const AudioFocusRequest&) = delete;
39 ~AudioFocusRequest() override;
41 // mojom::AudioFocusRequestClient.
42 void RequestAudioFocus(mojom::MediaSessionInfoPtr session_info,
43 mojom::AudioFocusType type,
44 RequestAudioFocusCallback callback) override;
45 void AbandonAudioFocus() override;
46 void MediaSessionInfoChanged(mojom::MediaSessionInfoPtr info) override;
48 // The current audio focus type that this request has.
49 mojom::AudioFocusType audio_focus_type() const { return audio_focus_type_; }
50 void set_audio_focus_type(mojom::AudioFocusType type) {
51 audio_focus_type_ = type;
54 // Returns whether the underyling media session is currently suspended.
55 bool IsSuspended() const;
57 // Returns the state of this audio focus request.
58 mojom::AudioFocusRequestStatePtr ToAudioFocusRequestState() const;
60 // Bind a mojo media controller to control the underlying media session.
61 void BindToMediaController(
62 mojo::PendingReceiver<mojom::MediaController> receiver);
64 // Suspends the underlying media session.
65 void Suspend(const EnforcementState& state);
67 // If the underlying media session previously suspended this session then this
68 // will resume it and apply any delayed action.
69 void ReleaseTransientHold();
71 // Perform a UI action (play/pause/stop). This may be delayed if the service
72 // has transiently suspended the session.
73 void PerformUIAction(mojom::MediaSessionAction action);
75 // Retrieves the bitmap associated with a |image|.
76 void GetMediaImageBitmap(const MediaImage& image,
79 GetMediaImageBitmapCallback callback);
81 mojom::MediaSession* ipc() { return session_.get(); }
82 const mojom::MediaSessionInfoPtr& info() const { return session_info_; }
83 const base::UnguessableToken& id() const { return id_; }
84 const std::string& source_name() const { return source_name_; }
85 const base::UnguessableToken& group_id() const { return group_id_; }
86 const base::UnguessableToken& identity() const { return identity_; }
89 void SetSessionInfo(mojom::MediaSessionInfoPtr session_info);
90 void OnConnectionError();
92 void OnImageDownloaded(GetMediaImageBitmapCallback callback,
93 const SkBitmap& bitmap);
95 bool encountered_error_ = false;
96 bool was_suspended_ = false;
98 std::unique_ptr<MediaController> controller_;
100 mojo::Remote<mojom::MediaSession> session_;
101 mojom::MediaSessionInfoPtr session_info_;
102 mojom::AudioFocusType audio_focus_type_;
104 mojo::Receiver<mojom::AudioFocusRequestClient> receiver_;
106 // The action to apply when the transient hold is released.
107 absl::optional<mojom::MediaSessionAction> delayed_action_;
109 // The ID of the audio focus request.
110 base::UnguessableToken const id_;
112 // The name of the source that created this audio focus request (used for
114 std::string const source_name_;
116 // The group ID of the audio focus request.
117 base::UnguessableToken const group_id_;
119 // The identity that requested audio focus.
120 base::UnguessableToken const identity_;
122 // Weak pointer to the owning |AudioFocusManager| instance.
123 const base::WeakPtr<AudioFocusManager> owner_;
126 } // namespace media_session
128 #endif // SERVICES_MEDIA_SESSION_AUDIO_FOCUS_REQUEST_H_