]> git.sesse.net Git - casparcg/commitdiff
2.0.2: console and diagnostics windows are closable.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 13 Nov 2011 19:48:32 +0000 (19:48 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 13 Nov 2011 19:48:32 +0000 (19:48 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.2@1566 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/diagnostics/graph.cpp
modules/decklink/interop/DeckLinkAPI_h.h
modules/decklink/interop/DeckLinkAPI_i.c
shell/main.cpp

index 0b4348e0bba706d3d4e389dccbf8b6eb721357cc..93ca5383e1914d7c7c01d4656893d64c5d34284c 100644 (file)
@@ -112,7 +112,14 @@ private:
                        return;\r
 \r
                sf::Event e;\r
-               while(window_->GetEvent(e)){}           \r
+               while(window_->GetEvent(e))\r
+               {\r
+                       if(e.Type == sf::Event::Closed)\r
+                       {\r
+                               window_.reset();\r
+                               return;\r
+                       }\r
+               }               \r
                glClear(GL_COLOR_BUFFER_BIT);\r
                window_->Draw(*this);\r
                window_->Display();\r
index 1d16472144aa12c7d029d22a32790712a232b193..4d0524e5a10cc9035307c3b5cf9e6ac85a2292e2 100644 (file)
@@ -4,7 +4,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Fri Nov 11 23:52:26 2011\r
+/* at Sun Nov 13 20:29:25 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index ae524ec3b478634dc97faea70d3d15efaca29916..2d1ed95f296468e674d05765cdbe076cfce2649d 100644 (file)
@@ -6,7 +6,7 @@
 \r
 \r
  /* File created by MIDL compiler version 7.00.0555 */\r
-/* at Fri Nov 11 23:52:26 2011\r
+/* at Sun Nov 13 20:29:25 2011\r
  */\r
 /* Compiler settings for interop\DeckLinkAPI.idl:\r
     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 \r
index caa1b27a2deaf4c7b0e0172bc41f88a290348c9c..c55cd572f61b0298d375a5483ba7c35e084bd847 100644 (file)
 \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
@@ -79,13 +93,27 @@ void change_icon( const HICON hNewIcon )
    ::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
+       //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
@@ -235,68 +263,91 @@ int main(int argc, wchar_t* argv[])
                        caspar::protocol::amcp::AMCPProtocolStrategy amcp(caspar_server.get_channels());\r
 \r
                        // Create a dummy client which prints amcp responses to console.\r
-                       auto dummy = std::make_shared<caspar::IO::ConsoleClientInfo>();\r
+                       auto console_client = std::make_shared<caspar::IO::ConsoleClientInfo>();\r
 \r
-                       bool is_running = true;\r
-                       while(is_running)\r
+                       boost::thread input_thread([&]\r
                        {\r
-                               std::wstring wcmd;\r
-                               std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
-\r
-                               is_running = wcmd != L"exit" && wcmd != L"q";\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
+                               while(shutdown_event == application_state::running)\r
                                {\r
-                                       int num = 0;\r
-                                       std::wstring file;\r
+                                       std::wstring wcmd;\r
+                                       std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
+\r
                                        try\r
                                        {\r
-                                               num = boost::lexical_cast<int>(wcmd.substr(1, 2));\r
-                                               file = wcmd.substr(4, wcmd.length()-1);\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
                                        }\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
+                                               CASPAR_LOG_CURRENT_EXCEPTION();\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
 \r
-                               wcmd += L"\r\n";\r
-                               amcp.Parse(wcmd.c_str(), wcmd.length(), dummy);\r
-                       }\r
-               }\r
-               Sleep(200); // CAPSAR_LOG is asynchronous. Try to get text in correct order.\r
-               system("pause");\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(200); // CAPSAR_LOG is asynchronous. Try to get text in correct order.'\r
+\r
+               if(shutdown_event == application_state::pause_and_shutdown)\r
+                       system("pause");        \r
        }\r
        catch(boost::property_tree::file_parser_error&)\r
        {\r