From 061f5d509950b712787a38042aca7da36f11aef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 12 Mar 2020 17:44:56 +0100 Subject: [PATCH] requests(OpenProjector): get function pointer from lib dynamically --- src/Utils.cpp | 30 ++++++++++++++++++++++++++++-- src/Utils.h | 3 +++ src/WSRequestHandler_General.cpp | 19 +++++++++++-------- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index 687dd0cd..d1f0f254 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -798,8 +798,6 @@ void getPauseRecordingFunctions(RecordingPausedFunction* recPausedFuncPtr, Pause if (pauseRecFuncPtr) { *pauseRecFuncPtr = (PauseRecordingFunction)os_dlsym(frontendApi, "obs_frontend_recording_pause"); } - - os_dlclose(frontendApi); } bool Utils::RecordingPauseSupported() @@ -835,6 +833,34 @@ void Utils::PauseRecording(bool pause) pauseRecording(pause); } +bool Utils::OpenProjectorSupported() +{ + void* frontendApi = os_dlopen("obs-frontend-api"); + if (!frontendApi) { + return false; + } + + void* openProjectorFunc = os_dlsym(frontendApi, "obs_frontend_open_projector"); + return (openProjectorFunc != nullptr); +} + +void Utils::OpenProjector(const char* type, int monitor, const char* geometry, const char* name) +{ + typedef void(*OpenProjectorFunc)(const char*, int monitor, const char* geometry, const char* name); + + void* frontendApi = os_dlopen("obs-frontend-api"); + if (!frontendApi) { + return; + } + + OpenProjectorFunc openProjectorFunc = (OpenProjectorFunc)os_dlsym(frontendApi, "obs_frontend_open_projector"); + if (!openProjectorFunc) { + return; + } + + openProjectorFunc(type, monitor, geometry, name); +} + QString Utils::nsToTimestamp(uint64_t ns) { uint64_t ms = ns / 1000000ULL; diff --git a/src/Utils.h b/src/Utils.h index 4259c2e6..d778a882 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -86,5 +86,8 @@ namespace Utils { bool RecordingPaused(); void PauseRecording(bool pause); + bool OpenProjectorSupported(); + void OpenProjector(const char* type, int monitor, const char* geometry, const char* name); + QString nsToTimestamp(uint64_t ns); }; diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 057b8bae..e1187e5b 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -331,17 +331,20 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * @since unreleased */ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { -#if (LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(24, 0, 4)) - const char *type = obs_data_get_string(request.parameters(), "type"); + if (!Utils::OpenProjectorSupported()) { + return request.failed("Projector opening requires OBS 24.0.4 or newer."); + } + + const char* type = obs_data_get_string(request.parameters(), "type"); + int monitor = -1; if (request.hasField("monitor")) { monitor = obs_data_get_int(request.parameters(), "monitor"); } - const char *geometry = obs_data_get_string(request.parameters(), "geometry"); - const char *name = obs_data_get_string(request.parameters(), "name"); - obs_frontend_open_projector(type, monitor, geometry, name); + + const char* geometry = obs_data_get_string(request.parameters(), "geometry"); + const char* name = obs_data_get_string(request.parameters(), "name"); + + Utils::OpenProjector(type, monitor, geometry, name); return request.success(); -#else - return request.failed("Projector opening requires libobs v24.0.4 or newer."); -#endif }