Requests: Add scene transition override requests

Adds these requests:
- `SetSceneTransitionOverride`
- `RemoveSceneTransitionOverride`
- `GetSceneTransitionOverride`
This commit is contained in:
tt2468 2020-05-18 14:44:25 -07:00
parent 590943ed95
commit 19b33a8558
3 changed files with 122 additions and 0 deletions

View File

@ -46,6 +46,9 @@ const QHash<QString, RpcMethodHandler> 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 },

View File

@ -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&);

View File

@ -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);
}