// Copyright 2019 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/streaming_playback_controller.h" #include #if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) #include "cast/standalone_receiver/sdl_audio_player.h" #include "cast/standalone_receiver/sdl_glue.h" #include "cast/standalone_receiver/sdl_video_player.h" #else #include "cast/standalone_receiver/dummy_player.h" #endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) #include "util/trace_logging.h" namespace openscreen { namespace cast { #if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) StreamingPlaybackController::StreamingPlaybackController( TaskRunner* task_runner, StreamingPlaybackController::Client* client) : task_runner_(task_runner), client_(client), sdl_event_loop_(task_runner_, [this] { client_->OnPlaybackError(this, Error{Error::Code::kOperationCancelled, std::string("SDL event loop closed.")}); }) { OSP_DCHECK(task_runner_ != nullptr); OSP_DCHECK(client_ != nullptr); constexpr int kDefaultWindowWidth = 1280; constexpr int kDefaultWindowHeight = 720; window_ = MakeUniqueSDLWindow( "Cast Streaming Receiver Demo", SDL_WINDOWPOS_UNDEFINED /* initial X position */, SDL_WINDOWPOS_UNDEFINED /* initial Y position */, kDefaultWindowWidth, kDefaultWindowHeight, SDL_WINDOW_RESIZABLE); OSP_CHECK(window_) << "Failed to create SDL window: " << SDL_GetError(); renderer_ = MakeUniqueSDLRenderer(window_.get(), -1, 0); OSP_CHECK(renderer_) << "Failed to create SDL renderer: " << SDL_GetError(); } #else StreamingPlaybackController::StreamingPlaybackController( TaskRunner* task_runner, StreamingPlaybackController::Client* client) : task_runner_(task_runner), client_(client) { OSP_DCHECK(task_runner_ != nullptr); OSP_DCHECK(client_ != nullptr); } #endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) void StreamingPlaybackController::OnMirroringNegotiated( const ReceiverSession* session, ReceiverSession::ConfiguredReceivers receivers) { TRACE_DEFAULT_SCOPED(TraceCategory::kStandaloneReceiver); #if defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) if (receivers.audio_receiver) { audio_player_ = std::make_unique( &Clock::now, task_runner_, receivers.audio_receiver, receivers.audio_config.codec, [this] { client_->OnPlaybackError(this, audio_player_->error_status()); }); } if (receivers.video_receiver) { video_player_ = std::make_unique( &Clock::now, task_runner_, receivers.video_receiver, receivers.video_config.codec, renderer_.get(), [this] { client_->OnPlaybackError(this, video_player_->error_status()); }); } #else if (receivers.audio_receiver) { audio_player_ = std::make_unique(receivers.audio_receiver); } if (receivers.video_receiver) { video_player_ = std::make_unique(receivers.video_receiver); } #endif // defined(CAST_STANDALONE_RECEIVER_HAVE_EXTERNAL_LIBS) } void StreamingPlaybackController::OnReceiversDestroying( const ReceiverSession* session, ReceiversDestroyingReason reason) { audio_player_.reset(); video_player_.reset(); } void StreamingPlaybackController::OnError(const ReceiverSession* session, Error error) { client_->OnPlaybackError(this, error); } } // namespace cast } // namespace openscreen