From 5748e163f8cdce4b970e497dfa6c85c632dec84f Mon Sep 17 00:00:00 2001 From: Palakis Date: Wed, 19 Apr 2017 15:21:21 +0200 Subject: [PATCH] Added GetPreviewScene and modified GetStudioModeStatus --- PROTOCOL.md | 11 +++++++++-- Utils.cpp | 7 ++++--- Utils.h | 2 +- WSRequestHandler.cpp | 32 +++++++++++++++++++++++++++----- WSRequestHandler.h | 1 + 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/PROTOCOL.md b/PROTOCOL.md index 470b2aeb..da88181a 100644 --- a/PROTOCOL.md +++ b/PROTOCOL.md @@ -348,12 +348,19 @@ __Response__ : OK if source exists in the current scene, error otherwise. --- #### "GetStudioModeStatus" -List OBS' scenes. +Tells if Studio Mode is currently enabled or disabled. __Request fields__ : none __Response__ : always OK, with these additional fields : - **"studio-mode"** (bool) : true if OBS is in Studio Mode, false otherwise. -- **"preview-scene"** (string, optional) : name of the current Previewed scene (present only if Studio Mode is enabled). + +--- + +#### "GetPreviewScene" +Studio Mode only. Gets the name of the currently Previewed scene, along with a list of its sources. + +__Request fields__ : none +__Response__ : OK if Studio Mode is enabled, with the same fields as [`GetCurrentScene`](#getcurrentscene), error otherwise. --- diff --git a/Utils.cpp b/Utils.cpp index 75993608..9ef3fc09 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -299,7 +299,7 @@ void Utils::TogglePreviewMode() GetPreviewModeButtonControl()->click(); } -const char* Utils::GetPreviewSceneName() +obs_scene_t* Utils::GetPreviewScene() { if (IsPreviewModeActive()) { @@ -309,9 +309,10 @@ const char* Utils::GetPreviewSceneName() blog(LOG_INFO, "GetPreviewSceneName: %d selected item(s)", selected.count()); // Qt::UserRole == QtUserRole::OBSRef - obs_source_t* source = obs_scene_get_source(Utils::SceneListItemToScene(selected.first())); + obs_scene_t* scene = Utils::SceneListItemToScene(selected.first()); - return obs_source_get_name(source); + obs_scene_addref(scene); + return scene; } return nullptr; diff --git a/Utils.h b/Utils.h index ecb96359..4f5b10a0 100644 --- a/Utils.h +++ b/Utils.h @@ -55,7 +55,7 @@ class Utils static void DisablePreviewMode(); static void TogglePreviewMode(); - static const char* GetPreviewSceneName(); + static obs_scene_t* GetPreviewScene(); static void SetPreviewScene(const char* name); static void TransitionToProgram(); diff --git a/WSRequestHandler.cpp b/WSRequestHandler.cpp index c12ec262..45365977 100644 --- a/WSRequestHandler.cpp +++ b/WSRequestHandler.cpp @@ -72,6 +72,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) : messageMap["ListProfiles"] = WSRequestHandler::HandleListProfiles; messageMap["GetStudioModeStatus"] = WSRequestHandler::HandleGetStudioModeStatus; + messageMap["GetPreviewScene"] = WSRequestHandler::HandleGetPreviewScene; messageMap["SetPreviewScene"] = WSRequestHandler::HandleSetPreviewScene; messageMap["TransitionToProgram"] = WSRequestHandler::HandleTransitionToProgram; messageMap["EnableStudioMode"] = WSRequestHandler::HandleEnableStudioMode; @@ -760,16 +761,37 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler *owner) obs_data_t* response = obs_data_create(); obs_data_set_bool(response, "studio-mode", previewActive); - if (previewActive) { - const char* currentPreviewScene = Utils::GetPreviewSceneName(); - obs_data_set_string(response, "preview-scene", currentPreviewScene); - } - owner->SendOKResponse(response); obs_data_release(response); } +void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler *owner) +{ + if (!Utils::IsPreviewModeActive()) + { + owner->SendErrorResponse("studio mode not enabled"); + return; + } + + obs_scene_t* preview_scene = Utils::GetPreviewScene(); + obs_source_t* source = obs_scene_get_source(preview_scene); + const char *name = obs_source_get_name(source); + + obs_data_array_t *scene_items = Utils::GetSceneItems(source); + + obs_data_t *data = obs_data_create(); + obs_data_set_string(data, "name", name); + obs_data_set_array(data, "sources", scene_items); + + owner->SendOKResponse(data); + + obs_data_release(data); + obs_data_array_release(scene_items); + + obs_scene_release(preview_scene); +} + void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler *owner) { const char* scene_name = obs_data_get_string(owner->_requestData, "scene-name"); diff --git a/WSRequestHandler.h b/WSRequestHandler.h index f54f43cd..c1c67680 100644 --- a/WSRequestHandler.h +++ b/WSRequestHandler.h @@ -89,6 +89,7 @@ class WSRequestHandler : public QObject static void HandleGetTransitionDuration(WSRequestHandler *owner); static void HandleGetStudioModeStatus(WSRequestHandler *owner); + static void HandleGetPreviewScene(WSRequestHandler *owner); static void HandleSetPreviewScene(WSRequestHandler *owner); static void HandleTransitionToProgram(WSRequestHandler *owner); static void HandleEnableStudioMode(WSRequestHandler *owner);