+ }
+
+ if (primary_amcp_server_)
+ primary_amcp_server_->add_client_lifecycle_object_factory(
+ [=] (const std::string& ipv4_address)
+ -> std::pair<std::wstring, std::shared_ptr<void>>
+ {
+ using namespace boost::asio::ip;
+
+ return std::make_pair(
+ std::wstring(L"osc_subscribe"),
+ osc_client_->get_subscription_token(
+ udp::endpoint(
+ address_v4::from_string(
+ ipv4_address),
+ default_port)));
+ });
+ }
+
+ void setup_thumbnail_generation(const boost::property_tree::wptree& pt)
+ {
+ if (!pt.get(L"configuration.thumbnails.generate-thumbnails", true))
+ return;
+
+ auto scan_interval_millis = pt.get(L"configuration.thumbnails.scan-interval-millis", 5000);
+
+ polling_filesystem_monitor_factory monitor_factory(io_service_, scan_interval_millis);
+ thumbnail_generator_.reset(new thumbnail_generator(
+ monitor_factory,
+ env::media_folder(),
+ env::thumbnails_folder(),
+ pt.get(L"configuration.thumbnails.width", 256),
+ pt.get(L"configuration.thumbnails.height", 144),
+ core::video_format_desc(pt.get(L"configuration.thumbnails.video-mode", L"720p2500")),
+ accelerator_.create_image_mixer(0),
+ pt.get(L"configuration.thumbnails.generate-delay-millis", 2000),
+ &image::write_cropped_png,
+ media_info_repo_,
+ producer_registry_,
+ pt.get(L"configuration.thumbnails.mipmap", true)));
+ }
+
+ void setup_controllers(const boost::property_tree::wptree& pt)
+ {
+ amcp_command_repo_ = spl::make_shared<amcp::amcp_command_repository>(
+ channels_,
+ thumbnail_generator_,
+ media_info_repo_,
+ system_info_provider_repo_,
+ cg_registry_,
+ help_repo_,
+ producer_registry_,
+ consumer_registry_,
+ accelerator_.get_ogl_device(),
+ shutdown_server_now_);
+ amcp::register_commands(*amcp_command_repo_);
+
+ using boost::property_tree::wptree;
+ for (auto& xml_controller : pt | witerate_children(L"configuration.controllers") | welement_context_iteration)
+ {
+ auto name = xml_controller.first;
+ auto protocol = ptree_get<std::wstring>(xml_controller.second, L"protocol");
+
+ if(name == L"tcp")
+ {
+ auto port = ptree_get<unsigned int>(xml_controller.second, L"port");
+ auto asyncbootstrapper = spl::make_shared<IO::AsyncEventServer>(
+ io_service_,
+ create_protocol(protocol, L"TCP Port " + boost::lexical_cast<std::wstring>(port)),
+ port);
+ async_servers_.push_back(asyncbootstrapper);
+
+ if (!primary_amcp_server_ && boost::iequals(protocol, L"AMCP"))
+ primary_amcp_server_ = asyncbootstrapper;