1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/media_router/browser/mirroring_media_controller_host_impl.h"
namespace media_router {
MirroringMediaControllerHostImpl::MirroringMediaControllerHostImpl(
mojo::Remote<media_router::mojom::MediaController> mirroring_controller)
: mirroring_controller_(std::move(mirroring_controller)) {}
MirroringMediaControllerHostImpl::~MirroringMediaControllerHostImpl() {
// Notify that freeze info is changing, since this object is deleting and the
// route may no longer be frozen.
for (MirroringMediaControllerHostImpl::Observer& observer : observers_) {
observer.OnFreezeInfoChanged();
}
}
mojo::PendingRemote<media_router::mojom::MediaStatusObserver>
MirroringMediaControllerHostImpl::GetMediaStatusObserverPendingRemote() {
return observer_receiver_.BindNewPipeAndPassRemote();
}
void MirroringMediaControllerHostImpl::AddObserver(
MirroringMediaControllerHostImpl::Observer* observer) {
CHECK(observer);
observers_.AddObserver(observer);
}
void MirroringMediaControllerHostImpl::RemoveObserver(
MirroringMediaControllerHostImpl::Observer* observer) {
CHECK(observer);
observers_.RemoveObserver(observer);
}
bool MirroringMediaControllerHostImpl::CanFreeze() const {
return can_freeze_;
}
bool MirroringMediaControllerHostImpl::IsFrozen() const {
return is_frozen_;
}
void MirroringMediaControllerHostImpl::Freeze() {
// Do nothing if the user has recently tried to pause mirroring.
if (freeze_timer_.IsRunning()) {
return;
}
freeze_timer_.Start(
FROM_HERE, kPauseDelay,
base::BindOnce(&MirroringMediaControllerHostImpl::DoPauseController,
base::Unretained(this)));
}
void MirroringMediaControllerHostImpl::Unfreeze() {
if (mirroring_controller_) {
mirroring_controller_->Play();
}
}
void MirroringMediaControllerHostImpl::OnMediaStatusUpdated(
media_router::mojom::MediaStatusPtr status) {
can_freeze_ = status->can_play_pause;
is_frozen_ = can_freeze_ &&
(status->play_state == mojom::MediaStatus::PlayState::PAUSED);
for (MirroringMediaControllerHostImpl::Observer& observer : observers_) {
observer.OnFreezeInfoChanged();
}
}
void MirroringMediaControllerHostImpl::DoPauseController() {
if (mirroring_controller_) {
mirroring_controller_->Pause();
}
}
} // namespace media_router
|