diff options
Diffstat (limited to 'cast/standalone_receiver/mirroring_application.cc')
-rw-r--r-- | cast/standalone_receiver/mirroring_application.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/cast/standalone_receiver/mirroring_application.cc b/cast/standalone_receiver/mirroring_application.cc new file mode 100644 index 00000000..a04c401a --- /dev/null +++ b/cast/standalone_receiver/mirroring_application.cc @@ -0,0 +1,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 |