+bool ParamCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ auto what = _parameters.at(2);\r
+ if(what == L"B")\r
+ GetChannel()->stage()->background(GetLayerIndex()).get()->param(_parameters.at(3));\r
+ else if(what == L"F")\r
+ GetChannel()->stage()->foreground(GetLayerIndex()).get()->param(_parameters.at(3));\r
+ \r
+ CASPAR_LOG(info) << "Executed param: " << _parameters[0] << TEXT(" successfully");\r
+\r
+ SetReplyString(TEXT("202 PARAM OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 PARAM FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool MixerCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ { \r
+ if(_parameters[0] == L"VIDEO")\r
+ {\r
+ if(_parameters[1] == L"IS_KEY")\r
+ {\r
+ bool value = lexical_cast_or_default(_parameters.at(2), false);\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_is_key(value);\r
+ return transform; \r
+ };\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform);\r
+ }\r
+ else if(_parameters[1] == L"OPACITY")\r
+ {\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+\r
+ double value = boost::lexical_cast<double>(_parameters.at(2));\r
+ \r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_opacity(value);\r
+ return transform; \r
+ };\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[1] == L"FILL_RECT")\r
+ {\r
+ int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
+ double x = boost::lexical_cast<double>(_parameters.at(2));\r
+ double y = boost::lexical_cast<double>(_parameters.at(3));\r
+ double x_s = boost::lexical_cast<double>(_parameters.at(4));\r
+ double y_s = boost::lexical_cast<double>(_parameters.at(5));\r
+\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_fill_translation(x, y);\r
+ transform.set_fill_scale(x_s, y_s);\r
+ transform.set_clip_translation(x, y);\r
+ transform.set_clip_scale(x_s, y_s);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[1] == L"CLIP_RECT")\r
+ {\r
+ int duration = _parameters.size() > 6 ? lexical_cast_or_default(_parameters[6], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 7 ? _parameters[7] : L"linear";\r
+ double x = boost::lexical_cast<double>(_parameters.at(2));\r
+ double y = boost::lexical_cast<double>(_parameters.at(3));\r
+ double x_s = boost::lexical_cast<double>(_parameters.at(4));\r
+ double y_s = boost::lexical_cast<double>(_parameters.at(5));\r
+\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_clip_translation(x, y);\r
+ transform.set_clip_scale(x_s, y_s);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[1] == L"GRID")\r
+ {\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+ int n = boost::lexical_cast<int>(_parameters.at(2));\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 = [=](image_transform transform) -> image_transform\r
+ { \r
+ transform.set_fill_translation(x*delta, y*delta);\r
+ transform.set_fill_scale(delta, delta); \r
+ transform.set_clip_translation(x*delta, y*delta);\r
+ transform.set_clip_scale(delta, delta);\r
+ return transform;\r
+ };\r
+ GetChannel()->mixer()->apply_image_transform(index, transform, duration, tween);\r
+ }\r
+ }\r
+ }\r
+ else if(_parameters[1] == L"BLEND")\r
+ {\r
+ auto blend_str = _parameters.at(2);\r
+\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_blend_mode(get_blend_mode(blend_str));\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform); \r
+ }\r
+ else if(_parameters[1] == L"BRIGHTNESS")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(2));\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_brightness(value);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[1] == L"SATURATION")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(2));\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_saturation(value);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[1] == L"CONTRAST")\r
+ {\r
+ auto value = boost::lexical_cast<double>(_parameters.at(2));\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_contrast(value);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[1] == L"LEVELS")\r
+ {\r
+ image_transform::levels value;\r
+ value.min_input = boost::lexical_cast<double>(_parameters.at(2));\r
+ value.max_input = boost::lexical_cast<double>(_parameters.at(3));\r
+ value.gamma = boost::lexical_cast<double>(_parameters.at(4));\r
+ value.min_output = boost::lexical_cast<double>(_parameters.at(5));\r
+ value.max_output = boost::lexical_cast<double>(_parameters.at(6));\r
+ int duration = _parameters.size() > 7 ? lexical_cast_or_default(_parameters[7], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 8 ? _parameters[8] : L"linear";\r
+\r
+ auto transform = [=](image_transform transform) -> image_transform\r
+ {\r
+ transform.set_levels(value);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, duration, tween); \r
+ }\r
+ else if(_parameters[1] == L"RESET")\r
+ {\r
+ int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->set_image_transform(GetLayerIndex(), image_transform(), duration, tween);\r
+ }\r
+ }\r
+ else if(_parameters[0] == L"AUDIO")\r
+ {\r
+ if(_parameters[1] == L"GAIN")\r
+ {\r
+ int duration = _parameters.size() > 3 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 4 ? _parameters[4] : L"linear";\r
+ double value = boost::lexical_cast<double>(_parameters[2]);\r
+\r
+ auto transform = [=](audio_transform transform) -> audio_transform\r
+ {\r
+ transform.set_gain(value);\r
+ return transform;\r
+ };\r
+ \r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->apply_audio_transform(GetLayerIndex(), transform, duration, tween);\r
+ }\r
+ else if(_parameters[1] == L"RESET")\r
+ {\r
+ int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[2], 0) : 0;\r
+ std::wstring tween = _parameters.size() > 3 ? _parameters[3] : L"linear";\r
+\r
+ int layer = GetLayerIndex();\r
+ GetChannel()->mixer()->set_audio_transform(GetLayerIndex(), audio_transform(), duration, tween);\r
+ }\r
+ }\r
+ else if(_parameters[0] == L"RESET")\r
+ {\r
+ GetChannel()->mixer()->reset_transforms();\r
+ }\r
+ \r
+ SetReplyString(TEXT("202 MIXER OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 MIXER ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 MIXER FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool SwapCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ if(GetLayerIndex(-1) != -1)\r
+ {\r
+ std::vector<std::string> strs;\r
+ boost::split(strs, _parameters[0], boost::is_any_of("-"));\r
+ \r
+ auto ch1 = GetChannel();\r
+ auto ch2 = GetChannels().at(boost::lexical_cast<int>(strs.at(0))-1);\r
+\r
+ int l1 = GetLayerIndex();\r
+ int l2 = boost::lexical_cast<int>(strs.at(1));\r
+\r
+ ch1->stage()->swap_layer(l1, l2, *ch2->stage());\r
+ }\r
+ else\r
+ {\r
+ auto ch1 = GetChannel();\r
+ auto ch2 = GetChannels().at(boost::lexical_cast<int>(_parameters[0])-1);\r
+ ch1->stage()->swap(*ch2->stage());\r
+ }\r
+\r
+ CASPAR_LOG(info) << "Swapped successfully";\r
+\r
+ SetReplyString(TEXT("202 SWAP OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 SWAP ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 SWAP FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool AddCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ GetChannel()->output()->add(GetLayerIndex(), create_consumer(_parameters));\r
+ \r
+ CASPAR_LOG(info) << "Added " << _parameters[0] << TEXT(" successfully");\r
+\r
+ SetReplyString(TEXT("202 ADD OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 ADD ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 ADD FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r
+bool RemoveCommand::DoExecute()\r
+{ \r
+ //Perform loading of the clip\r
+ try\r
+ {\r
+ GetChannel()->output()->remove(GetLayerIndex());\r
+\r
+ SetReplyString(TEXT("202 REMOVE OK\r\n"));\r
+\r
+ return true;\r
+ }\r
+ catch(file_not_found&)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("404 REMOVE ERROR\r\n"));\r
+ return false;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ SetReplyString(TEXT("502 REMOVE FAILED\r\n"));\r
+ return false;\r
+ }\r
+}\r
+\r