]> git.sesse.net Git - casparcg/blob - core/producer/flash/cg_producer.cpp
161d67c5d36343a9b9825d402bfae935487337f6
[casparcg] / core / producer / flash / cg_producer.cpp
1 #include "../../StdAfx.h"\r
2 \r
3 #if defined(_MSC_VER)\r
4 #pragma warning (disable : 4714) // marked as __forceinline not inlined\r
5 #endif\r
6 \r
7 #include "cg_producer.h"\r
8 #include "flash_producer.h"\r
9 \r
10 #include "../../processor/draw_frame.h"\r
11 #include "../../Server.h"\r
12 \r
13 #include <boost/filesystem.hpp>\r
14 #include <boost/assign.hpp>\r
15                 \r
16 namespace caspar { namespace core { namespace flash {\r
17         \r
18 struct template_version\r
19 {\r
20         enum type\r
21         {\r
22                 _17,\r
23                 _18,\r
24                 invalid,\r
25                 count\r
26         };\r
27 };\r
28 \r
29 struct cg_producer::implementation : boost::noncopyable\r
30 {\r
31 public:\r
32 \r
33         implementation() : ver_(template_version::invalid), flash_producer_(create_flash()){}\r
34 \r
35         safe_ptr<flash_producer> create_flash()\r
36         {               \r
37                 if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.18")))\r
38                 {\r
39                         CASPAR_LOG(info) << L"Running version 1.8 template graphics.";\r
40                         ver_ = template_version::_18;\r
41                         return safe_ptr<flash_producer>(flash_producer(server::template_folder()+TEXT("cg.fth.18")));\r
42                 }\r
43                 else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.17")))\r
44                 {\r
45                         CASPAR_LOG(info) << L"Running version 1.7 template graphics.";\r
46                         ver_ = template_version::_17;\r
47                         return safe_ptr<flash_producer>(flash_producer(server::template_folder()+TEXT("cg.fth.17")));\r
48                 }\r
49                 else \r
50                         BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No templatehost found."));  \r
51         }\r
52 \r
53         void clear()\r
54         {\r
55                 // TODO\r
56         }\r
57 \r
58         void add(int layer, const std::wstring& template_name,  bool play_on_load, const std::wstring& label, const std::wstring& data)\r
59         {\r
60                 CASPAR_LOG(info) << "Invoking add-command";\r
61                 \r
62                 std::wstringstream param;\r
63 \r
64                 std::wstring filename = template_name;\r
65 \r
66                 if(ver_ == template_version::_17)\r
67                 {\r
68                         std::wstring::size_type pos = template_name.find('.');\r
69                         filename = (pos != std::wstring::npos) ? template_name.substr(0, pos) : template_name;\r
70                 }\r
71 \r
72                 param << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string>") << (play_on_load?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
73                 \r
74                 flash_producer_->param(param.str());\r
75         }\r
76 \r
77         void remove(int layer)\r
78         {\r
79                 CASPAR_LOG(info) << "Invoking remove-command";\r
80                 \r
81                 std::wstringstream param;\r
82                 param << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
83                 \r
84                 flash_producer_->param(param.str());\r
85         }\r
86 \r
87         void play(int layer)\r
88         {\r
89                 CASPAR_LOG(info) << "Invoking play-command";\r
90                 \r
91                 std::wstringstream param;\r
92                 param << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
93                 \r
94                 flash_producer_->param(param.str());\r
95         }\r
96 \r
97         void stop(int layer, unsigned int mix_out_duration)\r
98         {\r
99                 CASPAR_LOG(info) << "Invoking stop-command";\r
100                 \r
101                 std::wstringstream param;\r
102                 param << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><number>") << mix_out_duration << TEXT("</number></arguments></invoke>");\r
103                 \r
104                 flash_producer_->param(param.str());\r
105         }\r
106 \r
107         void next(int layer)\r
108         {\r
109                 CASPAR_LOG(info) << "Invoking next-command";\r
110                 \r
111                 std::wstringstream param;\r
112                 param << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
113                 \r
114                 flash_producer_->param(param.str());\r
115         }\r
116 \r
117         void update(int layer, const std::wstring& data)\r
118         {\r
119                 CASPAR_LOG(info) << "Invoking update-command";\r
120                 \r
121                 std::wstringstream param;\r
122                 param << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
123                 \r
124                 flash_producer_->param(param.str());\r
125         }\r
126 \r
127         void invoke(int layer, const std::wstring& label)\r
128         {\r
129                 CASPAR_LOG(info) << "Invoking invoke-command";\r
130                 \r
131                 std::wstringstream param;\r
132                 param << TEXT("<invoke name=\"Invoke\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string>") << label << TEXT("</string></arguments></invoke>");\r
133                 \r
134                 flash_producer_->param(param.str());\r
135         }\r
136 \r
137         safe_ptr<draw_frame> receive()\r
138         {\r
139                 return flash_producer_->receive();\r
140         }\r
141                 \r
142         void initialize(const safe_ptr<frame_processor_device>& frame_processor)\r
143         {\r
144                 frame_processor_ = frame_processor;\r
145                 flash_producer_->initialize(frame_processor);\r
146         }\r
147 \r
148         std::wstring print() const\r
149         {\r
150                 return L"cg_producer. back-end:" + flash_producer_->print();\r
151         }\r
152 \r
153         safe_ptr<flash_producer> flash_producer_;\r
154         template_version::type ver_;\r
155         std::shared_ptr<frame_processor_device> frame_processor_;\r
156 };\r
157         \r
158 safe_ptr<cg_producer> get_default_cg_producer(const safe_ptr<channel>& channel, int render_layer)\r
159 {       \r
160         try\r
161         {\r
162                 return dynamic_pointer_cast<cg_producer>(channel->foreground(render_layer).get());\r
163         }\r
164         catch(std::bad_cast&)\r
165         {\r
166                 auto producer = make_safe<cg_producer>();               \r
167                 channel->load(render_layer, producer, load_option::auto_play); \r
168                 return producer;\r
169         }\r
170 }\r
171 \r
172 cg_producer::cg_producer() : impl_(new implementation()){}\r
173 cg_producer::cg_producer(cg_producer&& other) : impl_(std::move(other.impl_)){}\r
174 safe_ptr<draw_frame> cg_producer::receive(){return impl_->receive();}\r
175 void cg_producer::clear(){impl_->clear();}\r
176 void cg_producer::add(int layer, const std::wstring& template_name,  bool play_on_load, const std::wstring& startFromLabel, const std::wstring& data){impl_->add(layer, template_name, play_on_load, startFromLabel, data);}\r
177 void cg_producer::remove(int layer){impl_->remove(layer);}\r
178 void cg_producer::play(int layer){impl_->play(layer);}\r
179 void cg_producer::stop(int layer, unsigned int mix_out_duration){impl_->stop(layer, mix_out_duration);}\r
180 void cg_producer::next(int layer){impl_->next(layer);}\r
181 void cg_producer::update(int layer, const std::wstring& data){impl_->update(layer, data);}\r
182 void cg_producer::invoke(int layer, const std::wstring& label){impl_->invoke(layer, label);}\r
183 void cg_producer::initialize(const safe_ptr<frame_processor_device>& frame_processor){impl_->initialize(frame_processor);}\r
184 std::wstring cg_producer::print() const{return impl_->print();}\r
185 }}}