<ClInclude Include="mixer\image\blend_modes.h" />\r
<ClInclude Include="mixer\image\shader\blending_glsl.h" />\r
<ClInclude Include="mixer\image\shader\image_shader.h" />\r
+ <ClInclude Include="producer\channel\channel_producer.h" />\r
<ClInclude Include="producer\playlist\playlist_producer.h" />\r
<ClInclude Include="video_channel.h" />\r
<ClInclude Include="consumer\output.h" />\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../../../stdafx.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../../../stdafx.h</PrecompiledHeaderFile>\r
</ClCompile>\r
+ <ClCompile Include="producer\channel\channel_producer.cpp">\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Develop|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+ </ClCompile>\r
<ClCompile Include="producer\playlist\playlist_producer.cpp">\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">../../stdafx.h</PrecompiledHeaderFile>\r
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../stdafx.h</PrecompiledHeaderFile>\r
<Filter Include="source\mixer\image\shader">\r
<UniqueIdentifier>{e0a140f8-e217-465c-a934-163b7ea786be}</UniqueIdentifier>\r
</Filter>\r
+ <Filter Include="source\producer\channel">\r
+ <UniqueIdentifier>{f2380c6b-6ec8-4a47-8394-357a05eb831a}</UniqueIdentifier>\r
+ </Filter>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="producer\transition\transition_producer.h">\r
<ClInclude Include="mixer\image\shader\blending_glsl.h">\r
<Filter>source\mixer\image\shader</Filter>\r
</ClInclude>\r
+ <ClInclude Include="producer\channel\channel_producer.h">\r
+ <Filter>source\producer\channel</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<ClCompile Include="producer\transition\transition_producer.cpp">\r
<ClCompile Include="mixer\image\blend_modes.cpp">\r
<Filter>source\mixer\image</Filter>\r
</ClCompile>\r
+ <ClCompile Include="producer\channel\channel_producer.cpp">\r
+ <Filter>source\producer\channel</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
</Project>
\ No newline at end of file
#include <core/producer/frame_producer.h>\r
#include <core/video_format.h>\r
#include <core/producer/transition/transition_producer.h>\r
+#include <core/producer/channel/channel_producer.h>\r
#include <core/producer/frame/frame_transform.h>\r
#include <core/producer/stage.h>\r
#include <core/producer/layer.h>\r
}\r
}\r
\r
+bool ChannelGridCommand::DoExecute()\r
+{\r
+ int index = 1;\r
+ BOOST_FOREACH(auto channel, GetChannels())\r
+ {\r
+ if(channel != GetChannel())\r
+ {\r
+ auto producer = create_channel_producer(GetChannel()->mixer(), channel); \r
+ GetChannel()->stage()->load(index, producer, false);\r
+ GetChannel()->stage()->play(index);\r
+ index++;\r
+ }\r
+ }\r
+\r
+ int n = GetChannels().size()-1;\r
+ double delta = 1.0/static_cast<double>(n);\r
+ for(int x = 0; x < n; ++x)\r
+ {\r
+ for(int y = 0; y < n; ++y)\r
+ {\r
+ int index = x+y*n+1;\r
+ auto transform = [=](frame_transform transform) -> frame_transform\r
+ { \r
+ transform.fill_translation[0] = x*delta;\r
+ transform.fill_translation[1] = y*delta;\r
+ transform.fill_scale[0] = delta;\r
+ transform.fill_scale[1] = delta;\r
+ transform.clip_translation[0] = x*delta;\r
+ transform.clip_translation[1] = y*delta;\r
+ transform.clip_scale[0] = delta;\r
+ transform.clip_scale[1] = delta; \r
+ return transform;\r
+ };\r
+ GetChannel()->stage()->apply_frame_transform(index, transform);\r
+ }\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
bool CallCommand::DoExecute()\r
{ \r
//Perform loading of the clip\r
\r
namespace amcp {\r
\r
+class ChannelGridCommand : public AMCPCommandBase<true, AddToQueue, 0>\r
+{\r
+ std::wstring print() const { return L"ChannelGridCommand";}\r
+ bool DoExecute();\r
+};\r
+\r
class DiagnosticsCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
{\r
std::wstring print() const { return L"DiagnosticsCommand";}\r
std::wstring s = str;\r
transform(s.begin(), s.end(), s.begin(), toupper);\r
\r
- if (s == TEXT("MIXER")) return std::make_shared<MixerCommand>();\r
- else if(s == TEXT("DIAG")) return std::make_shared<DiagnosticsCommand>();\r
- else if(s == TEXT("CALL")) return std::make_shared<CallCommand>();\r
- else if(s == TEXT("SWAP")) return std::make_shared<SwapCommand>();\r
- else if(s == TEXT("LOAD")) return std::make_shared<LoadCommand>();\r
- else if(s == TEXT("LOADBG")) return std::make_shared<LoadbgCommand>();\r
- else if(s == TEXT("ADD")) return std::make_shared<AddCommand>();\r
- else if(s == TEXT("REMOVE")) return std::make_shared<RemoveCommand>();\r
- else if(s == TEXT("PAUSE")) return std::make_shared<PauseCommand>();\r
- else if(s == TEXT("PLAY")) return std::make_shared<PlayCommand>();\r
- else if(s == TEXT("STOP")) return std::make_shared<StopCommand>();\r
- else if(s == TEXT("CLEAR")) return std::make_shared<ClearCommand>();\r
- else if(s == TEXT("PRINT")) return std::make_shared<PrintCommand>();\r
- else if(s == TEXT("LOG")) return std::make_shared<LogCommand>();\r
- else if(s == TEXT("CG")) return std::make_shared<CGCommand>();\r
- else if(s == TEXT("DATA")) return std::make_shared<DataCommand>();\r
- else if(s == TEXT("CINF")) return std::make_shared<CinfCommand>();\r
- else if(s == TEXT("INFO")) return std::make_shared<InfoCommand>(channels_);\r
- else if(s == TEXT("CLS")) return std::make_shared<ClsCommand>();\r
- else if(s == TEXT("TLS")) return std::make_shared<TlsCommand>();\r
- else if(s == TEXT("VERSION")) return std::make_shared<VersionCommand>();\r
- else if(s == TEXT("BYE")) return std::make_shared<ByeCommand>();\r
- else if(s == TEXT("SET")) return std::make_shared<SetCommand>();\r
+ if (s == TEXT("MIXER")) return std::make_shared<MixerCommand>();\r
+ else if(s == TEXT("DIAG")) return std::make_shared<DiagnosticsCommand>();\r
+ else if(s == TEXT("CHANNEL_GRID")) return std::make_shared<ChannelGridCommand>();\r
+ else if(s == TEXT("CALL")) return std::make_shared<CallCommand>();\r
+ else if(s == TEXT("SWAP")) return std::make_shared<SwapCommand>();\r
+ else if(s == TEXT("LOAD")) return std::make_shared<LoadCommand>();\r
+ else if(s == TEXT("LOADBG")) return std::make_shared<LoadbgCommand>();\r
+ else if(s == TEXT("ADD")) return std::make_shared<AddCommand>();\r
+ else if(s == TEXT("REMOVE")) return std::make_shared<RemoveCommand>();\r
+ else if(s == TEXT("PAUSE")) return std::make_shared<PauseCommand>();\r
+ else if(s == TEXT("PLAY")) return std::make_shared<PlayCommand>();\r
+ else if(s == TEXT("STOP")) return std::make_shared<StopCommand>();\r
+ else if(s == TEXT("CLEAR")) return std::make_shared<ClearCommand>();\r
+ else if(s == TEXT("PRINT")) return std::make_shared<PrintCommand>();\r
+ else if(s == TEXT("LOG")) return std::make_shared<LogCommand>();\r
+ else if(s == TEXT("CG")) return std::make_shared<CGCommand>();\r
+ else if(s == TEXT("DATA")) return std::make_shared<DataCommand>();\r
+ else if(s == TEXT("CINF")) return std::make_shared<CinfCommand>();\r
+ else if(s == TEXT("INFO")) return std::make_shared<InfoCommand>(channels_);\r
+ else if(s == TEXT("CLS")) return std::make_shared<ClsCommand>();\r
+ else if(s == TEXT("TLS")) return std::make_shared<TlsCommand>();\r
+ else if(s == TEXT("VERSION")) return std::make_shared<VersionCommand>();\r
+ else if(s == TEXT("BYE")) return std::make_shared<ByeCommand>();\r
+ else if(s == TEXT("SET")) return std::make_shared<SetCommand>();\r
//else if(s == TEXT("MONITOR"))\r
//{\r
// result = AMCPCommandPtr(new MonitorCommand());\r