#include "cg_producer.h"\r
#include "flash_producer.h"\r
\r
-#include "../../producer/frame_producer_device.h"\r
-#include "../../format/video_format.h"\r
#include "../../processor/frame.h"\r
#include "../../Server.h"\r
\r
#include <boost/filesystem.hpp>\r
#include <boost/assign.hpp>\r
-#include <tbb/concurrent_unordered_map.h>\r
\r
-namespace caspar { namespace core { namespace flash{\r
-\r
-struct flash_cg_proxy\r
-{\r
- virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& startFromLabel = TEXT(""), const std::wstring& data = TEXT("")) = 0;\r
- virtual std::wstring remove(int layer) = 0;\r
- virtual std::wstring play(int layer) = 0;\r
- virtual std::wstring stop(int layer, unsigned int mixOutDuration) = 0;\r
- virtual std::wstring next(int layer) = 0;\r
- virtual std::wstring update(int layer, const std::wstring& data) = 0;\r
- virtual std::wstring invoke(int layer, const std::wstring& label) = 0;\r
-};\r
-\r
-struct flash_cg_proxy16 : public flash_cg_proxy\r
-{ \r
- virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
- {\r
- std::wstringstream flashParam;\r
- std::wstring::size_type pos = templateName.find('.');\r
- std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName; \r
- flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string><number>0</number>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring remove(int layer) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring play(int layer) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring stop(int layer, unsigned int mixOutDuration) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring next(int layer) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring update(int layer, const std::wstring& data) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring invoke(int layer, const std::wstring& label) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"ExecuteMethod\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << label << TEXT("</string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-};\r
-\r
-struct flash_cg_proxy17 : public flash_cg_proxy\r
-{\r
- virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
- {\r
- std::wstringstream flashParam;\r
-\r
- std::wstring::size_type pos = templateName.find('.');\r
- std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName;\r
- \r
- flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring remove(int layer) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring play(int layer) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring stop(int layer, unsigned int mixOutDuration)\r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring next(int layer)\r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring update(int layer, const std::wstring& data) \r
- {\r
- std::wstringstream flashParam;\r
- flashParam << 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
- return flashParam.str();\r
- }\r
-\r
- virtual std::wstring invoke(int layer, const std::wstring& label)\r
- {\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Invoke\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string>") << label << TEXT("</string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
-};\r
-\r
-struct flash_cg_proxy18 : public flash_cg_proxy17\r
+namespace caspar { namespace core { namespace flash {\r
+ \r
+struct template_version\r
{\r
- virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data)\r
+ enum type\r
{\r
- std::wstringstream flashParam;\r
- flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << templateName << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
- return flashParam.str();\r
- }\r
+ _17,\r
+ _18,\r
+ invalid,\r
+ count\r
+ };\r
};\r
\r
struct cg_producer::implementation : boost::noncopyable\r
{\r
public:\r
\r
- implementation()\r
+ implementation() : ver_(template_version::invalid)\r
{\r
if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.18")))\r
{\r
flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.18"));\r
- proxy_.reset(new flash_cg_proxy18());\r
CASPAR_LOG(info) << L"Running version 1.8 template graphics.";\r
+ ver_ = template_version::_18;\r
}\r
else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.17")))\r
{\r
flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.17"));\r
- proxy_.reset(new flash_cg_proxy17());\r
CASPAR_LOG(info) << L"Running version 1.7 template graphics.";\r
- }\r
- else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth"))) \r
- {\r
- flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth"));\r
- proxy_.reset(new flash_cg_proxy16());\r
- CASPAR_LOG(info) << L"Running version 1.6 template graphics.";\r
+ ver_ = template_version::_17;\r
}\r
else \r
- CASPAR_LOG(info) << L"No templatehost found. Template graphics will be disabled";\r
- \r
+ CASPAR_LOG(info) << L"No templatehost found. Template graphics will be disabled"; \r
}\r
\r
void clear()\r
flash_producer_.reset();\r
}\r
\r
- void add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data)\r
+ void add(int layer, const std::wstring& template_name, bool play_on_load, const std::wstring& label, const std::wstring& data)\r
{\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking add-command";\r
- flash_producer_->param(proxy_->add(layer, templateName, playOnLoad, startFromLabel, data));\r
+ \r
+ std::wstringstream param;\r
+\r
+ std::wstring filename = template_name;\r
+\r
+ if(ver_ == template_version::_17)\r
+ {\r
+ std::wstring::size_type pos = template_name.find('.');\r
+ filename = (pos != std::wstring::npos) ? template_name.substr(0, pos) : template_name;\r
+ }\r
+\r
+ 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
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
void remove(int layer)\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking remove-command";\r
- flash_producer_->param(proxy_->remove(layer));\r
+ \r
+ std::wstringstream param;\r
+ param << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
void play(int layer)\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking play-command";\r
- flash_producer_->param(proxy_->play(layer));\r
+ \r
+ std::wstringstream param;\r
+ param << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
- void stop(int layer, unsigned int mixOutDuration)\r
+ void stop(int layer, unsigned int mix_out_duration)\r
{\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking stop-command";\r
- flash_producer_->param(proxy_->stop(layer, mixOutDuration));\r
+ \r
+ std::wstringstream param;\r
+ 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
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
void next(int layer)\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking next-command";\r
- flash_producer_->param(proxy_->next(layer));\r
+ \r
+ std::wstringstream param;\r
+ param << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
void update(int layer, const std::wstring& data)\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking update-command";\r
- flash_producer_->param(proxy_->update(layer, data));\r
+ \r
+ std::wstringstream param;\r
+ 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
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
void invoke(int layer, const std::wstring& label)\r
if(flash_producer_ == nullptr)\r
return;\r
CASPAR_LOG(info) << "Invoking invoke-command";\r
- flash_producer_->param(proxy_->invoke(layer, label));\r
+ \r
+ std::wstringstream param;\r
+ 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
+ \r
+ flash_producer_->param(param.str());\r
}\r
\r
frame_ptr render_frame()\r
void initialize(const frame_processor_device_ptr& frame_processor)\r
{\r
frame_processor_ = frame_processor;\r
- if(flash_producer_)\r
+ if(flash_producer_ != nullptr)\r
flash_producer_->initialize(frame_processor_);\r
}\r
\r
flash_producer_ptr flash_producer_;\r
- std::unique_ptr<flash_cg_proxy> proxy_;\r
+ template_version::type ver_;\r
frame_processor_device_ptr frame_processor_;\r
};\r
\r
-// This is somewhat a hack... needs redesign\r
-cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, unsigned int render_layer)\r
+cg_producer_ptr get_default_cg_producer(const channel_ptr& channel, int render_layer)\r
{\r
if(!channel)\r
BOOST_THROW_EXCEPTION(null_argument() << msg_info("channel"));\r
\r
auto producer = std::dynamic_pointer_cast<cg_producer>(channel->foreground(render_layer));\r
- if(!producer)\r
+ if(producer == nullptr)\r
{\r
producer = std::make_shared<cg_producer>(); \r
channel->load(render_layer, producer, load_option::auto_play); \r
cg_producer::cg_producer() : impl_(new implementation()){}\r
frame_ptr cg_producer::render_frame(){return impl_->render_frame();}\r
void cg_producer::clear(){impl_->clear();}\r
-void cg_producer::add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data){impl_->add(layer, templateName, playOnLoad, startFromLabel, data);}\r
+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
void cg_producer::remove(int layer){impl_->remove(layer);}\r
void cg_producer::play(int layer){impl_->play(layer);}\r
-void cg_producer::stop(int layer, unsigned int mixOutDuration){impl_->stop(layer, mixOutDuration);}\r
+void cg_producer::stop(int layer, unsigned int mix_out_duration){impl_->stop(layer, mix_out_duration);}\r
void cg_producer::next(int layer){impl_->next(layer);}\r
void cg_producer::update(int layer, const std::wstring& data){impl_->update(layer, data);}\r
void cg_producer::invoke(int layer, const std::wstring& label){impl_->invoke(layer, label);}\r