X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=shell%2Fmain.cpp;h=b90bd40018219abba98dc17097a27fa220b08756;hb=c058dd1371028638afdfcba3cdabd25b8ec4ad35;hp=ffac2a4cded2060ec96880f06b2942e9099070fc;hpb=a5fffddd70ab601c8584fddec564b52c734f9bab;p=casparcg diff --git a/shell/main.cpp b/shell/main.cpp index ffac2a4cd..b90bd4001 100644 --- a/shell/main.cpp +++ b/shell/main.cpp @@ -19,9 +19,9 @@ * Author: Robert Nagy, ronag89@gmail.com */ -// tbbmalloc_proxy: -// Replace the standard memory allocation routines in Microsoft* C/C++ RTL -// (malloc/free, global new/delete, etc.) with the TBB memory allocator. +// tbbmalloc_proxy: +// Replace the standard memory allocation routines in Microsoft* C/C++ RTL +// (malloc/free, global new/delete, etc.) with the TBB memory allocator. #include "stdafx.h" @@ -61,21 +61,28 @@ #include #include #include +#include +#include #include #include +#include #include +#include using namespace caspar; - + void setup_global_locale() { boost::locale::generator gen; gen.categories(boost::locale::codepage_facet); std::locale::global(gen("")); + + // sscanf is used in for example FFmpeg where we want decimals to be parsed as . + std::setlocale(LC_ALL, "C"); } void print_info() @@ -107,15 +114,16 @@ void do_run( std::promise& shutdown_server_now, tbb::atomic& should_wait_for_keypress) { + ensure_gpf_handler_installed_for_thread("Console thread"); std::wstring wcmd; while(true) { - std::getline(std::wcin, wcmd); // TODO: It's blocking... - - //boost::to_upper(wcmd); + if (!std::getline(std::wcin, wcmd)) // TODO: It's blocking... + wcmd = L"EXIT"; // EOF, handle as EXIT if(boost::iequals(wcmd, L"EXIT") || boost::iequals(wcmd, L"Q") || boost::iequals(wcmd, L"QUIT") || boost::iequals(wcmd, L"BYE")) { + CASPAR_LOG(info) << L"Received message from Console: " << wcmd << L"\\r\\n"; should_wait_for_keypress = true; shutdown_server_now.set_value(false); //false to not restart break; @@ -135,11 +143,11 @@ void do_run( else if(wcmd.substr(0, 1) == L"5") { auto file = wcmd.substr(2, wcmd.length()-1); - wcmd = L"PLAY 1-1 " + file + L" LOOP\r\n" - L"PLAY 1-2 " + file + L" LOOP\r\n" + wcmd = L"PLAY 1-1 " + file + L" LOOP\r\n" + L"PLAY 1-2 " + file + L" LOOP\r\n" L"PLAY 1-3 " + file + L" LOOP\r\n" - L"PLAY 2-1 " + file + L" LOOP\r\n" - L"PLAY 2-2 " + file + L" LOOP\r\n" + L"PLAY 2-1 " + file + L" LOOP\r\n" + L"PLAY 2-2 " + file + L" LOOP\r\n" L"PLAY 2-3 " + file + L" LOOP\r\n"; } else if(wcmd.substr(0, 1) == L"7") @@ -213,6 +221,9 @@ bool run(const std::wstring& config_file_name, tbb::atomic& should_wait_fo // Create server object which initializes channels, protocols and controllers. std::unique_ptr caspar_server(new server(shutdown_server_now)); + // For example CEF resets the global locale, so this is to reset it back to "our" preference. + setup_global_locale(); + // Print environment information. print_system_info(caspar_server->get_system_info_provider_repo()); @@ -220,7 +231,7 @@ bool run(const std::wstring& config_file_name, tbb::atomic& should_wait_fo boost::property_tree::xml_writer_settings w(' ', 3); boost::property_tree::write_xml(str, env::properties(), w); CASPAR_LOG(info) << config_file_name << L":\n-----------------------------------------\n" << str.str() << L"-----------------------------------------"; - + { CASPAR_SCOPED_CONTEXT_MSG(config_file_name + L": ") caspar_server->start(); @@ -238,7 +249,7 @@ bool run(const std::wstring& config_file_name, tbb::atomic& should_wait_fo caspar_server->get_amcp_command_repository())))->create(console_client); std::weak_ptr> weak_amcp = amcp; - // Use separate thread for the blocking console input, will be terminated + // Use separate thread for the blocking console input, will be terminated // anyway when the main thread terminates. boost::thread stdin_thread(std::bind(do_run, weak_amcp, std::ref(shutdown_server_now), std::ref(should_wait_for_keypress))); //compiler didn't like lambda here... stdin_thread.detach(); @@ -267,7 +278,7 @@ int main(int argc, char** argv) setup_global_locale(); std::wcout << L"Type \"q\" to close application." << std::endl; - + // Set debug mode. auto debugging_environment = setup_debugging_environment(); @@ -289,8 +300,8 @@ int main(int argc, char** argv) tbb::task_scheduler_init init; std::wstring config_file_name(L"casparcg.config"); - - try + + try { // Configure environment properties from configuration. if (argc >= 2) @@ -299,14 +310,23 @@ int main(int argc, char** argv) env::configure(config_file_name); log::set_log_level(env::properties().get(L"configuration.log-level", L"info")); + auto log_categories_str = env::properties().get(L"configuration.log-categories", L"communication"); + std::set log_categories; + boost::split(log_categories, log_categories_str, boost::is_any_of(L", ")); + for (auto& log_category : { L"calltrace", L"communication" }) + log::set_log_category(log_category, log_categories.find(log_category) != log_categories.end()); if (env::properties().get(L"configuration.debugging.remote", false)) wait_for_remote_debugging(); // Start logging to file. - log::add_file_sink(env::log_folder()); + log::add_file_sink(env::log_folder() + L"caspar", caspar::log::category != caspar::log::log_category::calltrace); + log::add_file_sink(env::log_folder() + L"calltrace", caspar::log::category == caspar::log::log_category::calltrace); std::wcout << L"Logging [info] or higher severity to " << env::log_folder() << std::endl << std::endl; - + + // Once logging to file, log configuration warnings. + env::log_configuration_warnings(); + // Setup console window. setup_console_window(); @@ -320,22 +340,20 @@ int main(int argc, char** argv) if (thread->name != "main thread" && thread->name != "tbb-worker-thread") CASPAR_LOG(warning) << L"Thread left running: " << thread->name << L" (" << thread->native_id << L")"; } - + CASPAR_LOG(info) << "Successfully shutdown CasparCG Server."; - if (!should_wait_for_keypress) + if (should_wait_for_keypress) wait_for_keypress(); } catch(const boost::property_tree::file_parser_error& e) { - CASPAR_LOG_CURRENT_EXCEPTION(); CASPAR_LOG(fatal) << "At " << u8(config_file_name) << ":" << e.line() << ": " << e.message() << ". Please check the configuration file (" << u8(config_file_name) << ") for errors."; wait_for_keypress(); } catch (const user_error& e) { - CASPAR_LOG_CURRENT_EXCEPTION_AT_LEVEL(debug); - CASPAR_LOG(fatal) << get_message_and_context(e) << " Please check the configuration file (" << u8(config_file_name) << ") for errors. Turn on log level debug for stacktrace."; + CASPAR_LOG(fatal) << get_message_and_context(e) << " Please check the configuration file (" << u8(config_file_name) << ") for errors."; wait_for_keypress(); } catch(...)