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/eventhandler/EventHandler_SceneItems.cpp b/src/eventhandler/EventHandler_SceneItems.cpp index ebd871a6..b21303c3 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 (!canvas || !(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 (!canvas || !(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 (!canvas || !(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 (!canvas || !(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 (!canvas || !(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 (!canvas || !(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 (!canvas || !(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..73d1f7d8 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 (!canvas || !(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,17 @@ void EventHandler::HandleSceneCreated(obs_source_t *source) */ void EventHandler::HandleSceneRemoved(obs_source_t *source) { + OBSCanvasAutoRelease canvas = obs_source_get_canvas(source); + // 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; 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 +95,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 (!canvas || !(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); } diff --git a/src/requesthandler/RequestHandler_Canvases.cpp b/src/requesthandler/RequestHandler_Canvases.cpp index 26d545a6..532f3510 100644 --- a/src/requesthandler/RequestHandler_Canvases.cpp +++ b/src/requesthandler/RequestHandler_Canvases.cpp @@ -22,41 +22,43 @@ 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 - * @category canvas + * @category canvases */ -RequestResult RequestHandler::GetCanvasList(const Request &request) +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); - 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; - } - ret->push_back(canvasJson); + + 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); + canvases->push_back(canvasJson); return true; }, - &ret); - responseData["canvases"] = ret; + &canvases); + responseData["canvases"] = canvases; return RequestResult::Success(responseData); } 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); } diff --git a/src/requesthandler/RequestHandler_Filters.cpp b/src/requesthandler/RequestHandler_Filters.cpp index 59d7d9aa..76a2dba4 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.AcquireSource("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.AcquireSource("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 @@ -182,7 +179,7 @@ RequestResult RequestHandler::RemoveSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -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 @@ -212,7 +208,7 @@ RequestResult RequestHandler::SetSourceFilterName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter || !request.ValidateString("newFilterName", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -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 @@ -252,7 +247,7 @@ RequestResult RequestHandler::GetSourceFilter(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!pair.filter) return RequestResult::Error(statusCode, comment); @@ -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 @@ -290,7 +284,7 @@ RequestResult RequestHandler::SetSourceFilterIndex(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateNumber("filterIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -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 @@ -323,7 +316,7 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(statusCode, comment); + FilterPair pair = request.AcquireFilter(statusCode, comment); if (!(pair.filter && request.ValidateObject("filterSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -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 @@ -373,7 +365,7 @@ RequestResult RequestHandler::SetSourceFilterEnabled(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - FilterPair pair = request.ValidateFilter(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 38fc7f79..87adfb92 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 @@ -146,7 +145,7 @@ RequestResult RequestHandler::CreateInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(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); @@ -213,7 +212,7 @@ RequestResult RequestHandler::RemoveInput(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -243,7 +242,7 @@ RequestResult RequestHandler::SetInputName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("newInputName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -316,7 +315,7 @@ RequestResult RequestHandler::GetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -347,7 +346,7 @@ RequestResult RequestHandler::SetInputSettings(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateObject("inputSettings", statusCode, comment, true))) return RequestResult::Error(statusCode, comment); @@ -398,7 +397,7 @@ RequestResult RequestHandler::GetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -428,7 +427,7 @@ RequestResult RequestHandler::SetInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateBoolean("inputMuted", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -459,7 +458,7 @@ RequestResult RequestHandler::ToggleInputMute(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -494,7 +493,7 @@ RequestResult RequestHandler::GetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -531,7 +530,7 @@ RequestResult RequestHandler::SetInputVolume(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -582,7 +581,7 @@ RequestResult RequestHandler::GetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -613,7 +612,7 @@ RequestResult RequestHandler::SetInputAudioBalance(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioBalance", statusCode, comment, 0.0, 1.0))) return RequestResult::Error(statusCode, comment); @@ -647,7 +646,7 @@ RequestResult RequestHandler::GetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -679,7 +678,7 @@ RequestResult RequestHandler::SetInputAudioSyncOffset(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateNumber("inputAudioSyncOffset", statusCode, comment, -950, 20000))) return RequestResult::Error(statusCode, comment); @@ -717,7 +716,7 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -748,7 +747,7 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("monitorType", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -795,7 +794,7 @@ RequestResult RequestHandler::GetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -833,7 +832,7 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateObject("inputAudioTracks", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -901,7 +900,7 @@ RequestResult RequestHandler::GetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -934,7 +933,7 @@ RequestResult RequestHandler::SetInputDeinterlaceMode(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceMode", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -978,7 +977,7 @@ RequestResult RequestHandler::GetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -1011,7 +1010,7 @@ RequestResult RequestHandler::SetInputDeinterlaceFieldOrder(const Request &reque { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input || !request.ValidateString("inputDeinterlaceFieldOrder", statusCode, comment)) return RequestResult::Error(statusCode, comment); @@ -1051,7 +1050,7 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!(input && request.ValidateString("propertyName", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -1094,7 +1093,7 @@ RequestResult RequestHandler::PressInputPropertiesButton(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease input = request.ValidateInput(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 3c176e20..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.ValidateInput(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.ValidateInput(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.ValidateInput(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.ValidateInput(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 d2b0526b..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.ValidateOutput("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.ValidateOutput("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.ValidateOutput("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.ValidateOutput("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.ValidateOutput("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.ValidateOutput("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 d39faded..de95e493 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 * @@ -42,7 +41,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -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 * @@ -77,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.AcquireScene(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_GROUP_ONLY); if (!scene) return RequestResult::Error(statusCode, comment); @@ -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 @@ -112,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.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); @@ -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 @@ -159,7 +155,7 @@ RequestResult RequestHandler::GetSceneItemSource(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -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 @@ -198,13 +193,13 @@ RequestResult RequestHandler::CreateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease sceneSource = request.ValidateScene(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.ValidateSource("sourceName", "sourceUuid", statusCode, comment); + OBSSourceAutoRelease source = request.AcquireSource("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 @@ -250,7 +244,7 @@ RequestResult RequestHandler::RemoveSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(statusCode, comment); + OBSSceneItemAutoRelease sceneItem = request.AcquireSceneItem(statusCode, comment); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -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 @@ -286,19 +279,19 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem(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.ValidateSource("destinationSceneName", "destinationSceneUuid", statusCode, comment); + OBSSourceAutoRelease destinationSceneSource = request.AcquireSource("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)) @@ -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 @@ -363,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -377,8 +368,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 @@ -395,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -544,8 +533,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 @@ -563,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -579,8 +566,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 @@ -597,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -614,8 +599,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 @@ -633,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -649,8 +632,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 @@ -667,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -686,8 +667,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 @@ -705,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -721,8 +700,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 @@ -739,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192))) return RequestResult::Error(statusCode, comment); @@ -766,8 +743,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 @@ -785,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -803,8 +778,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 @@ -821,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment))) return RequestResult::Error(statusCode, comment); @@ -841,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.AcquireSceneItem(statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP); if (!sceneItem) return RequestResult::Error(statusCode, comment); @@ -859,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.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 2fbcab71..a0ed78b0 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -22,13 +22,12 @@ 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 - * @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 @@ -40,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.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + OBSCanvasAutoRelease canvas = request.AcquireCanvas("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); @@ -82,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); } @@ -108,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.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) + OBSCanvasAutoRelease canvas = request.AcquireCanvas("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); } @@ -126,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 @@ -167,13 +151,12 @@ RequestResult RequestHandler::SetCurrentProgramScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); 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 (!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."); @@ -238,13 +221,12 @@ RequestResult RequestHandler::SetCurrentPreviewScene(const Request &request) RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); 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 (!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."); @@ -257,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 * @@ -277,11 +260,15 @@ 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."); - 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."); @@ -294,8 +281,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,16 +296,15 @@ RequestResult RequestHandler::RemoveScene(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) - return RequestResult::Error(statusCode, comment); - - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(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 (!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."); @@ -331,8 +316,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,18 +332,14 @@ RequestResult RequestHandler::SetSceneName(const Request &request) { RequestStatus::RequestStatus statusCode; std::string comment; - OBSCanvasAutoRelease canvas = request.ValidateCanvas("canvasName", "canvasUuid", statusCode, comment); - if (statusCode == RequestStatus::ResourceNotFound) - return RequestResult::Error(statusCode, comment); - - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(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."); @@ -374,8 +354,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 * @@ -393,7 +372,7 @@ RequestResult RequestHandler::GetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(statusCode, comment); + OBSSourceAutoRelease scene = request.AcquireScene(statusCode, comment); if (!scene) return RequestResult::Error(statusCode, comment); @@ -417,8 +396,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 @@ -435,7 +413,7 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request &req { RequestStatus::RequestStatus statusCode; std::string comment; - OBSSourceAutoRelease scene = request.ValidateScene(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 11ff0627..b3da7896 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.AcquireSource("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.AcquireSource("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.AcquireSource("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.AcquireSource("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.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 c586ae71..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.ValidateInput(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.ValidateInput(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.ValidateInput(statusCode, comment); + OBSSourceAutoRelease input = request.AcquireInput(statusCode, comment); if (!input) return RequestResult::Error(statusCode, comment); @@ -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.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 40c33fe8..73198720 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::AcquireCanvas(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::AcquireSource(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 = AcquireCanvas(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 *Request::AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - obs_source_t *ret = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!ret) return nullptr; @@ -277,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::AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSourceAutoRelease sceneSource = ValidateSource("sceneName", "sceneUuid", statusCode, comment); + OBSSourceAutoRelease sceneSource = AcquireSource("canvasUuid", "sceneName", "sceneUuid", statusCode, comment); if (!sceneSource) return nullptr; @@ -308,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::AcquireInput(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *ret = ValidateSource("inputName", "inputUuid", statusCode, comment); + obs_source_t *ret = AcquireSource("canvasUuid", "inputName", "inputUuid", statusCode, comment); if (!ret) return nullptr; @@ -324,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::AcquireFilter(RequestStatus::RequestStatus &statusCode, std::string &comment) const { - obs_source_t *source = ValidateSource("sourceName", "sourceUuid", statusCode, comment); + obs_source_t *source = AcquireSource("canvasUuid", "sourceName", "sourceUuid", statusCode, comment); if (!source) return FilterPair{source, nullptr}; @@ -346,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::AcquireSceneItem(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter) const { - OBSSceneAutoRelease scene = ValidateScene2(statusCode, comment, filter); + OBSSceneAutoRelease scene = AcquireScene2(statusCode, comment, filter); if (!scene) return nullptr; @@ -371,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::AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const { if (!ValidateString(keyName, statusCode, comment)) return nullptr; @@ -388,31 +404,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..5711db7d 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_source_t *ValidateSource(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 *ValidateCanvas(const std::string &nameKeyName, const std::string &uuidKeyName, - RequestStatus::RequestStatus &statusCode, - std::string &comment) const; + obs_canvas_t *AcquireCanvas(const std::string &uuidKeyName, RequestStatus::RequestStatus &statusCode, + std::string &comment) const; + 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 *AcquireScene(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + obs_scene_t *AcquireScene2(RequestStatus::RequestStatus &statusCode, std::string &comment, + const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const; + 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 *AcquireOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const; std::string RequestType; bool HasRequestData; 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); } } } diff --git a/src/utils/Obs.h b/src/utils/Obs.h index 86991032..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 = ""); @@ -268,6 +267,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_ArrayHelper.cpp b/src/utils/Obs_ArrayHelper.cpp index cb1a7d1e..d7d7f6f8 100644 --- a/src/utils/Obs_ArrayHelper.cpp +++ b/src/utils/Obs_ArrayHelper.cpp @@ -114,28 +114,22 @@ 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); - return ret; -} + json sceneJson; + sceneJson["sceneName"] = obs_source_get_name(scene); + sceneJson["sceneUuid"] = obs_source_get_uuid(scene); + sceneJson["sceneIndex"] = nullptr; -std::vector Utils::Obs::ArrayHelper::GetGroupList() -{ - OBSCanvasAutoRelease canvas = obs_get_main_canvas(); - return GetCanvasGroupList(canvas); + ret->push_back(sceneJson); + + return true; + }; + + obs_canvas_enum_scenes(canvas, cb, &ret); + + return ret; } std::vector Utils::Obs::ArrayHelper::GetCanvasGroupList(obs_canvas_t *canvas) 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; +}