\r
#include <algorithm>\r
\r
-struct application_state\r
-{\r
- enum type\r
- {\r
- running,\r
- shutdown,\r
- pause_and_shutdown\r
- };\r
-};\r
-\r
-boost::condition_variable shutdown_cond;\r
-boost::mutex shutdown_mut;\r
-tbb::atomic<int> shutdown_event;\r
-\r
// NOTE: This is needed in order to make CComObject work since this is not a real ATL project.\r
CComModule _AtlModule;\r
extern __declspec(selectany) CAtlModule* _pAtlModule = &_AtlModule;\r
::FreeLibrary(hMod);\r
}\r
\r
-BOOL WINAPI HandlerRoutine(__in DWORD dwCtrlType)\r
-{\r
- switch(dwCtrlType)\r
- {\r
- case CTRL_CLOSE_EVENT:\r
- case CTRL_SHUTDOWN_EVENT:\r
- shutdown_event = application_state::shutdown;\r
- shutdown_cond.notify_all();\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
void setup_console_window()\r
{ \r
auto hOut = GetStdHandle(STD_OUTPUT_HANDLE);\r
\r
// Disable close button in console to avoid shutdown without cleanup.\r
- //EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);\r
- //DrawMenuBar(GetConsoleWindow());\r
- SetConsoleCtrlHandler(HandlerRoutine, true);\r
+ EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);\r
+ DrawMenuBar(GetConsoleWindow());\r
+ //SetConsoleCtrlHandler(HandlerRoutine, true);\r
\r
// Configure console size and position.\r
auto coord = GetLargestConsoleWindowSize(hOut);\r
\r
try \r
{\r
- {\r
- // Configure environment properties from configuration.\r
- caspar::env::configure("casparcg.config");\r
+ // Configure environment properties from configuration.\r
+ caspar::env::configure("casparcg.config");\r
\r
- #ifdef _DEBUG\r
- if(caspar::env::properties().get("configuration.debugging.remote", false))\r
- MessageBox(nullptr, TEXT("Now is the time to connect for remote debugging..."), TEXT("Debug"), MB_OK | MB_TOPMOST);\r
- #endif \r
-\r
- // Start logging to file.\r
- caspar::log::add_file_sink(caspar::env::log_folder()); \r
- std::wcout << L"Logging [info] or higher severity to " << caspar::env::log_folder() << std::endl << std::endl;\r
+ #ifdef _DEBUG\r
+ if(caspar::env::properties().get("configuration.debugging.remote", false))\r
+ MessageBox(nullptr, TEXT("Now is the time to connect for remote debugging..."), TEXT("Debug"), MB_OK | MB_TOPMOST);\r
+ #endif \r
+\r
+ // Start logging to file.\r
+ caspar::log::add_file_sink(caspar::env::log_folder()); \r
+ std::wcout << L"Logging [info] or higher severity to " << caspar::env::log_folder() << std::endl << std::endl;\r
\r
- // Setup console window.\r
- setup_console_window();\r
+ // Setup console window.\r
+ setup_console_window();\r
\r
- // Print environment information.\r
- print_info();\r
+ // Print environment information.\r
+ print_info();\r
\r
- std::stringstream str;\r
- boost::property_tree::xml_writer_settings<char> w(' ', 3);\r
- boost::property_tree::write_xml(str, caspar::env::properties(), w);\r
- CASPAR_LOG(info) << L"casparcg.config:\n-----------------------------------------\n" << str.str().c_str() << L"-----------------------------------------";\r
+ std::stringstream str;\r
+ boost::property_tree::xml_writer_settings<char> w(' ', 3);\r
+ boost::property_tree::write_xml(str, caspar::env::properties(), w);\r
+ CASPAR_LOG(info) << L"casparcg.config:\n-----------------------------------------\n" << str.str().c_str() << L"-----------------------------------------";\r
\r
+ {\r
// Create server object which initializes channels, protocols and controllers.\r
caspar::server caspar_server;\r
\r
// Create a dummy client which prints amcp responses to console.\r
auto console_client = std::make_shared<caspar::IO::ConsoleClientInfo>();\r
\r
- boost::thread input_thread([&]\r
+ std::wstring wcmd;\r
+ while(true)\r
{\r
- while(shutdown_event == application_state::running)\r
+ std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
+\r
+ if(wcmd == L"exit" || wcmd == L"q")\r
+ break;\r
+\r
+ // This is just dummy code for testing.\r
+ if(wcmd.substr(0, 1) == L"1")\r
+ wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" SLIDE 100 LOOP \r\nPLAY 1-1";\r
+ else if(wcmd.substr(0, 1) == L"2")\r
+ wcmd = L"MIXER 1-0 VIDEO IS_KEY 1";\r
+ else if(wcmd.substr(0, 1) == L"3")\r
+ wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
+ else if(wcmd.substr(0, 1) == L"4")\r
+ wcmd = L"PLAY 1-1 DV FILTER yadif=1:-1 LOOP";\r
+ else if(wcmd.substr(0, 1) == L"5")\r
{\r
- std::wstring wcmd;\r
- std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
-\r
+ auto file = wcmd.substr(2, wcmd.length()-1);\r
+ wcmd = L"PLAY 1-1 " + file + L" LOOP\r\n" \r
+ L"PLAY 1-2 " + file + L" LOOP\r\n" \r
+ L"PLAY 1-3 " + file + L" LOOP\r\n"\r
+ L"PLAY 2-1 " + file + L" LOOP\r\n" \r
+ L"PLAY 2-2 " + file + L" LOOP\r\n" \r
+ L"PLAY 2-3 " + file + L" LOOP\r\n";\r
+ }\r
+ else if(wcmd.substr(0, 1) == L"X")\r
+ {\r
+ int num = 0;\r
+ std::wstring file;\r
try\r
{\r
- if(wcmd == L"exit" || wcmd == L"q")\r
- {\r
- shutdown_event = application_state::pause_and_shutdown;\r
- shutdown_cond.notify_all();\r
- return;\r
- }\r
-\r
- // This is just dummy code for testing.\r
- if(wcmd.substr(0, 1) == L"1")\r
- wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" SLIDE 100 LOOP \r\nPLAY 1-1";\r
- else if(wcmd.substr(0, 1) == L"2")\r
- wcmd = L"MIXER 1-0 VIDEO IS_KEY 1";\r
- else if(wcmd.substr(0, 1) == L"3")\r
- wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
- else if(wcmd.substr(0, 1) == L"4")\r
- wcmd = L"PLAY 1-1 DV FILTER yadif=1:-1 LOOP";\r
- else if(wcmd.substr(0, 1) == L"5")\r
- {\r
- auto file = wcmd.substr(2, wcmd.length()-1);\r
- wcmd = L"PLAY 1-1 " + file + L" LOOP\r\n" \r
- L"PLAY 1-2 " + file + L" LOOP\r\n" \r
- L"PLAY 1-3 " + file + L" LOOP\r\n"\r
- L"PLAY 2-1 " + file + L" LOOP\r\n" \r
- L"PLAY 2-2 " + file + L" LOOP\r\n" \r
- L"PLAY 2-3 " + file + L" LOOP\r\n";\r
- }\r
- else if(wcmd.substr(0, 1) == L"X")\r
- {\r
- int num = 0;\r
- std::wstring file;\r
- try\r
- {\r
- num = boost::lexical_cast<int>(wcmd.substr(1, 2));\r
- file = wcmd.substr(4, wcmd.length()-1);\r
- }\r
- catch(...)\r
- {\r
- num = boost::lexical_cast<int>(wcmd.substr(1, 1));\r
- file = wcmd.substr(3, wcmd.length()-1);\r
- }\r
-\r
- int n = 0;\r
- int num2 = num;\r
- while(num2 > 0)\r
- {\r
- num2 >>= 1;\r
- n++;\r
- }\r
-\r
- wcmd = L"MIXER 1 GRID " + boost::lexical_cast<std::wstring>(n);\r
-\r
- for(int i = 1; i <= num; ++i)\r
- wcmd += L"\r\nPLAY 1-" + boost::lexical_cast<std::wstring>(i) + L" " + file + L" LOOP";// + L" SLIDE 100 LOOP";\r
- }\r
-\r
- wcmd += L"\r\n";\r
- amcp.Parse(wcmd.c_str(), wcmd.length(), console_client);\r
+ num = boost::lexical_cast<int>(wcmd.substr(1, 2));\r
+ file = wcmd.substr(4, wcmd.length()-1);\r
}\r
catch(...)\r
{\r
- CASPAR_LOG_CURRENT_EXCEPTION();\r
+ num = boost::lexical_cast<int>(wcmd.substr(1, 1));\r
+ file = wcmd.substr(3, wcmd.length()-1);\r
}\r
- }\r
- });\r
\r
- boost::unique_lock<boost::mutex> lock(shutdown_mut);\r
- while(shutdown_event == application_state::running) \r
- shutdown_cond.wait(lock); \r
- } \r
- \r
- Sleep(500); // CAPSAR_LOG is asynchronous. Try to get text in correct order.'\r
+ int n = 0;\r
+ int num2 = num;\r
+ while(num2 > 0)\r
+ {\r
+ num2 >>= 1;\r
+ n++;\r
+ }\r
+\r
+ wcmd = L"MIXER 1 GRID " + boost::lexical_cast<std::wstring>(n);\r
+\r
+ for(int i = 1; i <= num; ++i)\r
+ wcmd += L"\r\nPLAY 1-" + boost::lexical_cast<std::wstring>(i) + L" " + file + L" LOOP";// + L" SLIDE 100 LOOP";\r
+ }\r
\r
- if(shutdown_event == application_state::pause_and_shutdown)\r
- system("pause"); \r
+ wcmd += L"\r\n";\r
+ amcp.Parse(wcmd.c_str(), wcmd.length(), console_client);\r
+ } \r
+ }\r
+ Sleep(500);\r
+ CASPAR_LOG(info) << "Successfully shutdown CasparCG Server.";\r
+ system("pause"); \r
}\r
catch(boost::property_tree::file_parser_error&)\r
{\r
CASPAR_LOG(fatal) << L"Unhandled exception in main thread. Please report this error on the CasparCG forums (www.casparcg.com/forum).";\r
} \r
\r
- CASPAR_LOG(info) << "Successfully shutdown CasparCG Server.";\r
return 0;\r
}
\ No newline at end of file