#include <sstream>
#include <algorithm>
#include "CIIProtocolStrategy.h"
-#include "CIICommandsimpl.h"
-#include <modules/flash/producer/flash_producer.h>
+#include "CIICommandsImpl.h"
#include <core/producer/transition/transition_producer.h>
#include <core/mixer/mixer.h>
+#include <core/diagnostics/call_context.h>
#include <common/env.h>
#include <boost/algorithm/string/replace.hpp>
const std::wstring CIIProtocolStrategy::MessageDelimiter = L"\r\n";
const wchar_t CIIProtocolStrategy::TokenDelimiter = L'\\';
-CIIProtocolStrategy::CIIProtocolStrategy(const std::vector<spl::shared_ptr<core::video_channel>>& channels) : pChannel_(channels.at(0)), executor_(L"CIIProtocolStrategy")
+CIIProtocolStrategy::CIIProtocolStrategy(
+ const std::vector<spl::shared_ptr<core::video_channel>>& channels,
+ const spl::shared_ptr<core::cg_producer_registry>& cg_registry)
+ : executor_(L"CIIProtocolStrategy")
+ , pChannel_(channels.at(0))
+ , cg_registry_(cg_registry)
{
}
if(message[charIndex] == TokenDelimiter)
{
pTokenVector->push_back(currentToken.str());
- currentToken.str(TEXT(""));
+ currentToken.str(L"");
continue;
}
- if(message[charIndex] == TEXT('\"'))
- currentToken << TEXT(""");
- else if(message[charIndex] == TEXT('<'))
- currentToken << TEXT("<");
- else if(message[charIndex] == TEXT('>'))
- currentToken << TEXT(">");
+ if(message[charIndex] == L'\"')
+ currentToken << L""";
+ else if(message[charIndex] == L'<')
+ currentToken << L"<";
+ else if(message[charIndex] == L'>')
+ currentToken << L">";
else
currentToken << message[charIndex];
}
/************
// Examples (<X> = ASCIICHAR X)
-I\25\3\VII\\ sätter outputtype till 'vii'
+I\25\3\VII\\ s�tter outputtype till 'vii'
I\25\4\1\\ enablar framebuffer (ignore this)
-M\C/SVTNEWS\\ pekar ut vilken grafisk profil som skall användas
+M\C/SVTNEWS\\ pekar ut vilken grafisk profil som skall anv�ndas
-W\4009\4067\Jonas Björkman\\ Skriver "Jonas Björkman" till första textfältet i template 4067 och sparar den färdiga skylten som 4009
+W\4009\4067\Jonas Bj�rkman\\ Skriver "Jonas Bj�rkman" till f�rsta textf�ltet i template 4067 och sparar den f�rdiga skylten som 4009
-T\7\4009.VII\A\\ lägger ut skylt 4009
+T\7\4009.VII\A\\ l�gger ut skylt 4009
-Y\<205><247><202><196><192><192><200><248>\\ lägger ut skylten 4008 (<205><247><202><196><192><192><200><248> = "=g:4008h" om man drar bort 144 från varje asciivärde)
+Y\<205><247><202><196><192><192><200><248>\\ l�gger ut skylten 4008 (<205><247><202><196><192><192><200><248> = "=g:4008h" om man drar bort 144 fr�n varje asciiv�rde)
-V\5\3\1\1\namn.tga\1\\ lägger ut bilden namn.tga
-V\0\1\D\C\10\0\0\0\\ gör någon inställning som har med föregående kommando att göra.
+V\5\3\1\1\namn.tga\1\\ l�gger ut bilden namn.tga
+V\0\1\D\C\10\0\0\0\\ g�r n�gon inst�llning som har med f�reg�ende kommando att g�ra.
*************/
/**********************
New Commands to support the Netupe automation system
-V\5\13\1\1\Template\0\TabField1\TabField2...\\ Build. Ettan före Template indikerar vilket lager den nya templaten skall laddas in i. OBS. Skall inte visas efter det här steget
-Y\<27>\\ Stop. Här kommer ett lagerID också att skickas med (<27> = ESC)
-Y\<254>\\ Clear Canvas. Här kommer ett lagerID också att skickas med, utan det skall allt tömmas
-Y\<213><243>\\ Play. Här kommer ett lagerID också att skickas med
+V\5\13\1\1\Template\0\TabField1\TabField2...\\ Build. Ettan f�re Template indikerar vilket lager den nya templaten skall laddas in i. OBS. Skall inte visas efter det h�r steget
+Y\<27>\\ Stop. H�r kommer ett lagerID ocks� att skickas med (<27> = ESC)
+Y\<254>\\ Clear Canvas. H�r kommer ett lagerID ocks� att skickas med, utan det skall allt t�mmas
+Y\<213><243>\\ Play. H�r kommer ett lagerID ocks� att skickas med
**********************/
CIICommandPtr CIIProtocolStrategy::Create(const std::wstring& name)
{
switch(name[0])
{
- case TEXT('M'): return std::make_shared<MediaCommand>(this);
- case TEXT('W'): return std::make_shared<WriteCommand>(this);
- case TEXT('T'): return std::make_shared<ImagestoreCommand>(this);
- case TEXT('V'): return std::make_shared<MiscellaneousCommand>(this);
- case TEXT('Y'): return std::make_shared<KeydataCommand>(this);
+ case L'M': return std::make_shared<MediaCommand>(this);
+ case L'W': return std::make_shared<WriteCommand>(this);
+ case L'T': return std::make_shared<ImagestoreCommand>(this);
+ case L'V': return std::make_shared<MiscellaneousCommand>(this);
+ case L'Y': return std::make_shared<KeydataCommand>(this);
default: return nullptr;
}
}
void CIIProtocolStrategy::WriteTemplateData(const std::wstring& templateName, const std::wstring& titleName, const std::wstring& xmlData)
{
- std::wstring fullTemplateFilename = env::template_folder();
- if(currentProfile_.size() > 0)
- {
- fullTemplateFilename += currentProfile_;
- fullTemplateFilename += TEXT("\\");
- }
- fullTemplateFilename += templateName;
- fullTemplateFilename = flash::find_template(fullTemplateFilename);
- if(fullTemplateFilename.empty())
+ std::wstring fullTemplateFilename = templateName;
+
+ if (!currentProfile_.empty())
+ fullTemplateFilename = currentProfile_ + L"/" + templateName;
+
+ core::diagnostics::scoped_call_context save;
+ core::diagnostics::call_context::for_thread().video_channel = 1;
+ core::diagnostics::call_context::for_thread().layer = 0;
+ auto producer = cg_registry_->create_producer(GetChannel(), fullTemplateFilename);
+
+ if (producer == core::frame_producer::empty())
{
- CASPAR_LOG(error) << "Failed to save instance of " << templateName << TEXT(" as ") << titleName << TEXT(", template ") << fullTemplateFilename << " not found";
+ CASPAR_LOG(error) << "Failed to save instance of " << templateName << L" as " << titleName << L", template " << fullTemplateFilename << L"not found";
return;
}
-
- auto producer = flash::create_producer(this->GetChannel()->frame_factory(), this->GetChannel()->video_format_desc(), { env::template_folder() + TEXT("CG.fth") });
- std::wstringstream flashParam;
- flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>1</number><string>") << currentProfile_ << '/' << templateName << TEXT("</string><number>0</number><true/><string> </string><string><![CDATA[ ") << xmlData << TEXT(" ]]></string></arguments></invoke>");
- std::vector<std::wstring> params;
- params.push_back(flashParam.str());
- producer->call(std::move(params));
+ cg_registry_->get_proxy(producer)->add(1, fullTemplateFilename, true, L"", xmlData);
- CASPAR_LOG(info) << "Saved an instance of " << templateName << TEXT(" as ") << titleName ;
+ CASPAR_LOG(info) << "Saved an instance of " << templateName << L" as " << titleName ;
PutPreparedTemplate(titleName, spl::shared_ptr<core::frame_producer>(std::move(producer)));
transition.type = transition_type::mix;
transition.duration = 12;
+ core::diagnostics::scoped_call_context save;
+ core::diagnostics::call_context::for_thread().video_channel = 1;
+ core::diagnostics::call_context::for_thread().layer = 0;
+
auto pFP = create_producer(GetChannel()->frame_factory(), GetChannel()->video_format_desc(), filename);
auto pTransition = create_transition_producer(GetChannel()->video_format_desc().field_mode, pFP, transition);
return result;
}
-void CIIProtocolStrategy::PutPreparedTemplate(const std::wstring& titleName, spl::shared_ptr<core::frame_producer>& pFP)
+void CIIProtocolStrategy::PutPreparedTemplate(const std::wstring& titleName, const spl::shared_ptr<core::frame_producer>& pFP)
{
CASPAR_LOG(debug) << L"Saved title with name " << titleName;