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
82
83
84
85
86
87
88
89
90
|
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cast/standalone_receiver/mirroring_application.h"
#include "cast/common/public/message_port.h"
#include "cast/streaming/environment.h"
#include "cast/streaming/message_fields.h"
#include "cast/streaming/receiver_session.h"
#include "platform/api/task_runner.h"
#include "util/osp_logging.h"
namespace openscreen {
namespace cast {
const char kMirroringAppId[] = "0F5096E8";
const char kMirroringAudioOnlyAppId[] = "85CDB22F";
const char kMirroringDisplayName[] = "Chrome Mirroring";
const char kRemotingRpcNamespace[] = "urn:x-cast:com.google.cast.remoting";
MirroringApplication::MirroringApplication(TaskRunner* task_runner,
const IPAddress& interface_address,
ApplicationAgent* agent)
: task_runner_(task_runner),
interface_address_(interface_address),
app_ids_({kMirroringAppId, kMirroringAudioOnlyAppId}),
agent_(agent) {
OSP_DCHECK(task_runner_);
OSP_DCHECK(agent_);
agent_->RegisterApplication(this);
}
MirroringApplication::~MirroringApplication() {
agent_->UnregisterApplication(this); // ApplicationAgent may call Stop().
OSP_DCHECK(!current_session_);
}
const std::vector<std::string>& MirroringApplication::GetAppIds() const {
return app_ids_;
}
bool MirroringApplication::Launch(const std::string& app_id,
const Json::Value& app_params,
MessagePort* message_port) {
if ((app_id != kMirroringAppId && app_id != kMirroringAudioOnlyAppId) ||
!message_port || current_session_) {
return false;
}
wake_lock_ = ScopedWakeLock::Create(task_runner_);
environment_ = std::make_unique<Environment>(
&Clock::now, task_runner_,
IPEndpoint{interface_address_, kDefaultCastStreamingPort});
controller_ =
std::make_unique<StreamingPlaybackController>(task_runner_, this);
current_session_ = std::make_unique<ReceiverSession>(
controller_.get(), environment_.get(), message_port,
ReceiverSession::Preferences{});
return true;
}
std::string MirroringApplication::GetSessionId() {
return current_session_ ? current_session_->session_id() : std::string();
}
std::string MirroringApplication::GetDisplayName() {
return current_session_ ? kMirroringDisplayName : std::string();
}
std::vector<std::string> MirroringApplication::GetSupportedNamespaces() {
return {kCastWebrtcNamespace, kRemotingRpcNamespace};
}
void MirroringApplication::Stop() {
current_session_.reset();
controller_.reset();
environment_.reset();
wake_lock_.reset();
}
void MirroringApplication::OnPlaybackError(StreamingPlaybackController*,
Error error) {
OSP_LOG_ERROR << "[MirroringApplication] " << error;
agent_->StopApplicationIfRunning(this); // ApplicationAgent calls Stop().
}
} // namespace cast
} // namespace openscreen
|