diff --git a/libobs/obs-windows.c b/libobs/obs-windows.c index 562132457..fba37227c 100644 --- a/libobs/obs-windows.c +++ b/libobs/obs-windows.c @@ -26,7 +26,7 @@ static inline bool check_path(const char* data, const char *path, dstr_copy(output, path); dstr_cat(output, data); - blog(LOG_INFO, "Attempting path: %s\n", output->array); + blog(LOG_DEBUG, "Attempting path: %s\n", output->array); return os_file_exists(output->array); } diff --git a/libobs/util/base.c b/libobs/util/base.c index 5c91cf9ef..2939f35a4 100644 --- a/libobs/util/base.c +++ b/libobs/util/base.c @@ -27,10 +27,12 @@ static int log_output_level = LOG_DEBUG; static int log_output_level = LOG_INFO; #endif -static int crashing = 0; +static int crashing = 0; +static void *log_param = NULL; +static void *crash_param = NULL; static void def_log_handler(int log_level, const char *format, - va_list args) + va_list args, void *param) { char out[4096]; vsnprintf(out, sizeof(out), format, args); @@ -57,6 +59,8 @@ static void def_log_handler(int log_level, const char *format, fflush(stderr); } } + + UNUSED_PARAMETER(param); } #ifdef _MSC_VER @@ -65,24 +69,35 @@ static void def_log_handler(int log_level, const char *format, #define NORETURN __attribute__((noreturn)) #endif -NORETURN static void def_crash_handler(const char *format, va_list args) +NORETURN static void def_crash_handler(const char *format, va_list args, + void *param) { vfprintf(stderr, format, args); exit(0); + + UNUSED_PARAMETER(param); } -static void (*log_handler)(int log_level, const char *, va_list) = +static void (*log_handler)(int log_level, const char *, va_list, void *) = def_log_handler; -static void (*crash_handler)(const char *, va_list) = def_crash_handler; +static void (*crash_handler)(const char *, va_list, void *) = def_crash_handler; void base_set_log_handler( - void (*handler)(int log_level, const char *, va_list)) + void (*handler)(int log_level, const char *, va_list, void *), + void *param) { + if (!handler) + handler = def_log_handler; + + log_param = param; log_handler = handler; } -void base_set_crash_handler(void (*handler)(const char *, va_list)) +void base_set_crash_handler( + void (*handler)(const char *, va_list, void *), + void *param) { + crash_param = param; crash_handler = handler; } @@ -97,13 +112,13 @@ void bcrash(const char *format, ...) crashing = 1; va_start(args, format); - crash_handler(format, args); + crash_handler(format, args, crash_param); va_end(args); } void blogva(int log_level, const char *format, va_list args) { - log_handler(log_level, format, args); + log_handler(log_level, format, args, log_param); } void blog(int log_level, const char *format, ...) @@ -111,6 +126,6 @@ void blog(int log_level, const char *format, ...) va_list args; va_start(args, format); - log_handler(log_level, format, args); + blogva(log_level, format, args); va_end(args); } diff --git a/libobs/util/base.h b/libobs/util/base.h index a3986bea2..5d84f7ad9 100644 --- a/libobs/util/base.h +++ b/libobs/util/base.h @@ -59,8 +59,11 @@ enum { }; EXPORT void base_set_log_handler( - void (*handler)(int log_level, const char *, va_list)); -EXPORT void base_set_crash_handler(void (*handler)(const char *, va_list)); + void (*handler)(int log_level, const char *, va_list, void *), + void *param); +EXPORT void base_set_crash_handler( + void (*handler)(const char *, va_list, void *), + void *param); EXPORT void blogva(int log_level, const char *format, va_list args); diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index 8ea5f58b4..456a3f73f 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -29,29 +29,29 @@ #include "platform.hpp" #ifdef _WIN32 +#include #include #endif using namespace std; -static void do_log(int log_level, const char *msg, va_list args) -{ #ifdef _WIN32 +static void do_log(int log_level, const char *msg, va_list args, void *param) +{ + fstream &logFile = *static_cast(param); char bla[4096]; vsnprintf(bla, 4095, msg, args); OutputDebugStringA(bla); OutputDebugStringA("\n"); + if (log_level <= LOG_INFO) + logFile << bla << endl; + if (log_level <= LOG_ERROR && IsDebuggerPresent()) __debugbreak(); -#else - vprintf(msg, args); - printf("\n"); - - UNUSED_PARAMETER(log_level); -#endif } +#endif bool OBSApp::InitGlobalConfigDefaults() { @@ -220,7 +220,15 @@ int main(int argc, char *argv[]) int ret = -1; QCoreApplication::addLibraryPath("."); #ifdef _WIN32 - base_set_log_handler(do_log); + char *logPath = os_get_config_path("obs-studio/log.txt"); + fstream logFile; + + logFile.open(logPath, ios_base::in | ios_base::out | ios_base::trunc, + _SH_DENYNO); + bfree(logPath); + + if (logFile.is_open()) + base_set_log_handler(do_log, &logFile); #endif try { @@ -234,5 +242,6 @@ int main(int argc, char *argv[]) } blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs()); + base_set_log_handler(nullptr, nullptr); return ret; } diff --git a/test/win/test.cpp b/test/win/test.cpp index 589bb94b4..25a04998e 100644 --- a/test/win/test.cpp +++ b/test/win/test.cpp @@ -51,7 +51,7 @@ static LRESULT CALLBACK sceneProc(HWND hwnd, UINT message, WPARAM wParam, return 0; } -static void do_log(int log_level, const char *msg, va_list args) +static void do_log(int log_level, const char *msg, va_list args, void *param) { char bla[4096]; vsnprintf(bla, 4095, msg, args); @@ -61,6 +61,8 @@ static void do_log(int log_level, const char *msg, va_list args) if (log_level <= LOG_WARNING) __debugbreak(); + + UNUSED_PARAMETER(param); } static void CreateOBS(HWND hwnd) @@ -122,7 +124,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, int numCmd) { HWND hwnd = NULL; - base_set_log_handler(do_log); + base_set_log_handler(do_log, nullptr); try { hwnd = CreateTestWindow(instance);