diff --git a/src/requesthandler/RequestHandler.cpp b/src/requesthandler/RequestHandler.cpp index 9fa967bb..e9be6143 100644 --- a/src/requesthandler/RequestHandler.cpp +++ b/src/requesthandler/RequestHandler.cpp @@ -29,6 +29,10 @@ const std::map RequestHandler::_handlerMap // Scenes {"GetSceneList", &RequestHandler::GetSceneList}, + {"GetCurrentProgramScene", &RequestHandler::GetCurrentProgramScene}, + {"SetCurrentProgramScene", &RequestHandler::SetCurrentProgramScene}, + {"GetCurrentPreviewScene", &RequestHandler::GetCurrentPreviewScene}, + {"SetCurrentPreviewScene", &RequestHandler::SetCurrentPreviewScene}, }; RequestResult RequestHandler::ProcessRequest(const Request& request) diff --git a/src/requesthandler/RequestHandler.h b/src/requesthandler/RequestHandler.h index 1e4488f3..2d8744fa 100644 --- a/src/requesthandler/RequestHandler.h +++ b/src/requesthandler/RequestHandler.h @@ -43,6 +43,10 @@ class RequestHandler { // Scenes RequestResult GetSceneList(const Request&); + RequestResult GetCurrentProgramScene(const Request&); + RequestResult SetCurrentProgramScene(const Request&); + RequestResult GetCurrentPreviewScene(const Request&); + RequestResult SetCurrentPreviewScene(const Request&); static const std::map _handlerMap; }; diff --git a/src/requesthandler/RequestHandler_Scenes.cpp b/src/requesthandler/RequestHandler_Scenes.cpp index 936e6fb9..b94a66f3 100644 --- a/src/requesthandler/RequestHandler_Scenes.cpp +++ b/src/requesthandler/RequestHandler_Scenes.cpp @@ -20,3 +20,76 @@ RequestResult RequestHandler::GetSceneList(const Request& request) return RequestResult::Success(responseData); } + +RequestResult RequestHandler::GetCurrentProgramScene(const Request& request) +{ + json responseData; + + OBSSourceAutoRelease currentProgramScene = obs_frontend_get_current_scene(); + responseData["currentProgramSceneName"] = obs_source_get_name(currentProgramScene); + + return RequestResult::Success(responseData); +} + +RequestResult RequestHandler::SetCurrentProgramScene(const Request& request) +{ + RequestStatus::RequestStatus statusCode; + std::string comment; + if (!request.ValidateString("sceneName", statusCode, comment)) { + return RequestResult::Error(statusCode, comment); + } + + std::string sceneName = request.RequestData["sceneName"]; + + OBSSourceAutoRelease scene = obs_get_source_by_name(sceneName.c_str()); + if (!scene) + return RequestResult::Error(RequestStatus::SceneNotFound); + + if (obs_source_get_type(scene) != OBS_SOURCE_TYPE_SCENE) + return RequestResult::Error(RequestStatus::InvalidSourceType, "The specified source is not a scene."); + + obs_frontend_set_current_scene(scene); + + return RequestResult::Success(); +} + +RequestResult RequestHandler::GetCurrentPreviewScene(const Request& request) +{ + json responseData; + + OBSSourceAutoRelease currentPreviewScene = obs_frontend_get_current_preview_scene(); + if (currentPreviewScene) { + responseData["currentPreviewSceneName"] = obs_source_get_name(currentPreviewScene); + } else if (request.IgnoreNonFatalRequestChecks) { + responseData["currentPreviewSceneName"] = nullptr; + } else { + return RequestResult::Error(RequestStatus::StudioModeNotActive); + } + + return RequestResult::Success(responseData); +} + +RequestResult RequestHandler::SetCurrentPreviewScene(const Request& request) +{ + if (!obs_frontend_preview_program_mode_active()) + return RequestResult::Error(RequestStatus::StudioModeNotActive); + + RequestStatus::RequestStatus statusCode; + std::string comment; + if (!request.ValidateString("sceneName", statusCode, comment)) { + return RequestResult::Error(statusCode, comment); + } + + std::string sceneName = request.RequestData["sceneName"]; + + OBSSourceAutoRelease scene = obs_get_source_by_name(sceneName.c_str()); + if (!scene) + return RequestResult::Error(RequestStatus::SceneNotFound); + + if (obs_source_get_type(scene) != OBS_SOURCE_TYPE_SCENE) + return RequestResult::Error(RequestStatus::InvalidSourceType, "The specified source is not a scene."); + + obs_frontend_set_current_preview_scene(scene); + + return RequestResult::Success(); +}