1 #include "../../StdAfx.h"
\r
3 #if defined(_MSC_VER)
\r
4 #pragma warning (disable : 4714) // marked as __forceinline not inlined
\r
7 #include "cg_producer.h"
\r
8 #include "flash_producer.h"
\r
10 #include "../../processor/draw_frame.h"
\r
11 #include "../../Server.h"
\r
13 #include <boost/filesystem.hpp>
\r
14 #include <boost/assign.hpp>
\r
16 namespace caspar { namespace core { namespace flash {
\r
18 struct template_version
\r
29 struct cg_producer::implementation : boost::noncopyable
\r
33 implementation() : ver_(template_version::invalid), flash_producer_(create_flash()){}
\r
35 safe_ptr<flash_producer> create_flash()
\r
37 if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.18")))
\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
43 else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.17")))
\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
50 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("No templatehost found."));
\r
58 void add(int layer, const std::wstring& template_name, bool play_on_load, const std::wstring& label, const std::wstring& data)
\r
60 CASPAR_LOG(info) << "Invoking add-command";
\r
62 std::wstringstream param;
\r
64 std::wstring filename = template_name;
\r
66 if(ver_ == template_version::_17)
\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
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
74 flash_producer_->param(param.str());
\r
77 void remove(int layer)
\r
79 CASPAR_LOG(info) << "Invoking remove-command";
\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
84 flash_producer_->param(param.str());
\r
87 void play(int layer)
\r
89 CASPAR_LOG(info) << "Invoking play-command";
\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
94 flash_producer_->param(param.str());
\r
97 void stop(int layer, unsigned int mix_out_duration)
\r
99 CASPAR_LOG(info) << "Invoking stop-command";
\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
104 flash_producer_->param(param.str());
\r
107 void next(int layer)
\r
109 CASPAR_LOG(info) << "Invoking next-command";
\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
114 flash_producer_->param(param.str());
\r
117 void update(int layer, const std::wstring& data)
\r
119 CASPAR_LOG(info) << "Invoking update-command";
\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
124 flash_producer_->param(param.str());
\r
127 void invoke(int layer, const std::wstring& label)
\r
129 CASPAR_LOG(info) << "Invoking invoke-command";
\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
134 flash_producer_->param(param.str());
\r
137 safe_ptr<draw_frame> receive()
\r
139 return flash_producer_->receive();
\r
142 void initialize(const safe_ptr<frame_processor_device>& frame_processor)
\r
144 frame_processor_ = frame_processor;
\r
145 flash_producer_->initialize(frame_processor);
\r
148 std::wstring print() const
\r
150 return L"cg_producer. back-end:" + flash_producer_->print();
\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
158 safe_ptr<cg_producer> get_default_cg_producer(const safe_ptr<channel>& channel, int render_layer)
\r
162 return dynamic_pointer_cast<cg_producer>(channel->foreground(render_layer).get());
\r
164 catch(std::bad_cast&)
\r
166 auto producer = make_safe<cg_producer>();
\r
167 channel->load(render_layer, producer, load_option::auto_play);
\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