From 6635611d545269efb78e1c3ce92144a479090af9 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:28:35 -0800 Subject: [PATCH 01/19] utils: Handle json::null types when converting to obs_data_t Commit obsproject/obs-studio@a4f3c16 implemented this upstream, so since obs-websocket follows that util file, we should do the same. --- src/utils/Json.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/utils/Json.cpp b/src/utils/Json.cpp index 923020a4..d292f8ae 100644 --- a/src/utils/Json.cpp +++ b/src/utils/Json.cpp @@ -75,6 +75,8 @@ void obs_data_set_json_object_item(obs_data_t *d, json j) obs_data_set_double(d, key.c_str(), value.get()); } else if (value.is_boolean()) { obs_data_set_bool(d, key.c_str(), value.get()); + } else if (value.is_null()) { + obs_data_set_obj(d, key.c_str(), NULL); } } } From ae7b278f426e2ddf29af9a9bd572e61f0ffd7138 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:29:59 -0800 Subject: [PATCH 02/19] requesthandler: Fix unused-parameter build error from GetCanvasList --- src/requesthandler/RequestHandler_Canvases.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index 26d545a6..93a1bd0b 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -31,7 +31,7 @@ with this program. If not, see * @api requests * @category canvas */ -RequestResult RequestHandler::GetCanvasList(const Request &request) +RequestResult RequestHandler::GetCanvasList(const Request &) { json responseData; std::vector ret; From bf2f7206ce160bf7addb9ccd8df72bc5b372ac18 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:45:04 -0800 Subject: [PATCH 03/19] utils: Add Utils::Obs::ObjectHelper::GetCanvasVideoSettings() --- src/utils/Obs.h | 1 + src/utils/Obs_ObjectHelper.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/utils/Obs.h b/src/utils/Obs.h index 86991032..8da7ba78 100644 --- a/src/utils/Obs.h +++ b/src/utils/Obs.h @@ -268,6 +268,7 @@ namespace Utils { namespace ObjectHelper { json GetStats(); json GetSceneItemTransform(obs_sceneitem_t *item); + json GetCanvasVideoSettings(obs_canvas_t *canvas); } namespace SearchHelper { diff --git a/src/utils/Obs_ObjectHelper.cpp b/src/utils/Obs_ObjectHelper.cpp index 10f207e5..524b4991 100644 --- a/src/utils/Obs_ObjectHelper.cpp +++ b/src/utils/Obs_ObjectHelper.cpp @@ -87,3 +87,27 @@ json Utils::Obs::ObjectHelper::GetSceneItemTransform(obs_sceneitem_t *item) return ret; } + +json Utils::Obs::ObjectHelper::GetCanvasVideoSettings(obs_canvas_t *canvas) +{ + json ret; + + struct obs_video_info ovi; + if (canvas && obs_canvas_get_video_info(canvas, &ovi)) { + ret["fpsNumerator"] = ovi.fps_num; + ret["fpsDenominator"] = ovi.fps_den; + ret["baseWidth"] = ovi.base_width; + ret["baseHeight"] = ovi.base_height; + ret["outputWidth"] = ovi.output_width; + ret["outputHeight"] = ovi.output_height; + } else { + ret["fpsNumerator"] = nullptr; + ret["fpsDenominator"] = nullptr; + ret["baseWidth"] = nullptr; + ret["baseHeight"] = nullptr; + ret["outputWidth"] = nullptr; + ret["outputHeight"] = nullptr; + } + + return ret; +} From fda36b7662e479646b0f4f192e25744a641f5c6a Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:46:06 -0800 Subject: [PATCH 04/19] requesthandler: Use GetCanvasVideoSettings util for GetCanvasList --- src/requesthandler/RequestHandler_Canvases.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index 93a1bd0b..4911d5f5 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -43,15 +43,7 @@ RequestResult RequestHandler::GetCanvasList(const Request &) canvasJson["canvasName"] = obs_canvas_get_name(canvas); canvasJson["canvasUuid"] = obs_canvas_get_uuid(canvas); canvasJson["flags"] = obs_canvas_get_flags(canvas); - struct obs_video_info ovi; - if (obs_canvas_get_video_info(canvas, &ovi)) { - canvasJson["fpsNumerator"] = ovi.fps_num; - canvasJson["fpsDenominator"] = ovi.fps_den; - canvasJson["baseWidth"] = ovi.base_width; - canvasJson["baseHeight"] = ovi.base_height; - canvasJson["outputWidth"] = ovi.output_width; - canvasJson["outputHeight"] = ovi.output_height; - } + canvasJson["canvasVideoSettings"] = Utils::Obs::ObjectHelper::GetCanvasVideoSettings(canvas); ret->push_back(canvasJson); return true; }, From 2270da3ebca4749590c87871f20473af1ff3745e Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:48:08 -0800 Subject: [PATCH 05/19] requesthandler: Convert GetVideoSettings to use GetCanvasVideoSettings This is a slight behavior change, in that in the event of undefined video info for the main canvas, it will no longer throw an error, and will instead return values as `null`. This, however, brings the behavior in-line with the GetCanvasList, so I see that as preferred. --- src/requesthandler/RequestHandler_Config.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/requesthandler/RequestHandler_Config.cpp b/src/requesthandler/RequestHandler_Config.cpp index e6f21b9c..c97eb512 100644 --- a/src/requesthandler/RequestHandler_Config.cpp +++ b/src/requesthandler/RequestHandler_Config.cpp @@ -440,17 +440,11 @@ RequestResult RequestHandler::SetProfileParameter(const Request &request) */ RequestResult RequestHandler::GetVideoSettings(const Request &) { - struct obs_video_info ovi; - if (!obs_get_video_info(&ovi)) - return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to get internal OBS video info."); + OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); + if (!mainCanvas) + return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to get internal main OBS canvas."); - json responseData; - responseData["fpsNumerator"] = ovi.fps_num; - responseData["fpsDenominator"] = ovi.fps_den; - responseData["baseWidth"] = ovi.base_width; - responseData["baseHeight"] = ovi.base_height; - responseData["outputWidth"] = ovi.output_width; - responseData["outputHeight"] = ovi.output_height; + json responseData = Utils::Obs::ObjectHelper::GetCanvasVideoSettings(mainCanvas); return RequestResult::Success(responseData); } From f25c9ce4b4fcea398343714e71bedeab7e216c2e Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 16:00:15 -0800 Subject: [PATCH 06/19] docs: Small nitpicks to GetCanvasList documentation --- src/requesthandler/RequestHandler_Canvases.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index 4911d5f5..de9008d1 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -22,10 +22,10 @@ with this program. If not, see /** * Gets an array of canvases in OBS. * - * @responseField canvases | Array | Array of canvases + * @responseField canvases | Array | Array of canvases * * @requestType GetCanvasList - * @complexity 2 + * @complexity 3 * @rpcVersion -1 * @initialVersion 5.7.0 * @api requests From fc1524ae9d54595e050fd6528b090ccc20a34322 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 15:58:02 -0800 Subject: [PATCH 07/19] requesthandler: Use object of bools for canvas flags Uses an object of individual boolean values rather than the raw bitflag that libobs uses internally. This is much easier for users to grasp without needing to look up source code. --- .../RequestHandler_Canvases.cpp | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index de9008d1..e08ce58a 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -34,21 +34,31 @@ with this program. If not, see RequestResult RequestHandler::GetCanvasList(const Request &) { json responseData; - std::vector ret; + std::vector canvases; obs_enum_canvases( [](void *param, obs_canvas_t *canvas) { - auto ret = static_cast *>(param); + auto canvases = static_cast *>(param); + json canvasJson; canvasJson["canvasName"] = obs_canvas_get_name(canvas); canvasJson["canvasUuid"] = obs_canvas_get_uuid(canvas); - canvasJson["flags"] = obs_canvas_get_flags(canvas); + + auto flags = obs_canvas_get_flags(canvas); + json canvasFlags; + canvasFlags["MAIN"] = !!(flags & MAIN); + canvasFlags["ACTIVATE"] = !!(flags & ACTIVATE); + canvasFlags["MIX_AUDIO"] = !!(flags & MIX_AUDIO); + canvasFlags["SCENE_REF"] = !!(flags & SCENE_REF); + canvasFlags["EPHEMERAL"] = !!(flags & EPHEMERAL); + canvasJson["canvasFlags"] = canvasFlags; + canvasJson["canvasVideoSettings"] = Utils::Obs::ObjectHelper::GetCanvasVideoSettings(canvas); - ret->push_back(canvasJson); + canvases->push_back(canvasJson); return true; }, - &ret); - responseData["canvases"] = ret; + &canvases); + responseData["canvases"] = canvases; return RequestResult::Success(responseData); } From c1cce55d93d33a109111fa404cc71addc7a7f86a Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 25 Feb 2026 16:03:34 -0800 Subject: [PATCH 08/19] docs: Small nitpick, pluralize Canvases Co-authored-by: Warchamp7 --- docs/docs/generate_md.py | 2 +- src/eventhandler/EventHandler_Canvases.cpp | 6 +++--- src/requesthandler/RequestHandler_Canvases.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/generate_md.py b/docs/docs/generate_md.py index fc1db33a..34c5b78a 100644 --- a/docs/docs/generate_md.py +++ b/docs/docs/generate_md.py @@ -18,7 +18,7 @@ 'General', 'Config', 'Sources', - 'Canvas', + 'Canvases', 'Scenes', 'Inputs', 'Transitions', diff --git a/src/eventhandler/EventHandler_Canvases.cpp b/src/eventhandler/EventHandler_Canvases.cpp index 6151e74e..188fb3b5 100644 --- a/src/eventhandler/EventHandler_Canvases.cpp +++ b/src/eventhandler/EventHandler_Canvases.cpp @@ -31,7 +31,7 @@ with this program. If not, see * @rpcVersion -1 * @initialVersion 5.7.0 * @api events - * @category canvas + * @category canvases */ void EventHandler::HandleCanvasCreated(obs_canvas_t *canvas) { @@ -53,7 +53,7 @@ void EventHandler::HandleCanvasCreated(obs_canvas_t *canvas) * @rpcVersion -1 * @initialVersion 5.7.0 * @api events - * @category canvas + * @category canvases */ void EventHandler::HandleCanvasRemoved(obs_canvas_t *canvas) { @@ -76,7 +76,7 @@ void EventHandler::HandleCanvasRemoved(obs_canvas_t *canvas) * @rpcVersion -1 * @initialVersion 5.7.0 * @api events - * @category canvas + * @category canvases */ void EventHandler::HandleCanvasNameChanged(obs_canvas_t *canvas, std::string oldCanvasName, std::string canvasName) { diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index e08ce58a..532f3510 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -29,7 +29,7 @@ with this program. If not, see * @rpcVersion -1 * @initialVersion 5.7.0 * @api requests - * @category canvas + * @category canvases */ RequestResult RequestHandler::GetCanvasList(const Request &) { From d949f5f322e21773ec757b1ecb7979331ad4d97a Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:10:20 -0500 Subject: [PATCH 09/19] requesthandler: Remove canvasName in requests, small perf improvement Attempt to resolve sourceUuid first, now that it is the recommended approach to resolving a source. Then, try via canvas. This makes the uuid code path much faster. The stacked logic of being able to pass a name or uuid for both canvases AND sources was just too much, and so if people want to pass a canvas, they'll need to just suck it up and use UUIDs --- src/requesthandler/RequestHandler_Filters.cpp | 28 +++---- src/requesthandler/RequestHandler_Inputs.cpp | 3 +- .../RequestHandler_SceneItems.cpp | 57 +++++-------- src/requesthandler/RequestHandler_Scenes.cpp | 21 ++--- src/requesthandler/RequestHandler_Sources.cpp | 19 ++--- src/requesthandler/RequestHandler_Ui.cpp | 5 +- src/requesthandler/rpc/Request.cpp | 79 ++++++++----------- src/requesthandler/rpc/Request.h | 10 +-- 8 files changed, 88 insertions(+), 134 deletions(-) diff --git a/src/requesthandler/RequestHandler_Filters.cpp b/src/requesthandler/RequestHandler_Filters.cpp index 59d7d9aa..8061e0b0 100644 --- a/src/requesthandler/RequestHandler_Filters.cpp +++ b/src/requesthandler/RequestHandler_Filters.cpp @@ -43,8 +43,7 @@ RequestResult RequestHandler::GetSourceFilterKindList(const Request &) /** * Gets an array of all of a source's filters. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source * @requestField ?sourceUuid | String | UUID of the source * @@ -61,7 +60,7 @@ RequestResult RequestHandler::GetSourceFilterList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -109,8 +108,7 @@ RequestResult RequestHandler::GetSourceFilterDefaultSettings(const Request &requ /** * Creates a new filter, adding it to the specified source. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source to add the filter to * @requestField ?sourceUuid | String | UUID of the source to add the filter to * @requestField filterName | String | Name of the new filter to be created @@ -129,7 +127,7 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("filterName", statusCode, comment) && request.ValidateString("filterKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -165,8 +163,7 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request) /** * Removes a filter from a source. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter to remove @@ -194,8 +191,7 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request) /** * Sets the name of a source filter (rename). * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Current name of the filter @@ -230,8 +226,7 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request) /** * Gets the info for a specific source filter. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source * @requestField ?sourceUuid | String | UUID of the source * @requestField filterName | String | Name of the filter @@ -272,8 +267,7 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request) /** * Sets the index position of a filter on a source. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter @@ -304,8 +298,7 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request) /** * Sets the settings of a source filter. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter to set the settings of @@ -355,8 +348,7 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request) /** * Sets the enable state of a source filter. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source the filter is on * @requestField ?sourceUuid | String | UUID of the source the filter is on * @requestField filterName | String | Name of the filter diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index 38fc7f79..cfb45526 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -123,8 +123,7 @@ RequestResult RequestHandler::GetSpecialInputs(const Request &) /** * Creates a new input, adding it as a scene item to the specified scene. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to add the input to as a scene item * @requestField ?sceneUuid | String | UUID of the scene to add the input to as a scene item * @requestField inputName | String | Name of the new input to created diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index d39faded..f904f7ba 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -24,8 +24,7 @@ with this program. If not, see * * Scenes only * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to get the items of * @requestField ?sceneUuid | String | UUID of the scene to get the items of * @@ -59,8 +58,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request) * * Groups only * - * @requestField ?canvasName | String | Name of the canvas the group is in - * @requestField ?canvasUuid | String | UUID of the canvas the group is in + * @requestField ?canvasUuid | String | UUID of the canvas the group is in, if using the sceneName field * @requestField ?sceneName | String | Name of the group to get the items of * @requestField ?sceneUuid | String | UUID of the group to get the items of * @@ -92,8 +90,7 @@ RequestResult RequestHandler::GetGroupSceneItemList(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene or group is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene or group is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene or group is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene or group to search in * @requestField ?sceneUuid | String | UUID of the scene or group to search in * @requestField sourceName | String | Name of the source to find @@ -139,8 +136,7 @@ RequestResult RequestHandler::GetSceneItemId(const Request &request) /** * Gets the source associated with a scene item. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -177,8 +173,7 @@ RequestResult RequestHandler::GetSceneItemSource(const Request &request) * * Scenes only * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to create the new item in * @requestField ?sceneUuid | String | UUID of the scene to create the new item in * @requestField ?sourceName | String | Name of the source to add to the scene @@ -204,7 +199,7 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request) OBSScene scene = obs_scene_from_source(sceneSource); - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -233,8 +228,7 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request) * * Scenes only * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -265,8 +259,7 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request) * * Scenes only * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -293,8 +286,8 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request) // Get destination scene obs_scene_t *destinationScene; if (request.Contains("destinationSceneName")) { - OBSSourceAutoRelease destinationSceneSource = - request.ValidateSource("destinationSceneName", "destinationSceneUuid", statusCode, comment); + OBSSourceAutoRelease destinationSceneSource = request.ValidateSource( + "destinationCanvasUuid", "destinationSceneName", "destinationSceneUuid", statusCode, comment); if (!destinationSceneSource) return RequestResult::Error(statusCode, comment); @@ -344,8 +337,7 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -377,8 +369,7 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request &request) /** * Sets the transform and crop info of a scene item. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -544,8 +535,7 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -579,8 +569,7 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -614,8 +603,7 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -649,8 +637,7 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request &request) * * Scenes and Group * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -686,8 +673,7 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -721,8 +707,7 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -766,8 +751,7 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 @@ -803,8 +787,7 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request &request) * * Scenes and Groups * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene the item is in * @requestField ?sceneUuid | String | UUID of the scene the item is in * @requestField sceneItemId | Number | Numeric ID of the scene item | >= 0 diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index 2fbcab71..05175a01 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -22,7 +22,6 @@ with this program. If not, see /** * Gets an array of scenes in OBS. * - * @requestField ?canvasName | String | Name of the canvas the scenes are in * @requestField ?canvasUuid | String | UUID of the canvas the scenes are in * * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync @@ -43,7 +42,7 @@ RequestResult RequestHandler::GetSceneList(const Request &request) json responseData; RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); if (canvas) { @@ -111,7 +110,7 @@ RequestResult RequestHandler::GetGroupList(const Request &request) json responseData; RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); @@ -294,8 +293,7 @@ RequestResult RequestHandler::CreateScene(const Request &request) /** * Removes a scene from OBS. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to remove * @requestField ?sceneUuid | String | UUID of the scene to remove * @@ -310,7 +308,7 @@ RequestResult RequestHandler::RemoveScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); @@ -331,8 +329,7 @@ RequestResult RequestHandler::RemoveScene(const Request &request) /** * Sets the name of a scene (rename). * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene to be renamed * @requestField ?sceneUuid | String | UUID of the scene to be renamed * @requestField newSceneName | String | New name for the scene @@ -348,7 +345,7 @@ RequestResult RequestHandler::SetSceneName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); @@ -374,8 +371,7 @@ RequestResult RequestHandler::SetSceneName(const Request &request) * * Note: A transition UUID response field is not currently able to be implemented as of 2024-1-18. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene * @requestField ?sceneUuid | String | UUID of the scene * @@ -417,8 +413,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req /** * Sets the scene transition overridden for a scene. * - * @requestField ?canvasName | String | Name of the canvas the scene is in - * @requestField ?canvasUuid | String | UUID of the canvas the scene is in + * @requestField ?canvasUuid | String | UUID of the canvas the scene is in, if using the sceneName field * @requestField ?sceneName | String | Name of the scene * @requestField ?sceneUuid | String | UUID of the scene * @requestField ?transitionName | String | Name of the scene transition to use as override. Specify `null` to remove | Unchanged diff --git a/src/requesthandler/RequestHandler_Sources.cpp b/src/requesthandler/RequestHandler_Sources.cpp index 11ff0627..9442b9bd 100644 --- a/src/requesthandler/RequestHandler_Sources.cpp +++ b/src/requesthandler/RequestHandler_Sources.cpp @@ -114,8 +114,7 @@ bool IsImageFormatValid(std::string format) * * **Compatible with inputs and scenes.** * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to get the active state of * @requestField ?sourceUuid | String | UUID of the source to get the active state of * @@ -133,7 +132,7 @@ RequestResult RequestHandler::GetSourceActive(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -154,8 +153,7 @@ RequestResult RequestHandler::GetSourceActive(const Request &request) * * **Compatible with inputs and scenes.** * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to take a screenshot of * @requestField ?sourceUuid | String | UUID of the source to take a screenshot of * @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats @@ -176,7 +174,7 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -244,8 +242,7 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request) * * **Compatible with inputs and scenes.** * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using sourceName field * @requestField ?sourceName | String | Name of the source to take a screenshot of * @requestField ?sourceUuid | String | UUID of the source to take a screenshot of * @requestField imageFormat | String | Image compression format to use. Use `GetVersion` to get compatible image formats @@ -265,7 +262,7 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment) && request.ValidateString("imageFilePath", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -328,7 +325,7 @@ RequestResult RequestHandler::GetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -345,7 +342,7 @@ RequestResult RequestHandler::SetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Ui.cpp b/src/requesthandler/RequestHandler_Ui.cpp index c586ae71..3ab55fd1 100644 --- a/src/requesthandler/RequestHandler_Ui.cpp +++ b/src/requesthandler/RequestHandler_Ui.cpp @@ -265,8 +265,7 @@ RequestResult RequestHandler::OpenVideoMixProjector(const Request &request) * * Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release. * - * @requestField ?canvasName | String | Name of the canvas the source is in - * @requestField ?canvasUuid | String | UUID of the canvas the source is in + * @requestField ?canvasUuid | String | UUID of the canvas the source is in, if using the sourceName field * @requestField ?sourceName | String | Name of the source to open a projector for * @requestField ?sourceUuid | String | UUID of the source to open a projector for * @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode @@ -283,7 +282,7 @@ RequestResult RequestHandler::OpenSourceProjector(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/rpc/Request.cpp b/src/requesthandler/rpc/Request.cpp index 40c33fe8..e3e01497 100644 --- a/src/requesthandler/rpc/Request.cpp +++ b/src/requesthandler/rpc/Request.cpp @@ -211,25 +211,27 @@ bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestSt return true; } -obs_source_t *Request::ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_canvas_t *Request::ValidateCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const { - OBSCanvasAutoRelease canvas = ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) - return nullptr; - - if (ValidateString(nameKeyName, statusCode, comment)) { - std::string sourceName = RequestData[nameKeyName]; - obs_source_t *ret = canvas ? obs_canvas_get_source_by_name(canvas, sourceName.c_str()) - : obs_get_source_by_name(sourceName.c_str()); + if (ValidateString(uuidKeyName, statusCode, comment)) { + std::string canvasUuid = RequestData[uuidKeyName]; + obs_canvas_t *ret = obs_get_canvas_by_uuid(canvasUuid.c_str()); if (!ret) { statusCode = RequestStatus::ResourceNotFound; - comment = std::string("No source was found by the name of `") + sourceName + "`."; + comment = std::string("No canvas was found by the UUID of `") + canvasUuid + "`."; return nullptr; } return ret; } + return obs_get_main_canvas(); +} + +obs_source_t *Request::ValidateSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const +{ if (ValidateString(uuidKeyName, statusCode, comment)) { std::string sourceUuid = RequestData[uuidKeyName]; obs_source_t *ret = obs_get_source_by_uuid(sourceUuid.c_str()); @@ -241,16 +243,31 @@ obs_source_t *Request::ValidateSource(const std::string &nameKeyName, const std: return ret; } + if (ValidateString(nameKeyName, statusCode, comment)) { + OBSCanvasAutoRelease canvas = ValidateCanvas(canvasUuidKeyName, statusCode, comment); + if (!canvas) + return nullptr; + std::string sourceName = RequestData[nameKeyName]; + obs_source_t *ret = obs_canvas_get_source_by_name(canvas, sourceName.c_str()); + if (!ret) { + statusCode = RequestStatus::ResourceNotFound; + comment = std::string("No source was found by the name of `") + sourceName + "` within the canvas `" + + obs_canvas_get_name(canvas) + "`."; + return nullptr; + } + return ret; + } + statusCode = RequestStatus::MissingRequestField; - comment = std::string("Your request must contain at least one of the following fields: `") + nameKeyName + "` or `" + - uuidKeyName + "`."; + comment = std::string("Your request must contain at least one of the following fields: `") + nameKeyName + + "` with optional `" + canvasUuidKeyName + "` or `" + uuidKeyName + "`."; return nullptr; } obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const { - obs_source_t *ret = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + obs_source_t *ret = ValidateSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!ret) return nullptr; @@ -280,7 +297,7 @@ obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, s obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const { - OBSSourceAutoRelease sceneSource = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + OBSSourceAutoRelease sceneSource = ValidateSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!sceneSource) return nullptr; @@ -310,7 +327,7 @@ obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, s obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *ret = ValidateSource("inputName", "inputUuid", statusCode, comment); + obs_source_t *ret = ValidateSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); if (!ret) return nullptr; @@ -326,7 +343,7 @@ obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, s FilterPair Request::ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *source = ValidateSource("sourceName", "sourceUuid", statusCode, comment); + obs_source_t *source = ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return FilterPair{source, nullptr}; @@ -388,31 +405,3 @@ obs_output_t *Request::ValidateOutput(const std::string &keyName, RequestStatus: return ret; } - -obs_canvas_t *Request::ValidateCanvas(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, std::string &comment) const -{ - if (ValidateString(nameKeyName, statusCode, comment)) { - std::string canvasName = RequestData[nameKeyName]; - obs_canvas_t *ret = obs_get_canvas_by_name(canvasName.c_str()); - if (!ret) { - statusCode = RequestStatus::ResourceNotFound; - comment = std::string("No canvas was found by the name of `") + canvasName + "`."; - return nullptr; - } - return ret; - } - - if (ValidateString(uuidKeyName, statusCode, comment)) { - std::string canvasUuid = RequestData[uuidKeyName]; - obs_canvas_t *ret = obs_get_canvas_by_uuid(canvasUuid.c_str()); - if (!ret) { - statusCode = RequestStatus::ResourceNotFound; - comment = std::string("No canvas was found by the UUID of `") + canvasUuid + "`."; - return nullptr; - } - return ret; - } - - return nullptr; -} diff --git a/src/requesthandler/rpc/Request.h b/src/requesthandler/rpc/Request.h index ebe539dd..66790d0c 100644 --- a/src/requesthandler/rpc/Request.h +++ b/src/requesthandler/rpc/Request.h @@ -64,8 +64,11 @@ struct Request { const bool allowEmpty = false) const; // All return values have incremented refcounts - obs_source_t *ValidateSource(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, std::string &comment) const; + obs_canvas_t *ValidateCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + obs_source_t *ValidateSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; obs_source_t *ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; obs_scene_t *ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, @@ -76,9 +79,6 @@ struct Request { const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_canvas_t *ValidateCanvas(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, - std::string &comment) const; std::string RequestType; bool HasRequestData; From 8306759a48f43705e25e589f9c2720f52f17954b Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:11:58 -0500 Subject: [PATCH 10/19] requesthandler: Rename "Validate" style object requests to "Get" Just a visual change. These function more as getters than validators. --- src/requesthandler/RequestHandler_Filters.cpp | 16 ++--- src/requesthandler/RequestHandler_Inputs.cpp | 48 +++++++-------- .../RequestHandler_MediaInputs.cpp | 8 +-- src/requesthandler/RequestHandler_Outputs.cpp | 12 ++-- .../RequestHandler_SceneItems.cpp | 58 ++++++++----------- src/requesthandler/RequestHandler_Scenes.cpp | 20 +++---- src/requesthandler/RequestHandler_Sources.cpp | 10 ++-- src/requesthandler/RequestHandler_Ui.cpp | 8 +-- src/requesthandler/rpc/Request.cpp | 41 +++++++------ src/requesthandler/rpc/Request.h | 29 +++++----- 10 files changed, 118 insertions(+), 132 deletions(-) diff --git a/src/requesthandler/RequestHandler_Filters.cpp b/src/requesthandler/RequestHandler_Filters.cpp index 8061e0b0..46756d53 100644 --- a/src/requesthandler/RequestHandler_Filters.cpp +++ b/src/requesthandler/RequestHandler_Filters.cpp @@ -60,7 +60,7 @@ RequestResult RequestHandler::GetSourceFilterList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -127,7 +127,7 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("filterName", statusCode, comment) && request.ValidateString("filterKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -179,7 +179,7 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -208,7 +208,7 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -247,7 +247,7 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -284,7 +284,7 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -316,7 +316,7 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -365,7 +365,7 @@ RequestResult RequestHandler::SetSourceFilterEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.GetFilter(statusCode, comment); if (!(pair.filter && request.ValidateBoolean("filterEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index cfb45526..5dd0789d 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -145,7 +145,7 @@ RequestResult RequestHandler::CreateInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.GetScene(statusCode, comment); if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) && request.ValidateString("inputKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -212,7 +212,7 @@ RequestResult RequestHandler::RemoveInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -242,7 +242,7 @@ RequestResult RequestHandler::SetInputName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateString("newInputName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -315,7 +315,7 @@ RequestResult RequestHandler::GetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -346,7 +346,7 @@ RequestResult RequestHandler::SetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -397,7 +397,7 @@ RequestResult RequestHandler::GetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -427,7 +427,7 @@ RequestResult RequestHandler::SetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -458,7 +458,7 @@ RequestResult RequestHandler::ToggleInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -493,7 +493,7 @@ RequestResult RequestHandler::GetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -530,7 +530,7 @@ RequestResult RequestHandler::SetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -581,7 +581,7 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -612,7 +612,7 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0))) return RequestResult::Error(statusCode, comment); @@ -646,7 +646,7 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -678,7 +678,7 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000))) return RequestResult::Error(statusCode, comment); @@ -716,7 +716,7 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -747,7 +747,7 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateString("monitorType", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -794,7 +794,7 @@ RequestResult RequestHandler::GetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -832,7 +832,7 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -900,7 +900,7 @@ RequestResult RequestHandler::GetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -933,7 +933,7 @@ RequestResult RequestHandler::SetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceMode", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -977,7 +977,7 @@ RequestResult RequestHandler::GetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -1010,7 +1010,7 @@ RequestResult RequestHandler::SetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceFieldOrder", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -1050,7 +1050,7 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -1093,7 +1093,7 @@ RequestResult RequestHandler::PressInputPropertiesButton(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_MediaInputs.cpp b/src/requesthandler/RequestHandler_MediaInputs.cpp index 3c176e20..7e0752e4 100644 --- a/src/requesthandler/RequestHandler_MediaInputs.cpp +++ b/src/requesthandler/RequestHandler_MediaInputs.cpp @@ -57,7 +57,7 @@ RequestResult RequestHandler::GetMediaInputStatus(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -96,7 +96,7 @@ RequestResult RequestHandler::SetMediaInputCursor(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursor", statusCode, comment, 0))) return RequestResult::Error(statusCode, comment); @@ -132,7 +132,7 @@ RequestResult RequestHandler::OffsetMediaInputCursor(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursorOffset", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -169,7 +169,7 @@ RequestResult RequestHandler::TriggerMediaInputAction(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!(input && request.ValidateString("mediaAction", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Outputs.cpp b/src/requesthandler/RequestHandler_Outputs.cpp index d2b0526b..debc35fd 100644 --- a/src/requesthandler/RequestHandler_Outputs.cpp +++ b/src/requesthandler/RequestHandler_Outputs.cpp @@ -317,7 +317,7 @@ RequestResult RequestHandler::GetOutputStatus(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -354,7 +354,7 @@ RequestResult RequestHandler::ToggleOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -385,7 +385,7 @@ RequestResult RequestHandler::StartOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -413,7 +413,7 @@ RequestResult RequestHandler::StopOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -443,7 +443,7 @@ RequestResult RequestHandler::GetOutputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -471,7 +471,7 @@ RequestResult RequestHandler::SetOutputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); if (!(output && request.ValidateObject("outputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index f904f7ba..692ca377 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -41,7 +41,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -75,7 +75,7 @@ RequestResult RequestHandler::GetGroupSceneItemList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); if (!scene) return RequestResult::Error(statusCode, comment); @@ -109,7 +109,7 @@ RequestResult RequestHandler::GetSceneItemId(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneAutoRelease scene = request.ValidateScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneAutoRelease scene = request.GetScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(scene && request.ValidateString("sourceName", statusCode, comment))) // TODO: Source UUID support return RequestResult::Error(statusCode, comment); @@ -155,7 +155,7 @@ RequestResult RequestHandler::GetSceneItemSource(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -193,13 +193,13 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.GetScene(statusCode, comment); if (!sceneSource) return RequestResult::Error(statusCode, comment); OBSScene scene = obs_scene_from_source(sceneSource); - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -244,7 +244,7 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -279,19 +279,19 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); // Get destination scene obs_scene_t *destinationScene; if (request.Contains("destinationSceneName")) { - OBSSourceAutoRelease destinationSceneSource = request.ValidateSource( - "destinationCanvasUuid", "destinationSceneName", "destinationSceneUuid", statusCode, comment); + OBSSourceAutoRelease destinationSceneSource = request.GetSource("destinationCanvasUuid", "destinationSceneName", + "destinationSceneUuid", statusCode, comment); if (!destinationSceneSource) return RequestResult::Error(statusCode, comment); - // Reimplementation of ValidateScene2 + // Reimplementation of GetScene2 if (obs_source_get_type(destinationSceneSource) != OBS_SOURCE_TYPE_SCENE) return RequestResult::Error(RequestStatus::InvalidResourceType, "The specified source is not a scene."); if (obs_source_is_group(destinationSceneSource)) @@ -355,8 +355,7 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -386,8 +385,7 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -553,8 +551,7 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -586,8 +583,7 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -621,8 +617,7 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -654,8 +649,7 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -691,8 +685,7 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -724,8 +717,7 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -769,8 +761,7 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -804,8 +795,7 @@ RequestResult RequestHandler::SetSceneItemBlendMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -824,8 +814,7 @@ RequestResult RequestHandler::GetSceneItemPrivateSettings(const Request &request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -842,8 +831,7 @@ RequestResult RequestHandler::SetSceneItemPrivateSettings(const Request &request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = - request.ValidateSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index 05175a01..fcbdceef 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -42,7 +42,7 @@ RequestResult RequestHandler::GetSceneList(const Request &request) json responseData; RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); if (canvas) { @@ -110,7 +110,7 @@ RequestResult RequestHandler::GetGroupList(const Request &request) json responseData; RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); @@ -166,7 +166,7 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -237,7 +237,7 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -308,11 +308,11 @@ RequestResult RequestHandler::RemoveScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -345,11 +345,11 @@ RequestResult RequestHandler::SetSceneName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (statusCode == RequestStatus::ResourceNotFound) return RequestResult::Error(statusCode, comment); - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!(scene && request.ValidateString("newSceneName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -389,7 +389,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -430,7 +430,7 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Sources.cpp b/src/requesthandler/RequestHandler_Sources.cpp index 9442b9bd..b1528037 100644 --- a/src/requesthandler/RequestHandler_Sources.cpp +++ b/src/requesthandler/RequestHandler_Sources.cpp @@ -132,7 +132,7 @@ RequestResult RequestHandler::GetSourceActive(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -174,7 +174,7 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -262,7 +262,7 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment) && request.ValidateString("imageFilePath", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -325,7 +325,7 @@ RequestResult RequestHandler::GetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -342,7 +342,7 @@ RequestResult RequestHandler::SetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Ui.cpp b/src/requesthandler/RequestHandler_Ui.cpp index 3ab55fd1..38561991 100644 --- a/src/requesthandler/RequestHandler_Ui.cpp +++ b/src/requesthandler/RequestHandler_Ui.cpp @@ -96,7 +96,7 @@ RequestResult RequestHandler::OpenInputPropertiesDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -122,7 +122,7 @@ RequestResult RequestHandler::OpenInputFiltersDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -148,7 +148,7 @@ RequestResult RequestHandler::OpenInputInteractDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.GetInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -282,7 +282,7 @@ RequestResult RequestHandler::OpenSourceProjector(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/rpc/Request.cpp b/src/requesthandler/rpc/Request.cpp index e3e01497..8cd1190e 100644 --- a/src/requesthandler/rpc/Request.cpp +++ b/src/requesthandler/rpc/Request.cpp @@ -211,8 +211,8 @@ bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestSt return true; } -obs_canvas_t *Request::ValidateCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const +obs_canvas_t *Request::GetCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const { if (ValidateString(uuidKeyName, statusCode, comment)) { std::string canvasUuid = RequestData[uuidKeyName]; @@ -228,9 +228,9 @@ obs_canvas_t *Request::ValidateCanvas(const std::string &uuidKeyName, RequestSta return obs_get_main_canvas(); } -obs_source_t *Request::ValidateSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, - const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const +obs_source_t *Request::GetSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const { if (ValidateString(uuidKeyName, statusCode, comment)) { std::string sourceUuid = RequestData[uuidKeyName]; @@ -244,7 +244,7 @@ obs_source_t *Request::ValidateSource(const std::string &canvasUuidKeyName, cons } if (ValidateString(nameKeyName, statusCode, comment)) { - OBSCanvasAutoRelease canvas = ValidateCanvas(canvasUuidKeyName, statusCode, comment); + OBSCanvasAutoRelease canvas = GetCanvas(canvasUuidKeyName, statusCode, comment); if (!canvas) return nullptr; std::string sourceName = RequestData[nameKeyName]; @@ -264,10 +264,10 @@ obs_source_t *Request::ValidateSource(const std::string &canvasUuidKeyName, cons return nullptr; } -obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_source_t *Request::GetScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - obs_source_t *ret = ValidateSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); + obs_source_t *ret = GetSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!ret) return nullptr; @@ -294,10 +294,10 @@ obs_source_t *Request::ValidateScene(RequestStatus::RequestStatus &statusCode, s return ret; } -obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_scene_t *Request::GetScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSourceAutoRelease sceneSource = ValidateSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); + OBSSourceAutoRelease sceneSource = GetSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!sceneSource) return nullptr; @@ -325,9 +325,9 @@ obs_scene_t *Request::ValidateScene2(RequestStatus::RequestStatus &statusCode, s } } -obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_source_t *Request::GetInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *ret = ValidateSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); + obs_source_t *ret = GetSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); if (!ret) return nullptr; @@ -341,9 +341,9 @@ obs_source_t *Request::ValidateInput(RequestStatus::RequestStatus &statusCode, s return ret; } -FilterPair Request::ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const +FilterPair Request::GetFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *source = ValidateSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + obs_source_t *source = GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return FilterPair{source, nullptr}; @@ -363,10 +363,10 @@ FilterPair Request::ValidateFilter(RequestStatus::RequestStatus &statusCode, std return FilterPair{source, filter}; } -obs_sceneitem_t *Request::ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter) const +obs_sceneitem_t *Request::GetSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSceneAutoRelease scene = ValidateScene2(statusCode, comment, filter); + OBSSceneAutoRelease scene = GetScene2(statusCode, comment, filter); if (!scene) return nullptr; @@ -388,8 +388,7 @@ obs_sceneitem_t *Request::ValidateSceneItem(RequestStatus::RequestStatus &status return sceneItem; } -obs_output_t *Request::ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const +obs_output_t *Request::GetOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { if (!ValidateString(keyName, statusCode, comment)) return nullptr; diff --git a/src/requesthandler/rpc/Request.h b/src/requesthandler/rpc/Request.h index 66790d0c..508e6821 100644 --- a/src/requesthandler/rpc/Request.h +++ b/src/requesthandler/rpc/Request.h @@ -64,21 +64,20 @@ struct Request { const bool allowEmpty = false) const; // All return values have incremented refcounts - obs_canvas_t *ValidateCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const; - obs_source_t *ValidateSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, - const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const; - obs_source_t *ValidateScene(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_scene_t *ValidateScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_source_t *ValidateInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - FilterPair ValidateFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_sceneitem_t *ValidateSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, - const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, - std::string &comment) const; + obs_canvas_t *GetCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + obs_source_t *GetSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + obs_source_t *GetScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_scene_t *GetScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_source_t *GetInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + FilterPair GetFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + obs_sceneitem_t *GetSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_output_t *GetOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; std::string RequestType; bool HasRequestData; From 5b2558ab99a64b0ada903339a34da8372d0a5547 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:12 -0500 Subject: [PATCH 11/19] requesthandler: Perform better check for invalid canvas A previous commit of mine within this PR made GetCanvas() return a reference to the main canvas if `canvasUuid` was not specified. As such, that removed the need to check the requestStatus value, and we can just rely on the canvas ptr being != nullptr. This also fixes a theoretical uninitialized memory access from `statusCode` being unset. --- src/requesthandler/RequestHandler_Scenes.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index fcbdceef..efc5c1bc 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -43,7 +43,7 @@ RequestResult RequestHandler::GetSceneList(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + if (!canvas) return RequestResult::Error(statusCode, comment); if (canvas) { OBSSourceAutoRelease programSource = obs_canvas_get_channel(canvas, 0); @@ -111,7 +111,7 @@ RequestResult RequestHandler::GetGroupList(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + if (!canvas) return RequestResult::Error(statusCode, comment); if (canvas) @@ -309,7 +309,7 @@ RequestResult RequestHandler::RemoveScene(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + if (!canvas) return RequestResult::Error(statusCode, comment); OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); @@ -346,7 +346,7 @@ RequestResult RequestHandler::SetSceneName(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + if (!canvas) return RequestResult::Error(statusCode, comment); OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); From 54cd476216df32f0cfceceff3a6b04bd66ff1aec Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:17 -0500 Subject: [PATCH 12/19] requesthandler: Various fixes and improvements to scenes requests --- src/requesthandler/RequestHandler_Scenes.cpp | 81 +++++++------------- 1 file changed, 28 insertions(+), 53 deletions(-) diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index efc5c1bc..b86e0582 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -24,10 +24,10 @@ with this program. If not, see * * @requestField ?canvasUuid | String | UUID of the canvas the scenes are in * - * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if internal state desync - * @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if internal state desync - * @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode - * @responseField currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode + * @responseField currentProgramSceneName | String | Current program scene name. Can be `null` if non-main canvas or internal state desync + * @responseField currentProgramSceneUuid | String | Current program scene UUID. Can be `null` if non-main canvas or internal state desync + * @responseField currentPreviewSceneName | String | Current preview scene name. `null` if not in studio mode or non-main canvas + * @responseField currentPreviewSceneUuid | String | Current preview scene UUID. `null` if not in studio mode or non-main canvas * @responseField scenes | Array | Array of scenes * * @requestType GetSceneList @@ -39,31 +39,15 @@ with this program. If not, see */ RequestResult RequestHandler::GetSceneList(const Request &request) { - json responseData; RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (!canvas) return RequestResult::Error(statusCode, comment); - if (canvas) { - OBSSourceAutoRelease programSource = obs_canvas_get_channel(canvas, 0); - if (programSource && obs_source_get_type(programSource) == OBS_SOURCE_TYPE_TRANSITION) { - OBSSourceAutoRelease activeSource = obs_transition_get_active_source(programSource); - if (activeSource) { - responseData["currentProgramSceneName"] = obs_source_get_name(activeSource); - responseData["currentProgramSceneUuid"] = obs_source_get_uuid(activeSource); - } else { - responseData["currentProgramSceneName"] = nullptr; - responseData["currentProgramSceneUuid"] = nullptr; - } - } else if (programSource && obs_source_is_scene(programSource)) { - responseData["currentProgramSceneName"] = obs_source_get_name(programSource); - responseData["currentProgramSceneUuid"] = obs_source_get_uuid(programSource); - } else { - responseData["currentProgramSceneName"] = nullptr; - responseData["currentProgramSceneUuid"] = nullptr; - } - } else { + + json responseData; + + if (obs_canvas_get_flags(canvas) & MAIN) { // Main canvas, which has a program scene, preview scene, and scene order OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene(); if (currentProgramScene) { responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene); @@ -81,12 +65,14 @@ RequestResult RequestHandler::GetSceneList(const Request &request) responseData["currentPreviewSceneName"] = nullptr; responseData["currentPreviewSceneUuid"] = nullptr; } - } - - if (canvas) - responseData["scenes"] = Utils::Obs::ArrayHelper::GetCanvasSceneList(canvas); - else responseData["scenes"] = Utils::Obs::ArrayHelper::GetSceneList(); + } else { // Non-main canvas, which only has an unordered array of scenes + responseData["currentProgramSceneName"] = nullptr; + responseData["currentProgramSceneUuid"] = nullptr; + responseData["currentProgramSceneName"] = nullptr; + responseData["currentProgramSceneUuid"] = nullptr; + responseData["scenes"] = Utils::Obs::ArrayHelper::GetCanvasSceneList(canvas); + } return RequestResult::Success(responseData); } @@ -107,17 +93,14 @@ RequestResult RequestHandler::GetSceneList(const Request &request) */ RequestResult RequestHandler::GetGroupList(const Request &request) { - json responseData; RequestStatus::RequestStatus statusCode; std::string comment; OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); if (!canvas) return RequestResult::Error(statusCode, comment); - if (canvas) - responseData["groups"] = Utils::Obs::ArrayHelper::GetCanvasGroupList(canvas); - else - responseData["groups"] = Utils::Obs::ArrayHelper::GetGroupList(); + json responseData; + responseData["groups"] = Utils::Obs::ArrayHelper::GetCanvasGroupList(canvas); return RequestResult::Success(responseData); } @@ -125,7 +108,9 @@ RequestResult RequestHandler::GetGroupList(const Request &request) /** * Gets the current program scene. * - * Note: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. + * Note 1: This request is slated to have the `currentProgram`-prefixed fields removed from in an upcoming RPC version. + * + * Note 2: Canvases do not have any concept of a program or preview scene, so this request does not support canvases. * * @responseField sceneName | String | Current program scene name * @responseField sceneUuid | String | Current program scene UUID @@ -170,9 +155,8 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request) if (!scene) return RequestResult::Error(statusCode, comment); - OBSCanvasAutoRelease sceneCanvas = obs_source_get_canvas(scene); - OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); - if (sceneCanvas != mainCanvas) + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!(obs_canvas_get_flags(canvas) & MAIN)) return RequestResult::Error( RequestStatus::InvalidResourceState, "The specified scene is not from the main canvas and cannot be set as the program scene."); @@ -241,9 +225,8 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) if (!scene) return RequestResult::Error(statusCode, comment); - OBSCanvasAutoRelease sceneCanvas = obs_source_get_canvas(scene); - OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); - if (sceneCanvas != mainCanvas) + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!(obs_canvas_get_flags(canvas) & MAIN)) return RequestResult::Error( RequestStatus::InvalidResourceState, "The specified scene is not from the main canvas and cannot be set as the preview scene."); @@ -308,16 +291,12 @@ RequestResult RequestHandler::RemoveScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (!canvas) - return RequestResult::Error(statusCode, comment); - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); - if ((canvas && Utils::Obs::NumberHelper::GetCanvasSceneCount(canvas) < 2) || - (!canvas && Utils::Obs::NumberHelper::GetSceneCount() < 2)) + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if ((obs_canvas_get_flags(canvas) & MAIN) && Utils::Obs::NumberHelper::GetCanvasSceneCount(canvas) < 2) return RequestResult::Error(RequestStatus::NotEnoughResources, "You cannot remove the last scene in the collection."); @@ -345,18 +324,14 @@ RequestResult RequestHandler::SetSceneName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); - if (!canvas) - return RequestResult::Error(statusCode, comment); - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); if (!(scene && request.ValidateString("newSceneName", statusCode, comment))) return RequestResult::Error(statusCode, comment); std::string newSceneName = request.RequestData["newSceneName"]; - OBSSourceAutoRelease existingSource = canvas ? obs_canvas_get_source_by_name(canvas, newSceneName.c_str()) - : obs_get_source_by_name(newSceneName.c_str()); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + OBSSourceAutoRelease existingSource = obs_canvas_get_source_by_name(canvas, newSceneName.c_str()); if (existingSource) return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that new scene name."); From ed683b304129c7c8aaed988bda835902141ab189 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:22 -0500 Subject: [PATCH 13/19] utils: Remove unused GetGroupList() --- src/utils/Obs.h | 1 - src/utils/Obs_ArrayHelper.cpp | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/utils/Obs.h b/src/utils/Obs.h index 8da7ba78..84224f10 100644 --- a/src/utils/Obs.h +++ b/src/utils/Obs.h @@ -252,7 +252,6 @@ namespace Utils { std::vector GetHotkeyNameList(); std::vector GetSceneList(); std::vector GetCanvasSceneList(obs_canvas_t *canvas); - std::vector GetGroupList(); std::vector GetCanvasGroupList(obs_canvas_t *canvas); std::vector GetSceneItemList(obs_scene_t *scene, bool basic = false); std::vector GetInputList(std::string inputKind = ""); diff --git a/src/utils/Obs_ArrayHelper.cpp b/src/utils/Obs_ArrayHelper.cpp index cb1a7d1e..6cef3099 100644 --- a/src/utils/Obs_ArrayHelper.cpp +++ b/src/utils/Obs_ArrayHelper.cpp @@ -132,12 +132,6 @@ std::vector Utils::Obs::ArrayHelper::GetCanvasSceneList(obs_canvas_t *canv return ret; } -std::vector Utils::Obs::ArrayHelper::GetGroupList() -{ - OBSCanvasAutoRelease canvas = obs_get_main_canvas(); - return GetCanvasGroupList(canvas); -} - std::vector Utils::Obs::ArrayHelper::GetCanvasGroupList(obs_canvas_t *canvas) { std::vector ret; From 201cf8ccb45c87b8356bdbb7d2a63b5aca119eeb Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:27 -0500 Subject: [PATCH 14/19] utils: Clean up GetCanvasSceneList and set sceneIndex to null Canvases don't have ordered scenes, so it's better to return null values than to lie to the user. --- src/utils/Obs_ArrayHelper.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/utils/Obs_ArrayHelper.cpp b/src/utils/Obs_ArrayHelper.cpp index 6cef3099..d7d7f6f8 100644 --- a/src/utils/Obs_ArrayHelper.cpp +++ b/src/utils/Obs_ArrayHelper.cpp @@ -114,20 +114,20 @@ std::vector Utils::Obs::ArrayHelper::GetCanvasSceneList(obs_canvas_t *canv { std::vector ret; - obs_canvas_enum_scenes( - canvas, - [](void *param, obs_source_t *scene) { - auto ret = static_cast *>(param); - json sceneJson; - sceneJson["sceneName"] = obs_source_get_name(scene); - sceneJson["sceneUuid"] = obs_source_get_uuid(scene); - ret->push_back(sceneJson); - return true; - }, - &ret); - for (size_t i = 0; i < ret.size(); i++) { - ret[i]["sceneIndex"] = i + 1; - } + auto cb = [](void *param, obs_source_t *scene) { + auto ret = static_cast *>(param); + + json sceneJson; + sceneJson["sceneName"] = obs_source_get_name(scene); + sceneJson["sceneUuid"] = obs_source_get_uuid(scene); + sceneJson["sceneIndex"] = nullptr; + + ret->push_back(sceneJson); + + return true; + }; + + obs_canvas_enum_scenes(canvas, cb, &ret); return ret; } From 2547fe3c581717ff943663a50f0ee93e80dad2fc Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:34 -0500 Subject: [PATCH 15/19] eventhandler: Ignore scene events for non-main canvases Existing clients often track scene state based on name, and emitting events for non-main canvases under the existing event names is an API break. The correct solution is to increment the obs-websocket RPC version, in order to require clients to explicitly acknowledge that they have been designed to take into account the context of canvases. In order to preserve consistent behavior, we will instead ignore events from canvases other than the main canvas. --- src/eventhandler/EventHandler_SceneItems.cpp | 63 +++++++++----------- src/eventhandler/EventHandler_Scenes.cpp | 27 ++++----- 2 files changed, 40 insertions(+), 50 deletions(-) diff --git a/src/eventhandler/EventHandler_SceneItems.cpp b/src/eventhandler/EventHandler_SceneItems.cpp index ebd871a6..477ca463 100644 --- a/src/eventhandler/EventHandler_SceneItems.cpp +++ b/src/eventhandler/EventHandler_SceneItems.cpp @@ -49,6 +49,10 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data) if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); @@ -56,11 +60,6 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data) eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); eventData["sceneItemIndex"] = obs_sceneitem_get_order_position(sceneItem); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemCreated", eventData); } @@ -95,17 +94,16 @@ void EventHandler::HandleSceneItemRemoved(void *param, calldata_t *data) if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sourceName"] = obs_source_get_name(obs_sceneitem_get_source(sceneItem)); eventData["sourceUuid"] = obs_source_get_uuid(obs_sceneitem_get_source(sceneItem)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemRemoved", eventData); } @@ -132,15 +130,14 @@ void EventHandler::HandleSceneItemListReindexed(void *param, calldata_t *data) if (!scene) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sceneItems"] = Utils::Obs::ArrayHelper::GetSceneItemList(scene, true); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemListReindexed", eventData); } @@ -174,16 +171,15 @@ void EventHandler::HandleSceneItemEnableStateChanged(void *param, calldata_t *da bool sceneItemEnabled = calldata_bool(data, "visible"); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); eventData["sceneItemEnabled"] = sceneItemEnabled; - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemEnableStateChanged", eventData); } @@ -217,16 +213,15 @@ void EventHandler::HandleSceneItemLockStateChanged(void *param, calldata_t *data bool sceneItemLocked = calldata_bool(data, "locked"); + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); eventData["sceneItemLocked"] = sceneItemLocked; - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemLockStateChanged", eventData); } @@ -257,15 +252,14 @@ void EventHandler::HandleSceneItemSelected(void *param, calldata_t *data) if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItems, "SceneItemSelected", eventData); } @@ -300,15 +294,14 @@ void EventHandler::HandleSceneItemTransformChanged(void *param, calldata_t *data if (!sceneItem) return; + OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(obs_scene_get_source(scene)); eventData["sceneUuid"] = obs_source_get_uuid(obs_scene_get_source(scene)); eventData["sceneItemId"] = obs_sceneitem_get_id(sceneItem); eventData["sceneItemTransform"] = Utils::Obs::ObjectHelper::GetSceneItemTransform(sceneItem); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } eventHandler->BroadcastEvent(EventSubscription::SceneItemTransformChanged, "SceneItemTransformChanged", eventData); } diff --git a/src/eventhandler/EventHandler_Scenes.cpp b/src/eventhandler/EventHandler_Scenes.cpp index 4480899b..9fade330 100644 --- a/src/eventhandler/EventHandler_Scenes.cpp +++ b/src/eventhandler/EventHandler_Scenes.cpp @@ -36,15 +36,14 @@ with this program. If not, see */ void EventHandler::HandleSceneCreated(obs_source_t *source) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(source); eventData["sceneUuid"] = obs_source_get_uuid(source); eventData["isGroup"] = obs_source_is_group(source); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } BroadcastEvent(EventSubscription::Scenes, "SceneCreated", eventData); } @@ -65,15 +64,14 @@ void EventHandler::HandleSceneCreated(obs_source_t *source) */ void EventHandler::HandleSceneRemoved(obs_source_t *source) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneName"] = obs_source_get_name(source); eventData["sceneUuid"] = obs_source_get_uuid(source); eventData["isGroup"] = obs_source_is_group(source); - OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } BroadcastEvent(EventSubscription::Scenes, "SceneRemoved", eventData); } @@ -94,15 +92,14 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source) */ void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + if (!(obs_canvas_get_flags(canvas) & MAIN)) + return; + json eventData; eventData["sceneUuid"] = obs_source_get_uuid(source); eventData["oldSceneName"] = oldSceneName; eventData["sceneName"] = sceneName; - OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (canvas) { - eventData["canvasName"] = obs_canvas_get_name(canvas); - eventData["canvasUuid"] = obs_canvas_get_uuid(canvas); - } BroadcastEvent(EventSubscription::Scenes, "SceneNameChanged", eventData); } From dc4f7ba4315f9aac43384180861e14fa32dee3f6 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Fri, 27 Feb 2026 11:12:39 -0500 Subject: [PATCH 16/19] requesthandler: Add canvas support to CreateScene --- src/requesthandler/RequestHandler_Scenes.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index b86e0582..041722e1 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -239,7 +239,8 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) /** * Creates a new scene in OBS. * - * @requestField sceneName | String | Name for the new scene + * @requestField ?canvasUuid | String | UUID of the canvas to create the new scene in. Leave default to assume main canvas + * @requestField sceneName | String | Name for the new scene * * @responseField sceneUuid | String | UUID of the created scene * @@ -263,7 +264,7 @@ RequestResult RequestHandler::CreateScene(const Request &request) if (scene) return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that scene name."); - OBSSceneAutoRelease createdScene = obs_scene_create(sceneName.c_str()); + OBSSceneAutoRelease createdScene = obs_canvas_scene_create(canvas, sceneName.c_str()); if (!createdScene) return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene."); From 079dc8536cb1dafb86e1536c95805cbddeffa97a Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Fri, 27 Feb 2026 00:32:00 -0500 Subject: [PATCH 17/19] requesthandler: Rename "Get" style object requests to "Acquire" Just a visual change. "Acquire" is used to indicate that these methods return resources with an incremented ref. --- src/requesthandler/RequestHandler_Filters.cpp | 16 +++---- src/requesthandler/RequestHandler_Inputs.cpp | 48 +++++++++---------- .../RequestHandler_MediaInputs.cpp | 8 ++-- src/requesthandler/RequestHandler_Outputs.cpp | 12 ++--- .../RequestHandler_SceneItems.cpp | 42 ++++++++-------- src/requesthandler/RequestHandler_Scenes.cpp | 22 +++++---- src/requesthandler/RequestHandler_Sources.cpp | 10 ++-- src/requesthandler/RequestHandler_Ui.cpp | 8 ++-- src/requesthandler/rpc/Request.cpp | 28 +++++------ src/requesthandler/rpc/Request.h | 16 +++---- 10 files changed, 107 insertions(+), 103 deletions(-) diff --git a/src/requesthandler/RequestHandler_Filters.cpp b/src/requesthandler/RequestHandler_Filters.cpp index 46756d53..76a2dba4 100644 --- a/src/requesthandler/RequestHandler_Filters.cpp +++ b/src/requesthandler/RequestHandler_Filters.cpp @@ -60,7 +60,7 @@ RequestResult RequestHandler::GetSourceFilterList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -127,7 +127,7 @@ RequestResult RequestHandler::CreateSourceFilter(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("filterName", statusCode, comment) && request.ValidateString("filterKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -179,7 +179,7 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -208,7 +208,7 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -247,7 +247,7 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -284,7 +284,7 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -316,7 +316,7 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -365,7 +365,7 @@ RequestResult RequestHandler::SetSourceFilterEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.GetFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateBoolean("filterEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index 5dd0789d..87adfb92 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -145,7 +145,7 @@ RequestResult RequestHandler::CreateInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.GetScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.AcquireScene(statusCode, comment); if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) && request.ValidateString("inputKind", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -212,7 +212,7 @@ RequestResult RequestHandler::RemoveInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -242,7 +242,7 @@ RequestResult RequestHandler::SetInputName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("newInputName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -315,7 +315,7 @@ RequestResult RequestHandler::GetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -346,7 +346,7 @@ RequestResult RequestHandler::SetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -397,7 +397,7 @@ RequestResult RequestHandler::GetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -427,7 +427,7 @@ RequestResult RequestHandler::SetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -458,7 +458,7 @@ RequestResult RequestHandler::ToggleInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -493,7 +493,7 @@ RequestResult RequestHandler::GetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -530,7 +530,7 @@ RequestResult RequestHandler::SetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -581,7 +581,7 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -612,7 +612,7 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0))) return RequestResult::Error(statusCode, comment); @@ -646,7 +646,7 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -678,7 +678,7 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000))) return RequestResult::Error(statusCode, comment); @@ -716,7 +716,7 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -747,7 +747,7 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("monitorType", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -794,7 +794,7 @@ RequestResult RequestHandler::GetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -832,7 +832,7 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -900,7 +900,7 @@ RequestResult RequestHandler::GetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -933,7 +933,7 @@ RequestResult RequestHandler::SetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceMode", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -977,7 +977,7 @@ RequestResult RequestHandler::GetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -1010,7 +1010,7 @@ RequestResult RequestHandler::SetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceFieldOrder", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -1050,7 +1050,7 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -1093,7 +1093,7 @@ RequestResult RequestHandler::PressInputPropertiesButton(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_MediaInputs.cpp b/src/requesthandler/RequestHandler_MediaInputs.cpp index 7e0752e4..89192836 100644 --- a/src/requesthandler/RequestHandler_MediaInputs.cpp +++ b/src/requesthandler/RequestHandler_MediaInputs.cpp @@ -57,7 +57,7 @@ RequestResult RequestHandler::GetMediaInputStatus(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -96,7 +96,7 @@ RequestResult RequestHandler::SetMediaInputCursor(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursor", statusCode, comment, 0))) return RequestResult::Error(statusCode, comment); @@ -132,7 +132,7 @@ RequestResult RequestHandler::OffsetMediaInputCursor(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("mediaCursorOffset", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -169,7 +169,7 @@ RequestResult RequestHandler::TriggerMediaInputAction(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("mediaAction", statusCode, comment))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Outputs.cpp b/src/requesthandler/RequestHandler_Outputs.cpp index debc35fd..760af7f9 100644 --- a/src/requesthandler/RequestHandler_Outputs.cpp +++ b/src/requesthandler/RequestHandler_Outputs.cpp @@ -317,7 +317,7 @@ RequestResult RequestHandler::GetOutputStatus(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -354,7 +354,7 @@ RequestResult RequestHandler::ToggleOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -385,7 +385,7 @@ RequestResult RequestHandler::StartOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -413,7 +413,7 @@ RequestResult RequestHandler::StopOutput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -443,7 +443,7 @@ RequestResult RequestHandler::GetOutputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!output) return RequestResult::Error(statusCode, comment); @@ -471,7 +471,7 @@ RequestResult RequestHandler::SetOutputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSOutputAutoRelease output = request.GetOutput("outputName", statusCode, comment); + OBSOutputAutoRelease output = request.AcquireOutput("outputName", statusCode, comment); if (!(output && request.ValidateObject("outputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_SceneItems.cpp b/src/requesthandler/RequestHandler_SceneItems.cpp index 692ca377..de95e493 100644 --- a/src/requesthandler/RequestHandler_SceneItems.cpp +++ b/src/requesthandler/RequestHandler_SceneItems.cpp @@ -41,7 +41,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -75,7 +75,7 @@ RequestResult RequestHandler::GetGroupSceneItemList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); if (!scene) return RequestResult::Error(statusCode, comment); @@ -109,7 +109,7 @@ RequestResult RequestHandler::GetSceneItemId(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneAutoRelease scene = request.GetScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneAutoRelease scene = request.AcquireScene2(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(scene && request.ValidateString("sourceName", statusCode, comment))) // TODO: Source UUID support return RequestResult::Error(statusCode, comment); @@ -155,7 +155,7 @@ RequestResult RequestHandler::GetSceneItemSource(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -193,13 +193,13 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.GetScene(statusCode, comment); + OBSSourceAutoRelease sceneSource = request.AcquireScene(statusCode, comment); if (!sceneSource) return RequestResult::Error(statusCode, comment); OBSScene scene = obs_scene_from_source(sceneSource); - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -244,7 +244,7 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -279,14 +279,14 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); // Get destination scene obs_scene_t *destinationScene; if (request.Contains("destinationSceneName")) { - OBSSourceAutoRelease destinationSceneSource = request.GetSource("destinationCanvasUuid", "destinationSceneName", + OBSSourceAutoRelease destinationSceneSource = request.AcquireSource("destinationCanvasUuid", "destinationSceneName", "destinationSceneUuid", statusCode, comment); if (!destinationSceneSource) return RequestResult::Error(statusCode, comment); @@ -355,7 +355,7 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -385,7 +385,7 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -551,7 +551,7 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -583,7 +583,7 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -617,7 +617,7 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -649,7 +649,7 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -685,7 +685,7 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -717,7 +717,7 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -761,7 +761,7 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -795,7 +795,7 @@ RequestResult RequestHandler::SetSceneItemBlendMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -814,7 +814,7 @@ RequestResult RequestHandler::GetSceneItemPrivateSettings(const Request &request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -831,7 +831,7 @@ RequestResult RequestHandler::SetSceneItemPrivateSettings(const Request &request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.GetSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index 041722e1..82f042f4 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -41,7 +41,7 @@ RequestResult RequestHandler::GetSceneList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); if (!canvas) return RequestResult::Error(statusCode, comment); @@ -95,7 +95,7 @@ RequestResult RequestHandler::GetGroupList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.GetCanvas("canvasUuid", statusCode, comment); + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); if (!canvas) return RequestResult::Error(statusCode, comment); @@ -151,7 +151,7 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -221,7 +221,7 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -260,7 +260,11 @@ RequestResult RequestHandler::CreateScene(const Request &request) std::string sceneName = request.RequestData["sceneName"]; - OBSSourceAutoRelease scene = obs_get_source_by_name(sceneName.c_str()); + OBSCanvasAutoRelease canvas = request.AcquireCanvas("canvasUuid", statusCode, comment); + if (!canvas) + return RequestResult::Error(statusCode, comment); + + OBSSourceAutoRelease scene = obs_canvas_get_source_by_name(canvas, sceneName.c_str()); if (scene) return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that scene name."); @@ -292,7 +296,7 @@ RequestResult RequestHandler::RemoveScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -325,7 +329,7 @@ RequestResult RequestHandler::SetSceneName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!(scene && request.ValidateString("newSceneName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -365,7 +369,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -406,7 +410,7 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.GetScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Sources.cpp b/src/requesthandler/RequestHandler_Sources.cpp index b1528037..b3da7896 100644 --- a/src/requesthandler/RequestHandler_Sources.cpp +++ b/src/requesthandler/RequestHandler_Sources.cpp @@ -132,7 +132,7 @@ RequestResult RequestHandler::GetSourceActive(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -174,7 +174,7 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -262,7 +262,7 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!(source && request.ValidateString("imageFormat", statusCode, comment) && request.ValidateString("imageFilePath", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -325,7 +325,7 @@ RequestResult RequestHandler::GetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); @@ -342,7 +342,7 @@ RequestResult RequestHandler::SetSourcePrivateSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true)) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/RequestHandler_Ui.cpp b/src/requesthandler/RequestHandler_Ui.cpp index 38561991..9bdd2809 100644 --- a/src/requesthandler/RequestHandler_Ui.cpp +++ b/src/requesthandler/RequestHandler_Ui.cpp @@ -96,7 +96,7 @@ RequestResult RequestHandler::OpenInputPropertiesDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -122,7 +122,7 @@ RequestResult RequestHandler::OpenInputFiltersDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -148,7 +148,7 @@ RequestResult RequestHandler::OpenInputInteractDialog(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.GetInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -282,7 +282,7 @@ RequestResult RequestHandler::OpenSourceProjector(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease source = request.GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return RequestResult::Error(statusCode, comment); diff --git a/src/requesthandler/rpc/Request.cpp b/src/requesthandler/rpc/Request.cpp index 8cd1190e..73198720 100644 --- a/src/requesthandler/rpc/Request.cpp +++ b/src/requesthandler/rpc/Request.cpp @@ -211,7 +211,7 @@ bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestSt return true; } -obs_canvas_t *Request::GetCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, +obs_canvas_t *Request::AcquireCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { if (ValidateString(uuidKeyName, statusCode, comment)) { @@ -228,7 +228,7 @@ obs_canvas_t *Request::GetCanvas(const std::string &uuidKeyName, RequestStatus:: return obs_get_main_canvas(); } -obs_source_t *Request::GetSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, +obs_source_t *Request::AcquireSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { @@ -244,7 +244,7 @@ obs_source_t *Request::GetSource(const std::string &canvasUuidKeyName, const std } if (ValidateString(nameKeyName, statusCode, comment)) { - OBSCanvasAutoRelease canvas = GetCanvas(canvasUuidKeyName, statusCode, comment); + OBSCanvasAutoRelease canvas = AcquireCanvas(canvasUuidKeyName, statusCode, comment); if (!canvas) return nullptr; std::string sourceName = RequestData[nameKeyName]; @@ -264,10 +264,10 @@ obs_source_t *Request::GetSource(const std::string &canvasUuidKeyName, const std return nullptr; } -obs_source_t *Request::GetScene(RequestStatus::RequestStatus &statusCode, std::string &comment, +obs_source_t *Request::AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const { - obs_source_t *ret = GetSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!ret) return nullptr; @@ -294,10 +294,10 @@ obs_source_t *Request::GetScene(RequestStatus::RequestStatus &statusCode, std::s return ret; } -obs_scene_t *Request::GetScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, +obs_scene_t *Request::AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const { - OBSSourceAutoRelease sceneSource = GetSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); + OBSSourceAutoRelease sceneSource = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!sceneSource) return nullptr; @@ -325,9 +325,9 @@ obs_scene_t *Request::GetScene2(RequestStatus::RequestStatus &statusCode, std::s } } -obs_source_t *Request::GetInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_source_t *Request::AcquireInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *ret = GetSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); if (!ret) return nullptr; @@ -341,9 +341,9 @@ obs_source_t *Request::GetInput(RequestStatus::RequestStatus &statusCode, std::s return ret; } -FilterPair Request::GetFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const +FilterPair Request::AcquireFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *source = GetSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); + obs_source_t *source = AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return FilterPair{source, nullptr}; @@ -363,10 +363,10 @@ FilterPair Request::GetFilter(RequestStatus::RequestStatus &statusCode, std::str return FilterPair{source, filter}; } -obs_sceneitem_t *Request::GetSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, +obs_sceneitem_t *Request::AcquireSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const { - OBSSceneAutoRelease scene = GetScene2(statusCode, comment, filter); + OBSSceneAutoRelease scene = AcquireScene2(statusCode, comment, filter); if (!scene) return nullptr; @@ -388,7 +388,7 @@ obs_sceneitem_t *Request::GetSceneItem(RequestStatus::RequestStatus &statusCode, return sceneItem; } -obs_output_t *Request::GetOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const +obs_output_t *Request::AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { if (!ValidateString(keyName, statusCode, comment)) return nullptr; diff --git a/src/requesthandler/rpc/Request.h b/src/requesthandler/rpc/Request.h index 508e6821..5711db7d 100644 --- a/src/requesthandler/rpc/Request.h +++ b/src/requesthandler/rpc/Request.h @@ -64,20 +64,20 @@ struct Request { const bool allowEmpty = false) const; // All return values have incremented refcounts - obs_canvas_t *GetCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + obs_canvas_t *AcquireCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_source_t *GetSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, + obs_source_t *AcquireSource(const std::string &canvasUuidKeyName, const std::string &nameKeyName, const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_source_t *GetScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + obs_source_t *AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_scene_t *GetScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + obs_scene_t *AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_source_t *GetInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - FilterPair GetFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; - obs_sceneitem_t *GetSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + obs_source_t *AcquireInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + FilterPair AcquireFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const; + obs_sceneitem_t *AcquireSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; - obs_output_t *GetOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; + obs_output_t *AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; std::string RequestType; bool HasRequestData; From 1427439643c418f4ae61eb2cec6af43ead7cf4aa Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Fri, 27 Feb 2026 01:02:52 -0500 Subject: [PATCH 18/19] requesthandler: Guard against null canvas --- src/requesthandler/RequestHandler_Scenes.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index 82f042f4..a0ed78b0 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -156,7 +156,7 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request) return RequestResult::Error(statusCode, comment); OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return RequestResult::Error( RequestStatus::InvalidResourceState, "The specified scene is not from the main canvas and cannot be set as the program scene."); @@ -226,7 +226,7 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) return RequestResult::Error(statusCode, comment); OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return RequestResult::Error( RequestStatus::InvalidResourceState, "The specified scene is not from the main canvas and cannot be set as the preview scene."); @@ -301,6 +301,9 @@ RequestResult RequestHandler::RemoveScene(const Request &request) return RequestResult::Error(statusCode, comment); OBSCanvasAutoRelease canvas = obs_source_get_canvas(scene); + if (!canvas) + return RequestResult::Error(RequestStatus::ResourceActionFailed, "Error getting canvas for the specified scene."); + if ((obs_canvas_get_flags(canvas) & MAIN) && Utils::Obs::NumberHelper::GetCanvasSceneCount(canvas) < 2) return RequestResult::Error(RequestStatus::NotEnoughResources, "You cannot remove the last scene in the collection."); From 23ea344980371d9b00872ab302fe74efe224961c Mon Sep 17 00:00:00 2001 From: Warchamp7 Date: Fri, 27 Feb 2026 01:03:00 -0500 Subject: [PATCH 19/19] eventhandler: Guard against null canvas --- src/eventhandler/EventHandler_SceneItems.cpp | 14 +++++++------- src/eventhandler/EventHandler_Scenes.cpp | 9 ++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/eventhandler/EventHandler_SceneItems.cpp b/src/eventhandler/EventHandler_SceneItems.cpp index 477ca463..b21303c3 100644 --- a/src/eventhandler/EventHandler_SceneItems.cpp +++ b/src/eventhandler/EventHandler_SceneItems.cpp @@ -50,7 +50,7 @@ void EventHandler::HandleSceneItemCreated(void *param, calldata_t *data) return; OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -95,7 +95,7 @@ void EventHandler::HandleSceneItemRemoved(void *param, calldata_t *data) return; OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -131,7 +131,7 @@ void EventHandler::HandleSceneItemListReindexed(void *param, calldata_t *data) return; OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -172,7 +172,7 @@ void EventHandler::HandleSceneItemEnableStateChanged(void *param, calldata_t *da bool sceneItemEnabled = calldata_bool(data, "visible"); OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -214,7 +214,7 @@ void EventHandler::HandleSceneItemLockStateChanged(void *param, calldata_t *data bool sceneItemLocked = calldata_bool(data, "locked"); OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -253,7 +253,7 @@ void EventHandler::HandleSceneItemSelected(void *param, calldata_t *data) return; OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -295,7 +295,7 @@ void EventHandler::HandleSceneItemTransformChanged(void *param, calldata_t *data return; OBSCanvasAutoRelease canvas = obs_source_get_canvas(obs_scene_get_source(scene)); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; diff --git a/src/eventhandler/EventHandler_Scenes.cpp b/src/eventhandler/EventHandler_Scenes.cpp index 9fade330..73d1f7d8 100644 --- a/src/eventhandler/EventHandler_Scenes.cpp +++ b/src/eventhandler/EventHandler_Scenes.cpp @@ -37,7 +37,7 @@ with this program. If not, see void EventHandler::HandleSceneCreated(obs_source_t *source) { OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -65,7 +65,10 @@ void EventHandler::HandleSceneCreated(obs_source_t *source) void EventHandler::HandleSceneRemoved(obs_source_t *source) { OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + // NOTE: Groups do not emit source_remove when they are deleted and canvas will already be NULL + // during source_destroy. As a result, this event will never be emitted here for groups. + // This should be fixed in the future when more thorough canvas support is added. + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData; @@ -93,7 +96,7 @@ void EventHandler::HandleSceneRemoved(obs_source_t *source) void EventHandler::HandleSceneNameChanged(obs_source_t *source, std::string oldSceneName, std::string sceneName) { OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); - if (!(obs_canvas_get_flags(canvas) & MAIN)) + if (!canvas || !(obs_canvas_get_flags(canvas) & MAIN)) return; json eventData;