]> git.sesse.net Git - casparcg/blob - core/consumer/frame_consumer.cpp
2.0.0.2: Mayor solution reconfiguration.
[casparcg] / core / consumer / frame_consumer.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "frame_consumer.h"\r
4 \r
5 #include <common/memory/safe_ptr.h>\r
6 \r
7 #include <tbb/spin_rw_mutex.h>\r
8 \r
9 namespace caspar { namespace core {\r
10         \r
11 std::vector<const consumer_factory_t> c_factories;\r
12 tbb::spin_rw_mutex c_factories_mutex;\r
13 \r
14 void register_consumer_factory(const consumer_factory_t& factory)\r
15 {\r
16         tbb::spin_rw_mutex::scoped_lock(c_factories_mutex, true);\r
17         c_factories.push_back(factory);\r
18 }\r
19 \r
20 safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)\r
21 {\r
22         if(params.empty())\r
23                 BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
24         \r
25         tbb::spin_rw_mutex::scoped_lock(c_factories_mutex, false);\r
26         auto consumer = frame_consumer::empty();\r
27         std::any_of(c_factories.begin(), c_factories.end(), [&](const consumer_factory_t& factory) -> bool\r
28                 {\r
29                         try\r
30                         {\r
31                                 consumer = factory(params);\r
32                         }\r
33                         catch(...)\r
34                         {\r
35                                 CASPAR_LOG_CURRENT_EXCEPTION();\r
36                         }\r
37                         return consumer != frame_consumer::empty();\r
38                 });\r
39 \r
40         if(consumer == frame_consumer::empty())\r
41                 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax."));\r
42 \r
43         return consumer;\r
44 }\r
45 \r
46 }}