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