From d8f2aeb0046ec4537522bbd8bb6e991de043b27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 12 Mar 2020 17:03:00 +0100 Subject: [PATCH 1/4] requests(OpenProjector): refactor libobs version check --- src/WSRequestHandler_General.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index 686f56bb..dbf9b9ab 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -331,7 +331,7 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * @since unreleased */ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { -#if LIBOBS_API_VER >= 0x18000004 +#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(24, 0, 4) const char *type = obs_data_get_string(request.parameters(), "type"); int monitor = -1; if (request.hasField("monitor")) { From 010102da2523c2f8306647b05247b81a499dfda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 12 Mar 2020 17:06:09 +0100 Subject: [PATCH 2/4] ci(linux): download frontend API headers from stable --- CI/install-dependencies-xenial.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CI/install-dependencies-xenial.sh b/CI/install-dependencies-xenial.sh index bd9dd03d..aa5390ab 100755 --- a/CI/install-dependencies-xenial.sh +++ b/CI/install-dependencies-xenial.sh @@ -14,6 +14,6 @@ apt-get install -y \ qtbase5-dev # Dirty hack -wget -O /usr/include/obs/obs-frontend-api.h https://raw.githubusercontent.com/obsproject/obs-studio/master/UI/obs-frontend-api/obs-frontend-api.h +wget -O /usr/include/obs/obs-frontend-api.h https://raw.githubusercontent.com/obsproject/obs-studio/24.0.3/UI/obs-frontend-api/obs-frontend-api.h ldconfig From 796bdebd90819c54c3eeb01132c4da189e4323db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Thu, 12 Mar 2020 17:27:28 +0100 Subject: [PATCH 3/4] requests(OpenProjector): wrap version check with parentheses --- src/WSRequestHandler_General.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WSRequestHandler_General.cpp b/src/WSRequestHandler_General.cpp index dbf9b9ab..057b8bae 100644 --- a/src/WSRequestHandler_General.cpp +++ b/src/WSRequestHandler_General.cpp @@ -331,7 +331,7 @@ RpcResponse WSRequestHandler::GetVideoInfo(const RpcRequest& request) { * @since unreleased */ RpcResponse WSRequestHandler::OpenProjector(const RpcRequest& request) { -#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(24, 0, 4) +#if (LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(24, 0, 4)) const char *type = obs_data_get_string(request.parameters(), "type"); int monitor = -1; if (request.hasField("monitor")) { 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 4/4] 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 }