From 19b33a8558182ce7ab748c764d8f15dd30d5f412 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Mon, 18 May 2020 14:44:25 -0700 Subject: [PATCH] Requests: Add scene transition override requests Adds these requests: - `SetSceneTransitionOverride` - `RemoveSceneTransitionOverride` - `GetSceneTransitionOverride` --- src/WSRequestHandler.cpp | 3 + src/WSRequestHandler.h | 3 + src/WSRequestHandler_Scenes.cpp | 116 ++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+) diff --git a/src/WSRequestHandler.cpp b/src/WSRequestHandler.cpp index 05528676..29d8e652 100644 --- a/src/WSRequestHandler.cpp +++ b/src/WSRequestHandler.cpp @@ -46,6 +46,9 @@ const QHash WSRequestHandler::messageMap { { "SetCurrentScene", &WSRequestHandler::SetCurrentScene }, { "GetCurrentScene", &WSRequestHandler::GetCurrentScene }, { "GetSceneList", &WSRequestHandler::GetSceneList }, + { "SetSceneTransitionOverride", &WSRequestHandler::SetSceneTransitionOverride }, + { "RemoveSceneTransitionOverride", &WSRequestHandler::RemoveSceneTransitionOverride }, + { "GetSceneTransitionOverride", &WSRequestHandler::GetSceneTransitionOverride }, { "SetSourceRender", &WSRequestHandler::SetSceneItemRender }, // Retrocompat { "SetSceneItemRender", &WSRequestHandler::SetSceneItemRender }, diff --git a/src/WSRequestHandler.h b/src/WSRequestHandler.h index e5f6e173..ed7faaed 100644 --- a/src/WSRequestHandler.h +++ b/src/WSRequestHandler.h @@ -64,6 +64,9 @@ class WSRequestHandler { RpcResponse SetCurrentScene(const RpcRequest&); RpcResponse GetCurrentScene(const RpcRequest&); RpcResponse GetSceneList(const RpcRequest&); + RpcResponse SetSceneTransitionOverride(const RpcRequest&); + RpcResponse RemoveSceneTransitionOverride(const RpcRequest&); + RpcResponse GetSceneTransitionOverride(const RpcRequest&); RpcResponse SetSceneItemRender(const RpcRequest&); RpcResponse SetSceneItemPosition(const RpcRequest&); diff --git a/src/WSRequestHandler_Scenes.cpp b/src/WSRequestHandler_Scenes.cpp index 40693a78..ec4f74b0 100644 --- a/src/WSRequestHandler_Scenes.cpp +++ b/src/WSRequestHandler_Scenes.cpp @@ -148,3 +148,119 @@ RpcResponse WSRequestHandler::ReorderSceneItems(const RpcRequest& request) { return request.success(); } + +/** + * Set a scene to use a specific transition override. + * + * @param {String} `sceneName` Name of the scene to switch to. + * @param {String} `transitionName` Name of the transition to use. + * @param {int (Optional)} `transitionDuration` Duration in milliseconds of the transition if transition is not fixed. Defaults 300 if there is no current override and this value is not given. + * + * @api requests + * @name SetSceneTransitionOverride + * @category scenes + * @since 4.9.0 + */ +RpcResponse WSRequestHandler::SetSceneTransitionOverride(const RpcRequest& request) { + if (!request.hasField("sceneName") || !request.hasField("transitionName")) { + return request.failed("missing request parameters"); + } + + QString sceneName = obs_data_get_string(request.parameters(), "sceneName"); + OBSSourceAutoRelease source = obs_get_source_by_name(sceneName.toUtf8()); + if (!source) { + return request.failed("requested scene does not exist"); + } else if (!(obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE)) { + return request.failed("requested scene is invalid"); + } + + QString transitionName = obs_data_get_string(request.parameters(), "transitionName"); + if (!Utils::GetTransitionFromName(transitionName)) { + return request.failed("requested transition does not exist"); + } + + obs_data_t *sourceData = obs_source_get_private_settings(source); + + int transitionDuration = obs_data_get_int(sourceData, "transition_duration"); + if (request.hasField("transitionDuration")) { + transitionDuration = obs_data_get_int(request.parameters(), "transitionDuration"); + } else if (!transitionDuration) { + transitionDuration = 300; + } + + obs_data_set_string(sourceData, "transition", transitionName.toUtf8()); + obs_data_set_int(sourceData, "transition_duration", transitionDuration); + obs_data_release(sourceData); + + return request.success(); +} + +/** + * Remove any transition override on a scene. + * + * @param {String} `sceneName` Name of the scene to switch to. + * + * @api requests + * @name RemoveSceneTransitionOverride + * @category scenes + * @since 4.9.0 + */ +RpcResponse WSRequestHandler::RemoveSceneTransitionOverride(const RpcRequest& request) { + if (!request.hasField("sceneName")) { + return request.failed("missing request parameters"); + } + + QString sceneName = obs_data_get_string(request.parameters(), "sceneName"); + OBSSourceAutoRelease source = obs_get_source_by_name(sceneName.toUtf8()); + if (!source) { + return request.failed("requested scene does not exist"); + } else if (!(obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE)) { + return request.failed("requested scene is invalid"); + } + + obs_data_t *sourceData = obs_source_get_private_settings(source); + obs_data_erase(sourceData, "transition"); + obs_data_erase(sourceData, "transition_duration"); + obs_data_release(sourceData); + + return request.success(); +} + +/** + * Get the current scene transition override. + * + * @param {String} `sceneName` Name of the scene to switch to. + * + * @return {String} `transitionName` Name of the current overriding transition. Empty string if no override is set. + * @return {int} `transitionDuration` Transition duration. `-1` if no override is set. + * + * @api requests + * @name GetSceneTransitionOverride + * @category scenes + * @since 4.9.0 + */ +RpcResponse WSRequestHandler::GetSceneTransitionOverride(const RpcRequest& request) { + if (!request.hasField("sceneName")) { + return request.failed("missing request parameters"); + } + + QString sceneName = obs_data_get_string(request.parameters(), "sceneName"); + OBSSourceAutoRelease source = obs_get_source_by_name(sceneName.toUtf8()); + if (!source) { + return request.failed("requested scene does not exist"); + } else if (!(obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE)) { + return request.failed("requested scene is invalid"); + } + + OBSDataAutoRelease data = obs_data_create(); + obs_data_t *sourceData = obs_source_get_private_settings(source); + obs_data_set_string(data, "transitionName", obs_data_get_string(sourceData, "transition")); + if (!obs_data_get_int(sourceData, "transition_duration")) { + obs_data_set_int(data, "transitionDuration", -1); + } else { + obs_data_set_int(data, "transitionDuration", obs_data_get_int(sourceData, "transition_duration")); + } + obs_data_release(sourceData); + + return request.success(data); +} \ No newline at end of file