+struct server::impl : boost::noncopyable
+{
+ std::shared_ptr<boost::asio::io_service> io_service_ = create_running_io_service();
+ spl::shared_ptr<monitor::subject> monitor_subject_;
+ spl::shared_ptr<monitor::subject> diag_subject_ = core::diagnostics::get_or_create_subject();
+ accelerator::accelerator accelerator_;
+ spl::shared_ptr<help_repository> help_repo_;
+ std::shared_ptr<amcp::amcp_command_repository> amcp_command_repo_;
+ std::vector<spl::shared_ptr<IO::AsyncEventServer>> async_servers_;
+ std::shared_ptr<IO::AsyncEventServer> primary_amcp_server_;
+ std::shared_ptr<osc::client> osc_client_ = std::make_shared<osc::client>(io_service_);
+ std::vector<std::shared_ptr<void>> predefined_osc_subscriptions_;
+ std::vector<spl::shared_ptr<video_channel>> channels_;
+ spl::shared_ptr<media_info_repository> media_info_repo_;
+ boost::thread initial_media_info_thread_;
+ spl::shared_ptr<system_info_provider_repository> system_info_provider_repo_;
+ spl::shared_ptr<core::cg_producer_registry> cg_registry_;
+ spl::shared_ptr<core::frame_producer_registry> producer_registry_;
+ spl::shared_ptr<core::frame_consumer_registry> consumer_registry_;
+ tbb::atomic<bool> running_;
+ std::shared_ptr<thumbnail_generator> thumbnail_generator_;
+ std::promise<bool>& shutdown_server_now_;
+
+ explicit impl(std::promise<bool>& shutdown_server_now)
+ : accelerator_(env::properties().get(L"configuration.accelerator", L"auto"))
+ , media_info_repo_(create_in_memory_media_info_repository())
+ , producer_registry_(spl::make_shared<core::frame_producer_registry>(help_repo_))
+ , consumer_registry_(spl::make_shared<core::frame_consumer_registry>(help_repo_))
+ , shutdown_server_now_(shutdown_server_now)
+ {
+ running_ = false;
+ core::diagnostics::register_graph_to_log_sink();
+ caspar::core::diagnostics::osd::register_sink();
+ diag_subject_->attach_parent(monitor_subject_);
+
+ module_dependencies dependencies(
+ system_info_provider_repo_,
+ cg_registry_,
+ media_info_repo_,
+ producer_registry_,
+ consumer_registry_);
+
+ initialize_modules(dependencies);
+ core::text::init(dependencies);
+ core::scene::init(dependencies);
+ core::syncto::init(dependencies);
+ help_repo_->register_item({ L"producer" }, L"Color Producer", &core::describe_color_producer);
+ }