You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.0 KiB
91 lines
3.0 KiB
// 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
|