+ channels_.back()->output()->add(consumer);\r
+ });\r
+ }\r
+\r
+ // Dummy diagnostics channel\r
+ if(env::properties().get(L"configuration.channel-grid", false))\r
+ {\r
+ channels_.push_back(make_safe<video_channel>(channels_.size()+1, core::video_format_desc::get(core::video_format::x576p2500), ogl_, default_channel_layout_repository().get_by_name(L"STEREO")));\r
+ channels_.back()->monitor_output().attach_parent(monitor_subject_);\r
+ }\r
+ }\r
+\r
+ template<typename Base>\r
+ std::vector<safe_ptr<Base>> create_consumers(const boost::property_tree::wptree& pt)\r
+ {\r
+ std::vector<safe_ptr<Base>> consumers;\r
+\r
+ create_consumers(pt, [&] (const safe_ptr<core::frame_consumer>& consumer)\r
+ {\r
+ consumers.push_back(dynamic_pointer_cast<Base>(consumer));\r
+ });\r
+\r
+ return consumers;\r
+ }\r
+\r
+ template<class Func>\r
+ void create_consumers(const boost::property_tree::wptree& pt, const Func& on_consumer)\r
+ {\r
+ BOOST_FOREACH(auto& xml_consumer, pt)\r
+ {\r
+ try\r
+ {\r
+ auto name = xml_consumer.first;\r
+\r
+ if (name == L"screen")\r
+ on_consumer(ogl::create_consumer(xml_consumer.second));\r
+ else if (name == L"bluefish") \r
+ on_consumer(bluefish::create_consumer(xml_consumer.second)); \r
+ else if (name == L"decklink") \r
+ on_consumer(decklink::create_consumer(xml_consumer.second)); \r
+ else if (name == L"newtek-ivga") \r
+ on_consumer(newtek::create_ivga_consumer(xml_consumer.second)); \r
+ else if (name == L"blocking-decklink")\r
+ on_consumer(decklink::create_blocking_consumer(xml_consumer.second)); \r
+ else if (name == L"file") \r
+ on_consumer(ffmpeg::create_consumer(xml_consumer.second)); \r
+ else if (name == L"stream") \r
+ on_consumer(ffmpeg::create_streaming_consumer(xml_consumer.second)); \r
+ else if (name == L"system-audio")\r
+ on_consumer(oal::create_consumer());\r
+ else if (name != L"<xmlcomment>")\r
+ CASPAR_LOG(warning) << "Invalid consumer: " << widen(name); \r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ }\r