From f944cd34f9e4d8a58d80d7d50be31e21c52f6311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Mon, 17 Oct 2016 22:48:44 +0200 Subject: [PATCH] Added request SetSourceRender and util method GetSceneItemFromName --- Utils.cpp | 48 +++++++++++++++++++++++++++++++++++++------- Utils.h | 3 ++- WSRequestHandler.cpp | 25 ++++++++++++++++++++++- WSRequestHandler.h | 1 + 4 files changed, 68 insertions(+), 9 deletions(-) diff --git a/Utils.cpp b/Utils.cpp index d545231a..3d63d138 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,17 +1,19 @@ #include "Utils.h" -bool enum_scene_items(obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) { - obs_data_array_t *data = static_cast(param); - obs_data_array_push_back(data, Utils::GetSceneItemData(currentItem)); - return true; -} - obs_data_array_t* Utils::GetSceneItems(obs_source_t *source) { obs_data_array_t *items = obs_data_array_create(); obs_scene_t *scene = obs_scene_from_source(source); + if (scene == NULL) { + return NULL; + } - obs_scene_enum_items(scene, enum_scene_items, items); + obs_scene_enum_items(scene, [](obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) { + obs_data_array_t *data = static_cast(param); + obs_data_array_push_back(data, GetSceneItemData(currentItem)); + return true; + }, items); + obs_scene_release(scene); return items; } @@ -39,6 +41,38 @@ obs_data_t* Utils::GetSceneItemData(obs_sceneitem_t *item) { return data; } + +obs_sceneitem_t* Utils::GetSceneItemFromName(obs_source_t* source, const char* name) { + struct current_search { + const char* query; + obs_sceneitem_t* result; + }; + + current_search search; + search.query = name; + search.result = NULL; + + obs_scene_t *scene = obs_scene_from_source(source); + if (scene == NULL) { + return NULL; + } + + obs_scene_enum_items(scene, [](obs_scene_t *scene, obs_sceneitem_t *currentItem, void *param) { + current_search *search = static_cast(param); + + const char* currentItemName = obs_source_get_name(obs_sceneitem_get_source(currentItem)); + if (strcmp(currentItemName, search->query) == 0) { + search->result = currentItem; + obs_sceneitem_addref(search->result); + return false; + } + + return true; + }, &search); + + return search.result; +} + obs_data_array_t* Utils::GetScenes() { obs_frontend_source_list sceneList = {}; obs_frontend_get_scenes(&sceneList); diff --git a/Utils.h b/Utils.h index 7c340f13..ded0ccee 100644 --- a/Utils.h +++ b/Utils.h @@ -7,8 +7,9 @@ class Utils { public: - static obs_data_array_t* GetSceneItems(obs_source_t* source); + static obs_data_array_t* GetSceneItems(obs_source_t *source); static obs_data_t* GetSceneItemData(obs_scene_item *item); + static obs_sceneitem_t* GetSceneItemFromName(obs_source_t *source, const char* name); static obs_data_array_t* GetScenes(); static obs_data_t* GetSceneData(obs_source *source); diff --git a/WSRequestHandler.cpp b/WSRequestHandler.cpp index aa05d0c4..bd0cdd43 100644 --- a/WSRequestHandler.cpp +++ b/WSRequestHandler.cpp @@ -13,7 +13,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) { messageMap["GetCurrentScene"] = WSRequestHandler::HandleGetCurrentScene; messageMap["GetSceneList"] = WSRequestHandler::HandleGetSceneList; messageMap["SetSourceOrder"] = WSRequestHandler::ErrNotImplemented; - messageMap["SetSourceRender"] = WSRequestHandler::ErrNotImplemented; + messageMap["SetSourceRender"] = WSRequestHandler::HandleSetSourceRender; messageMap["SetSceneItemPositionAndSize"] = WSRequestHandler::ErrNotImplemented; messageMap["GetStreamingStatus"] = WSRequestHandler::HandleGetStreamingStatus; messageMap["StartStopStreaming"] = WSRequestHandler::HandleStartStopStreaming; @@ -148,6 +148,29 @@ void WSRequestHandler::HandleGetSceneList(WSRequestHandler *owner) { obs_data_release(data); } +void WSRequestHandler::HandleSetSourceRender(WSRequestHandler *owner) { + const char *itemName = obs_data_get_string(owner->_requestData, "source"); + bool isVisible = obs_data_get_bool(owner->_requestData, "render"); + if (itemName == NULL) { + owner->SendErrorResponse("invalid request parameters"); + return; + } + + obs_source_t* currentScene = obs_frontend_get_current_scene(); + + obs_sceneitem_t *sceneItem = Utils::GetSceneItemFromName(currentScene, itemName); + if (sceneItem != NULL) { + obs_sceneitem_set_visible(sceneItem, isVisible); + obs_sceneitem_release(sceneItem); + owner->SendOKResponse(); + } + else { + owner->SendErrorResponse("specified scene item doesn't exist"); + } + + obs_source_release(currentScene); +} + void WSRequestHandler::HandleGetStreamingStatus(WSRequestHandler *owner) { obs_data_t *data = obs_data_create(); obs_data_set_bool(data, "streaming", obs_frontend_streaming_active()); diff --git a/WSRequestHandler.h b/WSRequestHandler.h index 5207837f..a01001e9 100644 --- a/WSRequestHandler.h +++ b/WSRequestHandler.h @@ -30,6 +30,7 @@ class WSRequestHandler static void HandleSetCurrentScene(WSRequestHandler *owner); static void HandleGetCurrentScene(WSRequestHandler *owner); static void HandleGetSceneList(WSRequestHandler *owner); + static void HandleSetSourceRender(WSRequestHandler *owner); static void HandleGetStreamingStatus(WSRequestHandler *owner); static void HandleStartStopStreaming(WSRequestHandler *owner); static void HandleStartStopRecording(WSRequestHandler *owner);