]> git.sesse.net Git - casparcg/blob - core/producer/frame_producer.cpp
56f403e20279c5607dd523b722ca144f73ae20bb
[casparcg] / core / producer / frame_producer.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "frame_producer.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 producer_factory_t> p_factories;\r
12 tbb::spin_rw_mutex p_factories_mutex;\r
13 \r
14 void register_producer_factory(const producer_factory_t& factory)\r
15 {\r
16         tbb::spin_rw_mutex::scoped_lock(p_factories_mutex, true);\r
17         p_factories.push_back(factory);\r
18 }\r
19 \r
20 safe_ptr<core::frame_producer> create_producer(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(p_factories_mutex, false);\r
26         auto producer = frame_producer::empty();\r
27         std::any_of(p_factories.begin(), p_factories.end(), [&](const producer_factory_t& factory) -> bool\r
28                 {\r
29                         try\r
30                         {\r
31                                 producer = factory(params);\r
32                         }\r
33                         catch(...)\r
34                         {\r
35                                 CASPAR_LOG_CURRENT_EXCEPTION();\r
36                         }\r
37                         return producer != frame_producer::empty();\r
38                 });\r
39 \r
40         if(producer == frame_producer::empty())\r
41                 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No match found for supplied commands. Check syntax."));\r
42 \r
43         return producer;\r
44 }\r
45 \r
46 }}