diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 60a24829..94bbe562 100644 --- a/src/requesthandler/RequestHandler.cpp +++ b/src/requesthandler/RequestHandler.cpp @@ -42,6 +42,7 @@ const std::map RequestHandler::_handlerMap {"GetInputKindList", &RequestHandler::GetInputKindList}, {"GetInputDefaultSettings", &RequestHandler::GetInputDefaultSettings}, {"GetInputSettings", &RequestHandler::GetInputSettings}, + {"SetInputSettings", &RequestHandler::SetInputSettings}, }; RequestResult RequestHandler::ProcessRequest(const Request& request) diff --git a/src/requesthandler/RequestHandler.h b/src/requesthandler/RequestHandler.h index 7d2346b9..2c9bc493 100644 --- a/src/requesthandler/RequestHandler.h +++ b/src/requesthandler/RequestHandler.h @@ -56,6 +56,7 @@ class RequestHandler { RequestResult GetInputKindList(const Request&); RequestResult GetInputDefaultSettings(const Request&); RequestResult GetInputSettings(const Request&); + RequestResult SetInputSettings(const Request&); static const std::map _handlerMap; }; diff --git a/src/requesthandler/RequestHandler_Inputs.cpp b/src/requesthandler/RequestHandler_Inputs.cpp index 49076bdf..e5163e7d 100644 --- a/src/requesthandler/RequestHandler_Inputs.cpp +++ b/src/requesthandler/RequestHandler_Inputs.cpp @@ -44,9 +44,8 @@ RequestResult RequestHandler::GetInputDefaultSettings(const Request& request) { RequestStatus::RequestStatus statusCode; std::string comment; - if (!request.ValidateString("inputKind", statusCode, comment)) { + if (!request.ValidateString("inputKind", statusCode, comment)) return RequestResult::Error(statusCode, comment); - } std::string inputKind = request.RequestData["inputKind"]; @@ -74,3 +73,42 @@ RequestResult RequestHandler::GetInputSettings(const Request& request) responseData["inputKind"] = obs_source_get_id(input); return RequestResult::Success(responseData); } + +RequestResult RequestHandler::SetInputSettings(const Request& request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + OBSSourceAutoRelease input = request.ValidateInput("inputName", statusCode, comment); + if (!input) + return RequestResult::Error(statusCode, comment); + + if (!request.ValidateObject("inputSettings", statusCode, comment, true)) + return RequestResult::Error(statusCode, comment); + + bool overlay = true; + if (request.RequestData.contains("overlay") && !request.RequestData["overlay"].is_null()) { + if (!request.ValidateBoolean("overlay", statusCode, comment)) { + return RequestResult::Error(statusCode, comment); + } + + overlay = request.RequestData["overlay"]; + } + + // Get the new settings and convert it to obs_data_t* + OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["inputSettings"]); + if (!newSettings) + // This should never happen + return RequestResult::Error(RequestStatus::RequestProcessingFailed, "An internal data conversion operation failed. Please report this!"); + + if (overlay) + // Applies the new settings on top of the existing user settings + obs_source_update(input, newSettings); + else + // Clears all user settings (leaving defaults) then applies the new settings + obs_source_reset_settings(input, newSettings); + + // Tells any open source properties windows to perform a UI refresh + obs_source_update_properties(input); + + return RequestResult::Success(); +}